X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/9e98c9d41df683c131719cca60b9a8b5f3d267d9..028399bd2cc1bdd206602eac9b51eb6715826a1c:/vendor/assets/iD/iD.js
diff --git a/vendor/assets/iD/iD.js b/vendor/assets/iD/iD.js
index 24cb83d9f..088e252a2 100644
--- a/vendor/assets/iD/iD.js
+++ b/vendor/assets/iD/iD.js
@@ -2,35 +2,24 @@
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
- function createCommonjsModule(fn, basedir, module) {
- return module = {
- path: basedir,
- exports: {},
- require: function (path, base) {
- return commonjsRequire(path, (base === undefined || base === null) ? module.path : base);
- }
- }, fn(module, module.exports), module.exports;
- }
-
- function commonjsRequire () {
- throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
- }
-
var check = function (it) {
return it && it.Math == Math && it;
};
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
- var global_1 =
- /* global globalThis -- safe */
+ var global$1o =
+ // eslint-disable-next-line es/no-global-this -- safe
check(typeof globalThis == 'object' && globalThis) ||
check(typeof window == 'object' && window) ||
+ // eslint-disable-next-line no-restricted-globals -- safe
check(typeof self == 'object' && self) ||
check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||
// eslint-disable-next-line no-new-func -- fallback
(function () { return this; })() || Function('return this')();
- var fails = function (exec) {
+ var objectGetOwnPropertyDescriptor = {};
+
+ var fails$V = function (exec) {
try {
return !!exec();
} catch (error) {
@@ -38,29 +27,47 @@
}
};
+ var fails$U = fails$V;
+
// Detect IE8's incomplete defineProperty implementation
- var descriptors = !fails(function () {
+ var descriptors = !fails$U(function () {
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;
});
- var nativePropertyIsEnumerable = {}.propertyIsEnumerable;
- var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+ var fails$T = fails$V;
+
+ var functionBindNative = !fails$T(function () {
+ var test = (function () { /* empty */ }).bind();
+ // eslint-disable-next-line no-prototype-builtins -- safe
+ return typeof test != 'function' || test.hasOwnProperty('prototype');
+ });
+
+ var NATIVE_BIND$4 = functionBindNative;
+
+ var call$q = Function.prototype.call;
+
+ var functionCall = NATIVE_BIND$4 ? call$q.bind(call$q) : function () {
+ return call$q.apply(call$q, arguments);
+ };
+
+ var objectPropertyIsEnumerable = {};
+
+ var $propertyIsEnumerable$2 = {}.propertyIsEnumerable;
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ var getOwnPropertyDescriptor$5 = Object.getOwnPropertyDescriptor;
// Nashorn ~ JDK8 bug
- var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);
+ var NASHORN_BUG = getOwnPropertyDescriptor$5 && !$propertyIsEnumerable$2.call({ 1: 2 }, 1);
// `Object.prototype.propertyIsEnumerable` method implementation
// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
- var f = NASHORN_BUG ? function propertyIsEnumerable(V) {
- var descriptor = getOwnPropertyDescriptor(this, V);
+ objectPropertyIsEnumerable.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
+ var descriptor = getOwnPropertyDescriptor$5(this, V);
return !!descriptor && descriptor.enumerable;
- } : nativePropertyIsEnumerable;
-
- var objectPropertyIsEnumerable = {
- f: f
- };
+ } : $propertyIsEnumerable$2;
- var createPropertyDescriptor = function (bitmap, value) {
+ var createPropertyDescriptor$7 = function (bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
@@ -69,259 +76,631 @@
};
};
- var toString = {}.toString;
+ var NATIVE_BIND$3 = functionBindNative;
+
+ var FunctionPrototype$3 = Function.prototype;
+ var bind$g = FunctionPrototype$3.bind;
+ var call$p = FunctionPrototype$3.call;
+ var uncurryThis$Y = NATIVE_BIND$3 && bind$g.bind(call$p, call$p);
- var classofRaw = function (it) {
- return toString.call(it).slice(8, -1);
+ var functionUncurryThis = NATIVE_BIND$3 ? function (fn) {
+ return fn && uncurryThis$Y(fn);
+ } : function (fn) {
+ return fn && function () {
+ return call$p.apply(fn, arguments);
+ };
};
- var split = ''.split;
+ var uncurryThis$X = functionUncurryThis;
+
+ var toString$n = uncurryThis$X({}.toString);
+ var stringSlice$c = uncurryThis$X(''.slice);
+
+ var classofRaw$1 = function (it) {
+ return stringSlice$c(toString$n(it), 8, -1);
+ };
+
+ var global$1n = global$1o;
+ var uncurryThis$W = functionUncurryThis;
+ var fails$S = fails$V;
+ var classof$e = classofRaw$1;
+
+ var Object$5 = global$1n.Object;
+ var split$4 = uncurryThis$W(''.split);
// fallback for non-array-like ES3 and non-enumerable old V8 strings
- var indexedObject = fails(function () {
+ var indexedObject = fails$S(function () {
// throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
// eslint-disable-next-line no-prototype-builtins -- safe
- return !Object('z').propertyIsEnumerable(0);
+ return !Object$5('z').propertyIsEnumerable(0);
}) ? function (it) {
- return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);
- } : Object;
+ return classof$e(it) == 'String' ? split$4(it, '') : Object$5(it);
+ } : Object$5;
+
+ var global$1m = global$1o;
+
+ var TypeError$p = global$1m.TypeError;
// `RequireObjectCoercible` abstract operation
// https://tc39.es/ecma262/#sec-requireobjectcoercible
- var requireObjectCoercible = function (it) {
- if (it == undefined) throw TypeError("Can't call method on " + it);
+ var requireObjectCoercible$e = function (it) {
+ if (it == undefined) throw TypeError$p("Can't call method on " + it);
return it;
};
// toObject with fallback for non-array-like ES3 strings
+ var IndexedObject$4 = indexedObject;
+ var requireObjectCoercible$d = requireObjectCoercible$e;
+
+ var toIndexedObject$d = function (it) {
+ return IndexedObject$4(requireObjectCoercible$d(it));
+ };
+
+ // `IsCallable` abstract operation
+ // https://tc39.es/ecma262/#sec-iscallable
+ var isCallable$r = function (argument) {
+ return typeof argument == 'function';
+ };
+
+ var isCallable$q = isCallable$r;
+ var isObject$s = function (it) {
+ return typeof it == 'object' ? it !== null : isCallable$q(it);
+ };
+ var global$1l = global$1o;
+ var isCallable$p = isCallable$r;
- var toIndexedObject = function (it) {
- return indexedObject(requireObjectCoercible(it));
+ var aFunction = function (argument) {
+ return isCallable$p(argument) ? argument : undefined;
};
- var isObject = function (it) {
- return typeof it === 'object' ? it !== null : typeof it === 'function';
+ var getBuiltIn$b = function (namespace, method) {
+ return arguments.length < 2 ? aFunction(global$1l[namespace]) : global$1l[namespace] && global$1l[namespace][method];
};
+ var uncurryThis$V = functionUncurryThis;
+
+ var objectIsPrototypeOf = uncurryThis$V({}.isPrototypeOf);
+
+ var getBuiltIn$a = getBuiltIn$b;
+
+ var engineUserAgent = getBuiltIn$a('navigator', 'userAgent') || '';
+
+ var global$1k = global$1o;
+ var userAgent$7 = engineUserAgent;
+
+ var process$4 = global$1k.process;
+ var Deno = global$1k.Deno;
+ var versions = process$4 && process$4.versions || Deno && Deno.version;
+ var v8 = versions && versions.v8;
+ var match, version$1;
+
+ if (v8) {
+ match = v8.split('.');
+ // in old Chrome, versions of V8 isn't V8 = Chrome / 10
+ // but their correct versions are not interesting for us
+ version$1 = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);
+ }
+
+ // BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`
+ // so check `userAgent` even if `.v8` exists, but 0
+ if (!version$1 && userAgent$7) {
+ match = userAgent$7.match(/Edge\/(\d+)/);
+ if (!match || match[1] >= 74) {
+ match = userAgent$7.match(/Chrome\/(\d+)/);
+ if (match) version$1 = +match[1];
+ }
+ }
+
+ var engineV8Version = version$1;
+
+ /* eslint-disable es/no-symbol -- required for testing */
+
+ var V8_VERSION$3 = engineV8Version;
+ var fails$R = fails$V;
+
+ // eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing
+ var nativeSymbol = !!Object.getOwnPropertySymbols && !fails$R(function () {
+ var symbol = Symbol();
+ // Chrome 38 Symbol has incorrect toString conversion
+ // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
+ return !String(symbol) || !(Object(symbol) instanceof Symbol) ||
+ // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
+ !Symbol.sham && V8_VERSION$3 && V8_VERSION$3 < 41;
+ });
+
+ /* eslint-disable es/no-symbol -- required for testing */
+
+ var NATIVE_SYMBOL$3 = nativeSymbol;
+
+ var useSymbolAsUid = NATIVE_SYMBOL$3
+ && !Symbol.sham
+ && typeof Symbol.iterator == 'symbol';
+
+ var global$1j = global$1o;
+ var getBuiltIn$9 = getBuiltIn$b;
+ var isCallable$o = isCallable$r;
+ var isPrototypeOf$9 = objectIsPrototypeOf;
+ var USE_SYMBOL_AS_UID$1 = useSymbolAsUid;
+
+ var Object$4 = global$1j.Object;
+
+ var isSymbol$6 = USE_SYMBOL_AS_UID$1 ? function (it) {
+ return typeof it == 'symbol';
+ } : function (it) {
+ var $Symbol = getBuiltIn$9('Symbol');
+ return isCallable$o($Symbol) && isPrototypeOf$9($Symbol.prototype, Object$4(it));
+ };
+
+ var global$1i = global$1o;
+
+ var String$6 = global$1i.String;
+
+ var tryToString$5 = function (argument) {
+ try {
+ return String$6(argument);
+ } catch (error) {
+ return 'Object';
+ }
+ };
+
+ var global$1h = global$1o;
+ var isCallable$n = isCallable$r;
+ var tryToString$4 = tryToString$5;
+
+ var TypeError$o = global$1h.TypeError;
+
+ // `Assert: IsCallable(argument) is true`
+ var aCallable$a = function (argument) {
+ if (isCallable$n(argument)) return argument;
+ throw TypeError$o(tryToString$4(argument) + ' is not a function');
+ };
+
+ var aCallable$9 = aCallable$a;
+
+ // `GetMethod` abstract operation
+ // https://tc39.es/ecma262/#sec-getmethod
+ var getMethod$7 = function (V, P) {
+ var func = V[P];
+ return func == null ? undefined : aCallable$9(func);
+ };
+
+ var global$1g = global$1o;
+ var call$o = functionCall;
+ var isCallable$m = isCallable$r;
+ var isObject$r = isObject$s;
+
+ var TypeError$n = global$1g.TypeError;
+
+ // `OrdinaryToPrimitive` abstract operation
+ // https://tc39.es/ecma262/#sec-ordinarytoprimitive
+ var ordinaryToPrimitive$1 = function (input, pref) {
+ var fn, val;
+ if (pref === 'string' && isCallable$m(fn = input.toString) && !isObject$r(val = call$o(fn, input))) return val;
+ if (isCallable$m(fn = input.valueOf) && !isObject$r(val = call$o(fn, input))) return val;
+ if (pref !== 'string' && isCallable$m(fn = input.toString) && !isObject$r(val = call$o(fn, input))) return val;
+ throw TypeError$n("Can't convert object to primitive value");
+ };
+
+ var shared$5 = {exports: {}};
+
+ var isPure = false;
+
+ var global$1f = global$1o;
+
+ // eslint-disable-next-line es/no-object-defineproperty -- safe
+ var defineProperty$d = Object.defineProperty;
+
+ var setGlobal$3 = function (key, value) {
+ try {
+ defineProperty$d(global$1f, key, { value: value, configurable: true, writable: true });
+ } catch (error) {
+ global$1f[key] = value;
+ } return value;
+ };
+
+ var global$1e = global$1o;
+ var setGlobal$2 = setGlobal$3;
+
+ var SHARED = '__core-js_shared__';
+ var store$4 = global$1e[SHARED] || setGlobal$2(SHARED, {});
+
+ var sharedStore = store$4;
+
+ var store$3 = sharedStore;
+
+ (shared$5.exports = function (key, value) {
+ return store$3[key] || (store$3[key] = value !== undefined ? value : {});
+ })('versions', []).push({
+ version: '3.21.0',
+ mode: 'global',
+ copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',
+ license: 'https://github.com/zloirock/core-js/blob/v3.21.0/LICENSE',
+ source: 'https://github.com/zloirock/core-js'
+ });
+
+ var global$1d = global$1o;
+ var requireObjectCoercible$c = requireObjectCoercible$e;
+
+ var Object$3 = global$1d.Object;
+
+ // `ToObject` abstract operation
+ // https://tc39.es/ecma262/#sec-toobject
+ var toObject$i = function (argument) {
+ return Object$3(requireObjectCoercible$c(argument));
+ };
+
+ var uncurryThis$U = functionUncurryThis;
+ var toObject$h = toObject$i;
+
+ var hasOwnProperty$3 = uncurryThis$U({}.hasOwnProperty);
+
+ // `HasOwnProperty` abstract operation
+ // https://tc39.es/ecma262/#sec-hasownproperty
+ var hasOwnProperty_1 = Object.hasOwn || function hasOwn(it, key) {
+ return hasOwnProperty$3(toObject$h(it), key);
+ };
+
+ var uncurryThis$T = functionUncurryThis;
+
+ var id$2 = 0;
+ var postfix = Math.random();
+ var toString$m = uncurryThis$T(1.0.toString);
+
+ var uid$5 = function (key) {
+ return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString$m(++id$2 + postfix, 36);
+ };
+
+ var global$1c = global$1o;
+ var shared$4 = shared$5.exports;
+ var hasOwn$l = hasOwnProperty_1;
+ var uid$4 = uid$5;
+ var NATIVE_SYMBOL$2 = nativeSymbol;
+ var USE_SYMBOL_AS_UID = useSymbolAsUid;
+
+ var WellKnownSymbolsStore$1 = shared$4('wks');
+ var Symbol$3 = global$1c.Symbol;
+ var symbolFor = Symbol$3 && Symbol$3['for'];
+ var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol$3 : Symbol$3 && Symbol$3.withoutSetter || uid$4;
+
+ var wellKnownSymbol$t = function (name) {
+ if (!hasOwn$l(WellKnownSymbolsStore$1, name) || !(NATIVE_SYMBOL$2 || typeof WellKnownSymbolsStore$1[name] == 'string')) {
+ var description = 'Symbol.' + name;
+ if (NATIVE_SYMBOL$2 && hasOwn$l(Symbol$3, name)) {
+ WellKnownSymbolsStore$1[name] = Symbol$3[name];
+ } else if (USE_SYMBOL_AS_UID && symbolFor) {
+ WellKnownSymbolsStore$1[name] = symbolFor(description);
+ } else {
+ WellKnownSymbolsStore$1[name] = createWellKnownSymbol(description);
+ }
+ } return WellKnownSymbolsStore$1[name];
+ };
+
+ var global$1b = global$1o;
+ var call$n = functionCall;
+ var isObject$q = isObject$s;
+ var isSymbol$5 = isSymbol$6;
+ var getMethod$6 = getMethod$7;
+ var ordinaryToPrimitive = ordinaryToPrimitive$1;
+ var wellKnownSymbol$s = wellKnownSymbol$t;
+
+ var TypeError$m = global$1b.TypeError;
+ var TO_PRIMITIVE$1 = wellKnownSymbol$s('toPrimitive');
+
// `ToPrimitive` abstract operation
// https://tc39.es/ecma262/#sec-toprimitive
- // instead of the ES6 spec version, we didn't implement @@toPrimitive case
- // and the second argument - flag - preferred type is a string
- var toPrimitive = function (input, PREFERRED_STRING) {
- if (!isObject(input)) return input;
- var fn, val;
- if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;
- if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;
- if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;
- throw TypeError("Can't convert object to primitive value");
+ var toPrimitive$3 = function (input, pref) {
+ if (!isObject$q(input) || isSymbol$5(input)) return input;
+ var exoticToPrim = getMethod$6(input, TO_PRIMITIVE$1);
+ var result;
+ if (exoticToPrim) {
+ if (pref === undefined) pref = 'default';
+ result = call$n(exoticToPrim, input, pref);
+ if (!isObject$q(result) || isSymbol$5(result)) return result;
+ throw TypeError$m("Can't convert object to primitive value");
+ }
+ if (pref === undefined) pref = 'number';
+ return ordinaryToPrimitive(input, pref);
};
- var hasOwnProperty = {}.hasOwnProperty;
+ var toPrimitive$2 = toPrimitive$3;
+ var isSymbol$4 = isSymbol$6;
- var has = function (it, key) {
- return hasOwnProperty.call(it, key);
+ // `ToPropertyKey` abstract operation
+ // https://tc39.es/ecma262/#sec-topropertykey
+ var toPropertyKey$5 = function (argument) {
+ var key = toPrimitive$2(argument, 'string');
+ return isSymbol$4(key) ? key : key + '';
};
- var document$1 = global_1.document;
+ var global$1a = global$1o;
+ var isObject$p = isObject$s;
+
+ var document$3 = global$1a.document;
// typeof document.createElement is 'object' in old IE
- var EXISTS = isObject(document$1) && isObject(document$1.createElement);
+ var EXISTS$1 = isObject$p(document$3) && isObject$p(document$3.createElement);
- var documentCreateElement = function (it) {
- return EXISTS ? document$1.createElement(it) : {};
+ var documentCreateElement$2 = function (it) {
+ return EXISTS$1 ? document$3.createElement(it) : {};
};
- // Thank's IE8 for his funny defineProperty
- var ie8DomDefine = !descriptors && !fails(function () {
- return Object.defineProperty(documentCreateElement('div'), 'a', {
+ var DESCRIPTORS$p = descriptors;
+ var fails$Q = fails$V;
+ var createElement$1 = documentCreateElement$2;
+
+ // Thanks to IE8 for its funny defineProperty
+ var ie8DomDefine = !DESCRIPTORS$p && !fails$Q(function () {
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+ return Object.defineProperty(createElement$1('div'), 'a', {
get: function () { return 7; }
}).a != 7;
});
- var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+ var DESCRIPTORS$o = descriptors;
+ var call$m = functionCall;
+ var propertyIsEnumerableModule$2 = objectPropertyIsEnumerable;
+ var createPropertyDescriptor$6 = createPropertyDescriptor$7;
+ var toIndexedObject$c = toIndexedObject$d;
+ var toPropertyKey$4 = toPropertyKey$5;
+ var hasOwn$k = hasOwnProperty_1;
+ var IE8_DOM_DEFINE$1 = ie8DomDefine;
+
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ var $getOwnPropertyDescriptor$2 = Object.getOwnPropertyDescriptor;
// `Object.getOwnPropertyDescriptor` method
// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
- var f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
- O = toIndexedObject(O);
- P = toPrimitive(P, true);
- if (ie8DomDefine) try {
- return nativeGetOwnPropertyDescriptor(O, P);
+ objectGetOwnPropertyDescriptor.f = DESCRIPTORS$o ? $getOwnPropertyDescriptor$2 : function getOwnPropertyDescriptor(O, P) {
+ O = toIndexedObject$c(O);
+ P = toPropertyKey$4(P);
+ if (IE8_DOM_DEFINE$1) try {
+ return $getOwnPropertyDescriptor$2(O, P);
} catch (error) { /* empty */ }
- if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);
+ if (hasOwn$k(O, P)) return createPropertyDescriptor$6(!call$m(propertyIsEnumerableModule$2.f, O, P), O[P]);
};
- var objectGetOwnPropertyDescriptor = {
- f: f$1
- };
+ var objectDefineProperty = {};
- var anObject = function (it) {
- if (!isObject(it)) {
- throw TypeError(String(it) + ' is not an object');
- } return it;
+ var DESCRIPTORS$n = descriptors;
+ var fails$P = fails$V;
+
+ // V8 ~ Chrome 36-
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3334
+ var v8PrototypeDefineBug = DESCRIPTORS$n && fails$P(function () {
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+ return Object.defineProperty(function () { /* empty */ }, 'prototype', {
+ value: 42,
+ writable: false
+ }).prototype != 42;
+ });
+
+ var global$19 = global$1o;
+ var isObject$o = isObject$s;
+
+ var String$5 = global$19.String;
+ var TypeError$l = global$19.TypeError;
+
+ // `Assert: Type(argument) is Object`
+ var anObject$n = function (argument) {
+ if (isObject$o(argument)) return argument;
+ throw TypeError$l(String$5(argument) + ' is not an object');
};
- var nativeDefineProperty = Object.defineProperty;
+ var global$18 = global$1o;
+ var DESCRIPTORS$m = descriptors;
+ var IE8_DOM_DEFINE = ie8DomDefine;
+ var V8_PROTOTYPE_DEFINE_BUG$1 = v8PrototypeDefineBug;
+ var anObject$m = anObject$n;
+ var toPropertyKey$3 = toPropertyKey$5;
+
+ var TypeError$k = global$18.TypeError;
+ // eslint-disable-next-line es/no-object-defineproperty -- safe
+ var $defineProperty$1 = Object.defineProperty;
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ var $getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;
+ var ENUMERABLE = 'enumerable';
+ var CONFIGURABLE$1 = 'configurable';
+ var WRITABLE = 'writable';
// `Object.defineProperty` method
// https://tc39.es/ecma262/#sec-object.defineproperty
- var f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {
- anObject(O);
- P = toPrimitive(P, true);
- anObject(Attributes);
- if (ie8DomDefine) try {
- return nativeDefineProperty(O, P, Attributes);
+ objectDefineProperty.f = DESCRIPTORS$m ? V8_PROTOTYPE_DEFINE_BUG$1 ? function defineProperty(O, P, Attributes) {
+ anObject$m(O);
+ P = toPropertyKey$3(P);
+ anObject$m(Attributes);
+ if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {
+ var current = $getOwnPropertyDescriptor$1(O, P);
+ if (current && current[WRITABLE]) {
+ O[P] = Attributes.value;
+ Attributes = {
+ configurable: CONFIGURABLE$1 in Attributes ? Attributes[CONFIGURABLE$1] : current[CONFIGURABLE$1],
+ enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],
+ writable: false
+ };
+ }
+ } return $defineProperty$1(O, P, Attributes);
+ } : $defineProperty$1 : function defineProperty(O, P, Attributes) {
+ anObject$m(O);
+ P = toPropertyKey$3(P);
+ anObject$m(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return $defineProperty$1(O, P, Attributes);
} catch (error) { /* empty */ }
- if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError$k('Accessors not supported');
if ('value' in Attributes) O[P] = Attributes.value;
return O;
};
- var objectDefineProperty = {
- f: f$2
- };
+ var DESCRIPTORS$l = descriptors;
+ var definePropertyModule$7 = objectDefineProperty;
+ var createPropertyDescriptor$5 = createPropertyDescriptor$7;
- var createNonEnumerableProperty = descriptors ? function (object, key, value) {
- return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));
+ var createNonEnumerableProperty$b = DESCRIPTORS$l ? function (object, key, value) {
+ return definePropertyModule$7.f(object, key, createPropertyDescriptor$5(1, value));
} : function (object, key, value) {
object[key] = value;
return object;
};
- var setGlobal = function (key, value) {
- try {
- createNonEnumerableProperty(global_1, key, value);
- } catch (error) {
- global_1[key] = value;
- } return value;
- };
-
- var SHARED = '__core-js_shared__';
- var store = global_1[SHARED] || setGlobal(SHARED, {});
+ var redefine$h = {exports: {}};
- var sharedStore = store;
+ var uncurryThis$S = functionUncurryThis;
+ var isCallable$l = isCallable$r;
+ var store$2 = sharedStore;
- var functionToString = Function.toString;
+ var functionToString$1 = uncurryThis$S(Function.toString);
- // this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper
- if (typeof sharedStore.inspectSource != 'function') {
- sharedStore.inspectSource = function (it) {
- return functionToString.call(it);
+ // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
+ if (!isCallable$l(store$2.inspectSource)) {
+ store$2.inspectSource = function (it) {
+ return functionToString$1(it);
};
}
- var inspectSource = sharedStore.inspectSource;
+ var inspectSource$4 = store$2.inspectSource;
- var WeakMap = global_1.WeakMap;
+ var global$17 = global$1o;
+ var isCallable$k = isCallable$r;
+ var inspectSource$3 = inspectSource$4;
- var nativeWeakMap = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));
+ var WeakMap$1 = global$17.WeakMap;
- var isPure = false;
+ var nativeWeakMap = isCallable$k(WeakMap$1) && /native code/.test(inspectSource$3(WeakMap$1));
- var shared = createCommonjsModule(function (module) {
- (module.exports = function (key, value) {
- return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});
- })('versions', []).push({
- version: '3.9.1',
- mode: 'global',
- copyright: '© 2021 Denis Pushkarev (zloirock.ru)'
- });
- });
+ var shared$3 = shared$5.exports;
+ var uid$3 = uid$5;
- var id = 0;
- var postfix = Math.random();
+ var keys$3 = shared$3('keys');
- var uid = function (key) {
- return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);
+ var sharedKey$4 = function (key) {
+ return keys$3[key] || (keys$3[key] = uid$3(key));
};
- var keys = shared('keys');
-
- var sharedKey = function (key) {
- return keys[key] || (keys[key] = uid(key));
- };
+ var hiddenKeys$6 = {};
- var hiddenKeys = {};
+ var NATIVE_WEAK_MAP = nativeWeakMap;
+ var global$16 = global$1o;
+ var uncurryThis$R = functionUncurryThis;
+ var isObject$n = isObject$s;
+ var createNonEnumerableProperty$a = createNonEnumerableProperty$b;
+ var hasOwn$j = hasOwnProperty_1;
+ var shared$2 = sharedStore;
+ var sharedKey$3 = sharedKey$4;
+ var hiddenKeys$5 = hiddenKeys$6;
- var WeakMap$1 = global_1.WeakMap;
- var set, get, has$1;
+ var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
+ var TypeError$j = global$16.TypeError;
+ var WeakMap = global$16.WeakMap;
+ var set$4, get$5, has;
var enforce = function (it) {
- return has$1(it) ? get(it) : set(it, {});
+ return has(it) ? get$5(it) : set$4(it, {});
};
var getterFor = function (TYPE) {
return function (it) {
var state;
- if (!isObject(it) || (state = get(it)).type !== TYPE) {
- throw TypeError('Incompatible receiver, ' + TYPE + ' required');
+ if (!isObject$n(it) || (state = get$5(it)).type !== TYPE) {
+ throw TypeError$j('Incompatible receiver, ' + TYPE + ' required');
} return state;
};
};
- if (nativeWeakMap) {
- var store$1 = sharedStore.state || (sharedStore.state = new WeakMap$1());
- var wmget = store$1.get;
- var wmhas = store$1.has;
- var wmset = store$1.set;
- set = function (it, metadata) {
+ if (NATIVE_WEAK_MAP || shared$2.state) {
+ var store$1 = shared$2.state || (shared$2.state = new WeakMap());
+ var wmget = uncurryThis$R(store$1.get);
+ var wmhas = uncurryThis$R(store$1.has);
+ var wmset = uncurryThis$R(store$1.set);
+ set$4 = function (it, metadata) {
+ if (wmhas(store$1, it)) throw new TypeError$j(OBJECT_ALREADY_INITIALIZED);
metadata.facade = it;
- wmset.call(store$1, it, metadata);
+ wmset(store$1, it, metadata);
return metadata;
};
- get = function (it) {
- return wmget.call(store$1, it) || {};
+ get$5 = function (it) {
+ return wmget(store$1, it) || {};
};
- has$1 = function (it) {
- return wmhas.call(store$1, it);
+ has = function (it) {
+ return wmhas(store$1, it);
};
} else {
- var STATE = sharedKey('state');
- hiddenKeys[STATE] = true;
- set = function (it, metadata) {
+ var STATE = sharedKey$3('state');
+ hiddenKeys$5[STATE] = true;
+ set$4 = function (it, metadata) {
+ if (hasOwn$j(it, STATE)) throw new TypeError$j(OBJECT_ALREADY_INITIALIZED);
metadata.facade = it;
- createNonEnumerableProperty(it, STATE, metadata);
+ createNonEnumerableProperty$a(it, STATE, metadata);
return metadata;
};
- get = function (it) {
- return has(it, STATE) ? it[STATE] : {};
+ get$5 = function (it) {
+ return hasOwn$j(it, STATE) ? it[STATE] : {};
};
- has$1 = function (it) {
- return has(it, STATE);
+ has = function (it) {
+ return hasOwn$j(it, STATE);
};
}
var internalState = {
- set: set,
- get: get,
- has: has$1,
+ set: set$4,
+ get: get$5,
+ has: has,
enforce: enforce,
getterFor: getterFor
};
- var redefine = createCommonjsModule(function (module) {
- var getInternalState = internalState.get;
- var enforceInternalState = internalState.enforce;
+ var DESCRIPTORS$k = descriptors;
+ var hasOwn$i = hasOwnProperty_1;
+
+ var FunctionPrototype$2 = Function.prototype;
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ var getDescriptor = DESCRIPTORS$k && Object.getOwnPropertyDescriptor;
+
+ var EXISTS = hasOwn$i(FunctionPrototype$2, 'name');
+ // additional protection from minified / mangled / dropped function names
+ var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';
+ var CONFIGURABLE = EXISTS && (!DESCRIPTORS$k || (DESCRIPTORS$k && getDescriptor(FunctionPrototype$2, 'name').configurable));
+
+ var functionName = {
+ EXISTS: EXISTS,
+ PROPER: PROPER,
+ CONFIGURABLE: CONFIGURABLE
+ };
+
+ var global$15 = global$1o;
+ var isCallable$j = isCallable$r;
+ var hasOwn$h = hasOwnProperty_1;
+ var createNonEnumerableProperty$9 = createNonEnumerableProperty$b;
+ var setGlobal$1 = setGlobal$3;
+ var inspectSource$2 = inspectSource$4;
+ var InternalStateModule$9 = internalState;
+ var CONFIGURABLE_FUNCTION_NAME$2 = functionName.CONFIGURABLE;
+
+ var getInternalState$7 = InternalStateModule$9.get;
+ var enforceInternalState$1 = InternalStateModule$9.enforce;
var TEMPLATE = String(String).split('String');
- (module.exports = function (O, key, value, options) {
+ (redefine$h.exports = function (O, key, value, options) {
var unsafe = options ? !!options.unsafe : false;
var simple = options ? !!options.enumerable : false;
var noTargetGet = options ? !!options.noTargetGet : false;
+ var name = options && options.name !== undefined ? options.name : key;
var state;
- if (typeof value == 'function') {
- if (typeof key == 'string' && !has(value, 'name')) {
- createNonEnumerableProperty(value, 'name', key);
+ if (isCallable$j(value)) {
+ if (String(name).slice(0, 7) === 'Symbol(') {
+ name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
+ }
+ if (!hasOwn$h(value, 'name') || (CONFIGURABLE_FUNCTION_NAME$2 && value.name !== name)) {
+ createNonEnumerableProperty$9(value, 'name', name);
}
- state = enforceInternalState(value);
+ state = enforceInternalState$1(value);
if (!state.source) {
- state.source = TEMPLATE.join(typeof key == 'string' ? key : '');
+ state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
}
}
- if (O === global_1) {
+ if (O === global$15) {
if (simple) O[key] = value;
- else setGlobal(key, value);
+ else setGlobal$1(key, value);
return;
} else if (!unsafe) {
delete O[key];
@@ -329,58 +708,66 @@
simple = true;
}
if (simple) O[key] = value;
- else createNonEnumerableProperty(O, key, value);
+ else createNonEnumerableProperty$9(O, key, value);
// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
})(Function.prototype, 'toString', function toString() {
- return typeof this == 'function' && getInternalState(this).source || inspectSource(this);
- });
+ return isCallable$j(this) && getInternalState$7(this).source || inspectSource$2(this);
});
- var path = global_1;
+ var objectGetOwnPropertyNames = {};
- var aFunction = function (variable) {
- return typeof variable == 'function' ? variable : undefined;
+ var ceil$1 = Math.ceil;
+ var floor$8 = Math.floor;
+
+ // `ToIntegerOrInfinity` abstract operation
+ // https://tc39.es/ecma262/#sec-tointegerorinfinity
+ var toIntegerOrInfinity$b = function (argument) {
+ var number = +argument;
+ // eslint-disable-next-line no-self-compare -- safe
+ return number !== number || number === 0 ? 0 : (number > 0 ? floor$8 : ceil$1)(number);
};
- var getBuiltIn = function (namespace, method) {
- return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])
- : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];
- };
+ var toIntegerOrInfinity$a = toIntegerOrInfinity$b;
- var ceil = Math.ceil;
- var floor = Math.floor;
+ var max$5 = Math.max;
+ var min$9 = Math.min;
- // `ToInteger` abstract operation
- // https://tc39.es/ecma262/#sec-tointeger
- var toInteger = function (argument) {
- return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);
+ // Helper for a popular repeating case of the spec:
+ // Let integer be ? ToInteger(index).
+ // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
+ var toAbsoluteIndex$9 = function (index, length) {
+ var integer = toIntegerOrInfinity$a(index);
+ return integer < 0 ? max$5(integer + length, 0) : min$9(integer, length);
};
- var min = Math.min;
+ var toIntegerOrInfinity$9 = toIntegerOrInfinity$b;
+
+ var min$8 = Math.min;
// `ToLength` abstract operation
// https://tc39.es/ecma262/#sec-tolength
- var toLength = function (argument) {
- return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
+ var toLength$c = function (argument) {
+ return argument > 0 ? min$8(toIntegerOrInfinity$9(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
};
- var max = Math.max;
- var min$1 = Math.min;
+ var toLength$b = toLength$c;
- // Helper for a popular repeating case of the spec:
- // Let integer be ? ToInteger(index).
- // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
- var toAbsoluteIndex = function (index, length) {
- var integer = toInteger(index);
- return integer < 0 ? max(integer + length, 0) : min$1(integer, length);
+ // `LengthOfArrayLike` abstract operation
+ // https://tc39.es/ecma262/#sec-lengthofarraylike
+ var lengthOfArrayLike$i = function (obj) {
+ return toLength$b(obj.length);
};
+ var toIndexedObject$b = toIndexedObject$d;
+ var toAbsoluteIndex$8 = toAbsoluteIndex$9;
+ var lengthOfArrayLike$h = lengthOfArrayLike$i;
+
// `Array.prototype.{ indexOf, includes }` methods implementation
- var createMethod = function (IS_INCLUDES) {
+ var createMethod$6 = function (IS_INCLUDES) {
return function ($this, el, fromIndex) {
- var O = toIndexedObject($this);
- var length = toLength(O.length);
- var index = toAbsoluteIndex(fromIndex, length);
+ var O = toIndexedObject$b($this);
+ var length = lengthOfArrayLike$h(O);
+ var index = toAbsoluteIndex$8(fromIndex, length);
var value;
// Array#includes uses SameValueZero equality algorithm
// eslint-disable-next-line no-self-compare -- NaN check
@@ -398,30 +785,35 @@
var arrayIncludes = {
// `Array.prototype.includes` method
// https://tc39.es/ecma262/#sec-array.prototype.includes
- includes: createMethod(true),
+ includes: createMethod$6(true),
// `Array.prototype.indexOf` method
// https://tc39.es/ecma262/#sec-array.prototype.indexof
- indexOf: createMethod(false)
+ indexOf: createMethod$6(false)
};
- var indexOf = arrayIncludes.indexOf;
+ var uncurryThis$Q = functionUncurryThis;
+ var hasOwn$g = hasOwnProperty_1;
+ var toIndexedObject$a = toIndexedObject$d;
+ var indexOf$1 = arrayIncludes.indexOf;
+ var hiddenKeys$4 = hiddenKeys$6;
+ var push$a = uncurryThis$Q([].push);
var objectKeysInternal = function (object, names) {
- var O = toIndexedObject(object);
+ var O = toIndexedObject$a(object);
var i = 0;
var result = [];
var key;
- for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);
+ for (key in O) !hasOwn$g(hiddenKeys$4, key) && hasOwn$g(O, key) && push$a(result, key);
// Don't enum bug & hidden keys
- while (names.length > i) if (has(O, key = names[i++])) {
- ~indexOf(result, key) || result.push(key);
+ while (names.length > i) if (hasOwn$g(O, key = names[i++])) {
+ ~indexOf$1(result, key) || push$a(result, key);
}
return result;
};
// IE8- don't enum bug keys
- var enumBugKeys = [
+ var enumBugKeys$3 = [
'constructor',
'hasOwnProperty',
'isPrototypeOf',
@@ -431,67 +823,85 @@
'valueOf'
];
- var hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');
+ var internalObjectKeys$1 = objectKeysInternal;
+ var enumBugKeys$2 = enumBugKeys$3;
+
+ var hiddenKeys$3 = enumBugKeys$2.concat('length', 'prototype');
// `Object.getOwnPropertyNames` method
// https://tc39.es/ecma262/#sec-object.getownpropertynames
- var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
- return objectKeysInternal(O, hiddenKeys$1);
+ // eslint-disable-next-line es/no-object-getownpropertynames -- safe
+ objectGetOwnPropertyNames.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return internalObjectKeys$1(O, hiddenKeys$3);
};
- var objectGetOwnPropertyNames = {
- f: f$3
- };
+ var objectGetOwnPropertySymbols = {};
- var f$4 = Object.getOwnPropertySymbols;
+ // eslint-disable-next-line es/no-object-getownpropertysymbols -- safe
+ objectGetOwnPropertySymbols.f = Object.getOwnPropertySymbols;
- var objectGetOwnPropertySymbols = {
- f: f$4
- };
+ var getBuiltIn$8 = getBuiltIn$b;
+ var uncurryThis$P = functionUncurryThis;
+ var getOwnPropertyNamesModule$2 = objectGetOwnPropertyNames;
+ var getOwnPropertySymbolsModule$2 = objectGetOwnPropertySymbols;
+ var anObject$l = anObject$n;
+
+ var concat$3 = uncurryThis$P([].concat);
// all object keys, includes non-enumerable and symbols
- var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
- var keys = objectGetOwnPropertyNames.f(anObject(it));
- var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;
- return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;
+ var ownKeys$1 = getBuiltIn$8('Reflect', 'ownKeys') || function ownKeys(it) {
+ var keys = getOwnPropertyNamesModule$2.f(anObject$l(it));
+ var getOwnPropertySymbols = getOwnPropertySymbolsModule$2.f;
+ return getOwnPropertySymbols ? concat$3(keys, getOwnPropertySymbols(it)) : keys;
};
- var copyConstructorProperties = function (target, source) {
+ var hasOwn$f = hasOwnProperty_1;
+ var ownKeys = ownKeys$1;
+ var getOwnPropertyDescriptorModule$3 = objectGetOwnPropertyDescriptor;
+ var definePropertyModule$6 = objectDefineProperty;
+
+ var copyConstructorProperties$2 = function (target, source, exceptions) {
var keys = ownKeys(source);
- var defineProperty = objectDefineProperty.f;
- var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+ var defineProperty = definePropertyModule$6.f;
+ var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule$3.f;
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
- if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));
+ if (!hasOwn$f(target, key) && !(exceptions && hasOwn$f(exceptions, key))) {
+ defineProperty(target, key, getOwnPropertyDescriptor(source, key));
+ }
}
};
+ var fails$O = fails$V;
+ var isCallable$i = isCallable$r;
+
var replacement = /#|\.prototype\./;
- var isForced = function (feature, detection) {
- var value = data[normalize(feature)];
+ var isForced$5 = function (feature, detection) {
+ var value = data[normalize$1(feature)];
return value == POLYFILL ? true
: value == NATIVE ? false
- : typeof detection == 'function' ? fails(detection)
+ : isCallable$i(detection) ? fails$O(detection)
: !!detection;
};
- var normalize = isForced.normalize = function (string) {
+ var normalize$1 = isForced$5.normalize = function (string) {
return String(string).replace(replacement, '.').toLowerCase();
};
- var data = isForced.data = {};
- var NATIVE = isForced.NATIVE = 'N';
- var POLYFILL = isForced.POLYFILL = 'P';
-
- var isForced_1 = isForced;
-
- var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;
-
-
-
+ var data = isForced$5.data = {};
+ var NATIVE = isForced$5.NATIVE = 'N';
+ var POLYFILL = isForced$5.POLYFILL = 'P';
+ var isForced_1 = isForced$5;
+ var global$14 = global$1o;
+ var getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f;
+ var createNonEnumerableProperty$8 = createNonEnumerableProperty$b;
+ var redefine$g = redefine$h.exports;
+ var setGlobal = setGlobal$3;
+ var copyConstructorProperties$1 = copyConstructorProperties$2;
+ var isForced$4 = isForced_1;
/*
options.target - name of the target object
@@ -506,6 +916,7 @@
options.sham - add a flag to not completely full polyfills
options.enumerable - export as enumerable property
options.noTargetGet - prevent calling a getter on target
+ options.name - the .name of the function if it does not match the key
*/
var _export = function (options, source) {
var TARGET = options.target;
@@ -513,80 +924,84 @@
var STATIC = options.stat;
var FORCED, target, key, targetProperty, sourceProperty, descriptor;
if (GLOBAL) {
- target = global_1;
+ target = global$14;
} else if (STATIC) {
- target = global_1[TARGET] || setGlobal(TARGET, {});
+ target = global$14[TARGET] || setGlobal(TARGET, {});
} else {
- target = (global_1[TARGET] || {}).prototype;
+ target = (global$14[TARGET] || {}).prototype;
}
if (target) for (key in source) {
sourceProperty = source[key];
if (options.noTargetGet) {
- descriptor = getOwnPropertyDescriptor$1(target, key);
+ descriptor = getOwnPropertyDescriptor$4(target, key);
targetProperty = descriptor && descriptor.value;
} else targetProperty = target[key];
- FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
+ FORCED = isForced$4(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
// contained in target
if (!FORCED && targetProperty !== undefined) {
- if (typeof sourceProperty === typeof targetProperty) continue;
- copyConstructorProperties(sourceProperty, targetProperty);
+ if (typeof sourceProperty == typeof targetProperty) continue;
+ copyConstructorProperties$1(sourceProperty, targetProperty);
}
// add a flag to not completely full polyfills
if (options.sham || (targetProperty && targetProperty.sham)) {
- createNonEnumerableProperty(sourceProperty, 'sham', true);
+ createNonEnumerableProperty$8(sourceProperty, 'sham', true);
}
// extend global
- redefine(target, key, sourceProperty, options);
+ redefine$g(target, key, sourceProperty, options);
}
};
+ var $$1e = _export;
+ var global$13 = global$1o;
+ var uncurryThis$O = functionUncurryThis;
+
+ var Date$1 = global$13.Date;
+ var getTime$2 = uncurryThis$O(Date$1.prototype.getTime);
+
// `Date.now` method
// https://tc39.es/ecma262/#sec-date.now
- _export({ target: 'Date', stat: true }, {
+ $$1e({ target: 'Date', stat: true }, {
now: function now() {
- return new Date().getTime();
+ return getTime$2(new Date$1());
}
});
- var DatePrototype = Date.prototype;
+ var uncurryThis$N = functionUncurryThis;
+ var redefine$f = redefine$h.exports;
+
+ var DatePrototype$1 = Date.prototype;
var INVALID_DATE = 'Invalid Date';
- var TO_STRING = 'toString';
- var nativeDateToString = DatePrototype[TO_STRING];
- var getTime = DatePrototype.getTime;
+ var TO_STRING$1 = 'toString';
+ var un$DateToString = uncurryThis$N(DatePrototype$1[TO_STRING$1]);
+ var getTime$1 = uncurryThis$N(DatePrototype$1.getTime);
// `Date.prototype.toString` method
// https://tc39.es/ecma262/#sec-date.prototype.tostring
- if (new Date(NaN) + '' != INVALID_DATE) {
- redefine(DatePrototype, TO_STRING, function toString() {
- var value = getTime.call(this);
+ if (String(new Date(NaN)) != INVALID_DATE) {
+ redefine$f(DatePrototype$1, TO_STRING$1, function toString() {
+ var value = getTime$1(this);
// eslint-disable-next-line no-self-compare -- NaN check
- return value === value ? nativeDateToString.call(this) : INVALID_DATE;
+ return value === value ? un$DateToString(this) : INVALID_DATE;
});
}
function _typeof(obj) {
"@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- _typeof = function (obj) {
- return typeof obj;
- };
- } else {
- _typeof = function (obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
- };
- }
-
- return _typeof(obj);
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
+ return typeof obj;
+ } : function (obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ }, _typeof(obj);
}
- function _classCallCheck(instance, Constructor) {
+ function _classCallCheck$1(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
- function _defineProperties(target, props) {
+ function _defineProperties$1(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
@@ -596,9 +1011,12 @@
}
}
- function _createClass(Constructor, protoProps, staticProps) {
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
- if (staticProps) _defineProperties(Constructor, staticProps);
+ function _createClass$1(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties$1(Constructor, staticProps);
+ Object.defineProperty(Constructor, "prototype", {
+ writable: false
+ });
return Constructor;
}
@@ -634,18 +1052,21 @@
}
function _iterableToArray(iter) {
- if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
function _iterableToArrayLimit(arr, i) {
- if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
+
+ if (_i == null) return;
var _arr = [];
var _n = true;
var _d = false;
- var _e = undefined;
+
+ var _s, _e;
try {
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
@@ -690,9 +1111,9 @@
}
function _createForOfIteratorHelper(o, allowArrayLike) {
- var it;
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
- if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
+ if (!it) {
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
if (it) o = it;
var i = 0;
@@ -725,7 +1146,7 @@
err;
return {
s: function () {
- it = o[Symbol.iterator]();
+ it = it.call(o);
},
n: function () {
var step = it.next();
@@ -746,228 +1167,95 @@
};
}
- var engineIsNode = classofRaw(global_1.process) == 'process';
-
- var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';
-
- var process$1 = global_1.process;
- var versions = process$1 && process$1.versions;
- var v8 = versions && versions.v8;
- var match, version;
-
- if (v8) {
- match = v8.split('.');
- version = match[0] + match[1];
- } else if (engineUserAgent) {
- match = engineUserAgent.match(/Edge\/(\d+)/);
- if (!match || match[1] >= 74) {
- match = engineUserAgent.match(/Chrome\/(\d+)/);
- if (match) version = match[1];
- }
- }
-
- var engineV8Version = version && +version;
+ var $$1d = _export;
+ var global$12 = global$1o;
- var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {
- /* global Symbol -- required for testing */
- return !Symbol.sham &&
- // Chrome 38 Symbol has incorrect toString conversion
- // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
- (engineIsNode ? engineV8Version === 38 : engineV8Version > 37 && engineV8Version < 41);
+ // `globalThis` object
+ // https://tc39.es/ecma262/#sec-globalthis
+ $$1d({ global: true }, {
+ globalThis: global$12
});
- var useSymbolAsUid = nativeSymbol
- /* global Symbol -- safe */
- && !Symbol.sham
- && typeof Symbol.iterator == 'symbol';
+ var global$11 = global$1o;
- var WellKnownSymbolsStore = shared('wks');
- var Symbol$1 = global_1.Symbol;
- var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;
+ var path$1 = global$11;
- var wellKnownSymbol = function (name) {
- if (!has(WellKnownSymbolsStore, name) || !(nativeSymbol || typeof WellKnownSymbolsStore[name] == 'string')) {
- if (nativeSymbol && has(Symbol$1, name)) {
- WellKnownSymbolsStore[name] = Symbol$1[name];
- } else {
- WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);
- }
- } return WellKnownSymbolsStore[name];
- };
+ var wellKnownSymbolWrapped = {};
- var f$5 = wellKnownSymbol;
+ var wellKnownSymbol$r = wellKnownSymbol$t;
- var wellKnownSymbolWrapped = {
- f: f$5
- };
+ wellKnownSymbolWrapped.f = wellKnownSymbol$r;
- var defineProperty = objectDefineProperty.f;
+ var path = path$1;
+ var hasOwn$e = hasOwnProperty_1;
+ var wrappedWellKnownSymbolModule$1 = wellKnownSymbolWrapped;
+ var defineProperty$c = objectDefineProperty.f;
- var defineWellKnownSymbol = function (NAME) {
+ var defineWellKnownSymbol$4 = function (NAME) {
var Symbol = path.Symbol || (path.Symbol = {});
- if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {
- value: wellKnownSymbolWrapped.f(NAME)
+ if (!hasOwn$e(Symbol, NAME)) defineProperty$c(Symbol, NAME, {
+ value: wrappedWellKnownSymbolModule$1.f(NAME)
});
};
+ var defineWellKnownSymbol$3 = defineWellKnownSymbol$4;
+
// `Symbol.iterator` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.iterator
- defineWellKnownSymbol('iterator');
-
- var TO_STRING_TAG = wellKnownSymbol('toStringTag');
- var test = {};
-
- test[TO_STRING_TAG] = 'z';
+ defineWellKnownSymbol$3('iterator');
- var toStringTagSupport = String(test) === '[object z]';
+ var objectDefineProperties = {};
- var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');
- // ES3 wrong here
- var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
-
- // fallback for IE11 Script Access Denied error
- var tryGet = function (it, key) {
- try {
- return it[key];
- } catch (error) { /* empty */ }
- };
-
- // getting tag from ES6+ `Object.prototype.toString`
- var classof = toStringTagSupport ? classofRaw : function (it) {
- var O, tag, result;
- return it === undefined ? 'Undefined' : it === null ? 'Null'
- // @@toStringTag case
- : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$1)) == 'string' ? tag
- // builtinTag case
- : CORRECT_ARGUMENTS ? classofRaw(O)
- // ES3 arguments fallback
- : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;
- };
-
- // `Object.prototype.toString` method implementation
- // https://tc39.es/ecma262/#sec-object.prototype.tostring
- var objectToString = toStringTagSupport ? {}.toString : function toString() {
- return '[object ' + classof(this) + ']';
- };
-
- // `Object.prototype.toString` method
- // https://tc39.es/ecma262/#sec-object.prototype.tostring
- if (!toStringTagSupport) {
- redefine(Object.prototype, 'toString', objectToString, { unsafe: true });
- }
-
- // `String.prototype.{ codePointAt, at }` methods implementation
- var createMethod$1 = function (CONVERT_TO_STRING) {
- return function ($this, pos) {
- var S = String(requireObjectCoercible($this));
- var position = toInteger(pos);
- var size = S.length;
- var first, second;
- if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
- first = S.charCodeAt(position);
- return first < 0xD800 || first > 0xDBFF || position + 1 === size
- || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF
- ? CONVERT_TO_STRING ? S.charAt(position) : first
- : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
- };
- };
-
- var stringMultibyte = {
- // `String.prototype.codePointAt` method
- // https://tc39.es/ecma262/#sec-string.prototype.codepointat
- codeAt: createMethod$1(false),
- // `String.prototype.at` method
- // https://github.com/mathiasbynens/String.prototype.at
- charAt: createMethod$1(true)
- };
-
- // `ToObject` abstract operation
- // https://tc39.es/ecma262/#sec-toobject
- var toObject = function (argument) {
- return Object(requireObjectCoercible(argument));
- };
-
- var correctPrototypeGetter = !fails(function () {
- function F() { /* empty */ }
- F.prototype.constructor = null;
- return Object.getPrototypeOf(new F()) !== F.prototype;
- });
-
- var IE_PROTO = sharedKey('IE_PROTO');
- var ObjectPrototype = Object.prototype;
-
- // `Object.getPrototypeOf` method
- // https://tc39.es/ecma262/#sec-object.getprototypeof
- var objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {
- O = toObject(O);
- if (has(O, IE_PROTO)) return O[IE_PROTO];
- if (typeof O.constructor == 'function' && O instanceof O.constructor) {
- return O.constructor.prototype;
- } return O instanceof Object ? ObjectPrototype : null;
- };
-
- var ITERATOR = wellKnownSymbol('iterator');
- var BUGGY_SAFARI_ITERATORS = false;
-
- var returnThis = function () { return this; };
-
- // `%IteratorPrototype%` object
- // https://tc39.es/ecma262/#sec-%iteratorprototype%-object
- var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
-
- if ([].keys) {
- arrayIterator = [].keys();
- // Safari 8 has buggy iterators w/o `next`
- if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
- else {
- PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));
- if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
- }
- }
-
- var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {
- var test = {};
- // FF44- legacy iterators case
- return IteratorPrototype[ITERATOR].call(test) !== test;
- });
-
- if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};
-
- // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
- if ( !has(IteratorPrototype, ITERATOR)) {
- createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);
- }
-
- var iteratorsCore = {
- IteratorPrototype: IteratorPrototype,
- BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
- };
+ var internalObjectKeys = objectKeysInternal;
+ var enumBugKeys$1 = enumBugKeys$3;
// `Object.keys` method
// https://tc39.es/ecma262/#sec-object.keys
- var objectKeys = Object.keys || function keys(O) {
- return objectKeysInternal(O, enumBugKeys);
+ // eslint-disable-next-line es/no-object-keys -- safe
+ var objectKeys$4 = Object.keys || function keys(O) {
+ return internalObjectKeys(O, enumBugKeys$1);
};
+ var DESCRIPTORS$j = descriptors;
+ var V8_PROTOTYPE_DEFINE_BUG = v8PrototypeDefineBug;
+ var definePropertyModule$5 = objectDefineProperty;
+ var anObject$k = anObject$n;
+ var toIndexedObject$9 = toIndexedObject$d;
+ var objectKeys$3 = objectKeys$4;
+
// `Object.defineProperties` method
// https://tc39.es/ecma262/#sec-object.defineproperties
- var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
- anObject(O);
- var keys = objectKeys(Properties);
+ // eslint-disable-next-line es/no-object-defineproperties -- safe
+ objectDefineProperties.f = DESCRIPTORS$j && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject$k(O);
+ var props = toIndexedObject$9(Properties);
+ var keys = objectKeys$3(Properties);
var length = keys.length;
var index = 0;
var key;
- while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);
+ while (length > index) definePropertyModule$5.f(O, key = keys[index++], props[key]);
return O;
};
- var html = getBuiltIn('document', 'documentElement');
+ var getBuiltIn$7 = getBuiltIn$b;
+
+ var html$2 = getBuiltIn$7('document', 'documentElement');
+
+ /* global ActiveXObject -- old IE, WSH */
+
+ var anObject$j = anObject$n;
+ var definePropertiesModule$1 = objectDefineProperties;
+ var enumBugKeys = enumBugKeys$3;
+ var hiddenKeys$2 = hiddenKeys$6;
+ var html$1 = html$2;
+ var documentCreateElement$1 = documentCreateElement$2;
+ var sharedKey$2 = sharedKey$4;
var GT = '>';
var LT = '<';
- var PROTOTYPE = 'prototype';
+ var PROTOTYPE$2 = 'prototype';
var SCRIPT = 'script';
- var IE_PROTO$1 = sharedKey('IE_PROTO');
+ var IE_PROTO$1 = sharedKey$2('IE_PROTO');
var EmptyConstructor = function () { /* empty */ };
@@ -987,11 +1275,11 @@
// Create object with fake `null` prototype: use iframe Object with cleared prototype
var NullProtoObjectViaIFrame = function () {
// Thrash, waste and sodomy: IE GC bug
- var iframe = documentCreateElement('iframe');
+ var iframe = documentCreateElement$1('iframe');
var JS = 'java' + SCRIPT + ':';
var iframeDocument;
iframe.style.display = 'none';
- html.appendChild(iframe);
+ html$1.appendChild(iframe);
// https://github.com/zloirock/core-js/issues/475
iframe.src = String(JS);
iframeDocument = iframe.contentWindow.document;
@@ -1009,107 +1297,233 @@
var activeXDocument;
var NullProtoObject = function () {
try {
- /* global ActiveXObject -- old IE */
- activeXDocument = document.domain && new ActiveXObject('htmlfile');
+ activeXDocument = new ActiveXObject('htmlfile');
} catch (error) { /* ignore */ }
- NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();
+ NullProtoObject = typeof document != 'undefined'
+ ? document.domain && activeXDocument
+ ? NullProtoObjectViaActiveX(activeXDocument) // old IE
+ : NullProtoObjectViaIFrame()
+ : NullProtoObjectViaActiveX(activeXDocument); // WSH
var length = enumBugKeys.length;
- while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
+ while (length--) delete NullProtoObject[PROTOTYPE$2][enumBugKeys[length]];
return NullProtoObject();
};
- hiddenKeys[IE_PROTO$1] = true;
+ hiddenKeys$2[IE_PROTO$1] = true;
// `Object.create` method
// https://tc39.es/ecma262/#sec-object.create
var objectCreate = Object.create || function create(O, Properties) {
var result;
if (O !== null) {
- EmptyConstructor[PROTOTYPE] = anObject(O);
+ EmptyConstructor[PROTOTYPE$2] = anObject$j(O);
result = new EmptyConstructor();
- EmptyConstructor[PROTOTYPE] = null;
+ EmptyConstructor[PROTOTYPE$2] = null;
// add "__proto__" for Object.getPrototypeOf polyfill
result[IE_PROTO$1] = O;
} else result = NullProtoObject();
- return Properties === undefined ? result : objectDefineProperties(result, Properties);
+ return Properties === undefined ? result : definePropertiesModule$1.f(result, Properties);
};
- var defineProperty$1 = objectDefineProperty.f;
-
+ var wellKnownSymbol$q = wellKnownSymbol$t;
+ var create$a = objectCreate;
+ var definePropertyModule$4 = objectDefineProperty;
+ var UNSCOPABLES = wellKnownSymbol$q('unscopables');
+ var ArrayPrototype$1 = Array.prototype;
- var TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');
+ // Array.prototype[@@unscopables]
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+ if (ArrayPrototype$1[UNSCOPABLES] == undefined) {
+ definePropertyModule$4.f(ArrayPrototype$1, UNSCOPABLES, {
+ configurable: true,
+ value: create$a(null)
+ });
+ }
- var setToStringTag = function (it, TAG, STATIC) {
- if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG$2)) {
- defineProperty$1(it, TO_STRING_TAG$2, { configurable: true, value: TAG });
- }
+ // add a key to Array.prototype[@@unscopables]
+ var addToUnscopables$6 = function (key) {
+ ArrayPrototype$1[UNSCOPABLES][key] = true;
};
var iterators = {};
- var IteratorPrototype$1 = iteratorsCore.IteratorPrototype;
+ var fails$N = fails$V;
+
+ var correctPrototypeGetter = !fails$N(function () {
+ function F() { /* empty */ }
+ F.prototype.constructor = null;
+ // eslint-disable-next-line es/no-object-getprototypeof -- required for testing
+ return Object.getPrototypeOf(new F()) !== F.prototype;
+ });
+
+ var global$10 = global$1o;
+ var hasOwn$d = hasOwnProperty_1;
+ var isCallable$h = isCallable$r;
+ var toObject$g = toObject$i;
+ var sharedKey$1 = sharedKey$4;
+ var CORRECT_PROTOTYPE_GETTER$1 = correctPrototypeGetter;
+
+ var IE_PROTO = sharedKey$1('IE_PROTO');
+ var Object$2 = global$10.Object;
+ var ObjectPrototype$4 = Object$2.prototype;
+
+ // `Object.getPrototypeOf` method
+ // https://tc39.es/ecma262/#sec-object.getprototypeof
+ var objectGetPrototypeOf = CORRECT_PROTOTYPE_GETTER$1 ? Object$2.getPrototypeOf : function (O) {
+ var object = toObject$g(O);
+ if (hasOwn$d(object, IE_PROTO)) return object[IE_PROTO];
+ var constructor = object.constructor;
+ if (isCallable$h(constructor) && object instanceof constructor) {
+ return constructor.prototype;
+ } return object instanceof Object$2 ? ObjectPrototype$4 : null;
+ };
+
+ var fails$M = fails$V;
+ var isCallable$g = isCallable$r;
+ var getPrototypeOf$4 = objectGetPrototypeOf;
+ var redefine$e = redefine$h.exports;
+ var wellKnownSymbol$p = wellKnownSymbol$t;
+
+ var ITERATOR$a = wellKnownSymbol$p('iterator');
+ var BUGGY_SAFARI_ITERATORS$1 = false;
+
+ // `%IteratorPrototype%` object
+ // https://tc39.es/ecma262/#sec-%iteratorprototype%-object
+ var IteratorPrototype$2, PrototypeOfArrayIteratorPrototype, arrayIterator;
+
+ /* eslint-disable es/no-array-prototype-keys -- safe */
+ if ([].keys) {
+ arrayIterator = [].keys();
+ // Safari 8 has buggy iterators w/o `next`
+ if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS$1 = true;
+ else {
+ PrototypeOfArrayIteratorPrototype = getPrototypeOf$4(getPrototypeOf$4(arrayIterator));
+ if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype$2 = PrototypeOfArrayIteratorPrototype;
+ }
+ }
+ var NEW_ITERATOR_PROTOTYPE = IteratorPrototype$2 == undefined || fails$M(function () {
+ var test = {};
+ // FF44- legacy iterators case
+ return IteratorPrototype$2[ITERATOR$a].call(test) !== test;
+ });
+ if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype$2 = {};
+ // `%IteratorPrototype%[@@iterator]()` method
+ // https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
+ if (!isCallable$g(IteratorPrototype$2[ITERATOR$a])) {
+ redefine$e(IteratorPrototype$2, ITERATOR$a, function () {
+ return this;
+ });
+ }
+
+ var iteratorsCore = {
+ IteratorPrototype: IteratorPrototype$2,
+ BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS$1
+ };
+ var defineProperty$b = objectDefineProperty.f;
+ var hasOwn$c = hasOwnProperty_1;
+ var wellKnownSymbol$o = wellKnownSymbol$t;
+
+ var TO_STRING_TAG$4 = wellKnownSymbol$o('toStringTag');
+
+ var setToStringTag$a = function (target, TAG, STATIC) {
+ if (target && !STATIC) target = target.prototype;
+ if (target && !hasOwn$c(target, TO_STRING_TAG$4)) {
+ defineProperty$b(target, TO_STRING_TAG$4, { configurable: true, value: TAG });
+ }
+ };
+
+ var IteratorPrototype$1 = iteratorsCore.IteratorPrototype;
+ var create$9 = objectCreate;
+ var createPropertyDescriptor$4 = createPropertyDescriptor$7;
+ var setToStringTag$9 = setToStringTag$a;
+ var Iterators$4 = iterators;
var returnThis$1 = function () { return this; };
- var createIteratorConstructor = function (IteratorConstructor, NAME, next) {
+ var createIteratorConstructor$2 = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {
var TO_STRING_TAG = NAME + ' Iterator';
- IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });
- setToStringTag(IteratorConstructor, TO_STRING_TAG, false);
- iterators[TO_STRING_TAG] = returnThis$1;
+ IteratorConstructor.prototype = create$9(IteratorPrototype$1, { next: createPropertyDescriptor$4(+!ENUMERABLE_NEXT, next) });
+ setToStringTag$9(IteratorConstructor, TO_STRING_TAG, false);
+ Iterators$4[TO_STRING_TAG] = returnThis$1;
return IteratorConstructor;
};
- var aPossiblePrototype = function (it) {
- if (!isObject(it) && it !== null) {
- throw TypeError("Can't set " + String(it) + ' as a prototype');
- } return it;
+ var global$$ = global$1o;
+ var isCallable$f = isCallable$r;
+
+ var String$4 = global$$.String;
+ var TypeError$i = global$$.TypeError;
+
+ var aPossiblePrototype$1 = function (argument) {
+ if (typeof argument == 'object' || isCallable$f(argument)) return argument;
+ throw TypeError$i("Can't set " + String$4(argument) + ' as a prototype');
};
/* eslint-disable no-proto -- safe */
-
+ var uncurryThis$M = functionUncurryThis;
+ var anObject$i = anObject$n;
+ var aPossiblePrototype = aPossiblePrototype$1;
// `Object.setPrototypeOf` method
// https://tc39.es/ecma262/#sec-object.setprototypeof
// Works with __proto__ only. Old v8 can't work with null proto objects.
+ // eslint-disable-next-line es/no-object-setprototypeof -- safe
var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {
var CORRECT_SETTER = false;
var test = {};
var setter;
try {
- setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;
- setter.call(test, []);
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ setter = uncurryThis$M(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);
+ setter(test, []);
CORRECT_SETTER = test instanceof Array;
} catch (error) { /* empty */ }
return function setPrototypeOf(O, proto) {
- anObject(O);
+ anObject$i(O);
aPossiblePrototype(proto);
- if (CORRECT_SETTER) setter.call(O, proto);
+ if (CORRECT_SETTER) setter(O, proto);
else O.__proto__ = proto;
return O;
};
}() : undefined);
- var IteratorPrototype$2 = iteratorsCore.IteratorPrototype;
- var BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;
- var ITERATOR$1 = wellKnownSymbol('iterator');
+ var $$1c = _export;
+ var call$l = functionCall;
+ var FunctionName$1 = functionName;
+ var isCallable$e = isCallable$r;
+ var createIteratorConstructor$1 = createIteratorConstructor$2;
+ var getPrototypeOf$3 = objectGetPrototypeOf;
+ var setPrototypeOf$6 = objectSetPrototypeOf;
+ var setToStringTag$8 = setToStringTag$a;
+ var createNonEnumerableProperty$7 = createNonEnumerableProperty$b;
+ var redefine$d = redefine$h.exports;
+ var wellKnownSymbol$n = wellKnownSymbol$t;
+ var Iterators$3 = iterators;
+ var IteratorsCore = iteratorsCore;
+
+ var PROPER_FUNCTION_NAME$3 = FunctionName$1.PROPER;
+ var CONFIGURABLE_FUNCTION_NAME$1 = FunctionName$1.CONFIGURABLE;
+ var IteratorPrototype = IteratorsCore.IteratorPrototype;
+ var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
+ var ITERATOR$9 = wellKnownSymbol$n('iterator');
var KEYS = 'keys';
var VALUES = 'values';
var ENTRIES = 'entries';
- var returnThis$2 = function () { return this; };
+ var returnThis = function () { return this; };
- var defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
- createIteratorConstructor(IteratorConstructor, NAME, next);
+ var defineIterator$3 = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
+ createIteratorConstructor$1(IteratorConstructor, NAME, next);
var getIterationMethod = function (KIND) {
if (KIND === DEFAULT && defaultIterator) return defaultIterator;
- if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];
+ if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
switch (KIND) {
case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
@@ -1120,40 +1534,38 @@
var TO_STRING_TAG = NAME + ' Iterator';
var INCORRECT_VALUES_NAME = false;
var IterablePrototype = Iterable.prototype;
- var nativeIterator = IterablePrototype[ITERATOR$1]
+ var nativeIterator = IterablePrototype[ITERATOR$9]
|| IterablePrototype['@@iterator']
|| DEFAULT && IterablePrototype[DEFAULT];
- var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);
+ var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
var CurrentIteratorPrototype, methods, KEY;
// fix native
if (anyNativeIterator) {
- CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));
- if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {
- if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {
- if (objectSetPrototypeOf) {
- objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);
- } else if (typeof CurrentIteratorPrototype[ITERATOR$1] != 'function') {
- createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$1, returnThis$2);
+ CurrentIteratorPrototype = getPrototypeOf$3(anyNativeIterator.call(new Iterable()));
+ if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
+ if (getPrototypeOf$3(CurrentIteratorPrototype) !== IteratorPrototype) {
+ if (setPrototypeOf$6) {
+ setPrototypeOf$6(CurrentIteratorPrototype, IteratorPrototype);
+ } else if (!isCallable$e(CurrentIteratorPrototype[ITERATOR$9])) {
+ redefine$d(CurrentIteratorPrototype, ITERATOR$9, returnThis);
}
}
// Set @@toStringTag to native iterators
- setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);
+ setToStringTag$8(CurrentIteratorPrototype, TO_STRING_TAG, true);
}
}
- // fix Array#{values, @@iterator}.name in V8 / FF
- if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
- INCORRECT_VALUES_NAME = true;
- defaultIterator = function values() { return nativeIterator.call(this); };
- }
-
- // define iterator
- if ( IterablePrototype[ITERATOR$1] !== defaultIterator) {
- createNonEnumerableProperty(IterablePrototype, ITERATOR$1, defaultIterator);
+ // fix Array.prototype.{ values, @@iterator }.name in V8 / FF
+ if (PROPER_FUNCTION_NAME$3 && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
+ if (CONFIGURABLE_FUNCTION_NAME$1) {
+ createNonEnumerableProperty$7(IterablePrototype, 'name', VALUES);
+ } else {
+ INCORRECT_VALUES_NAME = true;
+ defaultIterator = function values() { return call$l(nativeIterator, this); };
+ }
}
- iterators[NAME] = defaultIterator;
// export additional methods
if (DEFAULT) {
@@ -1163,64 +1575,32 @@
entries: getIterationMethod(ENTRIES)
};
if (FORCED) for (KEY in methods) {
- if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
- redefine(IterablePrototype, KEY, methods[KEY]);
+ if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
+ redefine$d(IterablePrototype, KEY, methods[KEY]);
}
- } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods);
+ } else $$1c({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
}
+ // define iterator
+ if (IterablePrototype[ITERATOR$9] !== defaultIterator) {
+ redefine$d(IterablePrototype, ITERATOR$9, defaultIterator, { name: DEFAULT });
+ }
+ Iterators$3[NAME] = defaultIterator;
+
return methods;
};
- var charAt = stringMultibyte.charAt;
-
-
-
- var STRING_ITERATOR = 'String Iterator';
- var setInternalState = internalState.set;
- var getInternalState = internalState.getterFor(STRING_ITERATOR);
-
- // `String.prototype[@@iterator]` method
- // https://tc39.es/ecma262/#sec-string.prototype-@@iterator
- defineIterator(String, 'String', function (iterated) {
- setInternalState(this, {
- type: STRING_ITERATOR,
- string: String(iterated),
- index: 0
- });
- // `%StringIteratorPrototype%.next` method
- // https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next
- }, function next() {
- var state = getInternalState(this);
- var string = state.string;
- var index = state.index;
- var point;
- if (index >= string.length) return { value: undefined, done: true };
- point = charAt(string, index);
- state.index += point.length;
- return { value: point, done: false };
- });
-
- var UNSCOPABLES = wellKnownSymbol('unscopables');
- var ArrayPrototype = Array.prototype;
-
- // Array.prototype[@@unscopables]
- // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
- if (ArrayPrototype[UNSCOPABLES] == undefined) {
- objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, {
- configurable: true,
- value: objectCreate(null)
- });
- }
-
- // add a key to Array.prototype[@@unscopables]
- var addToUnscopables = function (key) {
- ArrayPrototype[UNSCOPABLES][key] = true;
- };
+ var toIndexedObject$8 = toIndexedObject$d;
+ var addToUnscopables$5 = addToUnscopables$6;
+ var Iterators$2 = iterators;
+ var InternalStateModule$8 = internalState;
+ var defineProperty$a = objectDefineProperty.f;
+ var defineIterator$2 = defineIterator$3;
+ var DESCRIPTORS$i = descriptors;
var ARRAY_ITERATOR = 'Array Iterator';
- var setInternalState$1 = internalState.set;
- var getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR);
+ var setInternalState$8 = InternalStateModule$8.set;
+ var getInternalState$6 = InternalStateModule$8.getterFor(ARRAY_ITERATOR);
// `Array.prototype.entries` method
// https://tc39.es/ecma262/#sec-array.prototype.entries
@@ -1232,17 +1612,17 @@
// https://tc39.es/ecma262/#sec-array.prototype-@@iterator
// `CreateArrayIterator` internal method
// https://tc39.es/ecma262/#sec-createarrayiterator
- var es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {
- setInternalState$1(this, {
+ var es_array_iterator = defineIterator$2(Array, 'Array', function (iterated, kind) {
+ setInternalState$8(this, {
type: ARRAY_ITERATOR,
- target: toIndexedObject(iterated), // target
+ target: toIndexedObject$8(iterated), // target
index: 0, // next index
kind: kind // kind
});
// `%ArrayIteratorPrototype%.next` method
// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next
}, function () {
- var state = getInternalState$1(this);
+ var state = getInternalState$6(this);
var target = state.target;
var kind = state.kind;
var index = state.index++;
@@ -1258,12 +1638,153 @@
// argumentsList[@@iterator] is %ArrayProto_values%
// https://tc39.es/ecma262/#sec-createunmappedargumentsobject
// https://tc39.es/ecma262/#sec-createmappedargumentsobject
- iterators.Arguments = iterators.Array;
+ var values = Iterators$2.Arguments = Iterators$2.Array;
// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
- addToUnscopables('keys');
- addToUnscopables('values');
- addToUnscopables('entries');
+ addToUnscopables$5('keys');
+ addToUnscopables$5('values');
+ addToUnscopables$5('entries');
+
+ // V8 ~ Chrome 45- bug
+ if (DESCRIPTORS$i && values.name !== 'values') try {
+ defineProperty$a(values, 'name', { value: 'values' });
+ } catch (error) { /* empty */ }
+
+ var wellKnownSymbol$m = wellKnownSymbol$t;
+
+ var TO_STRING_TAG$3 = wellKnownSymbol$m('toStringTag');
+ var test$2 = {};
+
+ test$2[TO_STRING_TAG$3] = 'z';
+
+ var toStringTagSupport = String(test$2) === '[object z]';
+
+ var global$_ = global$1o;
+ var TO_STRING_TAG_SUPPORT$2 = toStringTagSupport;
+ var isCallable$d = isCallable$r;
+ var classofRaw = classofRaw$1;
+ var wellKnownSymbol$l = wellKnownSymbol$t;
+
+ var TO_STRING_TAG$2 = wellKnownSymbol$l('toStringTag');
+ var Object$1 = global$_.Object;
+
+ // ES3 wrong here
+ var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
+
+ // fallback for IE11 Script Access Denied error
+ var tryGet = function (it, key) {
+ try {
+ return it[key];
+ } catch (error) { /* empty */ }
+ };
+
+ // getting tag from ES6+ `Object.prototype.toString`
+ var classof$d = TO_STRING_TAG_SUPPORT$2 ? classofRaw : function (it) {
+ var O, tag, result;
+ return it === undefined ? 'Undefined' : it === null ? 'Null'
+ // @@toStringTag case
+ : typeof (tag = tryGet(O = Object$1(it), TO_STRING_TAG$2)) == 'string' ? tag
+ // builtinTag case
+ : CORRECT_ARGUMENTS ? classofRaw(O)
+ // ES3 arguments fallback
+ : (result = classofRaw(O)) == 'Object' && isCallable$d(O.callee) ? 'Arguments' : result;
+ };
+
+ var TO_STRING_TAG_SUPPORT$1 = toStringTagSupport;
+ var classof$c = classof$d;
+
+ // `Object.prototype.toString` method implementation
+ // https://tc39.es/ecma262/#sec-object.prototype.tostring
+ var objectToString$1 = TO_STRING_TAG_SUPPORT$1 ? {}.toString : function toString() {
+ return '[object ' + classof$c(this) + ']';
+ };
+
+ var TO_STRING_TAG_SUPPORT = toStringTagSupport;
+ var redefine$c = redefine$h.exports;
+ var toString$l = objectToString$1;
+
+ // `Object.prototype.toString` method
+ // https://tc39.es/ecma262/#sec-object.prototype.tostring
+ if (!TO_STRING_TAG_SUPPORT) {
+ redefine$c(Object.prototype, 'toString', toString$l, { unsafe: true });
+ }
+
+ var global$Z = global$1o;
+ var classof$b = classof$d;
+
+ var String$3 = global$Z.String;
+
+ var toString$k = function (argument) {
+ if (classof$b(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');
+ return String$3(argument);
+ };
+
+ var uncurryThis$L = functionUncurryThis;
+ var toIntegerOrInfinity$8 = toIntegerOrInfinity$b;
+ var toString$j = toString$k;
+ var requireObjectCoercible$b = requireObjectCoercible$e;
+
+ var charAt$8 = uncurryThis$L(''.charAt);
+ var charCodeAt$2 = uncurryThis$L(''.charCodeAt);
+ var stringSlice$b = uncurryThis$L(''.slice);
+
+ var createMethod$5 = function (CONVERT_TO_STRING) {
+ return function ($this, pos) {
+ var S = toString$j(requireObjectCoercible$b($this));
+ var position = toIntegerOrInfinity$8(pos);
+ var size = S.length;
+ var first, second;
+ if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
+ first = charCodeAt$2(S, position);
+ return first < 0xD800 || first > 0xDBFF || position + 1 === size
+ || (second = charCodeAt$2(S, position + 1)) < 0xDC00 || second > 0xDFFF
+ ? CONVERT_TO_STRING
+ ? charAt$8(S, position)
+ : first
+ : CONVERT_TO_STRING
+ ? stringSlice$b(S, position, position + 2)
+ : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
+ };
+ };
+
+ var stringMultibyte = {
+ // `String.prototype.codePointAt` method
+ // https://tc39.es/ecma262/#sec-string.prototype.codepointat
+ codeAt: createMethod$5(false),
+ // `String.prototype.at` method
+ // https://github.com/mathiasbynens/String.prototype.at
+ charAt: createMethod$5(true)
+ };
+
+ var charAt$7 = stringMultibyte.charAt;
+ var toString$i = toString$k;
+ var InternalStateModule$7 = internalState;
+ var defineIterator$1 = defineIterator$3;
+
+ var STRING_ITERATOR = 'String Iterator';
+ var setInternalState$7 = InternalStateModule$7.set;
+ var getInternalState$5 = InternalStateModule$7.getterFor(STRING_ITERATOR);
+
+ // `String.prototype[@@iterator]` method
+ // https://tc39.es/ecma262/#sec-string.prototype-@@iterator
+ defineIterator$1(String, 'String', function (iterated) {
+ setInternalState$7(this, {
+ type: STRING_ITERATOR,
+ string: toString$i(iterated),
+ index: 0
+ });
+ // `%StringIteratorPrototype%.next` method
+ // https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next
+ }, function next() {
+ var state = getInternalState$5(this);
+ var string = state.string;
+ var index = state.index;
+ var point;
+ if (index >= string.length) return { value: undefined, done: true };
+ point = charAt$7(string, index);
+ state.index += point.length;
+ return { value: point, done: false };
+ });
// iterable DOM collections
// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
@@ -1301,131 +1822,257 @@
TouchList: 0
};
- var ITERATOR$2 = wellKnownSymbol('iterator');
- var TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');
- var ArrayValues = es_array_iterator.values;
+ // in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`
+ var documentCreateElement = documentCreateElement$2;
+
+ var classList$1 = documentCreateElement('span').classList;
+ var DOMTokenListPrototype$2 = classList$1 && classList$1.constructor && classList$1.constructor.prototype;
+
+ var domTokenListPrototype = DOMTokenListPrototype$2 === Object.prototype ? undefined : DOMTokenListPrototype$2;
+
+ var global$Y = global$1o;
+ var DOMIterables$1 = domIterables;
+ var DOMTokenListPrototype$1 = domTokenListPrototype;
+ var ArrayIteratorMethods = es_array_iterator;
+ var createNonEnumerableProperty$6 = createNonEnumerableProperty$b;
+ var wellKnownSymbol$k = wellKnownSymbol$t;
+
+ var ITERATOR$8 = wellKnownSymbol$k('iterator');
+ var TO_STRING_TAG$1 = wellKnownSymbol$k('toStringTag');
+ var ArrayValues = ArrayIteratorMethods.values;
- for (var COLLECTION_NAME in domIterables) {
- var Collection = global_1[COLLECTION_NAME];
- var CollectionPrototype = Collection && Collection.prototype;
+ var handlePrototype$1 = function (CollectionPrototype, COLLECTION_NAME) {
if (CollectionPrototype) {
// some Chrome versions have non-configurable methods on DOMTokenList
- if (CollectionPrototype[ITERATOR$2] !== ArrayValues) try {
- createNonEnumerableProperty(CollectionPrototype, ITERATOR$2, ArrayValues);
+ if (CollectionPrototype[ITERATOR$8] !== ArrayValues) try {
+ createNonEnumerableProperty$6(CollectionPrototype, ITERATOR$8, ArrayValues);
} catch (error) {
- CollectionPrototype[ITERATOR$2] = ArrayValues;
+ CollectionPrototype[ITERATOR$8] = ArrayValues;
}
- if (!CollectionPrototype[TO_STRING_TAG$3]) {
- createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG$3, COLLECTION_NAME);
+ if (!CollectionPrototype[TO_STRING_TAG$1]) {
+ createNonEnumerableProperty$6(CollectionPrototype, TO_STRING_TAG$1, COLLECTION_NAME);
}
- if (domIterables[COLLECTION_NAME]) for (var METHOD_NAME in es_array_iterator) {
+ if (DOMIterables$1[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {
// some Chrome versions have non-configurable methods on DOMTokenList
- if (CollectionPrototype[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {
- createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, es_array_iterator[METHOD_NAME]);
+ if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {
+ createNonEnumerableProperty$6(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);
} catch (error) {
- CollectionPrototype[METHOD_NAME] = es_array_iterator[METHOD_NAME];
+ CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];
}
}
}
+ };
+
+ for (var COLLECTION_NAME$1 in DOMIterables$1) {
+ handlePrototype$1(global$Y[COLLECTION_NAME$1] && global$Y[COLLECTION_NAME$1].prototype, COLLECTION_NAME$1);
}
+ handlePrototype$1(DOMTokenListPrototype$1, 'DOMTokenList');
+
+ var NATIVE_BIND$2 = functionBindNative;
+
+ var FunctionPrototype$1 = Function.prototype;
+ var apply$9 = FunctionPrototype$1.apply;
+ var call$k = FunctionPrototype$1.call;
+
+ // eslint-disable-next-line es/no-reflect -- safe
+ var functionApply = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND$2 ? call$k.bind(apply$9) : function () {
+ return call$k.apply(apply$9, arguments);
+ });
+
+ var classof$a = classofRaw$1;
+
// `IsArray` abstract operation
// https://tc39.es/ecma262/#sec-isarray
- var isArray = Array.isArray || function isArray(arg) {
- return classofRaw(arg) == 'Array';
+ // eslint-disable-next-line es/no-array-isarray -- safe
+ var isArray$8 = Array.isArray || function isArray(argument) {
+ return classof$a(argument) == 'Array';
+ };
+
+ var objectGetOwnPropertyNamesExternal = {};
+
+ var toPropertyKey$2 = toPropertyKey$5;
+ var definePropertyModule$3 = objectDefineProperty;
+ var createPropertyDescriptor$3 = createPropertyDescriptor$7;
+
+ var createProperty$5 = function (object, key, value) {
+ var propertyKey = toPropertyKey$2(key);
+ if (propertyKey in object) definePropertyModule$3.f(object, propertyKey, createPropertyDescriptor$3(0, value));
+ else object[propertyKey] = value;
};
- var nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;
+ var global$X = global$1o;
+ var toAbsoluteIndex$7 = toAbsoluteIndex$9;
+ var lengthOfArrayLike$g = lengthOfArrayLike$i;
+ var createProperty$4 = createProperty$5;
+
+ var Array$7 = global$X.Array;
+ var max$4 = Math.max;
+
+ var arraySliceSimple = function (O, start, end) {
+ var length = lengthOfArrayLike$g(O);
+ var k = toAbsoluteIndex$7(start, length);
+ var fin = toAbsoluteIndex$7(end === undefined ? length : end, length);
+ var result = Array$7(max$4(fin - k, 0));
+ for (var n = 0; k < fin; k++, n++) createProperty$4(result, n, O[k]);
+ result.length = n;
+ return result;
+ };
- var toString$1 = {}.toString;
+ /* eslint-disable es/no-object-getownpropertynames -- safe */
+
+ var classof$9 = classofRaw$1;
+ var toIndexedObject$7 = toIndexedObject$d;
+ var $getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;
+ var arraySlice$c = arraySliceSimple;
var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
? Object.getOwnPropertyNames(window) : [];
var getWindowNames = function (it) {
try {
- return nativeGetOwnPropertyNames(it);
+ return $getOwnPropertyNames$1(it);
} catch (error) {
- return windowNames.slice();
+ return arraySlice$c(windowNames);
}
};
// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
- var f$6 = function getOwnPropertyNames(it) {
- return windowNames && toString$1.call(it) == '[object Window]'
+ objectGetOwnPropertyNamesExternal.f = function getOwnPropertyNames(it) {
+ return windowNames && classof$9(it) == 'Window'
? getWindowNames(it)
- : nativeGetOwnPropertyNames(toIndexedObject(it));
+ : $getOwnPropertyNames$1(toIndexedObject$7(it));
};
- var objectGetOwnPropertyNamesExternal = {
- f: f$6
- };
+ var uncurryThis$K = functionUncurryThis;
- var aFunction$1 = function (it) {
- if (typeof it != 'function') {
- throw TypeError(String(it) + ' is not a function');
- } return it;
- };
+ var arraySlice$b = uncurryThis$K([].slice);
+
+ var uncurryThis$J = functionUncurryThis;
+ var aCallable$8 = aCallable$a;
+ var NATIVE_BIND$1 = functionBindNative;
+
+ var bind$f = uncurryThis$J(uncurryThis$J.bind);
// optional / simple context binding
- var functionBindContext = function (fn, that, length) {
- aFunction$1(fn);
- if (that === undefined) return fn;
- switch (length) {
- case 0: return function () {
- return fn.call(that);
- };
- case 1: return function (a) {
- return fn.call(that, a);
- };
- case 2: return function (a, b) {
- return fn.call(that, a, b);
- };
- case 3: return function (a, b, c) {
- return fn.call(that, a, b, c);
- };
- }
- return function (/* ...args */) {
+ var functionBindContext = function (fn, that) {
+ aCallable$8(fn);
+ return that === undefined ? fn : NATIVE_BIND$1 ? bind$f(fn, that) : function (/* ...args */) {
return fn.apply(that, arguments);
};
};
- var SPECIES = wellKnownSymbol('species');
+ var uncurryThis$I = functionUncurryThis;
+ var fails$L = fails$V;
+ var isCallable$c = isCallable$r;
+ var classof$8 = classof$d;
+ var getBuiltIn$6 = getBuiltIn$b;
+ var inspectSource$1 = inspectSource$4;
+
+ var noop$2 = function () { /* empty */ };
+ var empty$1 = [];
+ var construct$1 = getBuiltIn$6('Reflect', 'construct');
+ var constructorRegExp = /^\s*(?:class|function)\b/;
+ var exec$6 = uncurryThis$I(constructorRegExp.exec);
+ var INCORRECT_TO_STRING = !constructorRegExp.exec(noop$2);
+
+ var isConstructorModern = function isConstructor(argument) {
+ if (!isCallable$c(argument)) return false;
+ try {
+ construct$1(noop$2, empty$1, argument);
+ return true;
+ } catch (error) {
+ return false;
+ }
+ };
- // `ArraySpeciesCreate` abstract operation
+ var isConstructorLegacy = function isConstructor(argument) {
+ if (!isCallable$c(argument)) return false;
+ switch (classof$8(argument)) {
+ case 'AsyncFunction':
+ case 'GeneratorFunction':
+ case 'AsyncGeneratorFunction': return false;
+ }
+ try {
+ // we can't check .prototype since constructors produced by .bind haven't it
+ // `Function#toString` throws on some built-it function in some legacy engines
+ // (for example, `DOMQuad` and similar in FF41-)
+ return INCORRECT_TO_STRING || !!exec$6(constructorRegExp, inspectSource$1(argument));
+ } catch (error) {
+ return true;
+ }
+ };
+
+ isConstructorLegacy.sham = true;
+
+ // `IsConstructor` abstract operation
+ // https://tc39.es/ecma262/#sec-isconstructor
+ var isConstructor$4 = !construct$1 || fails$L(function () {
+ var called;
+ return isConstructorModern(isConstructorModern.call)
+ || !isConstructorModern(Object)
+ || !isConstructorModern(function () { called = true; })
+ || called;
+ }) ? isConstructorLegacy : isConstructorModern;
+
+ var global$W = global$1o;
+ var isArray$7 = isArray$8;
+ var isConstructor$3 = isConstructor$4;
+ var isObject$m = isObject$s;
+ var wellKnownSymbol$j = wellKnownSymbol$t;
+
+ var SPECIES$6 = wellKnownSymbol$j('species');
+ var Array$6 = global$W.Array;
+
+ // a part of `ArraySpeciesCreate` abstract operation
// https://tc39.es/ecma262/#sec-arrayspeciescreate
- var arraySpeciesCreate = function (originalArray, length) {
+ var arraySpeciesConstructor$1 = function (originalArray) {
var C;
- if (isArray(originalArray)) {
+ if (isArray$7(originalArray)) {
C = originalArray.constructor;
// cross-realm fallback
- if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
- else if (isObject(C)) {
- C = C[SPECIES];
+ if (isConstructor$3(C) && (C === Array$6 || isArray$7(C.prototype))) C = undefined;
+ else if (isObject$m(C)) {
+ C = C[SPECIES$6];
if (C === null) C = undefined;
}
- } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);
+ } return C === undefined ? Array$6 : C;
};
- var push = [].push;
+ var arraySpeciesConstructor = arraySpeciesConstructor$1;
- // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterOut }` methods implementation
- var createMethod$2 = function (TYPE) {
+ // `ArraySpeciesCreate` abstract operation
+ // https://tc39.es/ecma262/#sec-arrayspeciescreate
+ var arraySpeciesCreate$4 = function (originalArray, length) {
+ return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);
+ };
+
+ var bind$e = functionBindContext;
+ var uncurryThis$H = functionUncurryThis;
+ var IndexedObject$3 = indexedObject;
+ var toObject$f = toObject$i;
+ var lengthOfArrayLike$f = lengthOfArrayLike$i;
+ var arraySpeciesCreate$3 = arraySpeciesCreate$4;
+
+ var push$9 = uncurryThis$H([].push);
+
+ // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation
+ var createMethod$4 = function (TYPE) {
var IS_MAP = TYPE == 1;
var IS_FILTER = TYPE == 2;
var IS_SOME = TYPE == 3;
var IS_EVERY = TYPE == 4;
var IS_FIND_INDEX = TYPE == 6;
- var IS_FILTER_OUT = TYPE == 7;
+ var IS_FILTER_REJECT = TYPE == 7;
var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
return function ($this, callbackfn, that, specificCreate) {
- var O = toObject($this);
- var self = indexedObject(O);
- var boundFunction = functionBindContext(callbackfn, that, 3);
- var length = toLength(self.length);
+ var O = toObject$f($this);
+ var self = IndexedObject$3(O);
+ var boundFunction = bind$e(callbackfn, that);
+ var length = lengthOfArrayLike$f(self);
var index = 0;
- var create = specificCreate || arraySpeciesCreate;
- var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_OUT ? create($this, 0) : undefined;
+ var create = specificCreate || arraySpeciesCreate$3;
+ var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;
var value, result;
for (;length > index; index++) if (NO_HOLES || index in self) {
value = self[index];
@@ -1436,10 +2083,10 @@
case 3: return true; // some
case 5: return value; // find
case 6: return index; // findIndex
- case 2: push.call(target, value); // filter
+ case 2: push$9(target, value); // filter
} else switch (TYPE) {
case 4: return false; // every
- case 7: push.call(target, value); // filterOut
+ case 7: push$9(target, value); // filterReject
}
}
}
@@ -1450,149 +2097,192 @@
var arrayIteration = {
// `Array.prototype.forEach` method
// https://tc39.es/ecma262/#sec-array.prototype.foreach
- forEach: createMethod$2(0),
+ forEach: createMethod$4(0),
// `Array.prototype.map` method
// https://tc39.es/ecma262/#sec-array.prototype.map
- map: createMethod$2(1),
+ map: createMethod$4(1),
// `Array.prototype.filter` method
// https://tc39.es/ecma262/#sec-array.prototype.filter
- filter: createMethod$2(2),
+ filter: createMethod$4(2),
// `Array.prototype.some` method
// https://tc39.es/ecma262/#sec-array.prototype.some
- some: createMethod$2(3),
+ some: createMethod$4(3),
// `Array.prototype.every` method
// https://tc39.es/ecma262/#sec-array.prototype.every
- every: createMethod$2(4),
+ every: createMethod$4(4),
// `Array.prototype.find` method
// https://tc39.es/ecma262/#sec-array.prototype.find
- find: createMethod$2(5),
+ find: createMethod$4(5),
// `Array.prototype.findIndex` method
// https://tc39.es/ecma262/#sec-array.prototype.findIndex
- findIndex: createMethod$2(6),
- // `Array.prototype.filterOut` method
+ findIndex: createMethod$4(6),
+ // `Array.prototype.filterReject` method
// https://github.com/tc39/proposal-array-filtering
- filterOut: createMethod$2(7)
+ filterReject: createMethod$4(7)
};
- var $forEach = arrayIteration.forEach;
+ var $$1b = _export;
+ var global$V = global$1o;
+ var getBuiltIn$5 = getBuiltIn$b;
+ var apply$8 = functionApply;
+ var call$j = functionCall;
+ var uncurryThis$G = functionUncurryThis;
+ var DESCRIPTORS$h = descriptors;
+ var NATIVE_SYMBOL$1 = nativeSymbol;
+ var fails$K = fails$V;
+ var hasOwn$b = hasOwnProperty_1;
+ var isArray$6 = isArray$8;
+ var isCallable$b = isCallable$r;
+ var isObject$l = isObject$s;
+ var isPrototypeOf$8 = objectIsPrototypeOf;
+ var isSymbol$3 = isSymbol$6;
+ var anObject$h = anObject$n;
+ var toObject$e = toObject$i;
+ var toIndexedObject$6 = toIndexedObject$d;
+ var toPropertyKey$1 = toPropertyKey$5;
+ var $toString$3 = toString$k;
+ var createPropertyDescriptor$2 = createPropertyDescriptor$7;
+ var nativeObjectCreate = objectCreate;
+ var objectKeys$2 = objectKeys$4;
+ var getOwnPropertyNamesModule$1 = objectGetOwnPropertyNames;
+ var getOwnPropertyNamesExternal = objectGetOwnPropertyNamesExternal;
+ var getOwnPropertySymbolsModule$1 = objectGetOwnPropertySymbols;
+ var getOwnPropertyDescriptorModule$2 = objectGetOwnPropertyDescriptor;
+ var definePropertyModule$2 = objectDefineProperty;
+ var definePropertiesModule = objectDefineProperties;
+ var propertyIsEnumerableModule$1 = objectPropertyIsEnumerable;
+ var arraySlice$a = arraySlice$b;
+ var redefine$b = redefine$h.exports;
+ var shared$1 = shared$5.exports;
+ var sharedKey = sharedKey$4;
+ var hiddenKeys$1 = hiddenKeys$6;
+ var uid$2 = uid$5;
+ var wellKnownSymbol$i = wellKnownSymbol$t;
+ var wrappedWellKnownSymbolModule = wellKnownSymbolWrapped;
+ var defineWellKnownSymbol$2 = defineWellKnownSymbol$4;
+ var setToStringTag$7 = setToStringTag$a;
+ var InternalStateModule$6 = internalState;
+ var $forEach$2 = arrayIteration.forEach;
var HIDDEN = sharedKey('hidden');
var SYMBOL = 'Symbol';
var PROTOTYPE$1 = 'prototype';
- var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
- var setInternalState$2 = internalState.set;
- var getInternalState$2 = internalState.getterFor(SYMBOL);
- var ObjectPrototype$1 = Object[PROTOTYPE$1];
- var $Symbol = global_1.Symbol;
- var $stringify = getBuiltIn('JSON', 'stringify');
- var nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;
- var nativeDefineProperty$1 = objectDefineProperty.f;
- var nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;
- var nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;
- var AllSymbols = shared('symbols');
- var ObjectPrototypeSymbols = shared('op-symbols');
- var StringToSymbolRegistry = shared('string-to-symbol-registry');
- var SymbolToStringRegistry = shared('symbol-to-string-registry');
- var WellKnownSymbolsStore$1 = shared('wks');
- var QObject = global_1.QObject;
+ var TO_PRIMITIVE = wellKnownSymbol$i('toPrimitive');
+
+ var setInternalState$6 = InternalStateModule$6.set;
+ var getInternalState$4 = InternalStateModule$6.getterFor(SYMBOL);
+
+ var ObjectPrototype$3 = Object[PROTOTYPE$1];
+ var $Symbol = global$V.Symbol;
+ var SymbolPrototype$1 = $Symbol && $Symbol[PROTOTYPE$1];
+ var TypeError$h = global$V.TypeError;
+ var QObject = global$V.QObject;
+ var $stringify = getBuiltIn$5('JSON', 'stringify');
+ var nativeGetOwnPropertyDescriptor$2 = getOwnPropertyDescriptorModule$2.f;
+ var nativeDefineProperty$1 = definePropertyModule$2.f;
+ var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;
+ var nativePropertyIsEnumerable = propertyIsEnumerableModule$1.f;
+ var push$8 = uncurryThis$G([].push);
+
+ var AllSymbols = shared$1('symbols');
+ var ObjectPrototypeSymbols = shared$1('op-symbols');
+ var StringToSymbolRegistry = shared$1('string-to-symbol-registry');
+ var SymbolToStringRegistry = shared$1('symbol-to-string-registry');
+ var WellKnownSymbolsStore = shared$1('wks');
+
// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
var USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;
// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
- var setSymbolDescriptor = descriptors && fails(function () {
- return objectCreate(nativeDefineProperty$1({}, 'a', {
+ var setSymbolDescriptor = DESCRIPTORS$h && fails$K(function () {
+ return nativeObjectCreate(nativeDefineProperty$1({}, 'a', {
get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }
})).a != 7;
}) ? function (O, P, Attributes) {
- var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype$1, P);
- if (ObjectPrototypeDescriptor) delete ObjectPrototype$1[P];
+ var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$2(ObjectPrototype$3, P);
+ if (ObjectPrototypeDescriptor) delete ObjectPrototype$3[P];
nativeDefineProperty$1(O, P, Attributes);
- if (ObjectPrototypeDescriptor && O !== ObjectPrototype$1) {
- nativeDefineProperty$1(ObjectPrototype$1, P, ObjectPrototypeDescriptor);
+ if (ObjectPrototypeDescriptor && O !== ObjectPrototype$3) {
+ nativeDefineProperty$1(ObjectPrototype$3, P, ObjectPrototypeDescriptor);
}
} : nativeDefineProperty$1;
- var wrap = function (tag, description) {
- var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);
- setInternalState$2(symbol, {
+ var wrap$2 = function (tag, description) {
+ var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype$1);
+ setInternalState$6(symbol, {
type: SYMBOL,
tag: tag,
description: description
});
- if (!descriptors) symbol.description = description;
+ if (!DESCRIPTORS$h) symbol.description = description;
return symbol;
};
- var isSymbol = useSymbolAsUid ? function (it) {
- return typeof it == 'symbol';
- } : function (it) {
- return Object(it) instanceof $Symbol;
- };
-
var $defineProperty = function defineProperty(O, P, Attributes) {
- if (O === ObjectPrototype$1) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
- anObject(O);
- var key = toPrimitive(P, true);
- anObject(Attributes);
- if (has(AllSymbols, key)) {
+ if (O === ObjectPrototype$3) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
+ anObject$h(O);
+ var key = toPropertyKey$1(P);
+ anObject$h(Attributes);
+ if (hasOwn$b(AllSymbols, key)) {
if (!Attributes.enumerable) {
- if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));
+ if (!hasOwn$b(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor$2(1, {}));
O[HIDDEN][key] = true;
} else {
- if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
- Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });
+ if (hasOwn$b(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
+ Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor$2(0, false) });
} return setSymbolDescriptor(O, key, Attributes);
} return nativeDefineProperty$1(O, key, Attributes);
};
var $defineProperties = function defineProperties(O, Properties) {
- anObject(O);
- var properties = toIndexedObject(Properties);
- var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));
- $forEach(keys, function (key) {
- if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);
+ anObject$h(O);
+ var properties = toIndexedObject$6(Properties);
+ var keys = objectKeys$2(properties).concat($getOwnPropertySymbols(properties));
+ $forEach$2(keys, function (key) {
+ if (!DESCRIPTORS$h || call$j($propertyIsEnumerable$1, properties, key)) $defineProperty(O, key, properties[key]);
});
return O;
};
var $create = function create(O, Properties) {
- return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);
+ return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);
};
- var $propertyIsEnumerable = function propertyIsEnumerable(V) {
- var P = toPrimitive(V, true);
- var enumerable = nativePropertyIsEnumerable$1.call(this, P);
- if (this === ObjectPrototype$1 && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;
- return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;
+ var $propertyIsEnumerable$1 = function propertyIsEnumerable(V) {
+ var P = toPropertyKey$1(V);
+ var enumerable = call$j(nativePropertyIsEnumerable, this, P);
+ if (this === ObjectPrototype$3 && hasOwn$b(AllSymbols, P) && !hasOwn$b(ObjectPrototypeSymbols, P)) return false;
+ return enumerable || !hasOwn$b(this, P) || !hasOwn$b(AllSymbols, P) || hasOwn$b(this, HIDDEN) && this[HIDDEN][P]
+ ? enumerable : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
- var it = toIndexedObject(O);
- var key = toPrimitive(P, true);
- if (it === ObjectPrototype$1 && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;
- var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);
- if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {
+ var it = toIndexedObject$6(O);
+ var key = toPropertyKey$1(P);
+ if (it === ObjectPrototype$3 && hasOwn$b(AllSymbols, key) && !hasOwn$b(ObjectPrototypeSymbols, key)) return;
+ var descriptor = nativeGetOwnPropertyDescriptor$2(it, key);
+ if (descriptor && hasOwn$b(AllSymbols, key) && !(hasOwn$b(it, HIDDEN) && it[HIDDEN][key])) {
descriptor.enumerable = true;
}
return descriptor;
};
var $getOwnPropertyNames = function getOwnPropertyNames(O) {
- var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));
+ var names = nativeGetOwnPropertyNames(toIndexedObject$6(O));
var result = [];
- $forEach(names, function (key) {
- if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);
+ $forEach$2(names, function (key) {
+ if (!hasOwn$b(AllSymbols, key) && !hasOwn$b(hiddenKeys$1, key)) push$8(result, key);
});
return result;
};
var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {
- var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$1;
- var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));
+ var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$3;
+ var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject$6(O));
var result = [];
- $forEach(names, function (key) {
- if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype$1, key))) {
- result.push(AllSymbols[key]);
+ $forEach$2(names, function (key) {
+ if (hasOwn$b(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn$b(ObjectPrototype$3, key))) {
+ push$8(result, AllSymbols[key]);
}
});
return result;
@@ -1600,66 +2290,69 @@
// `Symbol` constructor
// https://tc39.es/ecma262/#sec-symbol-constructor
- if (!nativeSymbol) {
+ if (!NATIVE_SYMBOL$1) {
$Symbol = function Symbol() {
- if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');
- var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);
- var tag = uid(description);
+ if (isPrototypeOf$8(SymbolPrototype$1, this)) throw TypeError$h('Symbol is not a constructor');
+ var description = !arguments.length || arguments[0] === undefined ? undefined : $toString$3(arguments[0]);
+ var tag = uid$2(description);
var setter = function (value) {
- if (this === ObjectPrototype$1) setter.call(ObjectPrototypeSymbols, value);
- if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
- setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));
+ if (this === ObjectPrototype$3) call$j(setter, ObjectPrototypeSymbols, value);
+ if (hasOwn$b(this, HIDDEN) && hasOwn$b(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDescriptor(this, tag, createPropertyDescriptor$2(1, value));
};
- if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype$1, tag, { configurable: true, set: setter });
- return wrap(tag, description);
+ if (DESCRIPTORS$h && USE_SETTER) setSymbolDescriptor(ObjectPrototype$3, tag, { configurable: true, set: setter });
+ return wrap$2(tag, description);
};
- redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {
- return getInternalState$2(this).tag;
+ SymbolPrototype$1 = $Symbol[PROTOTYPE$1];
+
+ redefine$b(SymbolPrototype$1, 'toString', function toString() {
+ return getInternalState$4(this).tag;
});
- redefine($Symbol, 'withoutSetter', function (description) {
- return wrap(uid(description), description);
+ redefine$b($Symbol, 'withoutSetter', function (description) {
+ return wrap$2(uid$2(description), description);
});
- objectPropertyIsEnumerable.f = $propertyIsEnumerable;
- objectDefineProperty.f = $defineProperty;
- objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;
- objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;
- objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;
+ propertyIsEnumerableModule$1.f = $propertyIsEnumerable$1;
+ definePropertyModule$2.f = $defineProperty;
+ definePropertiesModule.f = $defineProperties;
+ getOwnPropertyDescriptorModule$2.f = $getOwnPropertyDescriptor;
+ getOwnPropertyNamesModule$1.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;
+ getOwnPropertySymbolsModule$1.f = $getOwnPropertySymbols;
- wellKnownSymbolWrapped.f = function (name) {
- return wrap(wellKnownSymbol(name), name);
+ wrappedWellKnownSymbolModule.f = function (name) {
+ return wrap$2(wellKnownSymbol$i(name), name);
};
- if (descriptors) {
+ if (DESCRIPTORS$h) {
// https://github.com/tc39/proposal-Symbol-description
- nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {
+ nativeDefineProperty$1(SymbolPrototype$1, 'description', {
configurable: true,
get: function description() {
- return getInternalState$2(this).description;
+ return getInternalState$4(this).description;
}
});
{
- redefine(ObjectPrototype$1, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
+ redefine$b(ObjectPrototype$3, 'propertyIsEnumerable', $propertyIsEnumerable$1, { unsafe: true });
}
}
}
- _export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, {
+ $$1b({ global: true, wrap: true, forced: !NATIVE_SYMBOL$1, sham: !NATIVE_SYMBOL$1 }, {
Symbol: $Symbol
});
- $forEach(objectKeys(WellKnownSymbolsStore$1), function (name) {
- defineWellKnownSymbol(name);
+ $forEach$2(objectKeys$2(WellKnownSymbolsStore), function (name) {
+ defineWellKnownSymbol$2(name);
});
- _export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, {
+ $$1b({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL$1 }, {
// `Symbol.for` method
// https://tc39.es/ecma262/#sec-symbol.for
'for': function (key) {
- var string = String(key);
- if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
+ var string = $toString$3(key);
+ if (hasOwn$b(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
var symbol = $Symbol(string);
StringToSymbolRegistry[string] = symbol;
SymbolToStringRegistry[symbol] = string;
@@ -1668,14 +2361,14 @@
// `Symbol.keyFor` method
// https://tc39.es/ecma262/#sec-symbol.keyfor
keyFor: function keyFor(sym) {
- if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');
- if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
+ if (!isSymbol$3(sym)) throw TypeError$h(sym + ' is not a symbol');
+ if (hasOwn$b(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
},
useSetter: function () { USE_SETTER = true; },
useSimple: function () { USE_SETTER = false; }
});
- _export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, {
+ $$1b({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL$1, sham: !DESCRIPTORS$h }, {
// `Object.create` method
// https://tc39.es/ecma262/#sec-object.create
create: $create,
@@ -1690,7 +2383,7 @@
getOwnPropertyDescriptor: $getOwnPropertyDescriptor
});
- _export({ target: 'Object', stat: true, forced: !nativeSymbol }, {
+ $$1b({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL$1 }, {
// `Object.getOwnPropertyNames` method
// https://tc39.es/ecma262/#sec-object.getownpropertynames
getOwnPropertyNames: $getOwnPropertyNames,
@@ -1701,16 +2394,16 @@
// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
// https://bugs.chromium.org/p/v8/issues/detail?id=3443
- _export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {
+ $$1b({ target: 'Object', stat: true, forced: fails$K(function () { getOwnPropertySymbolsModule$1.f(1); }) }, {
getOwnPropertySymbols: function getOwnPropertySymbols(it) {
- return objectGetOwnPropertySymbols.f(toObject(it));
+ return getOwnPropertySymbolsModule$1.f(toObject$e(it));
}
});
// `JSON.stringify` method behavior with symbols
// https://tc39.es/ecma262/#sec-json.stringify
if ($stringify) {
- var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () {
+ var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL$1 || fails$K(function () {
var symbol = $Symbol();
// MS Edge converts symbol values to JSON as {}
return $stringify([symbol]) != '[null]'
@@ -1720,134 +2413,167 @@
|| $stringify(Object(symbol)) != '{}';
});
- _export({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
+ $$1b({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
// eslint-disable-next-line no-unused-vars -- required for `.length`
stringify: function stringify(it, replacer, space) {
- var args = [it];
- var index = 1;
- var $replacer;
- while (arguments.length > index) args.push(arguments[index++]);
- $replacer = replacer;
- if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
- if (!isArray(replacer)) replacer = function (key, value) {
- if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
- if (!isSymbol(value)) return value;
+ var args = arraySlice$a(arguments);
+ var $replacer = replacer;
+ if (!isObject$l(replacer) && it === undefined || isSymbol$3(it)) return; // IE8 returns string on undefined
+ if (!isArray$6(replacer)) replacer = function (key, value) {
+ if (isCallable$b($replacer)) value = call$j($replacer, this, key, value);
+ if (!isSymbol$3(value)) return value;
};
args[1] = replacer;
- return $stringify.apply(null, args);
+ return apply$8($stringify, null, args);
}
});
}
// `Symbol.prototype[@@toPrimitive]` method
// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
- if (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) {
- createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);
+ if (!SymbolPrototype$1[TO_PRIMITIVE]) {
+ var valueOf = SymbolPrototype$1.valueOf;
+ // eslint-disable-next-line no-unused-vars -- required for .length
+ redefine$b(SymbolPrototype$1, TO_PRIMITIVE, function (hint) {
+ // TODO: improve hint logic
+ return call$j(valueOf, this);
+ });
}
// `Symbol.prototype[@@toStringTag]` property
// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag
- setToStringTag($Symbol, SYMBOL);
-
- hiddenKeys[HIDDEN] = true;
-
- var defineProperty$2 = objectDefineProperty.f;
-
+ setToStringTag$7($Symbol, SYMBOL);
+
+ hiddenKeys$1[HIDDEN] = true;
+
+ var $$1a = _export;
+ var DESCRIPTORS$g = descriptors;
+ var global$U = global$1o;
+ var uncurryThis$F = functionUncurryThis;
+ var hasOwn$a = hasOwnProperty_1;
+ var isCallable$a = isCallable$r;
+ var isPrototypeOf$7 = objectIsPrototypeOf;
+ var toString$h = toString$k;
+ var defineProperty$9 = objectDefineProperty.f;
+ var copyConstructorProperties = copyConstructorProperties$2;
- var NativeSymbol = global_1.Symbol;
+ var NativeSymbol = global$U.Symbol;
+ var SymbolPrototype = NativeSymbol && NativeSymbol.prototype;
- if (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||
+ if (DESCRIPTORS$g && isCallable$a(NativeSymbol) && (!('description' in SymbolPrototype) ||
// Safari 12 bug
NativeSymbol().description !== undefined
)) {
var EmptyStringDescriptionStore = {};
// wrap Symbol constructor for correct work with undefined description
var SymbolWrapper = function Symbol() {
- var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);
- var result = this instanceof SymbolWrapper
+ var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString$h(arguments[0]);
+ var result = isPrototypeOf$7(SymbolPrototype, this)
? new NativeSymbol(description)
// in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'
: description === undefined ? NativeSymbol() : NativeSymbol(description);
if (description === '') EmptyStringDescriptionStore[result] = true;
return result;
};
+
copyConstructorProperties(SymbolWrapper, NativeSymbol);
- var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;
- symbolPrototype.constructor = SymbolWrapper;
+ SymbolWrapper.prototype = SymbolPrototype;
+ SymbolPrototype.constructor = SymbolWrapper;
- var symbolToString = symbolPrototype.toString;
- var native = String(NativeSymbol('test')) == 'Symbol(test)';
+ var NATIVE_SYMBOL = String(NativeSymbol('test')) == 'Symbol(test)';
+ var symbolToString$1 = uncurryThis$F(SymbolPrototype.toString);
+ var symbolValueOf = uncurryThis$F(SymbolPrototype.valueOf);
var regexp = /^Symbol\((.*)\)[^)]+$/;
- defineProperty$2(symbolPrototype, 'description', {
+ var replace$8 = uncurryThis$F(''.replace);
+ var stringSlice$a = uncurryThis$F(''.slice);
+
+ defineProperty$9(SymbolPrototype, 'description', {
configurable: true,
get: function description() {
- var symbol = isObject(this) ? this.valueOf() : this;
- var string = symbolToString.call(symbol);
- if (has(EmptyStringDescriptionStore, symbol)) return '';
- var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');
+ var symbol = symbolValueOf(this);
+ var string = symbolToString$1(symbol);
+ if (hasOwn$a(EmptyStringDescriptionStore, symbol)) return '';
+ var desc = NATIVE_SYMBOL ? stringSlice$a(string, 7, -1) : replace$8(string, regexp, '$1');
return desc === '' ? undefined : desc;
}
});
- _export({ global: true, forced: true }, {
+ $$1a({ global: true, forced: true }, {
Symbol: SymbolWrapper
});
}
- var arrayBufferNative = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';
+ // eslint-disable-next-line es/no-typed-arrays -- safe
+ var arrayBufferNative = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined';
- var redefineAll = function (target, src, options) {
- for (var key in src) redefine(target, key, src[key], options);
+ var redefine$a = redefine$h.exports;
+
+ var redefineAll$4 = function (target, src, options) {
+ for (var key in src) redefine$a(target, key, src[key], options);
return target;
};
- var anInstance = function (it, Constructor, name) {
- if (!(it instanceof Constructor)) {
- throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');
- } return it;
+ var global$T = global$1o;
+ var isPrototypeOf$6 = objectIsPrototypeOf;
+
+ var TypeError$g = global$T.TypeError;
+
+ var anInstance$7 = function (it, Prototype) {
+ if (isPrototypeOf$6(Prototype, it)) return it;
+ throw TypeError$g('Incorrect invocation');
};
+ var global$S = global$1o;
+ var toIntegerOrInfinity$7 = toIntegerOrInfinity$b;
+ var toLength$a = toLength$c;
+
+ var RangeError$b = global$S.RangeError;
+
// `ToIndex` abstract operation
// https://tc39.es/ecma262/#sec-toindex
- var toIndex = function (it) {
+ var toIndex$2 = function (it) {
if (it === undefined) return 0;
- var number = toInteger(it);
- var length = toLength(number);
- if (number !== length) throw RangeError('Wrong length or index');
+ var number = toIntegerOrInfinity$7(it);
+ var length = toLength$a(number);
+ if (number !== length) throw RangeError$b('Wrong length or index');
return length;
};
// IEEE754 conversions based on https://github.com/feross/ieee754
- var abs = Math.abs;
- var pow = Math.pow;
- var floor$1 = Math.floor;
- var log = Math.log;
+ var global$R = global$1o;
+
+ var Array$5 = global$R.Array;
+ var abs$4 = Math.abs;
+ var pow$2 = Math.pow;
+ var floor$7 = Math.floor;
+ var log$2 = Math.log;
var LN2 = Math.LN2;
var pack = function (number, mantissaLength, bytes) {
- var buffer = new Array(bytes);
+ var buffer = Array$5(bytes);
var exponentLength = bytes * 8 - mantissaLength - 1;
var eMax = (1 << exponentLength) - 1;
var eBias = eMax >> 1;
- var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;
+ var rt = mantissaLength === 23 ? pow$2(2, -24) - pow$2(2, -77) : 0;
var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;
var index = 0;
var exponent, mantissa, c;
- number = abs(number);
+ number = abs$4(number);
// eslint-disable-next-line no-self-compare -- NaN check
if (number != number || number === Infinity) {
// eslint-disable-next-line no-self-compare -- NaN check
mantissa = number != number ? 1 : 0;
exponent = eMax;
} else {
- exponent = floor$1(log(number) / LN2);
- if (number * (c = pow(2, -exponent)) < 1) {
+ exponent = floor$7(log$2(number) / LN2);
+ c = pow$2(2, -exponent);
+ if (number * c < 1) {
exponent--;
c *= 2;
}
if (exponent + eBias >= 1) {
number += rt / c;
} else {
- number += rt * pow(2, 1 - eBias);
+ number += rt * pow$2(2, 1 - eBias);
}
if (number * c >= 2) {
exponent++;
@@ -1857,17 +2583,25 @@
mantissa = 0;
exponent = eMax;
} else if (exponent + eBias >= 1) {
- mantissa = (number * c - 1) * pow(2, mantissaLength);
+ mantissa = (number * c - 1) * pow$2(2, mantissaLength);
exponent = exponent + eBias;
} else {
- mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);
+ mantissa = number * pow$2(2, eBias - 1) * pow$2(2, mantissaLength);
exponent = 0;
}
}
- for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);
+ while (mantissaLength >= 8) {
+ buffer[index++] = mantissa & 255;
+ mantissa /= 256;
+ mantissaLength -= 8;
+ }
exponent = exponent << mantissaLength | mantissa;
exponentLength += mantissaLength;
- for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);
+ while (exponentLength > 0) {
+ buffer[index++] = exponent & 255;
+ exponent /= 256;
+ exponentLength -= 8;
+ }
buffer[--index] |= sign * 128;
return buffer;
};
@@ -1883,61 +2617,93 @@
var exponent = sign & 127;
var mantissa;
sign >>= 7;
- for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);
+ while (nBits > 0) {
+ exponent = exponent * 256 + buffer[index--];
+ nBits -= 8;
+ }
mantissa = exponent & (1 << -nBits) - 1;
exponent >>= -nBits;
nBits += mantissaLength;
- for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);
+ while (nBits > 0) {
+ mantissa = mantissa * 256 + buffer[index--];
+ nBits -= 8;
+ }
if (exponent === 0) {
exponent = 1 - eBias;
} else if (exponent === eMax) {
return mantissa ? NaN : sign ? -Infinity : Infinity;
} else {
- mantissa = mantissa + pow(2, mantissaLength);
+ mantissa = mantissa + pow$2(2, mantissaLength);
exponent = exponent - eBias;
- } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);
+ } return (sign ? -1 : 1) * mantissa * pow$2(2, exponent - mantissaLength);
};
- var ieee754 = {
+ var ieee754$2 = {
pack: pack,
unpack: unpack
};
+ var toObject$d = toObject$i;
+ var toAbsoluteIndex$6 = toAbsoluteIndex$9;
+ var lengthOfArrayLike$e = lengthOfArrayLike$i;
+
// `Array.prototype.fill` method implementation
// https://tc39.es/ecma262/#sec-array.prototype.fill
- var arrayFill = function fill(value /* , start = 0, end = @length */) {
- var O = toObject(this);
- var length = toLength(O.length);
+ var arrayFill$1 = function fill(value /* , start = 0, end = @length */) {
+ var O = toObject$d(this);
+ var length = lengthOfArrayLike$e(O);
var argumentsLength = arguments.length;
- var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);
+ var index = toAbsoluteIndex$6(argumentsLength > 1 ? arguments[1] : undefined, length);
var end = argumentsLength > 2 ? arguments[2] : undefined;
- var endPos = end === undefined ? length : toAbsoluteIndex(end, length);
+ var endPos = end === undefined ? length : toAbsoluteIndex$6(end, length);
while (endPos > index) O[index++] = value;
return O;
};
- var getOwnPropertyNames = objectGetOwnPropertyNames.f;
- var defineProperty$3 = objectDefineProperty.f;
-
-
-
-
- var getInternalState$3 = internalState.get;
- var setInternalState$3 = internalState.set;
- var ARRAY_BUFFER = 'ArrayBuffer';
+ var global$Q = global$1o;
+ var uncurryThis$E = functionUncurryThis;
+ var DESCRIPTORS$f = descriptors;
+ var NATIVE_ARRAY_BUFFER$2 = arrayBufferNative;
+ var FunctionName = functionName;
+ var createNonEnumerableProperty$5 = createNonEnumerableProperty$b;
+ var redefineAll$3 = redefineAll$4;
+ var fails$J = fails$V;
+ var anInstance$6 = anInstance$7;
+ var toIntegerOrInfinity$6 = toIntegerOrInfinity$b;
+ var toLength$9 = toLength$c;
+ var toIndex$1 = toIndex$2;
+ var IEEE754 = ieee754$2;
+ var getPrototypeOf$2 = objectGetPrototypeOf;
+ var setPrototypeOf$5 = objectSetPrototypeOf;
+ var getOwnPropertyNames$4 = objectGetOwnPropertyNames.f;
+ var defineProperty$8 = objectDefineProperty.f;
+ var arrayFill = arrayFill$1;
+ var arraySlice$9 = arraySliceSimple;
+ var setToStringTag$6 = setToStringTag$a;
+ var InternalStateModule$5 = internalState;
+
+ var PROPER_FUNCTION_NAME$2 = FunctionName.PROPER;
+ var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;
+ var getInternalState$3 = InternalStateModule$5.get;
+ var setInternalState$5 = InternalStateModule$5.set;
+ var ARRAY_BUFFER$1 = 'ArrayBuffer';
var DATA_VIEW = 'DataView';
- var PROTOTYPE$2 = 'prototype';
- var WRONG_LENGTH = 'Wrong length';
+ var PROTOTYPE = 'prototype';
+ var WRONG_LENGTH$1 = 'Wrong length';
var WRONG_INDEX = 'Wrong index';
- var NativeArrayBuffer = global_1[ARRAY_BUFFER];
- var $ArrayBuffer = NativeArrayBuffer;
- var $DataView = global_1[DATA_VIEW];
- var $DataViewPrototype = $DataView && $DataView[PROTOTYPE$2];
+ var NativeArrayBuffer$1 = global$Q[ARRAY_BUFFER$1];
+ var $ArrayBuffer = NativeArrayBuffer$1;
+ var ArrayBufferPrototype$1 = $ArrayBuffer && $ArrayBuffer[PROTOTYPE];
+ var $DataView = global$Q[DATA_VIEW];
+ var DataViewPrototype$1 = $DataView && $DataView[PROTOTYPE];
var ObjectPrototype$2 = Object.prototype;
- var RangeError$1 = global_1.RangeError;
+ var Array$4 = global$Q.Array;
+ var RangeError$a = global$Q.RangeError;
+ var fill$1 = uncurryThis$E(arrayFill);
+ var reverse = uncurryThis$E([].reverse);
- var packIEEE754 = ieee754.pack;
- var unpackIEEE754 = ieee754.unpack;
+ var packIEEE754 = IEEE754.pack;
+ var unpackIEEE754 = IEEE754.unpack;
var packInt8 = function (number) {
return [number & 0xFF];
@@ -1963,239 +2729,293 @@
return packIEEE754(number, 52, 8);
};
- var addGetter = function (Constructor, key) {
- defineProperty$3(Constructor[PROTOTYPE$2], key, { get: function () { return getInternalState$3(this)[key]; } });
+ var addGetter$1 = function (Constructor, key) {
+ defineProperty$8(Constructor[PROTOTYPE], key, { get: function () { return getInternalState$3(this)[key]; } });
};
- var get$1 = function (view, count, index, isLittleEndian) {
- var intIndex = toIndex(index);
+ var get$4 = function (view, count, index, isLittleEndian) {
+ var intIndex = toIndex$1(index);
var store = getInternalState$3(view);
- if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);
+ if (intIndex + count > store.byteLength) throw RangeError$a(WRONG_INDEX);
var bytes = getInternalState$3(store.buffer).bytes;
var start = intIndex + store.byteOffset;
- var pack = bytes.slice(start, start + count);
- return isLittleEndian ? pack : pack.reverse();
+ var pack = arraySlice$9(bytes, start, start + count);
+ return isLittleEndian ? pack : reverse(pack);
};
- var set$1 = function (view, count, index, conversion, value, isLittleEndian) {
- var intIndex = toIndex(index);
+ var set$3 = function (view, count, index, conversion, value, isLittleEndian) {
+ var intIndex = toIndex$1(index);
var store = getInternalState$3(view);
- if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);
+ if (intIndex + count > store.byteLength) throw RangeError$a(WRONG_INDEX);
var bytes = getInternalState$3(store.buffer).bytes;
var start = intIndex + store.byteOffset;
var pack = conversion(+value);
for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];
};
- if (!arrayBufferNative) {
+ if (!NATIVE_ARRAY_BUFFER$2) {
$ArrayBuffer = function ArrayBuffer(length) {
- anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
- var byteLength = toIndex(length);
- setInternalState$3(this, {
- bytes: arrayFill.call(new Array(byteLength), 0),
+ anInstance$6(this, ArrayBufferPrototype$1);
+ var byteLength = toIndex$1(length);
+ setInternalState$5(this, {
+ bytes: fill$1(Array$4(byteLength), 0),
byteLength: byteLength
});
- if (!descriptors) this.byteLength = byteLength;
+ if (!DESCRIPTORS$f) this.byteLength = byteLength;
};
+ ArrayBufferPrototype$1 = $ArrayBuffer[PROTOTYPE];
+
$DataView = function DataView(buffer, byteOffset, byteLength) {
- anInstance(this, $DataView, DATA_VIEW);
- anInstance(buffer, $ArrayBuffer, DATA_VIEW);
+ anInstance$6(this, DataViewPrototype$1);
+ anInstance$6(buffer, ArrayBufferPrototype$1);
var bufferLength = getInternalState$3(buffer).byteLength;
- var offset = toInteger(byteOffset);
- if (offset < 0 || offset > bufferLength) throw RangeError$1('Wrong offset');
- byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
- if (offset + byteLength > bufferLength) throw RangeError$1(WRONG_LENGTH);
- setInternalState$3(this, {
+ var offset = toIntegerOrInfinity$6(byteOffset);
+ if (offset < 0 || offset > bufferLength) throw RangeError$a('Wrong offset');
+ byteLength = byteLength === undefined ? bufferLength - offset : toLength$9(byteLength);
+ if (offset + byteLength > bufferLength) throw RangeError$a(WRONG_LENGTH$1);
+ setInternalState$5(this, {
buffer: buffer,
byteLength: byteLength,
byteOffset: offset
});
- if (!descriptors) {
+ if (!DESCRIPTORS$f) {
this.buffer = buffer;
this.byteLength = byteLength;
this.byteOffset = offset;
}
};
- if (descriptors) {
- addGetter($ArrayBuffer, 'byteLength');
- addGetter($DataView, 'buffer');
- addGetter($DataView, 'byteLength');
- addGetter($DataView, 'byteOffset');
+ DataViewPrototype$1 = $DataView[PROTOTYPE];
+
+ if (DESCRIPTORS$f) {
+ addGetter$1($ArrayBuffer, 'byteLength');
+ addGetter$1($DataView, 'buffer');
+ addGetter$1($DataView, 'byteLength');
+ addGetter$1($DataView, 'byteOffset');
}
- redefineAll($DataView[PROTOTYPE$2], {
+ redefineAll$3(DataViewPrototype$1, {
getInt8: function getInt8(byteOffset) {
- return get$1(this, 1, byteOffset)[0] << 24 >> 24;
+ return get$4(this, 1, byteOffset)[0] << 24 >> 24;
},
getUint8: function getUint8(byteOffset) {
- return get$1(this, 1, byteOffset)[0];
+ return get$4(this, 1, byteOffset)[0];
},
getInt16: function getInt16(byteOffset /* , littleEndian */) {
- var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
+ var bytes = get$4(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
},
getUint16: function getUint16(byteOffset /* , littleEndian */) {
- var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
+ var bytes = get$4(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
return bytes[1] << 8 | bytes[0];
},
getInt32: function getInt32(byteOffset /* , littleEndian */) {
- return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));
+ return unpackInt32(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));
},
getUint32: function getUint32(byteOffset /* , littleEndian */) {
- return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;
+ return unpackInt32(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;
},
getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
- return unpackIEEE754(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);
+ return unpackIEEE754(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);
},
getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
- return unpackIEEE754(get$1(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);
+ return unpackIEEE754(get$4(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);
},
setInt8: function setInt8(byteOffset, value) {
- set$1(this, 1, byteOffset, packInt8, value);
+ set$3(this, 1, byteOffset, packInt8, value);
},
setUint8: function setUint8(byteOffset, value) {
- set$1(this, 1, byteOffset, packInt8, value);
+ set$3(this, 1, byteOffset, packInt8, value);
},
setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
- set$1(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
+ set$3(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
},
setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
- set$1(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
+ set$3(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
},
setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
- set$1(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
+ set$3(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
},
setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
- set$1(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
+ set$3(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
},
setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
- set$1(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);
+ set$3(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);
},
setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
- set$1(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);
+ set$3(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);
}
});
} else {
+ var INCORRECT_ARRAY_BUFFER_NAME = PROPER_FUNCTION_NAME$2 && NativeArrayBuffer$1.name !== ARRAY_BUFFER$1;
/* eslint-disable no-new -- required for testing */
- if (!fails(function () {
- NativeArrayBuffer(1);
- }) || !fails(function () {
- new NativeArrayBuffer(-1);
- }) || fails(function () {
- new NativeArrayBuffer();
- new NativeArrayBuffer(1.5);
- new NativeArrayBuffer(NaN);
- return NativeArrayBuffer.name != ARRAY_BUFFER;
+ if (!fails$J(function () {
+ NativeArrayBuffer$1(1);
+ }) || !fails$J(function () {
+ new NativeArrayBuffer$1(-1);
+ }) || fails$J(function () {
+ new NativeArrayBuffer$1();
+ new NativeArrayBuffer$1(1.5);
+ new NativeArrayBuffer$1(NaN);
+ return INCORRECT_ARRAY_BUFFER_NAME && !CONFIGURABLE_FUNCTION_NAME;
})) {
/* eslint-enable no-new -- required for testing */
$ArrayBuffer = function ArrayBuffer(length) {
- anInstance(this, $ArrayBuffer);
- return new NativeArrayBuffer(toIndex(length));
+ anInstance$6(this, ArrayBufferPrototype$1);
+ return new NativeArrayBuffer$1(toIndex$1(length));
};
- var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE$2] = NativeArrayBuffer[PROTOTYPE$2];
- for (var keys$1 = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys$1.length > j;) {
- if (!((key = keys$1[j++]) in $ArrayBuffer)) {
- createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);
+
+ $ArrayBuffer[PROTOTYPE] = ArrayBufferPrototype$1;
+
+ for (var keys$2 = getOwnPropertyNames$4(NativeArrayBuffer$1), j$2 = 0, key$1; keys$2.length > j$2;) {
+ if (!((key$1 = keys$2[j$2++]) in $ArrayBuffer)) {
+ createNonEnumerableProperty$5($ArrayBuffer, key$1, NativeArrayBuffer$1[key$1]);
}
}
- ArrayBufferPrototype.constructor = $ArrayBuffer;
+
+ ArrayBufferPrototype$1.constructor = $ArrayBuffer;
+ } else if (INCORRECT_ARRAY_BUFFER_NAME && CONFIGURABLE_FUNCTION_NAME) {
+ createNonEnumerableProperty$5(NativeArrayBuffer$1, 'name', ARRAY_BUFFER$1);
}
// WebKit bug - the same parent prototype for typed arrays and data view
- if (objectSetPrototypeOf && objectGetPrototypeOf($DataViewPrototype) !== ObjectPrototype$2) {
- objectSetPrototypeOf($DataViewPrototype, ObjectPrototype$2);
+ if (setPrototypeOf$5 && getPrototypeOf$2(DataViewPrototype$1) !== ObjectPrototype$2) {
+ setPrototypeOf$5(DataViewPrototype$1, ObjectPrototype$2);
}
// iOS Safari 7.x bug
var testView = new $DataView(new $ArrayBuffer(2));
- var nativeSetInt8 = $DataViewPrototype.setInt8;
+ var $setInt8 = uncurryThis$E(DataViewPrototype$1.setInt8);
testView.setInt8(0, 2147483648);
testView.setInt8(1, 2147483649);
- if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {
+ if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll$3(DataViewPrototype$1, {
setInt8: function setInt8(byteOffset, value) {
- nativeSetInt8.call(this, byteOffset, value << 24 >> 24);
+ $setInt8(this, byteOffset, value << 24 >> 24);
},
setUint8: function setUint8(byteOffset, value) {
- nativeSetInt8.call(this, byteOffset, value << 24 >> 24);
+ $setInt8(this, byteOffset, value << 24 >> 24);
}
}, { unsafe: true });
}
- setToStringTag($ArrayBuffer, ARRAY_BUFFER);
- setToStringTag($DataView, DATA_VIEW);
+ setToStringTag$6($ArrayBuffer, ARRAY_BUFFER$1);
+ setToStringTag$6($DataView, DATA_VIEW);
var arrayBuffer = {
ArrayBuffer: $ArrayBuffer,
DataView: $DataView
};
- // `DataView` constructor
- // https://tc39.es/ecma262/#sec-dataview-constructor
- _export({ global: true, forced: !arrayBufferNative }, {
- DataView: arrayBuffer.DataView
- });
+ var global$P = global$1o;
+ var isConstructor$2 = isConstructor$4;
+ var tryToString$3 = tryToString$5;
+
+ var TypeError$f = global$P.TypeError;
- var SPECIES$1 = wellKnownSymbol('species');
+ // `Assert: IsConstructor(argument) is true`
+ var aConstructor$3 = function (argument) {
+ if (isConstructor$2(argument)) return argument;
+ throw TypeError$f(tryToString$3(argument) + ' is not a constructor');
+ };
+
+ var anObject$g = anObject$n;
+ var aConstructor$2 = aConstructor$3;
+ var wellKnownSymbol$h = wellKnownSymbol$t;
+
+ var SPECIES$5 = wellKnownSymbol$h('species');
// `SpeciesConstructor` abstract operation
// https://tc39.es/ecma262/#sec-speciesconstructor
- var speciesConstructor = function (O, defaultConstructor) {
- var C = anObject(O).constructor;
+ var speciesConstructor$5 = function (O, defaultConstructor) {
+ var C = anObject$g(O).constructor;
var S;
- return C === undefined || (S = anObject(C)[SPECIES$1]) == undefined ? defaultConstructor : aFunction$1(S);
+ return C === undefined || (S = anObject$g(C)[SPECIES$5]) == undefined ? defaultConstructor : aConstructor$2(S);
};
- var ArrayBuffer$1 = arrayBuffer.ArrayBuffer;
- var DataView$1 = arrayBuffer.DataView;
- var nativeArrayBufferSlice = ArrayBuffer$1.prototype.slice;
-
- var INCORRECT_SLICE = fails(function () {
- return !new ArrayBuffer$1(2).slice(1, undefined).byteLength;
+ var $$19 = _export;
+ var uncurryThis$D = functionUncurryThis;
+ var fails$I = fails$V;
+ var ArrayBufferModule$2 = arrayBuffer;
+ var anObject$f = anObject$n;
+ var toAbsoluteIndex$5 = toAbsoluteIndex$9;
+ var toLength$8 = toLength$c;
+ var speciesConstructor$4 = speciesConstructor$5;
+
+ var ArrayBuffer$4 = ArrayBufferModule$2.ArrayBuffer;
+ var DataView$2 = ArrayBufferModule$2.DataView;
+ var DataViewPrototype = DataView$2.prototype;
+ var un$ArrayBufferSlice = uncurryThis$D(ArrayBuffer$4.prototype.slice);
+ var getUint8 = uncurryThis$D(DataViewPrototype.getUint8);
+ var setUint8 = uncurryThis$D(DataViewPrototype.setUint8);
+
+ var INCORRECT_SLICE = fails$I(function () {
+ return !new ArrayBuffer$4(2).slice(1, undefined).byteLength;
});
// `ArrayBuffer.prototype.slice` method
// https://tc39.es/ecma262/#sec-arraybuffer.prototype.slice
- _export({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, {
+ $$19({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, {
slice: function slice(start, end) {
- if (nativeArrayBufferSlice !== undefined && end === undefined) {
- return nativeArrayBufferSlice.call(anObject(this), start); // FF fix
- }
- var length = anObject(this).byteLength;
- var first = toAbsoluteIndex(start, length);
- var fin = toAbsoluteIndex(end === undefined ? length : end, length);
- var result = new (speciesConstructor(this, ArrayBuffer$1))(toLength(fin - first));
- var viewSource = new DataView$1(this);
- var viewTarget = new DataView$1(result);
+ if (un$ArrayBufferSlice && end === undefined) {
+ return un$ArrayBufferSlice(anObject$f(this), start); // FF fix
+ }
+ var length = anObject$f(this).byteLength;
+ var first = toAbsoluteIndex$5(start, length);
+ var fin = toAbsoluteIndex$5(end === undefined ? length : end, length);
+ var result = new (speciesConstructor$4(this, ArrayBuffer$4))(toLength$8(fin - first));
+ var viewSource = new DataView$2(this);
+ var viewTarget = new DataView$2(result);
var index = 0;
while (first < fin) {
- viewTarget.setUint8(index++, viewSource.getUint8(first++));
+ setUint8(viewTarget, index++, getUint8(viewSource, first++));
} return result;
}
});
- var defineProperty$4 = objectDefineProperty.f;
-
+ var $$18 = _export;
+ var ArrayBufferModule$1 = arrayBuffer;
+ var NATIVE_ARRAY_BUFFER$1 = arrayBufferNative;
+ // `DataView` constructor
+ // https://tc39.es/ecma262/#sec-dataview-constructor
+ $$18({ global: true, forced: !NATIVE_ARRAY_BUFFER$1 }, {
+ DataView: ArrayBufferModule$1.DataView
+ });
-
-
- var Int8Array$1 = global_1.Int8Array;
- var Int8ArrayPrototype = Int8Array$1 && Int8Array$1.prototype;
- var Uint8ClampedArray = global_1.Uint8ClampedArray;
- var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;
- var TypedArray = Int8Array$1 && objectGetPrototypeOf(Int8Array$1);
- var TypedArrayPrototype = Int8ArrayPrototype && objectGetPrototypeOf(Int8ArrayPrototype);
- var ObjectPrototype$3 = Object.prototype;
- var isPrototypeOf = ObjectPrototype$3.isPrototypeOf;
-
- var TO_STRING_TAG$4 = wellKnownSymbol('toStringTag');
- var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');
+ var NATIVE_ARRAY_BUFFER = arrayBufferNative;
+ var DESCRIPTORS$e = descriptors;
+ var global$O = global$1o;
+ var isCallable$9 = isCallable$r;
+ var isObject$k = isObject$s;
+ var hasOwn$9 = hasOwnProperty_1;
+ var classof$7 = classof$d;
+ var tryToString$2 = tryToString$5;
+ var createNonEnumerableProperty$4 = createNonEnumerableProperty$b;
+ var redefine$9 = redefine$h.exports;
+ var defineProperty$7 = objectDefineProperty.f;
+ var isPrototypeOf$5 = objectIsPrototypeOf;
+ var getPrototypeOf$1 = objectGetPrototypeOf;
+ var setPrototypeOf$4 = objectSetPrototypeOf;
+ var wellKnownSymbol$g = wellKnownSymbol$t;
+ var uid$1 = uid$5;
+
+ var Int8Array$4 = global$O.Int8Array;
+ var Int8ArrayPrototype$1 = Int8Array$4 && Int8Array$4.prototype;
+ var Uint8ClampedArray$1 = global$O.Uint8ClampedArray;
+ var Uint8ClampedArrayPrototype = Uint8ClampedArray$1 && Uint8ClampedArray$1.prototype;
+ var TypedArray$1 = Int8Array$4 && getPrototypeOf$1(Int8Array$4);
+ var TypedArrayPrototype$2 = Int8ArrayPrototype$1 && getPrototypeOf$1(Int8ArrayPrototype$1);
+ var ObjectPrototype$1 = Object.prototype;
+ var TypeError$e = global$O.TypeError;
+
+ var TO_STRING_TAG = wellKnownSymbol$g('toStringTag');
+ var TYPED_ARRAY_TAG$1 = uid$1('TYPED_ARRAY_TAG');
+ var TYPED_ARRAY_CONSTRUCTOR$2 = uid$1('TYPED_ARRAY_CONSTRUCTOR');
// Fixing native typed arrays in Opera Presto crashes the browser, see #595
- var NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferNative && !!objectSetPrototypeOf && classof(global_1.opera) !== 'Opera';
- var TYPED_ARRAY_TAG_REQIRED = false;
- var NAME;
+ var NATIVE_ARRAY_BUFFER_VIEWS$3 = NATIVE_ARRAY_BUFFER && !!setPrototypeOf$4 && classof$7(global$O.opera) !== 'Opera';
+ var TYPED_ARRAY_TAG_REQUIRED = false;
+ var NAME$1, Constructor, Prototype;
var TypedArrayConstructorsList = {
Int8Array: 1,
@@ -2215,193 +3035,421 @@
};
var isView = function isView(it) {
- if (!isObject(it)) return false;
- var klass = classof(it);
+ if (!isObject$k(it)) return false;
+ var klass = classof$7(it);
return klass === 'DataView'
- || has(TypedArrayConstructorsList, klass)
- || has(BigIntArrayConstructorsList, klass);
+ || hasOwn$9(TypedArrayConstructorsList, klass)
+ || hasOwn$9(BigIntArrayConstructorsList, klass);
};
- var isTypedArray = function (it) {
- if (!isObject(it)) return false;
- var klass = classof(it);
- return has(TypedArrayConstructorsList, klass)
- || has(BigIntArrayConstructorsList, klass);
+ var isTypedArray$1 = function (it) {
+ if (!isObject$k(it)) return false;
+ var klass = classof$7(it);
+ return hasOwn$9(TypedArrayConstructorsList, klass)
+ || hasOwn$9(BigIntArrayConstructorsList, klass);
};
- var aTypedArray = function (it) {
- if (isTypedArray(it)) return it;
- throw TypeError('Target is not a typed array');
+ var aTypedArray$m = function (it) {
+ if (isTypedArray$1(it)) return it;
+ throw TypeError$e('Target is not a typed array');
};
- var aTypedArrayConstructor = function (C) {
- if (objectSetPrototypeOf) {
- if (isPrototypeOf.call(TypedArray, C)) return C;
- } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {
- var TypedArrayConstructor = global_1[ARRAY];
- if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {
- return C;
- }
- } throw TypeError('Target is not a typed array constructor');
+ var aTypedArrayConstructor$3 = function (C) {
+ if (isCallable$9(C) && (!setPrototypeOf$4 || isPrototypeOf$5(TypedArray$1, C))) return C;
+ throw TypeError$e(tryToString$2(C) + ' is not a typed array constructor');
};
- var exportTypedArrayMethod = function (KEY, property, forced) {
- if (!descriptors) return;
+ var exportTypedArrayMethod$n = function (KEY, property, forced, options) {
+ if (!DESCRIPTORS$e) return;
if (forced) for (var ARRAY in TypedArrayConstructorsList) {
- var TypedArrayConstructor = global_1[ARRAY];
- if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {
+ var TypedArrayConstructor = global$O[ARRAY];
+ if (TypedArrayConstructor && hasOwn$9(TypedArrayConstructor.prototype, KEY)) try {
delete TypedArrayConstructor.prototype[KEY];
+ } catch (error) {
+ // old WebKit bug - some methods are non-configurable
+ try {
+ TypedArrayConstructor.prototype[KEY] = property;
+ } catch (error2) { /* empty */ }
}
}
- if (!TypedArrayPrototype[KEY] || forced) {
- redefine(TypedArrayPrototype, KEY, forced ? property
- : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);
+ if (!TypedArrayPrototype$2[KEY] || forced) {
+ redefine$9(TypedArrayPrototype$2, KEY, forced ? property
+ : NATIVE_ARRAY_BUFFER_VIEWS$3 && Int8ArrayPrototype$1[KEY] || property, options);
}
};
- var exportTypedArrayStaticMethod = function (KEY, property, forced) {
+ var exportTypedArrayStaticMethod$1 = function (KEY, property, forced) {
var ARRAY, TypedArrayConstructor;
- if (!descriptors) return;
- if (objectSetPrototypeOf) {
+ if (!DESCRIPTORS$e) return;
+ if (setPrototypeOf$4) {
if (forced) for (ARRAY in TypedArrayConstructorsList) {
- TypedArrayConstructor = global_1[ARRAY];
- if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {
+ TypedArrayConstructor = global$O[ARRAY];
+ if (TypedArrayConstructor && hasOwn$9(TypedArrayConstructor, KEY)) try {
delete TypedArrayConstructor[KEY];
- }
+ } catch (error) { /* empty */ }
}
- if (!TypedArray[KEY] || forced) {
+ if (!TypedArray$1[KEY] || forced) {
// V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable
try {
- return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array$1[KEY] || property);
+ return redefine$9(TypedArray$1, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS$3 && TypedArray$1[KEY] || property);
} catch (error) { /* empty */ }
} else return;
}
for (ARRAY in TypedArrayConstructorsList) {
- TypedArrayConstructor = global_1[ARRAY];
+ TypedArrayConstructor = global$O[ARRAY];
if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {
- redefine(TypedArrayConstructor, KEY, property);
+ redefine$9(TypedArrayConstructor, KEY, property);
}
}
};
- for (NAME in TypedArrayConstructorsList) {
- if (!global_1[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;
+ for (NAME$1 in TypedArrayConstructorsList) {
+ Constructor = global$O[NAME$1];
+ Prototype = Constructor && Constructor.prototype;
+ if (Prototype) createNonEnumerableProperty$4(Prototype, TYPED_ARRAY_CONSTRUCTOR$2, Constructor);
+ else NATIVE_ARRAY_BUFFER_VIEWS$3 = false;
+ }
+
+ for (NAME$1 in BigIntArrayConstructorsList) {
+ Constructor = global$O[NAME$1];
+ Prototype = Constructor && Constructor.prototype;
+ if (Prototype) createNonEnumerableProperty$4(Prototype, TYPED_ARRAY_CONSTRUCTOR$2, Constructor);
}
// WebKit bug - typed arrays constructors prototype is Object.prototype
- if (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {
+ if (!NATIVE_ARRAY_BUFFER_VIEWS$3 || !isCallable$9(TypedArray$1) || TypedArray$1 === Function.prototype) {
// eslint-disable-next-line no-shadow -- safe
- TypedArray = function TypedArray() {
- throw TypeError('Incorrect invocation');
+ TypedArray$1 = function TypedArray() {
+ throw TypeError$e('Incorrect invocation');
};
- if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {
- if (global_1[NAME]) objectSetPrototypeOf(global_1[NAME], TypedArray);
+ if (NATIVE_ARRAY_BUFFER_VIEWS$3) for (NAME$1 in TypedArrayConstructorsList) {
+ if (global$O[NAME$1]) setPrototypeOf$4(global$O[NAME$1], TypedArray$1);
}
}
- if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype$3) {
- TypedArrayPrototype = TypedArray.prototype;
- if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {
- if (global_1[NAME]) objectSetPrototypeOf(global_1[NAME].prototype, TypedArrayPrototype);
+ if (!NATIVE_ARRAY_BUFFER_VIEWS$3 || !TypedArrayPrototype$2 || TypedArrayPrototype$2 === ObjectPrototype$1) {
+ TypedArrayPrototype$2 = TypedArray$1.prototype;
+ if (NATIVE_ARRAY_BUFFER_VIEWS$3) for (NAME$1 in TypedArrayConstructorsList) {
+ if (global$O[NAME$1]) setPrototypeOf$4(global$O[NAME$1].prototype, TypedArrayPrototype$2);
}
}
// WebKit bug - one more object in Uint8ClampedArray prototype chain
- if (NATIVE_ARRAY_BUFFER_VIEWS && objectGetPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {
- objectSetPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);
+ if (NATIVE_ARRAY_BUFFER_VIEWS$3 && getPrototypeOf$1(Uint8ClampedArrayPrototype) !== TypedArrayPrototype$2) {
+ setPrototypeOf$4(Uint8ClampedArrayPrototype, TypedArrayPrototype$2);
}
- if (descriptors && !has(TypedArrayPrototype, TO_STRING_TAG$4)) {
- TYPED_ARRAY_TAG_REQIRED = true;
- defineProperty$4(TypedArrayPrototype, TO_STRING_TAG$4, { get: function () {
- return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;
+ if (DESCRIPTORS$e && !hasOwn$9(TypedArrayPrototype$2, TO_STRING_TAG)) {
+ TYPED_ARRAY_TAG_REQUIRED = true;
+ defineProperty$7(TypedArrayPrototype$2, TO_STRING_TAG, { get: function () {
+ return isObject$k(this) ? this[TYPED_ARRAY_TAG$1] : undefined;
} });
- for (NAME in TypedArrayConstructorsList) if (global_1[NAME]) {
- createNonEnumerableProperty(global_1[NAME], TYPED_ARRAY_TAG, NAME);
+ for (NAME$1 in TypedArrayConstructorsList) if (global$O[NAME$1]) {
+ createNonEnumerableProperty$4(global$O[NAME$1], TYPED_ARRAY_TAG$1, NAME$1);
}
}
var arrayBufferViewCore = {
- NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,
- TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,
- aTypedArray: aTypedArray,
- aTypedArrayConstructor: aTypedArrayConstructor,
- exportTypedArrayMethod: exportTypedArrayMethod,
- exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,
+ NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS$3,
+ TYPED_ARRAY_CONSTRUCTOR: TYPED_ARRAY_CONSTRUCTOR$2,
+ TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG$1,
+ aTypedArray: aTypedArray$m,
+ aTypedArrayConstructor: aTypedArrayConstructor$3,
+ exportTypedArrayMethod: exportTypedArrayMethod$n,
+ exportTypedArrayStaticMethod: exportTypedArrayStaticMethod$1,
isView: isView,
- isTypedArray: isTypedArray,
- TypedArray: TypedArray,
- TypedArrayPrototype: TypedArrayPrototype
+ isTypedArray: isTypedArray$1,
+ TypedArray: TypedArray$1,
+ TypedArrayPrototype: TypedArrayPrototype$2
};
- var NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
+ var $$17 = _export;
+ var ArrayBufferViewCore$o = arrayBufferViewCore;
+
+ var NATIVE_ARRAY_BUFFER_VIEWS$2 = ArrayBufferViewCore$o.NATIVE_ARRAY_BUFFER_VIEWS;
// `ArrayBuffer.isView` method
// https://tc39.es/ecma262/#sec-arraybuffer.isview
- _export({ target: 'ArrayBuffer', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS$1 }, {
- isView: arrayBufferViewCore.isView
+ $$17({ target: 'ArrayBuffer', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS$2 }, {
+ isView: ArrayBufferViewCore$o.isView
});
- var SPECIES$2 = wellKnownSymbol('species');
+ var getBuiltIn$4 = getBuiltIn$b;
+ var definePropertyModule$1 = objectDefineProperty;
+ var wellKnownSymbol$f = wellKnownSymbol$t;
+ var DESCRIPTORS$d = descriptors;
+
+ var SPECIES$4 = wellKnownSymbol$f('species');
- var setSpecies = function (CONSTRUCTOR_NAME) {
- var Constructor = getBuiltIn(CONSTRUCTOR_NAME);
- var defineProperty = objectDefineProperty.f;
+ var setSpecies$5 = function (CONSTRUCTOR_NAME) {
+ var Constructor = getBuiltIn$4(CONSTRUCTOR_NAME);
+ var defineProperty = definePropertyModule$1.f;
- if (descriptors && Constructor && !Constructor[SPECIES$2]) {
- defineProperty(Constructor, SPECIES$2, {
+ if (DESCRIPTORS$d && Constructor && !Constructor[SPECIES$4]) {
+ defineProperty(Constructor, SPECIES$4, {
configurable: true,
get: function () { return this; }
});
}
};
- var ARRAY_BUFFER$1 = 'ArrayBuffer';
- var ArrayBuffer$2 = arrayBuffer[ARRAY_BUFFER$1];
- var NativeArrayBuffer$1 = global_1[ARRAY_BUFFER$1];
+ var $$16 = _export;
+ var global$N = global$1o;
+ var arrayBufferModule = arrayBuffer;
+ var setSpecies$4 = setSpecies$5;
+
+ var ARRAY_BUFFER = 'ArrayBuffer';
+ var ArrayBuffer$3 = arrayBufferModule[ARRAY_BUFFER];
+ var NativeArrayBuffer = global$N[ARRAY_BUFFER];
// `ArrayBuffer` constructor
// https://tc39.es/ecma262/#sec-arraybuffer-constructor
- _export({ global: true, forced: NativeArrayBuffer$1 !== ArrayBuffer$2 }, {
- ArrayBuffer: ArrayBuffer$2
+ $$16({ global: true, forced: NativeArrayBuffer !== ArrayBuffer$3 }, {
+ ArrayBuffer: ArrayBuffer$3
});
- setSpecies(ARRAY_BUFFER$1);
+ setSpecies$4(ARRAY_BUFFER);
+
+ var fails$H = fails$V;
- var arrayMethodIsStrict = function (METHOD_NAME, argument) {
+ var arrayMethodIsStrict$9 = function (METHOD_NAME, argument) {
var method = [][METHOD_NAME];
- return !!method && fails(function () {
+ return !!method && fails$H(function () {
// eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing
method.call(null, argument || function () { throw 1; }, 1);
});
};
- var $indexOf = arrayIncludes.indexOf;
-
+ /* eslint-disable es/no-array-prototype-indexof -- required for testing */
+ var $$15 = _export;
+ var uncurryThis$C = functionUncurryThis;
+ var $IndexOf = arrayIncludes.indexOf;
+ var arrayMethodIsStrict$8 = arrayMethodIsStrict$9;
- var nativeIndexOf = [].indexOf;
+ var un$IndexOf = uncurryThis$C([].indexOf);
- var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;
- var STRICT_METHOD = arrayMethodIsStrict('indexOf');
+ var NEGATIVE_ZERO$1 = !!un$IndexOf && 1 / un$IndexOf([1], 1, -0) < 0;
+ var STRICT_METHOD$8 = arrayMethodIsStrict$8('indexOf');
// `Array.prototype.indexOf` method
// https://tc39.es/ecma262/#sec-array.prototype.indexof
- _export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, {
+ $$15({ target: 'Array', proto: true, forced: NEGATIVE_ZERO$1 || !STRICT_METHOD$8 }, {
indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
- return NEGATIVE_ZERO
+ var fromIndex = arguments.length > 1 ? arguments[1] : undefined;
+ return NEGATIVE_ZERO$1
// convert -0 to +0
- ? nativeIndexOf.apply(this, arguments) || 0
- : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ ? un$IndexOf(this, searchElement, fromIndex) || 0
+ : $IndexOf(this, searchElement, fromIndex);
}
});
- var SPECIES$3 = wellKnownSymbol('species');
+ var anObject$e = anObject$n;
+
+ // `RegExp.prototype.flags` getter implementation
+ // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
+ var regexpFlags$1 = function () {
+ var that = anObject$e(this);
+ var result = '';
+ if (that.global) result += 'g';
+ if (that.ignoreCase) result += 'i';
+ if (that.multiline) result += 'm';
+ if (that.dotAll) result += 's';
+ if (that.unicode) result += 'u';
+ if (that.sticky) result += 'y';
+ return result;
+ };
+
+ var fails$G = fails$V;
+ var global$M = global$1o;
+
+ // babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError
+ var $RegExp$2 = global$M.RegExp;
+
+ var UNSUPPORTED_Y$3 = fails$G(function () {
+ var re = $RegExp$2('a', 'y');
+ re.lastIndex = 2;
+ return re.exec('abcd') != null;
+ });
+
+ // UC Browser bug
+ // https://github.com/zloirock/core-js/issues/1008
+ var MISSED_STICKY$1 = UNSUPPORTED_Y$3 || fails$G(function () {
+ return !$RegExp$2('a', 'y').sticky;
+ });
+
+ var BROKEN_CARET = UNSUPPORTED_Y$3 || fails$G(function () {
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=773687
+ var re = $RegExp$2('^r', 'gy');
+ re.lastIndex = 2;
+ return re.exec('str') != null;
+ });
+
+ var regexpStickyHelpers = {
+ BROKEN_CARET: BROKEN_CARET,
+ MISSED_STICKY: MISSED_STICKY$1,
+ UNSUPPORTED_Y: UNSUPPORTED_Y$3
+ };
+
+ var fails$F = fails$V;
+ var global$L = global$1o;
+
+ // babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError
+ var $RegExp$1 = global$L.RegExp;
+
+ var regexpUnsupportedDotAll = fails$F(function () {
+ var re = $RegExp$1('.', 's');
+ return !(re.dotAll && re.exec('\n') && re.flags === 's');
+ });
+
+ var fails$E = fails$V;
+ var global$K = global$1o;
+
+ // babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError
+ var $RegExp = global$K.RegExp;
+
+ var regexpUnsupportedNcg = fails$E(function () {
+ var re = $RegExp('(?b)', 'g');
+ return re.exec('b').groups.a !== 'b' ||
+ 'b'.replace(re, '$c') !== 'bc';
+ });
+
+ /* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */
+ /* eslint-disable regexp/no-useless-quantifier -- testing */
+ var call$i = functionCall;
+ var uncurryThis$B = functionUncurryThis;
+ var toString$g = toString$k;
+ var regexpFlags = regexpFlags$1;
+ var stickyHelpers$2 = regexpStickyHelpers;
+ var shared = shared$5.exports;
+ var create$8 = objectCreate;
+ var getInternalState$2 = internalState.get;
+ var UNSUPPORTED_DOT_ALL$1 = regexpUnsupportedDotAll;
+ var UNSUPPORTED_NCG$1 = regexpUnsupportedNcg;
+
+ var nativeReplace = shared('native-string-replace', String.prototype.replace);
+ var nativeExec = RegExp.prototype.exec;
+ var patchedExec = nativeExec;
+ var charAt$6 = uncurryThis$B(''.charAt);
+ var indexOf = uncurryThis$B(''.indexOf);
+ var replace$7 = uncurryThis$B(''.replace);
+ var stringSlice$9 = uncurryThis$B(''.slice);
+
+ var UPDATES_LAST_INDEX_WRONG = (function () {
+ var re1 = /a/;
+ var re2 = /b*/g;
+ call$i(nativeExec, re1, 'a');
+ call$i(nativeExec, re2, 'a');
+ return re1.lastIndex !== 0 || re2.lastIndex !== 0;
+ })();
+
+ var UNSUPPORTED_Y$2 = stickyHelpers$2.BROKEN_CARET;
+
+ // nonparticipating capturing group, copied from es5-shim's String#split patch.
+ var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
+
+ var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$2 || UNSUPPORTED_DOT_ALL$1 || UNSUPPORTED_NCG$1;
+
+ if (PATCH) {
+ patchedExec = function exec(string) {
+ var re = this;
+ var state = getInternalState$2(re);
+ var str = toString$g(string);
+ var raw = state.raw;
+ var result, reCopy, lastIndex, match, i, object, group;
+
+ if (raw) {
+ raw.lastIndex = re.lastIndex;
+ result = call$i(patchedExec, raw, str);
+ re.lastIndex = raw.lastIndex;
+ return result;
+ }
+
+ var groups = state.groups;
+ var sticky = UNSUPPORTED_Y$2 && re.sticky;
+ var flags = call$i(regexpFlags, re);
+ var source = re.source;
+ var charsAdded = 0;
+ var strCopy = str;
+
+ if (sticky) {
+ flags = replace$7(flags, 'y', '');
+ if (indexOf(flags, 'g') === -1) {
+ flags += 'g';
+ }
+
+ strCopy = stringSlice$9(str, re.lastIndex);
+ // Support anchored sticky behavior.
+ if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt$6(str, re.lastIndex - 1) !== '\n')) {
+ source = '(?: ' + source + ')';
+ strCopy = ' ' + strCopy;
+ charsAdded++;
+ }
+ // ^(? + rx + ) is needed, in combination with some str slicing, to
+ // simulate the 'y' flag.
+ reCopy = new RegExp('^(?:' + source + ')', flags);
+ }
+
+ if (NPCG_INCLUDED) {
+ reCopy = new RegExp('^' + source + '$(?!\\s)', flags);
+ }
+ if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;
+
+ match = call$i(nativeExec, sticky ? reCopy : re, strCopy);
+
+ if (sticky) {
+ if (match) {
+ match.input = stringSlice$9(match.input, charsAdded);
+ match[0] = stringSlice$9(match[0], charsAdded);
+ match.index = re.lastIndex;
+ re.lastIndex += match[0].length;
+ } else re.lastIndex = 0;
+ } else if (UPDATES_LAST_INDEX_WRONG && match) {
+ re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
+ }
+ if (NPCG_INCLUDED && match && match.length > 1) {
+ // Fix browsers whose `exec` methods don't consistently return `undefined`
+ // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
+ call$i(nativeReplace, match[0], reCopy, function () {
+ for (i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined) match[i] = undefined;
+ }
+ });
+ }
+
+ if (match && groups) {
+ match.groups = object = create$8(null);
+ for (i = 0; i < groups.length; i++) {
+ group = groups[i];
+ object[group[0]] = match[group[1]];
+ }
+ }
+
+ return match;
+ };
+ }
- var arrayMethodHasSpeciesSupport = function (METHOD_NAME) {
+ var regexpExec$3 = patchedExec;
+
+ var $$14 = _export;
+ var exec$5 = regexpExec$3;
+
+ // `RegExp.prototype.exec` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype.exec
+ $$14({ target: 'RegExp', proto: true, forced: /./.exec !== exec$5 }, {
+ exec: exec$5
+ });
+
+ var fails$D = fails$V;
+ var wellKnownSymbol$e = wellKnownSymbol$t;
+ var V8_VERSION$2 = engineV8Version;
+
+ var SPECIES$3 = wellKnownSymbol$e('species');
+
+ var arrayMethodHasSpeciesSupport$5 = function (METHOD_NAME) {
// We can't use this feature detection in V8 since it causes
// deoptimization and serious performance degradation
// https://github.com/zloirock/core-js/issues/677
- return engineV8Version >= 51 || !fails(function () {
+ return V8_VERSION$2 >= 51 || !fails$D(function () {
var array = [];
var constructor = array.constructor = {};
constructor[SPECIES$3] = function () {
@@ -2411,110 +3459,192 @@
});
};
- var $map = arrayIteration.map;
-
+ var $$13 = _export;
+ var $map$1 = arrayIteration.map;
+ var arrayMethodHasSpeciesSupport$4 = arrayMethodHasSpeciesSupport$5;
- var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');
+ var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport$4('map');
// `Array.prototype.map` method
// https://tc39.es/ecma262/#sec-array.prototype.map
// with adding support of @@species
- _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
+ $$13({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 }, {
map: function map(callbackfn /* , thisArg */) {
- return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return $map$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
var $forEach$1 = arrayIteration.forEach;
+ var arrayMethodIsStrict$7 = arrayMethodIsStrict$9;
-
- var STRICT_METHOD$1 = arrayMethodIsStrict('forEach');
+ var STRICT_METHOD$7 = arrayMethodIsStrict$7('forEach');
// `Array.prototype.forEach` method implementation
// https://tc39.es/ecma262/#sec-array.prototype.foreach
- var arrayForEach = !STRICT_METHOD$1 ? function forEach(callbackfn /* , thisArg */) {
+ var arrayForEach = !STRICT_METHOD$7 ? function forEach(callbackfn /* , thisArg */) {
return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ // eslint-disable-next-line es/no-array-prototype-foreach -- safe
} : [].forEach;
+ var $$12 = _export;
+ var forEach$3 = arrayForEach;
+
// `Array.prototype.forEach` method
// https://tc39.es/ecma262/#sec-array.prototype.foreach
- _export({ target: 'Array', proto: true, forced: [].forEach != arrayForEach }, {
- forEach: arrayForEach
+ // eslint-disable-next-line es/no-array-prototype-foreach -- safe
+ $$12({ target: 'Array', proto: true, forced: [].forEach != forEach$3 }, {
+ forEach: forEach$3
});
- for (var COLLECTION_NAME$1 in domIterables) {
- var Collection$1 = global_1[COLLECTION_NAME$1];
- var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;
+ var global$J = global$1o;
+ var DOMIterables = domIterables;
+ var DOMTokenListPrototype = domTokenListPrototype;
+ var forEach$2 = arrayForEach;
+ var createNonEnumerableProperty$3 = createNonEnumerableProperty$b;
+
+ var handlePrototype = function (CollectionPrototype) {
// some Chrome versions have non-configurable methods on DOMTokenList
- if (CollectionPrototype$1 && CollectionPrototype$1.forEach !== arrayForEach) try {
- createNonEnumerableProperty(CollectionPrototype$1, 'forEach', arrayForEach);
+ if (CollectionPrototype && CollectionPrototype.forEach !== forEach$2) try {
+ createNonEnumerableProperty$3(CollectionPrototype, 'forEach', forEach$2);
} catch (error) {
- CollectionPrototype$1.forEach = arrayForEach;
+ CollectionPrototype.forEach = forEach$2;
+ }
+ };
+
+ for (var COLLECTION_NAME in DOMIterables) {
+ if (DOMIterables[COLLECTION_NAME]) {
+ handlePrototype(global$J[COLLECTION_NAME] && global$J[COLLECTION_NAME].prototype);
}
}
+ handlePrototype(DOMTokenListPrototype);
+
+ var $$11 = _export;
+ var isArray$5 = isArray$8;
+
// `Array.isArray` method
// https://tc39.es/ecma262/#sec-array.isarray
- _export({ target: 'Array', stat: true }, {
- isArray: isArray
+ $$11({ target: 'Array', stat: true }, {
+ isArray: isArray$5
});
- var nativeGetOwnPropertyNames$2 = objectGetOwnPropertyNamesExternal.f;
+ var $$10 = _export;
+ var fails$C = fails$V;
+ var getOwnPropertyNames$3 = objectGetOwnPropertyNamesExternal.f;
- var FAILS_ON_PRIMITIVES = fails(function () { return !Object.getOwnPropertyNames(1); });
+ // eslint-disable-next-line es/no-object-getownpropertynames -- required for testing
+ var FAILS_ON_PRIMITIVES$5 = fails$C(function () { return !Object.getOwnPropertyNames(1); });
// `Object.getOwnPropertyNames` method
// https://tc39.es/ecma262/#sec-object.getownpropertynames
- _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
- getOwnPropertyNames: nativeGetOwnPropertyNames$2
+ $$10({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$5 }, {
+ getOwnPropertyNames: getOwnPropertyNames$3
});
- var nativePromiseConstructor = global_1.Promise;
+ var global$I = global$1o;
- var ITERATOR$3 = wellKnownSymbol('iterator');
- var ArrayPrototype$1 = Array.prototype;
+ var nativePromiseConstructor = global$I.Promise;
+
+ var wellKnownSymbol$d = wellKnownSymbol$t;
+ var Iterators$1 = iterators;
+
+ var ITERATOR$7 = wellKnownSymbol$d('iterator');
+ var ArrayPrototype = Array.prototype;
// check on default Array iterator
- var isArrayIteratorMethod = function (it) {
- return it !== undefined && (iterators.Array === it || ArrayPrototype$1[ITERATOR$3] === it);
+ var isArrayIteratorMethod$3 = function (it) {
+ return it !== undefined && (Iterators$1.Array === it || ArrayPrototype[ITERATOR$7] === it);
};
- var ITERATOR$4 = wellKnownSymbol('iterator');
+ var classof$6 = classof$d;
+ var getMethod$5 = getMethod$7;
+ var Iterators = iterators;
+ var wellKnownSymbol$c = wellKnownSymbol$t;
- var getIteratorMethod = function (it) {
- if (it != undefined) return it[ITERATOR$4]
- || it['@@iterator']
- || iterators[classof(it)];
+ var ITERATOR$6 = wellKnownSymbol$c('iterator');
+
+ var getIteratorMethod$5 = function (it) {
+ if (it != undefined) return getMethod$5(it, ITERATOR$6)
+ || getMethod$5(it, '@@iterator')
+ || Iterators[classof$6(it)];
};
- var iteratorClose = function (iterator) {
- var returnMethod = iterator['return'];
- if (returnMethod !== undefined) {
- return anObject(returnMethod.call(iterator)).value;
+ var global$H = global$1o;
+ var call$h = functionCall;
+ var aCallable$7 = aCallable$a;
+ var anObject$d = anObject$n;
+ var tryToString$1 = tryToString$5;
+ var getIteratorMethod$4 = getIteratorMethod$5;
+
+ var TypeError$d = global$H.TypeError;
+
+ var getIterator$4 = function (argument, usingIterator) {
+ var iteratorMethod = arguments.length < 2 ? getIteratorMethod$4(argument) : usingIterator;
+ if (aCallable$7(iteratorMethod)) return anObject$d(call$h(iteratorMethod, argument));
+ throw TypeError$d(tryToString$1(argument) + ' is not iterable');
+ };
+
+ var call$g = functionCall;
+ var anObject$c = anObject$n;
+ var getMethod$4 = getMethod$7;
+
+ var iteratorClose$2 = function (iterator, kind, value) {
+ var innerResult, innerError;
+ anObject$c(iterator);
+ try {
+ innerResult = getMethod$4(iterator, 'return');
+ if (!innerResult) {
+ if (kind === 'throw') throw value;
+ return value;
+ }
+ innerResult = call$g(innerResult, iterator);
+ } catch (error) {
+ innerError = true;
+ innerResult = error;
}
+ if (kind === 'throw') throw value;
+ if (innerError) throw innerResult;
+ anObject$c(innerResult);
+ return value;
};
+ var global$G = global$1o;
+ var bind$d = functionBindContext;
+ var call$f = functionCall;
+ var anObject$b = anObject$n;
+ var tryToString = tryToString$5;
+ var isArrayIteratorMethod$2 = isArrayIteratorMethod$3;
+ var lengthOfArrayLike$d = lengthOfArrayLike$i;
+ var isPrototypeOf$4 = objectIsPrototypeOf;
+ var getIterator$3 = getIterator$4;
+ var getIteratorMethod$3 = getIteratorMethod$5;
+ var iteratorClose$1 = iteratorClose$2;
+
+ var TypeError$c = global$G.TypeError;
+
var Result = function (stopped, result) {
this.stopped = stopped;
this.result = result;
};
- var iterate = function (iterable, unboundFunction, options) {
+ var ResultPrototype = Result.prototype;
+
+ var iterate$3 = function (iterable, unboundFunction, options) {
var that = options && options.that;
var AS_ENTRIES = !!(options && options.AS_ENTRIES);
var IS_ITERATOR = !!(options && options.IS_ITERATOR);
var INTERRUPTED = !!(options && options.INTERRUPTED);
- var fn = functionBindContext(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);
+ var fn = bind$d(unboundFunction, that);
var iterator, iterFn, index, length, result, next, step;
var stop = function (condition) {
- if (iterator) iteratorClose(iterator);
+ if (iterator) iteratorClose$1(iterator, 'normal', condition);
return new Result(true, condition);
};
var callFn = function (value) {
if (AS_ENTRIES) {
- anObject(value);
+ anObject$b(value);
return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);
} return INTERRUPTED ? fn(value, stop) : fn(value);
};
@@ -2522,31 +3652,32 @@
if (IS_ITERATOR) {
iterator = iterable;
} else {
- iterFn = getIteratorMethod(iterable);
- if (typeof iterFn != 'function') throw TypeError('Target is not iterable');
+ iterFn = getIteratorMethod$3(iterable);
+ if (!iterFn) throw TypeError$c(tryToString(iterable) + ' is not iterable');
// optimisation for array iterators
- if (isArrayIteratorMethod(iterFn)) {
- for (index = 0, length = toLength(iterable.length); length > index; index++) {
+ if (isArrayIteratorMethod$2(iterFn)) {
+ for (index = 0, length = lengthOfArrayLike$d(iterable); length > index; index++) {
result = callFn(iterable[index]);
- if (result && result instanceof Result) return result;
+ if (result && isPrototypeOf$4(ResultPrototype, result)) return result;
} return new Result(false);
}
- iterator = iterFn.call(iterable);
+ iterator = getIterator$3(iterable, iterFn);
}
next = iterator.next;
- while (!(step = next.call(iterator)).done) {
+ while (!(step = call$f(next, iterator)).done) {
try {
result = callFn(step.value);
} catch (error) {
- iteratorClose(iterator);
- throw error;
+ iteratorClose$1(iterator, 'throw', error);
}
- if (typeof result == 'object' && result && result instanceof Result) return result;
+ if (typeof result == 'object' && result && isPrototypeOf$4(ResultPrototype, result)) return result;
} return new Result(false);
};
- var ITERATOR$5 = wellKnownSymbol('iterator');
+ var wellKnownSymbol$b = wellKnownSymbol$t;
+
+ var ITERATOR$5 = wellKnownSymbol$b('iterator');
var SAFE_CLOSING = false;
try {
@@ -2562,11 +3693,11 @@
iteratorWithReturn[ITERATOR$5] = function () {
return this;
};
- // eslint-disable-next-line no-throw-literal -- required for testing
+ // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing
Array.from(iteratorWithReturn, function () { throw 2; });
} catch (error) { /* empty */ }
- var checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) {
+ var checkCorrectnessOfIteration$4 = function (exec, SKIP_CLOSING) {
if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
var ITERATION_SUPPORT = false;
try {
@@ -2583,24 +3714,58 @@
return ITERATION_SUPPORT;
};
- var engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent);
+ var global$F = global$1o;
- var location$1 = global_1.location;
- var set$2 = global_1.setImmediate;
- var clear = global_1.clearImmediate;
- var process$2 = global_1.process;
- var MessageChannel = global_1.MessageChannel;
- var Dispatch = global_1.Dispatch;
+ var TypeError$b = global$F.TypeError;
+
+ var validateArgumentsLength$4 = function (passed, required) {
+ if (passed < required) throw TypeError$b('Not enough arguments');
+ return passed;
+ };
+
+ var userAgent$6 = engineUserAgent;
+
+ var engineIsIos = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent$6);
+
+ var classof$5 = classofRaw$1;
+ var global$E = global$1o;
+
+ var engineIsNode = classof$5(global$E.process) == 'process';
+
+ var global$D = global$1o;
+ var apply$7 = functionApply;
+ var bind$c = functionBindContext;
+ var isCallable$8 = isCallable$r;
+ var hasOwn$8 = hasOwnProperty_1;
+ var fails$B = fails$V;
+ var html = html$2;
+ var arraySlice$8 = arraySlice$b;
+ var createElement = documentCreateElement$2;
+ var validateArgumentsLength$3 = validateArgumentsLength$4;
+ var IS_IOS$1 = engineIsIos;
+ var IS_NODE$4 = engineIsNode;
+
+ var set$2 = global$D.setImmediate;
+ var clear = global$D.clearImmediate;
+ var process$3 = global$D.process;
+ var Dispatch$1 = global$D.Dispatch;
+ var Function$3 = global$D.Function;
+ var MessageChannel = global$D.MessageChannel;
+ var String$2 = global$D.String;
var counter = 0;
- var queue = {};
+ var queue$1 = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
- var defer, channel, port;
+ var location$1, defer, channel, port;
+
+ try {
+ // Deno throws a ReferenceError on `location` access without `--location` flag
+ location$1 = global$D.location;
+ } catch (error) { /* empty */ }
var run = function (id) {
- // eslint-disable-next-line no-prototype-builtins -- safe
- if (queue.hasOwnProperty(id)) {
- var fn = queue[id];
- delete queue[id];
+ if (hasOwn$8(queue$1, id)) {
+ var fn = queue$1[id];
+ delete queue$1[id];
fn();
}
};
@@ -2617,57 +3782,56 @@
var post = function (id) {
// old engines have not location.origin
- global_1.postMessage(id + '', location$1.protocol + '//' + location$1.host);
+ global$D.postMessage(String$2(id), location$1.protocol + '//' + location$1.host);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if (!set$2 || !clear) {
- set$2 = function setImmediate(fn) {
- var args = [];
- var i = 1;
- while (arguments.length > i) args.push(arguments[i++]);
- queue[++counter] = function () {
- // eslint-disable-next-line no-new-func -- spec requirement
- (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);
+ set$2 = function setImmediate(handler) {
+ validateArgumentsLength$3(arguments.length, 1);
+ var fn = isCallable$8(handler) ? handler : Function$3(handler);
+ var args = arraySlice$8(arguments, 1);
+ queue$1[++counter] = function () {
+ apply$7(fn, undefined, args);
};
defer(counter);
return counter;
};
clear = function clearImmediate(id) {
- delete queue[id];
+ delete queue$1[id];
};
// Node.js 0.8-
- if (engineIsNode) {
+ if (IS_NODE$4) {
defer = function (id) {
- process$2.nextTick(runner(id));
+ process$3.nextTick(runner(id));
};
// Sphere (JS game engine) Dispatch API
- } else if (Dispatch && Dispatch.now) {
+ } else if (Dispatch$1 && Dispatch$1.now) {
defer = function (id) {
- Dispatch.now(runner(id));
+ Dispatch$1.now(runner(id));
};
// Browsers with MessageChannel, includes WebWorkers
// except iOS - https://github.com/zloirock/core-js/issues/624
- } else if (MessageChannel && !engineIsIos) {
+ } else if (MessageChannel && !IS_IOS$1) {
channel = new MessageChannel();
port = channel.port2;
channel.port1.onmessage = listener;
- defer = functionBindContext(port.postMessage, port, 1);
+ defer = bind$c(port.postMessage, port);
// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
} else if (
- global_1.addEventListener &&
- typeof postMessage == 'function' &&
- !global_1.importScripts &&
+ global$D.addEventListener &&
+ isCallable$8(global$D.postMessage) &&
+ !global$D.importScripts &&
location$1 && location$1.protocol !== 'file:' &&
- !fails(post)
+ !fails$B(post)
) {
defer = post;
- global_1.addEventListener('message', listener, false);
+ global$D.addEventListener('message', listener, false);
// IE8-
- } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {
+ } else if (ONREADYSTATECHANGE in createElement('script')) {
defer = function (id) {
- html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {
+ html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {
html.removeChild(this);
run(id);
};
@@ -2680,41 +3844,51 @@
}
}
- var task = {
+ var task$1 = {
set: set$2,
clear: clear
};
- var engineIsWebosWebkit = /web0s(?!.*chrome)/i.test(engineUserAgent);
-
- var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;
- var macrotask = task.set;
+ var userAgent$5 = engineUserAgent;
+ var global$C = global$1o;
+ var engineIsIosPebble = /ipad|iphone|ipod/i.test(userAgent$5) && global$C.Pebble !== undefined;
+ var userAgent$4 = engineUserAgent;
+ var engineIsWebosWebkit = /web0s(?!.*chrome)/i.test(userAgent$4);
- var MutationObserver = global_1.MutationObserver || global_1.WebKitMutationObserver;
- var document$2 = global_1.document;
- var process$3 = global_1.process;
- var Promise$1 = global_1.Promise;
+ var global$B = global$1o;
+ var bind$b = functionBindContext;
+ var getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;
+ var macrotask = task$1.set;
+ var IS_IOS = engineIsIos;
+ var IS_IOS_PEBBLE = engineIsIosPebble;
+ var IS_WEBOS_WEBKIT = engineIsWebosWebkit;
+ var IS_NODE$3 = engineIsNode;
+
+ var MutationObserver = global$B.MutationObserver || global$B.WebKitMutationObserver;
+ var document$2 = global$B.document;
+ var process$2 = global$B.process;
+ var Promise$1 = global$B.Promise;
// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
- var queueMicrotaskDescriptor = getOwnPropertyDescriptor$2(global_1, 'queueMicrotask');
+ var queueMicrotaskDescriptor = getOwnPropertyDescriptor$3(global$B, 'queueMicrotask');
var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;
- var flush, head, last, notify, toggle, node, promise, then;
+ var flush, head, last, notify$1, toggle, node, promise, then;
// modern engines have queueMicrotask method
if (!queueMicrotask) {
flush = function () {
var parent, fn;
- if (engineIsNode && (parent = process$3.domain)) parent.exit();
+ if (IS_NODE$3 && (parent = process$2.domain)) parent.exit();
while (head) {
fn = head.fn;
head = head.next;
try {
fn();
} catch (error) {
- if (head) notify();
+ if (head) notify$1();
else last = undefined;
throw error;
}
@@ -2724,25 +3898,27 @@
// browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
// also except WebOS Webkit https://github.com/zloirock/core-js/issues/898
- if (!engineIsIos && !engineIsNode && !engineIsWebosWebkit && MutationObserver && document$2) {
+ if (!IS_IOS && !IS_NODE$3 && !IS_WEBOS_WEBKIT && MutationObserver && document$2) {
toggle = true;
node = document$2.createTextNode('');
new MutationObserver(flush).observe(node, { characterData: true });
- notify = function () {
+ notify$1 = function () {
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
- } else if (Promise$1 && Promise$1.resolve) {
+ } else if (!IS_IOS_PEBBLE && Promise$1 && Promise$1.resolve) {
// Promise.resolve without an argument throws an error in LG WebOS 2
promise = Promise$1.resolve(undefined);
- then = promise.then;
- notify = function () {
- then.call(promise, flush);
+ // workaround of WebKit ~ iOS Safari 10.1 bug
+ promise.constructor = Promise$1;
+ then = bind$b(promise.then, promise);
+ notify$1 = function () {
+ then(flush);
};
// Node.js without promises
- } else if (engineIsNode) {
- notify = function () {
- process$3.nextTick(flush);
+ } else if (IS_NODE$3) {
+ notify$1 = function () {
+ process$2.nextTick(flush);
};
// for other environments - macrotask based on:
// - setImmediate
@@ -2751,22 +3927,27 @@
// - onreadystatechange
// - setTimeout
} else {
- notify = function () {
- // strange IE + webpack dev server bug - use .call(global)
- macrotask.call(global_1, flush);
+ // strange IE + webpack dev server bug - use .bind(global)
+ macrotask = bind$b(macrotask, global$B);
+ notify$1 = function () {
+ macrotask(flush);
};
}
}
- var microtask = queueMicrotask || function (fn) {
+ var microtask$1 = queueMicrotask || function (fn) {
var task = { fn: fn, next: undefined };
if (last) last.next = task;
if (!head) {
head = task;
- notify();
+ notify$1();
} last = task;
};
+ var newPromiseCapability$2 = {};
+
+ var aCallable$6 = aCallable$a;
+
var PromiseCapability = function (C) {
var resolve, reject;
this.promise = new C(function ($$resolve, $$reject) {
@@ -2774,36 +3955,39 @@
resolve = $$resolve;
reject = $$reject;
});
- this.resolve = aFunction$1(resolve);
- this.reject = aFunction$1(reject);
+ this.resolve = aCallable$6(resolve);
+ this.reject = aCallable$6(reject);
};
- // 25.4.1.5 NewPromiseCapability(C)
- var f$7 = function (C) {
+ // `NewPromiseCapability` abstract operation
+ // https://tc39.es/ecma262/#sec-newpromisecapability
+ newPromiseCapability$2.f = function (C) {
return new PromiseCapability(C);
};
- var newPromiseCapability = {
- f: f$7
- };
+ var anObject$a = anObject$n;
+ var isObject$j = isObject$s;
+ var newPromiseCapability$1 = newPromiseCapability$2;
- var promiseResolve = function (C, x) {
- anObject(C);
- if (isObject(x) && x.constructor === C) return x;
- var promiseCapability = newPromiseCapability.f(C);
+ var promiseResolve$2 = function (C, x) {
+ anObject$a(C);
+ if (isObject$j(x) && x.constructor === C) return x;
+ var promiseCapability = newPromiseCapability$1.f(C);
var resolve = promiseCapability.resolve;
resolve(x);
return promiseCapability.promise;
};
- var hostReportErrors = function (a, b) {
- var console = global_1.console;
+ var global$A = global$1o;
+
+ var hostReportErrors$1 = function (a, b) {
+ var console = global$A.console;
if (console && console.error) {
- arguments.length === 1 ? console.error(a) : console.error(a, b);
+ arguments.length == 1 ? console.error(a) : console.error(a, b);
}
};
- var perform = function (exec) {
+ var perform$1 = function (exec) {
try {
return { error: false, value: exec() };
} catch (error) {
@@ -2811,32 +3995,81 @@
}
};
- var task$1 = task.set;
-
-
-
-
-
-
-
-
-
+ var Queue$1 = function () {
+ this.head = null;
+ this.tail = null;
+ };
+ Queue$1.prototype = {
+ add: function (item) {
+ var entry = { item: item, next: null };
+ if (this.head) this.tail.next = entry;
+ else this.head = entry;
+ this.tail = entry;
+ },
+ get: function () {
+ var entry = this.head;
+ if (entry) {
+ this.head = entry.next;
+ if (this.tail === entry) this.tail = null;
+ return entry.item;
+ }
+ }
+ };
- var SPECIES$4 = wellKnownSymbol('species');
+ var queue = Queue$1;
+
+ var engineIsBrowser = typeof window == 'object';
+
+ var $$$ = _export;
+ var global$z = global$1o;
+ var getBuiltIn$3 = getBuiltIn$b;
+ var call$e = functionCall;
+ var NativePromise$1 = nativePromiseConstructor;
+ var redefine$8 = redefine$h.exports;
+ var redefineAll$2 = redefineAll$4;
+ var setPrototypeOf$3 = objectSetPrototypeOf;
+ var setToStringTag$5 = setToStringTag$a;
+ var setSpecies$3 = setSpecies$5;
+ var aCallable$5 = aCallable$a;
+ var isCallable$7 = isCallable$r;
+ var isObject$i = isObject$s;
+ var anInstance$5 = anInstance$7;
+ var inspectSource = inspectSource$4;
+ var iterate$2 = iterate$3;
+ var checkCorrectnessOfIteration$3 = checkCorrectnessOfIteration$4;
+ var speciesConstructor$3 = speciesConstructor$5;
+ var task = task$1.set;
+ var microtask = microtask$1;
+ var promiseResolve$1 = promiseResolve$2;
+ var hostReportErrors = hostReportErrors$1;
+ var newPromiseCapabilityModule = newPromiseCapability$2;
+ var perform = perform$1;
+ var Queue = queue;
+ var InternalStateModule$4 = internalState;
+ var isForced$3 = isForced_1;
+ var wellKnownSymbol$a = wellKnownSymbol$t;
+ var IS_BROWSER = engineIsBrowser;
+ var IS_NODE$2 = engineIsNode;
+ var V8_VERSION$1 = engineV8Version;
+
+ var SPECIES$2 = wellKnownSymbol$a('species');
var PROMISE = 'Promise';
- var getInternalState$4 = internalState.get;
- var setInternalState$4 = internalState.set;
- var getInternalPromiseState = internalState.getterFor(PROMISE);
- var PromiseConstructor = nativePromiseConstructor;
- var TypeError$1 = global_1.TypeError;
- var document$3 = global_1.document;
- var process$4 = global_1.process;
- var $fetch = getBuiltIn('fetch');
- var newPromiseCapability$1 = newPromiseCapability.f;
- var newGenericPromiseCapability = newPromiseCapability$1;
- var DISPATCH_EVENT = !!(document$3 && document$3.createEvent && global_1.dispatchEvent);
- var NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';
+
+ var getInternalState$1 = InternalStateModule$4.getterFor(PROMISE);
+ var setInternalState$4 = InternalStateModule$4.set;
+ var getInternalPromiseState = InternalStateModule$4.getterFor(PROMISE);
+ var NativePromisePrototype = NativePromise$1 && NativePromise$1.prototype;
+ var PromiseConstructor = NativePromise$1;
+ var PromisePrototype = NativePromisePrototype;
+ var TypeError$a = global$z.TypeError;
+ var document$1 = global$z.document;
+ var process$1 = global$z.process;
+ var newPromiseCapability = newPromiseCapabilityModule.f;
+ var newGenericPromiseCapability = newPromiseCapability;
+
+ var DISPATCH_EVENT = !!(document$1 && document$1.createEvent && global$z.dispatchEvent);
+ var NATIVE_REJECTION_EVENT = isCallable$7(global$z.PromiseRejectionEvent);
var UNHANDLED_REJECTION = 'unhandledrejection';
var REJECTION_HANDLED = 'rejectionhandled';
var PENDING = 0;
@@ -2844,117 +4077,120 @@
var REJECTED = 2;
var HANDLED = 1;
var UNHANDLED = 2;
+ var SUBCLASSING = false;
+
var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;
- var FORCED = isForced_1(PROMISE, function () {
- var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);
- if (!GLOBAL_CORE_JS_PROMISE) {
- // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
- // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
- // We can't detect it synchronously, so just check versions
- if (engineV8Version === 66) return true;
- // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
- if (!engineIsNode && !NATIVE_REJECTION_EVENT) return true;
- }
+ var FORCED$g = isForced$3(PROMISE, function () {
+ var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor);
+ var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor);
+ // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
+ // We can't detect it synchronously, so just check versions
+ if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION$1 === 66) return true;
// We can't use @@species feature detection in V8 since it causes
// deoptimization and performance degradation
// https://github.com/zloirock/core-js/issues/679
- if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false;
+ if (V8_VERSION$1 >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;
// Detect correctness of subclassing with @@species support
- var promise = PromiseConstructor.resolve(1);
+ var promise = new PromiseConstructor(function (resolve) { resolve(1); });
var FakePromise = function (exec) {
exec(function () { /* empty */ }, function () { /* empty */ });
};
var constructor = promise.constructor = {};
- constructor[SPECIES$4] = FakePromise;
- return !(promise.then(function () { /* empty */ }) instanceof FakePromise);
+ constructor[SPECIES$2] = FakePromise;
+ SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;
+ if (!SUBCLASSING) return true;
+ // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
+ return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT;
});
- var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {
+ var INCORRECT_ITERATION$1 = FORCED$g || !checkCorrectnessOfIteration$3(function (iterable) {
PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });
});
// helpers
var isThenable = function (it) {
var then;
- return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
+ return isObject$i(it) && isCallable$7(then = it.then) ? then : false;
};
- var notify$1 = function (state, isReject) {
+ var callReaction = function (reaction, state) {
+ var value = state.value;
+ var ok = state.state == FULFILLED;
+ var handler = ok ? reaction.ok : reaction.fail;
+ var resolve = reaction.resolve;
+ var reject = reaction.reject;
+ var domain = reaction.domain;
+ var result, then, exited;
+ try {
+ if (handler) {
+ if (!ok) {
+ if (state.rejection === UNHANDLED) onHandleUnhandled(state);
+ state.rejection = HANDLED;
+ }
+ if (handler === true) result = value;
+ else {
+ if (domain) domain.enter();
+ result = handler(value); // can throw
+ if (domain) {
+ domain.exit();
+ exited = true;
+ }
+ }
+ if (result === reaction.promise) {
+ reject(TypeError$a('Promise-chain cycle'));
+ } else if (then = isThenable(result)) {
+ call$e(then, result, resolve, reject);
+ } else resolve(result);
+ } else reject(value);
+ } catch (error) {
+ if (domain && !exited) domain.exit();
+ reject(error);
+ }
+ };
+
+ var notify = function (state, isReject) {
if (state.notified) return;
state.notified = true;
- var chain = state.reactions;
microtask(function () {
- var value = state.value;
- var ok = state.state == FULFILLED;
- var index = 0;
- // variable length - can't use forEach
- while (chain.length > index) {
- var reaction = chain[index++];
- var handler = ok ? reaction.ok : reaction.fail;
- var resolve = reaction.resolve;
- var reject = reaction.reject;
- var domain = reaction.domain;
- var result, then, exited;
- try {
- if (handler) {
- if (!ok) {
- if (state.rejection === UNHANDLED) onHandleUnhandled(state);
- state.rejection = HANDLED;
- }
- if (handler === true) result = value;
- else {
- if (domain) domain.enter();
- result = handler(value); // can throw
- if (domain) {
- domain.exit();
- exited = true;
- }
- }
- if (result === reaction.promise) {
- reject(TypeError$1('Promise-chain cycle'));
- } else if (then = isThenable(result)) {
- then.call(result, resolve, reject);
- } else resolve(result);
- } else reject(value);
- } catch (error) {
- if (domain && !exited) domain.exit();
- reject(error);
- }
+ var reactions = state.reactions;
+ var reaction;
+ while (reaction = reactions.get()) {
+ callReaction(reaction, state);
}
- state.reactions = [];
state.notified = false;
if (isReject && !state.rejection) onUnhandled(state);
});
};
- var dispatchEvent = function (name, promise, reason) {
+ var dispatchEvent$1 = function (name, promise, reason) {
var event, handler;
if (DISPATCH_EVENT) {
- event = document$3.createEvent('Event');
+ event = document$1.createEvent('Event');
event.promise = promise;
event.reason = reason;
event.initEvent(name, false, true);
- global_1.dispatchEvent(event);
+ global$z.dispatchEvent(event);
} else event = { promise: promise, reason: reason };
- if (!NATIVE_REJECTION_EVENT && (handler = global_1['on' + name])) handler(event);
+ if (!NATIVE_REJECTION_EVENT && (handler = global$z['on' + name])) handler(event);
else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);
};
var onUnhandled = function (state) {
- task$1.call(global_1, function () {
+ call$e(task, global$z, function () {
var promise = state.facade;
var value = state.value;
var IS_UNHANDLED = isUnhandled(state);
var result;
if (IS_UNHANDLED) {
result = perform(function () {
- if (engineIsNode) {
- process$4.emit('unhandledRejection', value, promise);
- } else dispatchEvent(UNHANDLED_REJECTION, promise, value);
+ if (IS_NODE$2) {
+ process$1.emit('unhandledRejection', value, promise);
+ } else dispatchEvent$1(UNHANDLED_REJECTION, promise, value);
});
// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
- state.rejection = engineIsNode || isUnhandled(state) ? UNHANDLED : HANDLED;
+ state.rejection = IS_NODE$2 || isUnhandled(state) ? UNHANDLED : HANDLED;
if (result.error) throw result.value;
}
});
@@ -2965,15 +4201,15 @@
};
var onHandleUnhandled = function (state) {
- task$1.call(global_1, function () {
+ call$e(task, global$z, function () {
var promise = state.facade;
- if (engineIsNode) {
- process$4.emit('rejectionHandled', promise);
- } else dispatchEvent(REJECTION_HANDLED, promise, state.value);
+ if (IS_NODE$2) {
+ process$1.emit('rejectionHandled', promise);
+ } else dispatchEvent$1(REJECTION_HANDLED, promise, state.value);
});
};
- var bind = function (fn, state, unwrap) {
+ var bind$a = function (fn, state, unwrap) {
return function (value) {
fn(state, value, unwrap);
};
@@ -2985,7 +4221,7 @@
if (unwrap) state = unwrap;
state.value = value;
state.state = REJECTED;
- notify$1(state, true);
+ notify(state, true);
};
var internalResolve = function (state, value, unwrap) {
@@ -2993,15 +4229,15 @@
state.done = true;
if (unwrap) state = unwrap;
try {
- if (state.facade === value) throw TypeError$1("Promise can't be resolved itself");
+ if (state.facade === value) throw TypeError$a("Promise can't be resolved itself");
var then = isThenable(value);
if (then) {
microtask(function () {
var wrapper = { done: false };
try {
- then.call(value,
- bind(internalResolve, wrapper, state),
- bind(internalReject, wrapper, state)
+ call$e(then, value,
+ bind$a(internalResolve, wrapper, state),
+ bind$a(internalReject, wrapper, state)
);
} catch (error) {
internalReject(wrapper, error, state);
@@ -3010,7 +4246,7 @@
} else {
state.value = value;
state.state = FULFILLED;
- notify$1(state, false);
+ notify(state, false);
}
} catch (error) {
internalReject({ done: false }, error, state);
@@ -3018,19 +4254,20 @@
};
// constructor polyfill
- if (FORCED) {
+ if (FORCED$g) {
// 25.4.3.1 Promise(executor)
PromiseConstructor = function Promise(executor) {
- anInstance(this, PromiseConstructor, PROMISE);
- aFunction$1(executor);
- Internal.call(this);
- var state = getInternalState$4(this);
+ anInstance$5(this, PromisePrototype);
+ aCallable$5(executor);
+ call$e(Internal, this);
+ var state = getInternalState$1(this);
try {
- executor(bind(internalResolve, state), bind(internalReject, state));
+ executor(bind$a(internalResolve, state), bind$a(internalReject, state));
} catch (error) {
internalReject(state, error);
}
};
+ PromisePrototype = PromiseConstructor.prototype;
// eslint-disable-next-line no-unused-vars -- required for `.length`
Internal = function Promise(executor) {
setInternalState$4(this, {
@@ -3038,24 +4275,27 @@
done: false,
notified: false,
parent: false,
- reactions: [],
+ reactions: new Queue(),
rejection: false,
state: PENDING,
value: undefined
});
};
- Internal.prototype = redefineAll(PromiseConstructor.prototype, {
+ Internal.prototype = redefineAll$2(PromisePrototype, {
// `Promise.prototype.then` method
// https://tc39.es/ecma262/#sec-promise.prototype.then
+ // eslint-disable-next-line unicorn/no-thenable -- safe
then: function then(onFulfilled, onRejected) {
var state = getInternalPromiseState(this);
- var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor));
- reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
- reaction.fail = typeof onRejected == 'function' && onRejected;
- reaction.domain = engineIsNode ? process$4.domain : undefined;
+ var reaction = newPromiseCapability(speciesConstructor$3(this, PromiseConstructor));
state.parent = true;
- state.reactions.push(reaction);
- if (state.state != PENDING) notify$1(state, false);
+ reaction.ok = isCallable$7(onFulfilled) ? onFulfilled : true;
+ reaction.fail = isCallable$7(onRejected) && onRejected;
+ reaction.domain = IS_NODE$2 ? process$1.domain : undefined;
+ if (state.state == PENDING) state.reactions.add(reaction);
+ else microtask(function () {
+ callReaction(reaction, state);
+ });
return reaction.promise;
},
// `Promise.prototype.catch` method
@@ -3066,86 +4306,92 @@
});
OwnPromiseCapability = function () {
var promise = new Internal();
- var state = getInternalState$4(promise);
+ var state = getInternalState$1(promise);
this.promise = promise;
- this.resolve = bind(internalResolve, state);
- this.reject = bind(internalReject, state);
+ this.resolve = bind$a(internalResolve, state);
+ this.reject = bind$a(internalReject, state);
};
- newPromiseCapability.f = newPromiseCapability$1 = function (C) {
+ newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
return C === PromiseConstructor || C === PromiseWrapper
? new OwnPromiseCapability(C)
: newGenericPromiseCapability(C);
};
- if ( typeof nativePromiseConstructor == 'function') {
- nativeThen = nativePromiseConstructor.prototype.then;
+ if (isCallable$7(NativePromise$1) && NativePromisePrototype !== Object.prototype) {
+ nativeThen = NativePromisePrototype.then;
- // wrap native Promise#then for native async functions
- redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) {
- var that = this;
- return new PromiseConstructor(function (resolve, reject) {
- nativeThen.call(that, resolve, reject);
- }).then(onFulfilled, onRejected);
- // https://github.com/zloirock/core-js/issues/640
- }, { unsafe: true });
-
- // wrap fetch result
- if (typeof $fetch == 'function') _export({ global: true, enumerable: true, forced: true }, {
- // eslint-disable-next-line no-unused-vars -- required for `.length`
- fetch: function fetch(input /* , init */) {
- return promiseResolve(PromiseConstructor, $fetch.apply(global_1, arguments));
- }
- });
+ if (!SUBCLASSING) {
+ // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs
+ redefine$8(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {
+ var that = this;
+ return new PromiseConstructor(function (resolve, reject) {
+ call$e(nativeThen, that, resolve, reject);
+ }).then(onFulfilled, onRejected);
+ // https://github.com/zloirock/core-js/issues/640
+ }, { unsafe: true });
+
+ // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`
+ redefine$8(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true });
+ }
+
+ // make `.constructor === Promise` work for native promise-based APIs
+ try {
+ delete NativePromisePrototype.constructor;
+ } catch (error) { /* empty */ }
+
+ // make `instanceof Promise` work for native promise-based APIs
+ if (setPrototypeOf$3) {
+ setPrototypeOf$3(NativePromisePrototype, PromisePrototype);
+ }
}
}
- _export({ global: true, wrap: true, forced: FORCED }, {
+ $$$({ global: true, wrap: true, forced: FORCED$g }, {
Promise: PromiseConstructor
});
- setToStringTag(PromiseConstructor, PROMISE, false);
- setSpecies(PROMISE);
+ setToStringTag$5(PromiseConstructor, PROMISE, false);
+ setSpecies$3(PROMISE);
- PromiseWrapper = getBuiltIn(PROMISE);
+ PromiseWrapper = getBuiltIn$3(PROMISE);
// statics
- _export({ target: PROMISE, stat: true, forced: FORCED }, {
+ $$$({ target: PROMISE, stat: true, forced: FORCED$g }, {
// `Promise.reject` method
// https://tc39.es/ecma262/#sec-promise.reject
reject: function reject(r) {
- var capability = newPromiseCapability$1(this);
- capability.reject.call(undefined, r);
+ var capability = newPromiseCapability(this);
+ call$e(capability.reject, undefined, r);
return capability.promise;
}
});
- _export({ target: PROMISE, stat: true, forced: FORCED }, {
+ $$$({ target: PROMISE, stat: true, forced: FORCED$g }, {
// `Promise.resolve` method
// https://tc39.es/ecma262/#sec-promise.resolve
resolve: function resolve(x) {
- return promiseResolve( this, x);
+ return promiseResolve$1(this, x);
}
});
- _export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {
+ $$$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {
// `Promise.all` method
// https://tc39.es/ecma262/#sec-promise.all
all: function all(iterable) {
var C = this;
- var capability = newPromiseCapability$1(C);
+ var capability = newPromiseCapability(C);
var resolve = capability.resolve;
var reject = capability.reject;
var result = perform(function () {
- var $promiseResolve = aFunction$1(C.resolve);
+ var $promiseResolve = aCallable$5(C.resolve);
var values = [];
var counter = 0;
var remaining = 1;
- iterate(iterable, function (promise) {
+ iterate$2(iterable, function (promise) {
var index = counter++;
var alreadyCalled = false;
- values.push(undefined);
remaining++;
- $promiseResolve.call(C, promise).then(function (value) {
+ call$e($promiseResolve, C, promise).then(function (value) {
if (alreadyCalled) return;
alreadyCalled = true;
values[index] = value;
@@ -3161,12 +4407,12 @@
// https://tc39.es/ecma262/#sec-promise.race
race: function race(iterable) {
var C = this;
- var capability = newPromiseCapability$1(C);
+ var capability = newPromiseCapability(C);
var reject = capability.reject;
var result = perform(function () {
- var $promiseResolve = aFunction$1(C.resolve);
- iterate(iterable, function (promise) {
- $promiseResolve.call(C, promise).then(capability.resolve, reject);
+ var $promiseResolve = aCallable$5(C.resolve);
+ iterate$2(iterable, function (promise) {
+ call$e($promiseResolve, C, promise).then(capability.resolve, reject);
});
});
if (result.error) reject(result.value);
@@ -3174,133 +4420,176 @@
}
});
+ var typedArrayConstructor = {exports: {}};
+
/* eslint-disable no-new -- required for testing */
+ var global$y = global$1o;
+ var fails$A = fails$V;
+ var checkCorrectnessOfIteration$2 = checkCorrectnessOfIteration$4;
+ var NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
+
+ var ArrayBuffer$2 = global$y.ArrayBuffer;
+ var Int8Array$3 = global$y.Int8Array;
+
+ var typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS$1 || !fails$A(function () {
+ Int8Array$3(1);
+ }) || !fails$A(function () {
+ new Int8Array$3(-1);
+ }) || !checkCorrectnessOfIteration$2(function (iterable) {
+ new Int8Array$3();
+ new Int8Array$3(null);
+ new Int8Array$3(1.5);
+ new Int8Array$3(iterable);
+ }, true) || fails$A(function () {
+ // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill
+ return new Int8Array$3(new ArrayBuffer$2(2), 1, undefined).length !== 1;
+ });
+ var isObject$h = isObject$s;
- var NATIVE_ARRAY_BUFFER_VIEWS$2 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
+ var floor$6 = Math.floor;
- var ArrayBuffer$3 = global_1.ArrayBuffer;
- var Int8Array$2 = global_1.Int8Array;
+ // `IsIntegralNumber` abstract operation
+ // https://tc39.es/ecma262/#sec-isintegralnumber
+ // eslint-disable-next-line es/no-number-isinteger -- safe
+ var isIntegralNumber$1 = Number.isInteger || function isInteger(it) {
+ return !isObject$h(it) && isFinite(it) && floor$6(it) === it;
+ };
- var typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS$2 || !fails(function () {
- Int8Array$2(1);
- }) || !fails(function () {
- new Int8Array$2(-1);
- }) || !checkCorrectnessOfIteration(function (iterable) {
- new Int8Array$2();
- new Int8Array$2(null);
- new Int8Array$2(1.5);
- new Int8Array$2(iterable);
- }, true) || fails(function () {
- // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill
- return new Int8Array$2(new ArrayBuffer$3(2), 1, undefined).length !== 1;
- });
+ var global$x = global$1o;
+ var toIntegerOrInfinity$5 = toIntegerOrInfinity$b;
- var toPositiveInteger = function (it) {
- var result = toInteger(it);
- if (result < 0) throw RangeError("The argument can't be less than 0");
+ var RangeError$9 = global$x.RangeError;
+
+ var toPositiveInteger$1 = function (it) {
+ var result = toIntegerOrInfinity$5(it);
+ if (result < 0) throw RangeError$9("The argument can't be less than 0");
return result;
};
- var toOffset = function (it, BYTES) {
+ var global$w = global$1o;
+ var toPositiveInteger = toPositiveInteger$1;
+
+ var RangeError$8 = global$w.RangeError;
+
+ var toOffset$2 = function (it, BYTES) {
var offset = toPositiveInteger(it);
- if (offset % BYTES) throw RangeError('Wrong offset');
+ if (offset % BYTES) throw RangeError$8('Wrong offset');
return offset;
};
- var aTypedArrayConstructor$1 = arrayBufferViewCore.aTypedArrayConstructor;
+ var bind$9 = functionBindContext;
+ var call$d = functionCall;
+ var aConstructor$1 = aConstructor$3;
+ var toObject$c = toObject$i;
+ var lengthOfArrayLike$c = lengthOfArrayLike$i;
+ var getIterator$2 = getIterator$4;
+ var getIteratorMethod$2 = getIteratorMethod$5;
+ var isArrayIteratorMethod$1 = isArrayIteratorMethod$3;
+ var aTypedArrayConstructor$2 = arrayBufferViewCore.aTypedArrayConstructor;
- var typedArrayFrom = function from(source /* , mapfn, thisArg */) {
- var O = toObject(source);
+ var typedArrayFrom$2 = function from(source /* , mapfn, thisArg */) {
+ var C = aConstructor$1(this);
+ var O = toObject$c(source);
var argumentsLength = arguments.length;
var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
var mapping = mapfn !== undefined;
- var iteratorMethod = getIteratorMethod(O);
+ var iteratorMethod = getIteratorMethod$2(O);
var i, length, result, step, iterator, next;
- if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {
- iterator = iteratorMethod.call(O);
+ if (iteratorMethod && !isArrayIteratorMethod$1(iteratorMethod)) {
+ iterator = getIterator$2(O, iteratorMethod);
next = iterator.next;
O = [];
- while (!(step = next.call(iterator)).done) {
+ while (!(step = call$d(next, iterator)).done) {
O.push(step.value);
}
}
if (mapping && argumentsLength > 2) {
- mapfn = functionBindContext(mapfn, arguments[2], 2);
+ mapfn = bind$9(mapfn, arguments[2]);
}
- length = toLength(O.length);
- result = new (aTypedArrayConstructor$1(this))(length);
+ length = lengthOfArrayLike$c(O);
+ result = new (aTypedArrayConstructor$2(C))(length);
for (i = 0; length > i; i++) {
result[i] = mapping ? mapfn(O[i], i) : O[i];
}
return result;
};
+ var isCallable$6 = isCallable$r;
+ var isObject$g = isObject$s;
+ var setPrototypeOf$2 = objectSetPrototypeOf;
+
// makes subclassing work correct for wrapped built-ins
- var inheritIfRequired = function ($this, dummy, Wrapper) {
+ var inheritIfRequired$4 = function ($this, dummy, Wrapper) {
var NewTarget, NewTargetPrototype;
if (
// it can work only with native `setPrototypeOf`
- objectSetPrototypeOf &&
+ setPrototypeOf$2 &&
// we haven't completely correct pre-ES6 way for getting `new.target`, so use this
- typeof (NewTarget = dummy.constructor) == 'function' &&
+ isCallable$6(NewTarget = dummy.constructor) &&
NewTarget !== Wrapper &&
- isObject(NewTargetPrototype = NewTarget.prototype) &&
+ isObject$g(NewTargetPrototype = NewTarget.prototype) &&
NewTargetPrototype !== Wrapper.prototype
- ) objectSetPrototypeOf($this, NewTargetPrototype);
+ ) setPrototypeOf$2($this, NewTargetPrototype);
return $this;
};
- var typedArrayConstructor = createCommonjsModule(function (module) {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var getOwnPropertyNames = objectGetOwnPropertyNames.f;
-
- var forEach = arrayIteration.forEach;
-
-
-
-
-
-
- var getInternalState = internalState.get;
- var setInternalState = internalState.set;
- var nativeDefineProperty = objectDefineProperty.f;
- var nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+ var $$_ = _export;
+ var global$v = global$1o;
+ var call$c = functionCall;
+ var DESCRIPTORS$c = descriptors;
+ var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS$1 = typedArrayConstructorsRequireWrappers;
+ var ArrayBufferViewCore$n = arrayBufferViewCore;
+ var ArrayBufferModule = arrayBuffer;
+ var anInstance$4 = anInstance$7;
+ var createPropertyDescriptor$1 = createPropertyDescriptor$7;
+ var createNonEnumerableProperty$2 = createNonEnumerableProperty$b;
+ var isIntegralNumber = isIntegralNumber$1;
+ var toLength$7 = toLength$c;
+ var toIndex = toIndex$2;
+ var toOffset$1 = toOffset$2;
+ var toPropertyKey = toPropertyKey$5;
+ var hasOwn$7 = hasOwnProperty_1;
+ var classof$4 = classof$d;
+ var isObject$f = isObject$s;
+ var isSymbol$2 = isSymbol$6;
+ var create$7 = objectCreate;
+ var isPrototypeOf$3 = objectIsPrototypeOf;
+ var setPrototypeOf$1 = objectSetPrototypeOf;
+ var getOwnPropertyNames$2 = objectGetOwnPropertyNames.f;
+ var typedArrayFrom$1 = typedArrayFrom$2;
+ var forEach$1 = arrayIteration.forEach;
+ var setSpecies$2 = setSpecies$5;
+ var definePropertyModule = objectDefineProperty;
+ var getOwnPropertyDescriptorModule$1 = objectGetOwnPropertyDescriptor;
+ var InternalStateModule$3 = internalState;
+ var inheritIfRequired$3 = inheritIfRequired$4;
+
+ var getInternalState = InternalStateModule$3.get;
+ var setInternalState$3 = InternalStateModule$3.set;
+ var nativeDefineProperty = definePropertyModule.f;
+ var nativeGetOwnPropertyDescriptor$1 = getOwnPropertyDescriptorModule$1.f;
var round = Math.round;
- var RangeError = global_1.RangeError;
- var ArrayBuffer = arrayBuffer.ArrayBuffer;
- var DataView = arrayBuffer.DataView;
- var NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
- var TYPED_ARRAY_TAG = arrayBufferViewCore.TYPED_ARRAY_TAG;
- var TypedArray = arrayBufferViewCore.TypedArray;
- var TypedArrayPrototype = arrayBufferViewCore.TypedArrayPrototype;
- var aTypedArrayConstructor = arrayBufferViewCore.aTypedArrayConstructor;
- var isTypedArray = arrayBufferViewCore.isTypedArray;
+ var RangeError$7 = global$v.RangeError;
+ var ArrayBuffer$1 = ArrayBufferModule.ArrayBuffer;
+ var ArrayBufferPrototype = ArrayBuffer$1.prototype;
+ var DataView$1 = ArrayBufferModule.DataView;
+ var NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore$n.NATIVE_ARRAY_BUFFER_VIEWS;
+ var TYPED_ARRAY_CONSTRUCTOR$1 = ArrayBufferViewCore$n.TYPED_ARRAY_CONSTRUCTOR;
+ var TYPED_ARRAY_TAG = ArrayBufferViewCore$n.TYPED_ARRAY_TAG;
+ var TypedArray = ArrayBufferViewCore$n.TypedArray;
+ var TypedArrayPrototype$1 = ArrayBufferViewCore$n.TypedArrayPrototype;
+ var aTypedArrayConstructor$1 = ArrayBufferViewCore$n.aTypedArrayConstructor;
+ var isTypedArray = ArrayBufferViewCore$n.isTypedArray;
var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
var WRONG_LENGTH = 'Wrong length';
var fromList = function (C, list) {
+ aTypedArrayConstructor$1(C);
var index = 0;
var length = list.length;
- var result = new (aTypedArrayConstructor(C))(length);
+ var result = new C(length);
while (length > index) result[index] = list[index++];
return result;
};
@@ -3313,59 +4602,62 @@
var isArrayBuffer = function (it) {
var klass;
- return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';
+ return isPrototypeOf$3(ArrayBufferPrototype, it) || (klass = classof$4(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';
};
var isTypedArrayIndex = function (target, key) {
return isTypedArray(target)
- && typeof key != 'symbol'
+ && !isSymbol$2(key)
&& key in target
- && String(+key) == String(key);
+ && isIntegralNumber(+key)
+ && key >= 0;
};
var wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {
- return isTypedArrayIndex(target, key = toPrimitive(key, true))
- ? createPropertyDescriptor(2, target[key])
- : nativeGetOwnPropertyDescriptor(target, key);
+ key = toPropertyKey(key);
+ return isTypedArrayIndex(target, key)
+ ? createPropertyDescriptor$1(2, target[key])
+ : nativeGetOwnPropertyDescriptor$1(target, key);
};
var wrappedDefineProperty = function defineProperty(target, key, descriptor) {
- if (isTypedArrayIndex(target, key = toPrimitive(key, true))
- && isObject(descriptor)
- && has(descriptor, 'value')
- && !has(descriptor, 'get')
- && !has(descriptor, 'set')
+ key = toPropertyKey(key);
+ if (isTypedArrayIndex(target, key)
+ && isObject$f(descriptor)
+ && hasOwn$7(descriptor, 'value')
+ && !hasOwn$7(descriptor, 'get')
+ && !hasOwn$7(descriptor, 'set')
// TODO: add validation descriptor w/o calling accessors
&& !descriptor.configurable
- && (!has(descriptor, 'writable') || descriptor.writable)
- && (!has(descriptor, 'enumerable') || descriptor.enumerable)
+ && (!hasOwn$7(descriptor, 'writable') || descriptor.writable)
+ && (!hasOwn$7(descriptor, 'enumerable') || descriptor.enumerable)
) {
target[key] = descriptor.value;
return target;
} return nativeDefineProperty(target, key, descriptor);
};
- if (descriptors) {
+ if (DESCRIPTORS$c) {
if (!NATIVE_ARRAY_BUFFER_VIEWS) {
- objectGetOwnPropertyDescriptor.f = wrappedGetOwnPropertyDescriptor;
- objectDefineProperty.f = wrappedDefineProperty;
- addGetter(TypedArrayPrototype, 'buffer');
- addGetter(TypedArrayPrototype, 'byteOffset');
- addGetter(TypedArrayPrototype, 'byteLength');
- addGetter(TypedArrayPrototype, 'length');
+ getOwnPropertyDescriptorModule$1.f = wrappedGetOwnPropertyDescriptor;
+ definePropertyModule.f = wrappedDefineProperty;
+ addGetter(TypedArrayPrototype$1, 'buffer');
+ addGetter(TypedArrayPrototype$1, 'byteOffset');
+ addGetter(TypedArrayPrototype$1, 'byteLength');
+ addGetter(TypedArrayPrototype$1, 'length');
}
- _export({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {
+ $$_({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {
getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,
defineProperty: wrappedDefineProperty
});
- module.exports = function (TYPE, wrapper, CLAMPED) {
+ typedArrayConstructor.exports = function (TYPE, wrapper, CLAMPED) {
var BYTES = TYPE.match(/\d+$/)[0] / 8;
var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';
var GETTER = 'get' + TYPE;
var SETTER = 'set' + TYPE;
- var NativeTypedArrayConstructor = global_1[CONSTRUCTOR_NAME];
+ var NativeTypedArrayConstructor = global$v[CONSTRUCTOR_NAME];
var TypedArrayConstructor = NativeTypedArrayConstructor;
var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;
var exported = {};
@@ -3395,114 +4687,122 @@
if (!NATIVE_ARRAY_BUFFER_VIEWS) {
TypedArrayConstructor = wrapper(function (that, data, offset, $length) {
- anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);
+ anInstance$4(that, TypedArrayConstructorPrototype);
var index = 0;
var byteOffset = 0;
var buffer, byteLength, length;
- if (!isObject(data)) {
+ if (!isObject$f(data)) {
length = toIndex(data);
byteLength = length * BYTES;
- buffer = new ArrayBuffer(byteLength);
+ buffer = new ArrayBuffer$1(byteLength);
} else if (isArrayBuffer(data)) {
buffer = data;
- byteOffset = toOffset(offset, BYTES);
+ byteOffset = toOffset$1(offset, BYTES);
var $len = data.byteLength;
if ($length === undefined) {
- if ($len % BYTES) throw RangeError(WRONG_LENGTH);
+ if ($len % BYTES) throw RangeError$7(WRONG_LENGTH);
byteLength = $len - byteOffset;
- if (byteLength < 0) throw RangeError(WRONG_LENGTH);
+ if (byteLength < 0) throw RangeError$7(WRONG_LENGTH);
} else {
- byteLength = toLength($length) * BYTES;
- if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);
+ byteLength = toLength$7($length) * BYTES;
+ if (byteLength + byteOffset > $len) throw RangeError$7(WRONG_LENGTH);
}
length = byteLength / BYTES;
} else if (isTypedArray(data)) {
return fromList(TypedArrayConstructor, data);
} else {
- return typedArrayFrom.call(TypedArrayConstructor, data);
+ return call$c(typedArrayFrom$1, TypedArrayConstructor, data);
}
- setInternalState(that, {
+ setInternalState$3(that, {
buffer: buffer,
byteOffset: byteOffset,
byteLength: byteLength,
length: length,
- view: new DataView(buffer)
+ view: new DataView$1(buffer)
});
while (index < length) addElement(that, index++);
});
- if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);
- TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = objectCreate(TypedArrayPrototype);
- } else if (typedArrayConstructorsRequireWrappers) {
+ if (setPrototypeOf$1) setPrototypeOf$1(TypedArrayConstructor, TypedArray);
+ TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create$7(TypedArrayPrototype$1);
+ } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS$1) {
TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {
- anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);
- return inheritIfRequired(function () {
- if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));
+ anInstance$4(dummy, TypedArrayConstructorPrototype);
+ return inheritIfRequired$3(function () {
+ if (!isObject$f(data)) return new NativeTypedArrayConstructor(toIndex(data));
if (isArrayBuffer(data)) return $length !== undefined
- ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)
+ ? new NativeTypedArrayConstructor(data, toOffset$1(typedArrayOffset, BYTES), $length)
: typedArrayOffset !== undefined
- ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))
+ ? new NativeTypedArrayConstructor(data, toOffset$1(typedArrayOffset, BYTES))
: new NativeTypedArrayConstructor(data);
if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);
- return typedArrayFrom.call(TypedArrayConstructor, data);
+ return call$c(typedArrayFrom$1, TypedArrayConstructor, data);
}(), dummy, TypedArrayConstructor);
});
- if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);
- forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {
+ if (setPrototypeOf$1) setPrototypeOf$1(TypedArrayConstructor, TypedArray);
+ forEach$1(getOwnPropertyNames$2(NativeTypedArrayConstructor), function (key) {
if (!(key in TypedArrayConstructor)) {
- createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);
+ createNonEnumerableProperty$2(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);
}
});
TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;
}
if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {
- createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);
+ createNonEnumerableProperty$2(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);
}
+ createNonEnumerableProperty$2(TypedArrayConstructorPrototype, TYPED_ARRAY_CONSTRUCTOR$1, TypedArrayConstructor);
+
if (TYPED_ARRAY_TAG) {
- createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);
+ createNonEnumerableProperty$2(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);
}
exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;
- _export({
+ $$_({
global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS
}, exported);
if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {
- createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);
+ createNonEnumerableProperty$2(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);
}
if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {
- createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);
+ createNonEnumerableProperty$2(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);
}
- setSpecies(CONSTRUCTOR_NAME);
+ setSpecies$2(CONSTRUCTOR_NAME);
};
- } else module.exports = function () { /* empty */ };
- });
+ } else typedArrayConstructor.exports = function () { /* empty */ };
+
+ var createTypedArrayConstructor$1 = typedArrayConstructor.exports;
// `Uint8Array` constructor
// https://tc39.es/ecma262/#sec-typedarray-objects
- typedArrayConstructor('Uint8', function (init) {
+ createTypedArrayConstructor$1('Uint8', function (init) {
return function Uint8Array(data, byteOffset, length) {
return init(this, data, byteOffset, length);
};
});
- var min$2 = Math.min;
+ var toObject$b = toObject$i;
+ var toAbsoluteIndex$4 = toAbsoluteIndex$9;
+ var lengthOfArrayLike$b = lengthOfArrayLike$i;
+
+ var min$7 = Math.min;
// `Array.prototype.copyWithin` method implementation
// https://tc39.es/ecma262/#sec-array.prototype.copywithin
+ // eslint-disable-next-line es/no-array-prototype-copywithin -- safe
var arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
- var O = toObject(this);
- var len = toLength(O.length);
- var to = toAbsoluteIndex(target, len);
- var from = toAbsoluteIndex(start, len);
+ var O = toObject$b(this);
+ var len = lengthOfArrayLike$b(O);
+ var to = toAbsoluteIndex$4(target, len);
+ var from = toAbsoluteIndex$4(start, len);
var end = arguments.length > 2 ? arguments[2] : undefined;
- var count = min$2((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);
+ var count = min$7((end === undefined ? len : toAbsoluteIndex$4(end, len)) - from, len - to);
var inc = 1;
if (from < to && to < from + count) {
inc = -1;
@@ -3517,212 +4817,285 @@
} return O;
};
- var aTypedArray$1 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$1 = arrayBufferViewCore.exportTypedArrayMethod;
+ var uncurryThis$A = functionUncurryThis;
+ var ArrayBufferViewCore$m = arrayBufferViewCore;
+ var $ArrayCopyWithin = arrayCopyWithin;
+
+ var u$ArrayCopyWithin = uncurryThis$A($ArrayCopyWithin);
+ var aTypedArray$l = ArrayBufferViewCore$m.aTypedArray;
+ var exportTypedArrayMethod$m = ArrayBufferViewCore$m.exportTypedArrayMethod;
// `%TypedArray%.prototype.copyWithin` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin
- exportTypedArrayMethod$1('copyWithin', function copyWithin(target, start /* , end */) {
- return arrayCopyWithin.call(aTypedArray$1(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
+ exportTypedArrayMethod$m('copyWithin', function copyWithin(target, start /* , end */) {
+ return u$ArrayCopyWithin(aTypedArray$l(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
});
- var $every = arrayIteration.every;
+ var ArrayBufferViewCore$l = arrayBufferViewCore;
+ var $every$1 = arrayIteration.every;
- var aTypedArray$2 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$2 = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$k = ArrayBufferViewCore$l.aTypedArray;
+ var exportTypedArrayMethod$l = ArrayBufferViewCore$l.exportTypedArrayMethod;
// `%TypedArray%.prototype.every` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.every
- exportTypedArrayMethod$2('every', function every(callbackfn /* , thisArg */) {
- return $every(aTypedArray$2(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$l('every', function every(callbackfn /* , thisArg */) {
+ return $every$1(aTypedArray$k(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
});
- var aTypedArray$3 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$3 = arrayBufferViewCore.exportTypedArrayMethod;
+ var ArrayBufferViewCore$k = arrayBufferViewCore;
+ var call$b = functionCall;
+ var $fill = arrayFill$1;
+
+ var aTypedArray$j = ArrayBufferViewCore$k.aTypedArray;
+ var exportTypedArrayMethod$k = ArrayBufferViewCore$k.exportTypedArrayMethod;
// `%TypedArray%.prototype.fill` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill
- // eslint-disable-next-line no-unused-vars -- required for `.length`
- exportTypedArrayMethod$3('fill', function fill(value /* , start, end */) {
- return arrayFill.apply(aTypedArray$3(this), arguments);
+ exportTypedArrayMethod$k('fill', function fill(value /* , start, end */) {
+ var length = arguments.length;
+ return call$b(
+ $fill,
+ aTypedArray$j(this),
+ value,
+ length > 1 ? arguments[1] : undefined,
+ length > 2 ? arguments[2] : undefined
+ );
});
- var aTypedArrayConstructor$2 = arrayBufferViewCore.aTypedArrayConstructor;
-
+ var lengthOfArrayLike$a = lengthOfArrayLike$i;
- var typedArrayFromSpeciesAndList = function (instance, list) {
- var C = speciesConstructor(instance, instance.constructor);
+ var arrayFromConstructorAndList$1 = function (Constructor, list) {
var index = 0;
- var length = list.length;
- var result = new (aTypedArrayConstructor$2(C))(length);
+ var length = lengthOfArrayLike$a(list);
+ var result = new Constructor(length);
while (length > index) result[index] = list[index++];
return result;
};
- var $filter = arrayIteration.filter;
+ var ArrayBufferViewCore$j = arrayBufferViewCore;
+ var speciesConstructor$2 = speciesConstructor$5;
+
+ var TYPED_ARRAY_CONSTRUCTOR = ArrayBufferViewCore$j.TYPED_ARRAY_CONSTRUCTOR;
+ var aTypedArrayConstructor = ArrayBufferViewCore$j.aTypedArrayConstructor;
+
+ // a part of `TypedArraySpeciesCreate` abstract operation
+ // https://tc39.es/ecma262/#typedarray-species-create
+ var typedArraySpeciesConstructor$4 = function (originalArray) {
+ return aTypedArrayConstructor(speciesConstructor$2(originalArray, originalArray[TYPED_ARRAY_CONSTRUCTOR]));
+ };
+
+ var arrayFromConstructorAndList = arrayFromConstructorAndList$1;
+ var typedArraySpeciesConstructor$3 = typedArraySpeciesConstructor$4;
+
+ var typedArrayFromSpeciesAndList = function (instance, list) {
+ return arrayFromConstructorAndList(typedArraySpeciesConstructor$3(instance), list);
+ };
+ var ArrayBufferViewCore$i = arrayBufferViewCore;
+ var $filter$1 = arrayIteration.filter;
+ var fromSpeciesAndList = typedArrayFromSpeciesAndList;
- var aTypedArray$4 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$4 = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$i = ArrayBufferViewCore$i.aTypedArray;
+ var exportTypedArrayMethod$j = ArrayBufferViewCore$i.exportTypedArrayMethod;
// `%TypedArray%.prototype.filter` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter
- exportTypedArrayMethod$4('filter', function filter(callbackfn /* , thisArg */) {
- var list = $filter(aTypedArray$4(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- return typedArrayFromSpeciesAndList(this, list);
+ exportTypedArrayMethod$j('filter', function filter(callbackfn /* , thisArg */) {
+ var list = $filter$1(aTypedArray$i(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return fromSpeciesAndList(this, list);
});
- var $find = arrayIteration.find;
+ var ArrayBufferViewCore$h = arrayBufferViewCore;
+ var $find$1 = arrayIteration.find;
- var aTypedArray$5 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$5 = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$h = ArrayBufferViewCore$h.aTypedArray;
+ var exportTypedArrayMethod$i = ArrayBufferViewCore$h.exportTypedArrayMethod;
// `%TypedArray%.prototype.find` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.find
- exportTypedArrayMethod$5('find', function find(predicate /* , thisArg */) {
- return $find(aTypedArray$5(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$i('find', function find(predicate /* , thisArg */) {
+ return $find$1(aTypedArray$h(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
});
- var $findIndex = arrayIteration.findIndex;
+ var ArrayBufferViewCore$g = arrayBufferViewCore;
+ var $findIndex$1 = arrayIteration.findIndex;
- var aTypedArray$6 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$6 = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$g = ArrayBufferViewCore$g.aTypedArray;
+ var exportTypedArrayMethod$h = ArrayBufferViewCore$g.exportTypedArrayMethod;
// `%TypedArray%.prototype.findIndex` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex
- exportTypedArrayMethod$6('findIndex', function findIndex(predicate /* , thisArg */) {
- return $findIndex(aTypedArray$6(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$h('findIndex', function findIndex(predicate /* , thisArg */) {
+ return $findIndex$1(aTypedArray$g(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
});
- var $forEach$2 = arrayIteration.forEach;
+ var ArrayBufferViewCore$f = arrayBufferViewCore;
+ var $forEach = arrayIteration.forEach;
- var aTypedArray$7 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$7 = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$f = ArrayBufferViewCore$f.aTypedArray;
+ var exportTypedArrayMethod$g = ArrayBufferViewCore$f.exportTypedArrayMethod;
// `%TypedArray%.prototype.forEach` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach
- exportTypedArrayMethod$7('forEach', function forEach(callbackfn /* , thisArg */) {
- $forEach$2(aTypedArray$7(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$g('forEach', function forEach(callbackfn /* , thisArg */) {
+ $forEach(aTypedArray$f(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
});
- var $includes = arrayIncludes.includes;
+ var ArrayBufferViewCore$e = arrayBufferViewCore;
+ var $includes$1 = arrayIncludes.includes;
- var aTypedArray$8 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$8 = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$e = ArrayBufferViewCore$e.aTypedArray;
+ var exportTypedArrayMethod$f = ArrayBufferViewCore$e.exportTypedArrayMethod;
// `%TypedArray%.prototype.includes` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes
- exportTypedArrayMethod$8('includes', function includes(searchElement /* , fromIndex */) {
- return $includes(aTypedArray$8(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$f('includes', function includes(searchElement /* , fromIndex */) {
+ return $includes$1(aTypedArray$e(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
});
- var $indexOf$1 = arrayIncludes.indexOf;
+ var ArrayBufferViewCore$d = arrayBufferViewCore;
+ var $indexOf = arrayIncludes.indexOf;
- var aTypedArray$9 = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$9 = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$d = ArrayBufferViewCore$d.aTypedArray;
+ var exportTypedArrayMethod$e = ArrayBufferViewCore$d.exportTypedArrayMethod;
// `%TypedArray%.prototype.indexOf` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof
- exportTypedArrayMethod$9('indexOf', function indexOf(searchElement /* , fromIndex */) {
- return $indexOf$1(aTypedArray$9(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$e('indexOf', function indexOf(searchElement /* , fromIndex */) {
+ return $indexOf(aTypedArray$d(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
});
- var ITERATOR$6 = wellKnownSymbol('iterator');
- var Uint8Array$1 = global_1.Uint8Array;
- var arrayValues = es_array_iterator.values;
- var arrayKeys = es_array_iterator.keys;
- var arrayEntries = es_array_iterator.entries;
- var aTypedArray$a = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$a = arrayBufferViewCore.exportTypedArrayMethod;
- var nativeTypedArrayIterator = Uint8Array$1 && Uint8Array$1.prototype[ITERATOR$6];
+ var global$u = global$1o;
+ var fails$z = fails$V;
+ var uncurryThis$z = functionUncurryThis;
+ var ArrayBufferViewCore$c = arrayBufferViewCore;
+ var ArrayIterators = es_array_iterator;
+ var wellKnownSymbol$9 = wellKnownSymbol$t;
+
+ var ITERATOR$4 = wellKnownSymbol$9('iterator');
+ var Uint8Array$2 = global$u.Uint8Array;
+ var arrayValues = uncurryThis$z(ArrayIterators.values);
+ var arrayKeys = uncurryThis$z(ArrayIterators.keys);
+ var arrayEntries = uncurryThis$z(ArrayIterators.entries);
+ var aTypedArray$c = ArrayBufferViewCore$c.aTypedArray;
+ var exportTypedArrayMethod$d = ArrayBufferViewCore$c.exportTypedArrayMethod;
+ var TypedArrayPrototype = Uint8Array$2 && Uint8Array$2.prototype;
+
+ var GENERIC = !fails$z(function () {
+ TypedArrayPrototype[ITERATOR$4].call([1]);
+ });
- var CORRECT_ITER_NAME = !!nativeTypedArrayIterator
- && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);
+ var ITERATOR_IS_VALUES = !!TypedArrayPrototype
+ && TypedArrayPrototype.values
+ && TypedArrayPrototype[ITERATOR$4] === TypedArrayPrototype.values
+ && TypedArrayPrototype.values.name === 'values';
var typedArrayValues = function values() {
- return arrayValues.call(aTypedArray$a(this));
+ return arrayValues(aTypedArray$c(this));
};
// `%TypedArray%.prototype.entries` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries
- exportTypedArrayMethod$a('entries', function entries() {
- return arrayEntries.call(aTypedArray$a(this));
- });
+ exportTypedArrayMethod$d('entries', function entries() {
+ return arrayEntries(aTypedArray$c(this));
+ }, GENERIC);
// `%TypedArray%.prototype.keys` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys
- exportTypedArrayMethod$a('keys', function keys() {
- return arrayKeys.call(aTypedArray$a(this));
- });
+ exportTypedArrayMethod$d('keys', function keys() {
+ return arrayKeys(aTypedArray$c(this));
+ }, GENERIC);
// `%TypedArray%.prototype.values` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.values
- exportTypedArrayMethod$a('values', typedArrayValues, !CORRECT_ITER_NAME);
+ exportTypedArrayMethod$d('values', typedArrayValues, GENERIC || !ITERATOR_IS_VALUES, { name: 'values' });
// `%TypedArray%.prototype[@@iterator]` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator
- exportTypedArrayMethod$a(ITERATOR$6, typedArrayValues, !CORRECT_ITER_NAME);
+ exportTypedArrayMethod$d(ITERATOR$4, typedArrayValues, GENERIC || !ITERATOR_IS_VALUES, { name: 'values' });
- var aTypedArray$b = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$b = arrayBufferViewCore.exportTypedArrayMethod;
- var $join = [].join;
+ var ArrayBufferViewCore$b = arrayBufferViewCore;
+ var uncurryThis$y = functionUncurryThis;
+
+ var aTypedArray$b = ArrayBufferViewCore$b.aTypedArray;
+ var exportTypedArrayMethod$c = ArrayBufferViewCore$b.exportTypedArrayMethod;
+ var $join = uncurryThis$y([].join);
// `%TypedArray%.prototype.join` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.join
- // eslint-disable-next-line no-unused-vars -- required for `.length`
- exportTypedArrayMethod$b('join', function join(separator) {
- return $join.apply(aTypedArray$b(this), arguments);
+ exportTypedArrayMethod$c('join', function join(separator) {
+ return $join(aTypedArray$b(this), separator);
});
- var min$3 = Math.min;
- var nativeLastIndexOf = [].lastIndexOf;
- var NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;
- var STRICT_METHOD$2 = arrayMethodIsStrict('lastIndexOf');
- var FORCED$1 = NEGATIVE_ZERO$1 || !STRICT_METHOD$2;
+ /* eslint-disable es/no-array-prototype-lastindexof -- safe */
+ var apply$6 = functionApply;
+ var toIndexedObject$5 = toIndexedObject$d;
+ var toIntegerOrInfinity$4 = toIntegerOrInfinity$b;
+ var lengthOfArrayLike$9 = lengthOfArrayLike$i;
+ var arrayMethodIsStrict$6 = arrayMethodIsStrict$9;
+
+ var min$6 = Math.min;
+ var $lastIndexOf$1 = [].lastIndexOf;
+ var NEGATIVE_ZERO = !!$lastIndexOf$1 && 1 / [1].lastIndexOf(1, -0) < 0;
+ var STRICT_METHOD$6 = arrayMethodIsStrict$6('lastIndexOf');
+ var FORCED$f = NEGATIVE_ZERO || !STRICT_METHOD$6;
// `Array.prototype.lastIndexOf` method implementation
// https://tc39.es/ecma262/#sec-array.prototype.lastindexof
- var arrayLastIndexOf = FORCED$1 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
+ var arrayLastIndexOf = FORCED$f ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
// convert -0 to +0
- if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0;
- var O = toIndexedObject(this);
- var length = toLength(O.length);
+ if (NEGATIVE_ZERO) return apply$6($lastIndexOf$1, this, arguments) || 0;
+ var O = toIndexedObject$5(this);
+ var length = lengthOfArrayLike$9(O);
var index = length - 1;
- if (arguments.length > 1) index = min$3(index, toInteger(arguments[1]));
+ if (arguments.length > 1) index = min$6(index, toIntegerOrInfinity$4(arguments[1]));
if (index < 0) index = length + index;
for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;
return -1;
- } : nativeLastIndexOf;
+ } : $lastIndexOf$1;
- var aTypedArray$c = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$c = arrayBufferViewCore.exportTypedArrayMethod;
+ var ArrayBufferViewCore$a = arrayBufferViewCore;
+ var apply$5 = functionApply;
+ var $lastIndexOf = arrayLastIndexOf;
+
+ var aTypedArray$a = ArrayBufferViewCore$a.aTypedArray;
+ var exportTypedArrayMethod$b = ArrayBufferViewCore$a.exportTypedArrayMethod;
// `%TypedArray%.prototype.lastIndexOf` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof
- // eslint-disable-next-line no-unused-vars -- required for `.length`
- exportTypedArrayMethod$c('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {
- return arrayLastIndexOf.apply(aTypedArray$c(this), arguments);
+ exportTypedArrayMethod$b('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {
+ var length = arguments.length;
+ return apply$5($lastIndexOf, aTypedArray$a(this), length > 1 ? [searchElement, arguments[1]] : [searchElement]);
});
- var $map$1 = arrayIteration.map;
-
+ var ArrayBufferViewCore$9 = arrayBufferViewCore;
+ var $map = arrayIteration.map;
+ var typedArraySpeciesConstructor$2 = typedArraySpeciesConstructor$4;
- var aTypedArray$d = arrayBufferViewCore.aTypedArray;
- var aTypedArrayConstructor$3 = arrayBufferViewCore.aTypedArrayConstructor;
- var exportTypedArrayMethod$d = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$9 = ArrayBufferViewCore$9.aTypedArray;
+ var exportTypedArrayMethod$a = ArrayBufferViewCore$9.exportTypedArrayMethod;
// `%TypedArray%.prototype.map` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.map
- exportTypedArrayMethod$d('map', function map(mapfn /* , thisArg */) {
- return $map$1(aTypedArray$d(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {
- return new (aTypedArrayConstructor$3(speciesConstructor(O, O.constructor)))(length);
+ exportTypedArrayMethod$a('map', function map(mapfn /* , thisArg */) {
+ return $map(aTypedArray$9(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {
+ return new (typedArraySpeciesConstructor$2(O))(length);
});
});
+ var global$t = global$1o;
+ var aCallable$4 = aCallable$a;
+ var toObject$a = toObject$i;
+ var IndexedObject$2 = indexedObject;
+ var lengthOfArrayLike$8 = lengthOfArrayLike$i;
+
+ var TypeError$9 = global$t.TypeError;
+
// `Array.prototype.{ reduce, reduceRight }` methods implementation
var createMethod$3 = function (IS_RIGHT) {
return function (that, callbackfn, argumentsLength, memo) {
- aFunction$1(callbackfn);
- var O = toObject(that);
- var self = indexedObject(O);
- var length = toLength(O.length);
+ aCallable$4(callbackfn);
+ var O = toObject$a(that);
+ var self = IndexedObject$2(O);
+ var length = lengthOfArrayLike$8(O);
var index = IS_RIGHT ? length - 1 : 0;
var i = IS_RIGHT ? -1 : 1;
if (argumentsLength < 2) while (true) {
@@ -3733,7 +5106,7 @@
}
index += i;
if (IS_RIGHT ? index < 0 : length <= index) {
- throw TypeError('Reduce of empty array with no initial value');
+ throw TypeError$9('Reduce of empty array with no initial value');
}
}
for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
@@ -3752,38 +5125,44 @@
right: createMethod$3(true)
};
- var $reduce = arrayReduce.left;
+ var ArrayBufferViewCore$8 = arrayBufferViewCore;
+ var $reduce$1 = arrayReduce.left;
- var aTypedArray$e = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$e = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$8 = ArrayBufferViewCore$8.aTypedArray;
+ var exportTypedArrayMethod$9 = ArrayBufferViewCore$8.exportTypedArrayMethod;
// `%TypedArray%.prototype.reduce` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce
- exportTypedArrayMethod$e('reduce', function reduce(callbackfn /* , initialValue */) {
- return $reduce(aTypedArray$e(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$9('reduce', function reduce(callbackfn /* , initialValue */) {
+ var length = arguments.length;
+ return $reduce$1(aTypedArray$8(this), callbackfn, length, length > 1 ? arguments[1] : undefined);
});
- var $reduceRight = arrayReduce.right;
+ var ArrayBufferViewCore$7 = arrayBufferViewCore;
+ var $reduceRight$1 = arrayReduce.right;
- var aTypedArray$f = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$f = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$7 = ArrayBufferViewCore$7.aTypedArray;
+ var exportTypedArrayMethod$8 = ArrayBufferViewCore$7.exportTypedArrayMethod;
// `%TypedArray%.prototype.reduceRicht` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright
- exportTypedArrayMethod$f('reduceRight', function reduceRight(callbackfn /* , initialValue */) {
- return $reduceRight(aTypedArray$f(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$8('reduceRight', function reduceRight(callbackfn /* , initialValue */) {
+ var length = arguments.length;
+ return $reduceRight$1(aTypedArray$7(this), callbackfn, length, length > 1 ? arguments[1] : undefined);
});
- var aTypedArray$g = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$g = arrayBufferViewCore.exportTypedArrayMethod;
- var floor$2 = Math.floor;
+ var ArrayBufferViewCore$6 = arrayBufferViewCore;
+
+ var aTypedArray$6 = ArrayBufferViewCore$6.aTypedArray;
+ var exportTypedArrayMethod$7 = ArrayBufferViewCore$6.exportTypedArrayMethod;
+ var floor$5 = Math.floor;
// `%TypedArray%.prototype.reverse` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse
- exportTypedArrayMethod$g('reverse', function reverse() {
+ exportTypedArrayMethod$7('reverse', function reverse() {
var that = this;
- var length = aTypedArray$g(that).length;
- var middle = floor$2(length / 2);
+ var length = aTypedArray$6(that).length;
+ var middle = floor$5(length / 2);
var index = 0;
var value;
while (index < middle) {
@@ -3793,121 +5172,286 @@
} return that;
});
- var aTypedArray$h = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$h = arrayBufferViewCore.exportTypedArrayMethod;
+ var global$s = global$1o;
+ var call$a = functionCall;
+ var ArrayBufferViewCore$5 = arrayBufferViewCore;
+ var lengthOfArrayLike$7 = lengthOfArrayLike$i;
+ var toOffset = toOffset$2;
+ var toIndexedObject$4 = toObject$i;
+ var fails$y = fails$V;
+
+ var RangeError$6 = global$s.RangeError;
+ var Int8Array$2 = global$s.Int8Array;
+ var Int8ArrayPrototype = Int8Array$2 && Int8Array$2.prototype;
+ var $set = Int8ArrayPrototype && Int8ArrayPrototype.set;
+ var aTypedArray$5 = ArrayBufferViewCore$5.aTypedArray;
+ var exportTypedArrayMethod$6 = ArrayBufferViewCore$5.exportTypedArrayMethod;
+
+ var WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS = !fails$y(function () {
+ // eslint-disable-next-line es/no-typed-arrays -- required for testing
+ var array = new Uint8ClampedArray(2);
+ call$a($set, array, { length: 1, 0: 3 }, 1);
+ return array[1] !== 3;
+ });
- var FORCED$2 = fails(function () {
- /* global Int8Array -- safe */
- new Int8Array(1).set({});
+ // https://bugs.chromium.org/p/v8/issues/detail?id=11294 and other
+ var TO_OBJECT_BUG = WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS && ArrayBufferViewCore$5.NATIVE_ARRAY_BUFFER_VIEWS && fails$y(function () {
+ var array = new Int8Array$2(2);
+ array.set(1);
+ array.set('2', 1);
+ return array[0] !== 0 || array[1] !== 2;
});
// `%TypedArray%.prototype.set` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set
- exportTypedArrayMethod$h('set', function set(arrayLike /* , offset */) {
- aTypedArray$h(this);
+ exportTypedArrayMethod$6('set', function set(arrayLike /* , offset */) {
+ aTypedArray$5(this);
var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);
+ var src = toIndexedObject$4(arrayLike);
+ if (WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS) return call$a($set, this, src, offset);
var length = this.length;
- var src = toObject(arrayLike);
- var len = toLength(src.length);
+ var len = lengthOfArrayLike$7(src);
var index = 0;
- if (len + offset > length) throw RangeError('Wrong length');
+ if (len + offset > length) throw RangeError$6('Wrong length');
while (index < len) this[offset + index] = src[index++];
- }, FORCED$2);
+ }, !WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS || TO_OBJECT_BUG);
+
+ var ArrayBufferViewCore$4 = arrayBufferViewCore;
+ var typedArraySpeciesConstructor$1 = typedArraySpeciesConstructor$4;
+ var fails$x = fails$V;
+ var arraySlice$7 = arraySlice$b;
- var aTypedArray$i = arrayBufferViewCore.aTypedArray;
- var aTypedArrayConstructor$4 = arrayBufferViewCore.aTypedArrayConstructor;
- var exportTypedArrayMethod$i = arrayBufferViewCore.exportTypedArrayMethod;
- var $slice = [].slice;
+ var aTypedArray$4 = ArrayBufferViewCore$4.aTypedArray;
+ var exportTypedArrayMethod$5 = ArrayBufferViewCore$4.exportTypedArrayMethod;
- var FORCED$3 = fails(function () {
- /* global Int8Array -- safe */
+ var FORCED$e = fails$x(function () {
+ // eslint-disable-next-line es/no-typed-arrays -- required for testing
new Int8Array(1).slice();
});
// `%TypedArray%.prototype.slice` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice
- exportTypedArrayMethod$i('slice', function slice(start, end) {
- var list = $slice.call(aTypedArray$i(this), start, end);
- var C = speciesConstructor(this, this.constructor);
+ exportTypedArrayMethod$5('slice', function slice(start, end) {
+ var list = arraySlice$7(aTypedArray$4(this), start, end);
+ var C = typedArraySpeciesConstructor$1(this);
var index = 0;
var length = list.length;
- var result = new (aTypedArrayConstructor$4(C))(length);
+ var result = new C(length);
while (length > index) result[index] = list[index++];
return result;
- }, FORCED$3);
+ }, FORCED$e);
- var $some = arrayIteration.some;
+ var ArrayBufferViewCore$3 = arrayBufferViewCore;
+ var $some$1 = arrayIteration.some;
- var aTypedArray$j = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$j = arrayBufferViewCore.exportTypedArrayMethod;
+ var aTypedArray$3 = ArrayBufferViewCore$3.aTypedArray;
+ var exportTypedArrayMethod$4 = ArrayBufferViewCore$3.exportTypedArrayMethod;
// `%TypedArray%.prototype.some` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.some
- exportTypedArrayMethod$j('some', function some(callbackfn /* , thisArg */) {
- return $some(aTypedArray$j(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ exportTypedArrayMethod$4('some', function some(callbackfn /* , thisArg */) {
+ return $some$1(aTypedArray$3(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var arraySlice$6 = arraySliceSimple;
+
+ var floor$4 = Math.floor;
+
+ var mergeSort = function (array, comparefn) {
+ var length = array.length;
+ var middle = floor$4(length / 2);
+ return length < 8 ? insertionSort(array, comparefn) : merge$5(
+ array,
+ mergeSort(arraySlice$6(array, 0, middle), comparefn),
+ mergeSort(arraySlice$6(array, middle), comparefn),
+ comparefn
+ );
+ };
+
+ var insertionSort = function (array, comparefn) {
+ var length = array.length;
+ var i = 1;
+ var element, j;
+
+ while (i < length) {
+ j = i;
+ element = array[i];
+ while (j && comparefn(array[j - 1], element) > 0) {
+ array[j] = array[--j];
+ }
+ if (j !== i++) array[j] = element;
+ } return array;
+ };
+
+ var merge$5 = function (array, left, right, comparefn) {
+ var llength = left.length;
+ var rlength = right.length;
+ var lindex = 0;
+ var rindex = 0;
+
+ while (lindex < llength || rindex < rlength) {
+ array[lindex + rindex] = (lindex < llength && rindex < rlength)
+ ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]
+ : lindex < llength ? left[lindex++] : right[rindex++];
+ } return array;
+ };
+
+ var arraySort$1 = mergeSort;
+
+ var userAgent$3 = engineUserAgent;
+
+ var firefox = userAgent$3.match(/firefox\/(\d+)/i);
+
+ var engineFfVersion = !!firefox && +firefox[1];
+
+ var UA = engineUserAgent;
+
+ var engineIsIeOrEdge = /MSIE|Trident/.test(UA);
+
+ var userAgent$2 = engineUserAgent;
+
+ var webkit = userAgent$2.match(/AppleWebKit\/(\d+)\./);
+
+ var engineWebkitVersion = !!webkit && +webkit[1];
+
+ var global$r = global$1o;
+ var uncurryThis$x = functionUncurryThis;
+ var fails$w = fails$V;
+ var aCallable$3 = aCallable$a;
+ var internalSort$1 = arraySort$1;
+ var ArrayBufferViewCore$2 = arrayBufferViewCore;
+ var FF$1 = engineFfVersion;
+ var IE_OR_EDGE$1 = engineIsIeOrEdge;
+ var V8$1 = engineV8Version;
+ var WEBKIT$1 = engineWebkitVersion;
+
+ var Array$3 = global$r.Array;
+ var aTypedArray$2 = ArrayBufferViewCore$2.aTypedArray;
+ var exportTypedArrayMethod$3 = ArrayBufferViewCore$2.exportTypedArrayMethod;
+ var Uint16Array = global$r.Uint16Array;
+ var un$Sort$1 = Uint16Array && uncurryThis$x(Uint16Array.prototype.sort);
+
+ // WebKit
+ var ACCEPT_INCORRECT_ARGUMENTS = !!un$Sort$1 && !(fails$w(function () {
+ un$Sort$1(new Uint16Array(2), null);
+ }) && fails$w(function () {
+ un$Sort$1(new Uint16Array(2), {});
+ }));
+
+ var STABLE_SORT$1 = !!un$Sort$1 && !fails$w(function () {
+ // feature detection can be too slow, so check engines versions
+ if (V8$1) return V8$1 < 74;
+ if (FF$1) return FF$1 < 67;
+ if (IE_OR_EDGE$1) return true;
+ if (WEBKIT$1) return WEBKIT$1 < 602;
+
+ var array = new Uint16Array(516);
+ var expected = Array$3(516);
+ var index, mod;
+
+ for (index = 0; index < 516; index++) {
+ mod = index % 4;
+ array[index] = 515 - index;
+ expected[index] = index - 2 * mod + 3;
+ }
+
+ un$Sort$1(array, function (a, b) {
+ return (a / 4 | 0) - (b / 4 | 0);
+ });
+
+ for (index = 0; index < 516; index++) {
+ if (array[index] !== expected[index]) return true;
+ }
});
- var aTypedArray$k = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$k = arrayBufferViewCore.exportTypedArrayMethod;
- var $sort = [].sort;
+ var getSortCompare$1 = function (comparefn) {
+ return function (x, y) {
+ if (comparefn !== undefined) return +comparefn(x, y) || 0;
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (y !== y) return -1;
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (x !== x) return 1;
+ if (x === 0 && y === 0) return 1 / x > 0 && 1 / y < 0 ? 1 : -1;
+ return x > y;
+ };
+ };
// `%TypedArray%.prototype.sort` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort
- exportTypedArrayMethod$k('sort', function sort(comparefn) {
- return $sort.call(aTypedArray$k(this), comparefn);
- });
+ exportTypedArrayMethod$3('sort', function sort(comparefn) {
+ if (comparefn !== undefined) aCallable$3(comparefn);
+ if (STABLE_SORT$1) return un$Sort$1(this, comparefn);
+
+ return internalSort$1(aTypedArray$2(this), getSortCompare$1(comparefn));
+ }, !STABLE_SORT$1 || ACCEPT_INCORRECT_ARGUMENTS);
- var aTypedArray$l = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$l = arrayBufferViewCore.exportTypedArrayMethod;
+ var ArrayBufferViewCore$1 = arrayBufferViewCore;
+ var toLength$6 = toLength$c;
+ var toAbsoluteIndex$3 = toAbsoluteIndex$9;
+ var typedArraySpeciesConstructor = typedArraySpeciesConstructor$4;
+
+ var aTypedArray$1 = ArrayBufferViewCore$1.aTypedArray;
+ var exportTypedArrayMethod$2 = ArrayBufferViewCore$1.exportTypedArrayMethod;
// `%TypedArray%.prototype.subarray` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray
- exportTypedArrayMethod$l('subarray', function subarray(begin, end) {
- var O = aTypedArray$l(this);
+ exportTypedArrayMethod$2('subarray', function subarray(begin, end) {
+ var O = aTypedArray$1(this);
var length = O.length;
- var beginIndex = toAbsoluteIndex(begin, length);
- return new (speciesConstructor(O, O.constructor))(
+ var beginIndex = toAbsoluteIndex$3(begin, length);
+ var C = typedArraySpeciesConstructor(O);
+ return new C(
O.buffer,
O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,
- toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)
+ toLength$6((end === undefined ? length : toAbsoluteIndex$3(end, length)) - beginIndex)
);
});
- var Int8Array$3 = global_1.Int8Array;
- var aTypedArray$m = arrayBufferViewCore.aTypedArray;
- var exportTypedArrayMethod$m = arrayBufferViewCore.exportTypedArrayMethod;
+ var global$q = global$1o;
+ var apply$4 = functionApply;
+ var ArrayBufferViewCore = arrayBufferViewCore;
+ var fails$v = fails$V;
+ var arraySlice$5 = arraySlice$b;
+
+ var Int8Array$1 = global$q.Int8Array;
+ var aTypedArray = ArrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$1 = ArrayBufferViewCore.exportTypedArrayMethod;
var $toLocaleString = [].toLocaleString;
- var $slice$1 = [].slice;
// iOS Safari 6.x fails here
- var TO_LOCALE_STRING_BUG = !!Int8Array$3 && fails(function () {
- $toLocaleString.call(new Int8Array$3(1));
+ var TO_LOCALE_STRING_BUG = !!Int8Array$1 && fails$v(function () {
+ $toLocaleString.call(new Int8Array$1(1));
});
- var FORCED$4 = fails(function () {
- return [1, 2].toLocaleString() != new Int8Array$3([1, 2]).toLocaleString();
- }) || !fails(function () {
- Int8Array$3.prototype.toLocaleString.call([1, 2]);
+ var FORCED$d = fails$v(function () {
+ return [1, 2].toLocaleString() != new Int8Array$1([1, 2]).toLocaleString();
+ }) || !fails$v(function () {
+ Int8Array$1.prototype.toLocaleString.call([1, 2]);
});
// `%TypedArray%.prototype.toLocaleString` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring
- exportTypedArrayMethod$m('toLocaleString', function toLocaleString() {
- return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice$1.call(aTypedArray$m(this)) : aTypedArray$m(this), arguments);
- }, FORCED$4);
-
- var exportTypedArrayMethod$n = arrayBufferViewCore.exportTypedArrayMethod;
-
+ exportTypedArrayMethod$1('toLocaleString', function toLocaleString() {
+ return apply$4(
+ $toLocaleString,
+ TO_LOCALE_STRING_BUG ? arraySlice$5(aTypedArray(this)) : aTypedArray(this),
+ arraySlice$5(arguments)
+ );
+ }, FORCED$d);
+ var exportTypedArrayMethod = arrayBufferViewCore.exportTypedArrayMethod;
+ var fails$u = fails$V;
+ var global$p = global$1o;
+ var uncurryThis$w = functionUncurryThis;
- var Uint8Array$2 = global_1.Uint8Array;
- var Uint8ArrayPrototype = Uint8Array$2 && Uint8Array$2.prototype || {};
+ var Uint8Array$1 = global$p.Uint8Array;
+ var Uint8ArrayPrototype = Uint8Array$1 && Uint8Array$1.prototype || {};
var arrayToString = [].toString;
- var arrayJoin = [].join;
+ var join$5 = uncurryThis$w([].join);
- if (fails(function () { arrayToString.call({}); })) {
+ if (fails$u(function () { arrayToString.call({}); })) {
arrayToString = function toString() {
- return arrayJoin.call(this);
+ return join$5(this);
};
}
@@ -3915,67 +5459,85 @@
// `%TypedArray%.prototype.toString` method
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring
- exportTypedArrayMethod$n('toString', arrayToString, IS_NOT_ARRAY_METHOD);
+ exportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);
+
+ var $$Z = _export;
+ var uncurryThis$v = functionUncurryThis;
+ var IndexedObject$1 = indexedObject;
+ var toIndexedObject$3 = toIndexedObject$d;
+ var arrayMethodIsStrict$5 = arrayMethodIsStrict$9;
- var nativeJoin = [].join;
+ var un$Join = uncurryThis$v([].join);
- var ES3_STRINGS = indexedObject != Object;
- var STRICT_METHOD$3 = arrayMethodIsStrict('join', ',');
+ var ES3_STRINGS = IndexedObject$1 != Object;
+ var STRICT_METHOD$5 = arrayMethodIsStrict$5('join', ',');
// `Array.prototype.join` method
// https://tc39.es/ecma262/#sec-array.prototype.join
- _export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$3 }, {
+ $$Z({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$5 }, {
join: function join(separator) {
- return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);
+ return un$Join(toIndexedObject$3(this), separator === undefined ? ',' : separator);
}
});
- var createProperty = function (object, key, value) {
- var propertyKey = toPrimitive(key);
- if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));
- else object[propertyKey] = value;
- };
-
- var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('slice');
-
- var SPECIES$5 = wellKnownSymbol('species');
- var nativeSlice = [].slice;
- var max$1 = Math.max;
+ var $$Y = _export;
+ var global$o = global$1o;
+ var isArray$4 = isArray$8;
+ var isConstructor$1 = isConstructor$4;
+ var isObject$e = isObject$s;
+ var toAbsoluteIndex$2 = toAbsoluteIndex$9;
+ var lengthOfArrayLike$6 = lengthOfArrayLike$i;
+ var toIndexedObject$2 = toIndexedObject$d;
+ var createProperty$3 = createProperty$5;
+ var wellKnownSymbol$8 = wellKnownSymbol$t;
+ var arrayMethodHasSpeciesSupport$3 = arrayMethodHasSpeciesSupport$5;
+ var un$Slice = arraySlice$b;
+
+ var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport$3('slice');
+
+ var SPECIES$1 = wellKnownSymbol$8('species');
+ var Array$2 = global$o.Array;
+ var max$3 = Math.max;
// `Array.prototype.slice` method
// https://tc39.es/ecma262/#sec-array.prototype.slice
// fallback for not array-like ES3 strings and DOM objects
- _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 }, {
+ $$Y({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 }, {
slice: function slice(start, end) {
- var O = toIndexedObject(this);
- var length = toLength(O.length);
- var k = toAbsoluteIndex(start, length);
- var fin = toAbsoluteIndex(end === undefined ? length : end, length);
+ var O = toIndexedObject$2(this);
+ var length = lengthOfArrayLike$6(O);
+ var k = toAbsoluteIndex$2(start, length);
+ var fin = toAbsoluteIndex$2(end === undefined ? length : end, length);
// inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
var Constructor, result, n;
- if (isArray(O)) {
+ if (isArray$4(O)) {
Constructor = O.constructor;
// cross-realm fallback
- if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {
+ if (isConstructor$1(Constructor) && (Constructor === Array$2 || isArray$4(Constructor.prototype))) {
Constructor = undefined;
- } else if (isObject(Constructor)) {
- Constructor = Constructor[SPECIES$5];
+ } else if (isObject$e(Constructor)) {
+ Constructor = Constructor[SPECIES$1];
if (Constructor === null) Constructor = undefined;
}
- if (Constructor === Array || Constructor === undefined) {
- return nativeSlice.call(O, k, fin);
+ if (Constructor === Array$2 || Constructor === undefined) {
+ return un$Slice(O, k, fin);
}
}
- result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));
- for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
+ result = new (Constructor === undefined ? Array$2 : Constructor)(max$3(fin - k, 0));
+ for (n = 0; k < fin; k++, n++) if (k in O) createProperty$3(result, n, O[k]);
result.length = n;
return result;
}
});
- var ITERATOR$7 = wellKnownSymbol('iterator');
+ var fails$t = fails$V;
+ var wellKnownSymbol$7 = wellKnownSymbol$t;
+ var IS_PURE = isPure;
- var nativeUrl = !fails(function () {
+ var ITERATOR$3 = wellKnownSymbol$7('iterator');
+
+ var nativeUrl = !fails$t(function () {
+ // eslint-disable-next-line unicorn/relative-url-style -- required for testing
var url = new URL('b?a=1&b=2&c=3', 'http://a');
var searchParams = url.searchParams;
var result = '';
@@ -3984,12 +5546,12 @@
searchParams['delete']('b');
result += key + value;
});
- return (isPure && !url.toJSON)
+ return (IS_PURE && !url.toJSON)
|| !searchParams.sort
|| url.href !== 'http://a/c%20d?a=1&c=3'
|| searchParams.get('c') !== '3'
|| String(new URLSearchParams('?a=1')) !== 'a=1'
- || !searchParams[ITERATOR$7]
+ || !searchParams[ITERATOR$3]
// throws in Edge
|| new URL('https://a@b').username !== 'a'
|| new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'
@@ -4003,331 +5565,91 @@
|| new URL('http://x', undefined).host !== 'x';
});
- var nativeAssign = Object.assign;
- var defineProperty$5 = Object.defineProperty;
-
- // `Object.assign` method
- // https://tc39.es/ecma262/#sec-object.assign
- var objectAssign = !nativeAssign || fails(function () {
- // should have correct order of operations (Edge bug)
- if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$5({}, 'a', {
- enumerable: true,
- get: function () {
- defineProperty$5(this, 'b', {
- value: 3,
- enumerable: false
- });
- }
- }), { b: 2 })).b !== 1) return true;
- // should work with symbols and should have deterministic property order (V8 bug)
- var A = {};
- var B = {};
- /* global Symbol -- required for testing */
- var symbol = Symbol();
- var alphabet = 'abcdefghijklmnopqrst';
- A[symbol] = 7;
- alphabet.split('').forEach(function (chr) { B[chr] = chr; });
- return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;
- }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`
- var T = toObject(target);
- var argumentsLength = arguments.length;
- var index = 1;
- var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;
- var propertyIsEnumerable = objectPropertyIsEnumerable.f;
- while (argumentsLength > index) {
- var S = indexedObject(arguments[index++]);
- var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);
- var length = keys.length;
- var j = 0;
- var key;
- while (length > j) {
- key = keys[j++];
- if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];
- }
- } return T;
- } : nativeAssign;
-
- // call something on iterator step with safe closing on error
- var callWithSafeIterationClosing = function (iterator, fn, value, ENTRIES) {
- try {
- return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
- // 7.4.6 IteratorClose(iterator, completion)
- } catch (error) {
- iteratorClose(iterator);
- throw error;
- }
- };
-
- // `Array.from` method implementation
- // https://tc39.es/ecma262/#sec-array.from
- var arrayFrom = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
- var O = toObject(arrayLike);
- var C = typeof this == 'function' ? this : Array;
- var argumentsLength = arguments.length;
- var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
- var mapping = mapfn !== undefined;
- var iteratorMethod = getIteratorMethod(O);
- var index = 0;
- var length, result, step, iterator, next, value;
- if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);
- // if the target is not iterable or it's an array with the default iterator - use a simple case
- if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {
- iterator = iteratorMethod.call(O);
- next = iterator.next;
- result = new C();
- for (;!(step = next.call(iterator)).done; index++) {
- value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
- createProperty(result, index, value);
- }
- } else {
- length = toLength(O.length);
- result = new C(length);
- for (;length > index; index++) {
- value = mapping ? mapfn(O[index], index) : O[index];
- createProperty(result, index, value);
- }
- }
- result.length = index;
- return result;
- };
-
- // based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js
- var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1
- var base = 36;
- var tMin = 1;
- var tMax = 26;
- var skew = 38;
- var damp = 700;
- var initialBias = 72;
- var initialN = 128; // 0x80
- var delimiter = '-'; // '\x2D'
- var regexNonASCII = /[^\0-\u007E]/; // non-ASCII chars
- var regexSeparators = /[.\u3002\uFF0E\uFF61]/g; // RFC 3490 separators
- var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';
- var baseMinusTMin = base - tMin;
- var floor$3 = Math.floor;
- var stringFromCharCode = String.fromCharCode;
-
- /**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- */
- var ucs2decode = function (string) {
- var output = [];
- var counter = 0;
- var length = string.length;
- while (counter < length) {
- var value = string.charCodeAt(counter++);
- if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
- // It's a high surrogate, and there is a next character.
- var extra = string.charCodeAt(counter++);
- if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
- output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
- } else {
- // It's an unmatched surrogate; only append this code unit, in case the
- // next code unit is the high surrogate of a surrogate pair.
- output.push(value);
- counter--;
- }
- } else {
- output.push(value);
- }
- }
- return output;
- };
-
- /**
- * Converts a digit/integer into a basic code point.
- */
- var digitToBasic = function (digit) {
- // 0..25 map to ASCII a..z or A..Z
- // 26..35 map to ASCII 0..9
- return digit + 22 + 75 * (digit < 26);
- };
-
- /**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * https://tools.ietf.org/html/rfc3492#section-3.4
- */
- var adapt = function (delta, numPoints, firstTime) {
- var k = 0;
- delta = firstTime ? floor$3(delta / damp) : delta >> 1;
- delta += floor$3(delta / numPoints);
- for (; delta > baseMinusTMin * tMax >> 1; k += base) {
- delta = floor$3(delta / baseMinusTMin);
- }
- return floor$3(k + (baseMinusTMin + 1) * delta / (delta + skew));
- };
-
- /**
- * Converts a string of Unicode symbols (e.g. a domain name label) to a
- * Punycode string of ASCII-only symbols.
- */
- // eslint-disable-next-line max-statements -- TODO
- var encode = function (input) {
- var output = [];
-
- // Convert the input in UCS-2 to an array of Unicode code points.
- input = ucs2decode(input);
-
- // Cache the length.
- var inputLength = input.length;
-
- // Initialize the state.
- var n = initialN;
- var delta = 0;
- var bias = initialBias;
- var i, currentValue;
-
- // Handle the basic code points.
- for (i = 0; i < input.length; i++) {
- currentValue = input[i];
- if (currentValue < 0x80) {
- output.push(stringFromCharCode(currentValue));
- }
- }
-
- var basicLength = output.length; // number of basic code points.
- var handledCPCount = basicLength; // number of code points that have been handled;
-
- // Finish the basic string with a delimiter unless it's empty.
- if (basicLength) {
- output.push(delimiter);
- }
-
- // Main encoding loop:
- while (handledCPCount < inputLength) {
- // All non-basic code points < n have been handled already. Find the next larger one:
- var m = maxInt;
- for (i = 0; i < input.length; i++) {
- currentValue = input[i];
- if (currentValue >= n && currentValue < m) {
- m = currentValue;
- }
- }
-
- // Increase `delta` enough to advance the decoder's state to , but guard against overflow.
- var handledCPCountPlusOne = handledCPCount + 1;
- if (m - n > floor$3((maxInt - delta) / handledCPCountPlusOne)) {
- throw RangeError(OVERFLOW_ERROR);
- }
-
- delta += (m - n) * handledCPCountPlusOne;
- n = m;
-
- for (i = 0; i < input.length; i++) {
- currentValue = input[i];
- if (currentValue < n && ++delta > maxInt) {
- throw RangeError(OVERFLOW_ERROR);
- }
- if (currentValue == n) {
- // Represent delta as a generalized variable-length integer.
- var q = delta;
- for (var k = base; /* no condition */; k += base) {
- var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
- if (q < t) break;
- var qMinusT = q - t;
- var baseMinusT = base - t;
- output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));
- q = floor$3(qMinusT / baseMinusT);
- }
-
- output.push(stringFromCharCode(digitToBasic(q)));
- bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
- delta = 0;
- ++handledCPCount;
- }
- }
-
- ++delta;
- ++n;
- }
- return output.join('');
- };
-
- var stringPunycodeToAscii = function (input) {
- var encoded = [];
- var labels = input.toLowerCase().replace(regexSeparators, '\u002E').split('.');
- var i, label;
- for (i = 0; i < labels.length; i++) {
- label = labels[i];
- encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);
- }
- return encoded.join('.');
- };
-
- var getIterator = function (it) {
- var iteratorMethod = getIteratorMethod(it);
- if (typeof iteratorMethod != 'function') {
- throw TypeError(String(it) + ' is not iterable');
- } return anObject(iteratorMethod.call(it));
- };
-
// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var $fetch$1 = getBuiltIn('fetch');
- var Headers = getBuiltIn('Headers');
- var ITERATOR$8 = wellKnownSymbol('iterator');
+ var $$X = _export;
+ var global$n = global$1o;
+ var getBuiltIn$2 = getBuiltIn$b;
+ var call$9 = functionCall;
+ var uncurryThis$u = functionUncurryThis;
+ var USE_NATIVE_URL$1 = nativeUrl;
+ var redefine$7 = redefine$h.exports;
+ var redefineAll$1 = redefineAll$4;
+ var setToStringTag$4 = setToStringTag$a;
+ var createIteratorConstructor = createIteratorConstructor$2;
+ var InternalStateModule$2 = internalState;
+ var anInstance$3 = anInstance$7;
+ var isCallable$5 = isCallable$r;
+ var hasOwn$6 = hasOwnProperty_1;
+ var bind$8 = functionBindContext;
+ var classof$3 = classof$d;
+ var anObject$9 = anObject$n;
+ var isObject$d = isObject$s;
+ var $toString$2 = toString$k;
+ var create$6 = objectCreate;
+ var createPropertyDescriptor = createPropertyDescriptor$7;
+ var getIterator$1 = getIterator$4;
+ var getIteratorMethod$1 = getIteratorMethod$5;
+ var validateArgumentsLength$2 = validateArgumentsLength$4;
+ var wellKnownSymbol$6 = wellKnownSymbol$t;
+ var arraySort = arraySort$1;
+
+ var ITERATOR$2 = wellKnownSymbol$6('iterator');
var URL_SEARCH_PARAMS = 'URLSearchParams';
var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';
- var setInternalState$5 = internalState.set;
- var getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS);
- var getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR);
+ var setInternalState$2 = InternalStateModule$2.set;
+ var getInternalParamsState = InternalStateModule$2.getterFor(URL_SEARCH_PARAMS);
+ var getInternalIteratorState = InternalStateModule$2.getterFor(URL_SEARCH_PARAMS_ITERATOR);
+
+ var n$Fetch = getBuiltIn$2('fetch');
+ var N$Request = getBuiltIn$2('Request');
+ var Headers$1 = getBuiltIn$2('Headers');
+ var RequestPrototype = N$Request && N$Request.prototype;
+ var HeadersPrototype = Headers$1 && Headers$1.prototype;
+ var RegExp$1 = global$n.RegExp;
+ var TypeError$8 = global$n.TypeError;
+ var decodeURIComponent$1 = global$n.decodeURIComponent;
+ var encodeURIComponent$1 = global$n.encodeURIComponent;
+ var charAt$5 = uncurryThis$u(''.charAt);
+ var join$4 = uncurryThis$u([].join);
+ var push$7 = uncurryThis$u([].push);
+ var replace$6 = uncurryThis$u(''.replace);
+ var shift$1 = uncurryThis$u([].shift);
+ var splice = uncurryThis$u([].splice);
+ var split$3 = uncurryThis$u(''.split);
+ var stringSlice$8 = uncurryThis$u(''.slice);
var plus = /\+/g;
var sequences = Array(4);
var percentSequence = function (bytes) {
- return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\da-f]{2}){' + bytes + '})', 'gi'));
+ return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp$1('((?:%[\\da-f]{2}){' + bytes + '})', 'gi'));
};
var percentDecode = function (sequence) {
try {
- return decodeURIComponent(sequence);
+ return decodeURIComponent$1(sequence);
} catch (error) {
return sequence;
}
};
var deserialize = function (it) {
- var result = it.replace(plus, ' ');
+ var result = replace$6(it, plus, ' ');
var bytes = 4;
try {
- return decodeURIComponent(result);
+ return decodeURIComponent$1(result);
} catch (error) {
while (bytes) {
- result = result.replace(percentSequence(bytes--), percentDecode);
+ result = replace$6(result, percentSequence(bytes--), percentDecode);
}
return result;
}
};
- var find = /[!'()~]|%20/g;
+ var find$1 = /[!'()~]|%20/g;
- var replace = {
+ var replacements = {
'!': '%21',
"'": '%27',
'(': '%28',
@@ -4337,44 +5659,17 @@
};
var replacer = function (match) {
- return replace[match];
+ return replacements[match];
};
var serialize = function (it) {
- return encodeURIComponent(it).replace(find, replacer);
- };
-
- var parseSearchParams = function (result, query) {
- if (query) {
- var attributes = query.split('&');
- var index = 0;
- var attribute, entry;
- while (index < attributes.length) {
- attribute = attributes[index++];
- if (attribute.length) {
- entry = attribute.split('=');
- result.push({
- key: deserialize(entry.shift()),
- value: deserialize(entry.join('='))
- });
- }
- }
- }
- };
-
- var updateSearchParams = function (query) {
- this.entries.length = 0;
- parseSearchParams(this.entries, query);
- };
-
- var validateArgumentsLength = function (passed, required) {
- if (passed < required) throw TypeError('Not enough arguments');
+ return replace$6(encodeURIComponent$1(it), find$1, replacer);
};
var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {
- setInternalState$5(this, {
+ setInternalState$2(this, {
type: URL_SEARCH_PARAMS_ITERATOR,
- iterator: getIterator(getInternalParamsState(params).entries),
+ iterator: getIterator$1(getInternalParamsState(params).entries),
kind: kind
});
}, 'Iterator', function next() {
@@ -4385,68 +5680,110 @@
if (!step.done) {
step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];
} return step;
- });
+ }, true);
- // `URLSearchParams` constructor
- // https://url.spec.whatwg.org/#interface-urlsearchparams
- var URLSearchParamsConstructor = function URLSearchParams(/* init */) {
- anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);
- var init = arguments.length > 0 ? arguments[0] : undefined;
- var that = this;
- var entries = [];
- var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;
-
- setInternalState$5(that, {
- type: URL_SEARCH_PARAMS,
- entries: entries,
- updateURL: function () { /* empty */ },
- updateSearchParams: updateSearchParams
- });
+ var URLSearchParamsState = function (init) {
+ this.entries = [];
+ this.url = null;
if (init !== undefined) {
- if (isObject(init)) {
- iteratorMethod = getIteratorMethod(init);
- if (typeof iteratorMethod === 'function') {
- iterator = iteratorMethod.call(init);
- next = iterator.next;
- while (!(step = next.call(iterator)).done) {
- entryIterator = getIterator(anObject(step.value));
- entryNext = entryIterator.next;
- if (
- (first = entryNext.call(entryIterator)).done ||
- (second = entryNext.call(entryIterator)).done ||
- !entryNext.call(entryIterator).done
- ) throw TypeError('Expected sequence with length 2');
- entries.push({ key: first.value + '', value: second.value + '' });
+ if (isObject$d(init)) this.parseObject(init);
+ else this.parseQuery(typeof init == 'string' ? charAt$5(init, 0) === '?' ? stringSlice$8(init, 1) : init : $toString$2(init));
+ }
+ };
+
+ URLSearchParamsState.prototype = {
+ type: URL_SEARCH_PARAMS,
+ bindURL: function (url) {
+ this.url = url;
+ this.update();
+ },
+ parseObject: function (object) {
+ var iteratorMethod = getIteratorMethod$1(object);
+ var iterator, next, step, entryIterator, entryNext, first, second;
+
+ if (iteratorMethod) {
+ iterator = getIterator$1(object, iteratorMethod);
+ next = iterator.next;
+ while (!(step = call$9(next, iterator)).done) {
+ entryIterator = getIterator$1(anObject$9(step.value));
+ entryNext = entryIterator.next;
+ if (
+ (first = call$9(entryNext, entryIterator)).done ||
+ (second = call$9(entryNext, entryIterator)).done ||
+ !call$9(entryNext, entryIterator).done
+ ) throw TypeError$8('Expected sequence with length 2');
+ push$7(this.entries, { key: $toString$2(first.value), value: $toString$2(second.value) });
+ }
+ } else for (var key in object) if (hasOwn$6(object, key)) {
+ push$7(this.entries, { key: key, value: $toString$2(object[key]) });
+ }
+ },
+ parseQuery: function (query) {
+ if (query) {
+ var attributes = split$3(query, '&');
+ var index = 0;
+ var attribute, entry;
+ while (index < attributes.length) {
+ attribute = attributes[index++];
+ if (attribute.length) {
+ entry = split$3(attribute, '=');
+ push$7(this.entries, {
+ key: deserialize(shift$1(entry)),
+ value: deserialize(join$4(entry, '='))
+ });
}
- } else for (key in init) if (has(init, key)) entries.push({ key: key, value: init[key] + '' });
- } else {
- parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');
+ }
}
+ },
+ serialize: function () {
+ var entries = this.entries;
+ var result = [];
+ var index = 0;
+ var entry;
+ while (index < entries.length) {
+ entry = entries[index++];
+ push$7(result, serialize(entry.key) + '=' + serialize(entry.value));
+ } return join$4(result, '&');
+ },
+ update: function () {
+ this.entries.length = 0;
+ this.parseQuery(this.url.query);
+ },
+ updateURL: function () {
+ if (this.url) this.url.update();
}
};
+ // `URLSearchParams` constructor
+ // https://url.spec.whatwg.org/#interface-urlsearchparams
+ var URLSearchParamsConstructor = function URLSearchParams(/* init */) {
+ anInstance$3(this, URLSearchParamsPrototype);
+ var init = arguments.length > 0 ? arguments[0] : undefined;
+ setInternalState$2(this, new URLSearchParamsState(init));
+ };
+
var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;
- redefineAll(URLSearchParamsPrototype, {
+ redefineAll$1(URLSearchParamsPrototype, {
// `URLSearchParams.prototype.append` method
// https://url.spec.whatwg.org/#dom-urlsearchparams-append
append: function append(name, value) {
- validateArgumentsLength(arguments.length, 2);
+ validateArgumentsLength$2(arguments.length, 2);
var state = getInternalParamsState(this);
- state.entries.push({ key: name + '', value: value + '' });
+ push$7(state.entries, { key: $toString$2(name), value: $toString$2(value) });
state.updateURL();
},
// `URLSearchParams.prototype.delete` method
// https://url.spec.whatwg.org/#dom-urlsearchparams-delete
'delete': function (name) {
- validateArgumentsLength(arguments.length, 1);
+ validateArgumentsLength$2(arguments.length, 1);
var state = getInternalParamsState(this);
var entries = state.entries;
- var key = name + '';
+ var key = $toString$2(name);
var index = 0;
while (index < entries.length) {
- if (entries[index].key === key) entries.splice(index, 1);
+ if (entries[index].key === key) splice(entries, index, 1);
else index++;
}
state.updateURL();
@@ -4454,9 +5791,9 @@
// `URLSearchParams.prototype.get` method
// https://url.spec.whatwg.org/#dom-urlsearchparams-get
get: function get(name) {
- validateArgumentsLength(arguments.length, 1);
+ validateArgumentsLength$2(arguments.length, 1);
var entries = getInternalParamsState(this).entries;
- var key = name + '';
+ var key = $toString$2(name);
var index = 0;
for (; index < entries.length; index++) {
if (entries[index].key === key) return entries[index].value;
@@ -4466,22 +5803,22 @@
// `URLSearchParams.prototype.getAll` method
// https://url.spec.whatwg.org/#dom-urlsearchparams-getall
getAll: function getAll(name) {
- validateArgumentsLength(arguments.length, 1);
+ validateArgumentsLength$2(arguments.length, 1);
var entries = getInternalParamsState(this).entries;
- var key = name + '';
+ var key = $toString$2(name);
var result = [];
var index = 0;
for (; index < entries.length; index++) {
- if (entries[index].key === key) result.push(entries[index].value);
+ if (entries[index].key === key) push$7(result, entries[index].value);
}
return result;
},
// `URLSearchParams.prototype.has` method
// https://url.spec.whatwg.org/#dom-urlsearchparams-has
has: function has(name) {
- validateArgumentsLength(arguments.length, 1);
+ validateArgumentsLength$2(arguments.length, 1);
var entries = getInternalParamsState(this).entries;
- var key = name + '';
+ var key = $toString$2(name);
var index = 0;
while (index < entries.length) {
if (entries[index++].key === key) return true;
@@ -4491,52 +5828,40 @@
// `URLSearchParams.prototype.set` method
// https://url.spec.whatwg.org/#dom-urlsearchparams-set
set: function set(name, value) {
- validateArgumentsLength(arguments.length, 1);
+ validateArgumentsLength$2(arguments.length, 1);
var state = getInternalParamsState(this);
var entries = state.entries;
var found = false;
- var key = name + '';
- var val = value + '';
+ var key = $toString$2(name);
+ var val = $toString$2(value);
var index = 0;
var entry;
for (; index < entries.length; index++) {
entry = entries[index];
if (entry.key === key) {
- if (found) entries.splice(index--, 1);
+ if (found) splice(entries, index--, 1);
else {
found = true;
entry.value = val;
}
}
}
- if (!found) entries.push({ key: key, value: val });
+ if (!found) push$7(entries, { key: key, value: val });
state.updateURL();
},
// `URLSearchParams.prototype.sort` method
// https://url.spec.whatwg.org/#dom-urlsearchparams-sort
sort: function sort() {
var state = getInternalParamsState(this);
- var entries = state.entries;
- // Array#sort is not stable in some engines
- var slice = entries.slice();
- var entry, entriesIndex, sliceIndex;
- entries.length = 0;
- for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {
- entry = slice[sliceIndex];
- for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {
- if (entries[entriesIndex].key > entry.key) {
- entries.splice(entriesIndex, 0, entry);
- break;
- }
- }
- if (entriesIndex === sliceIndex) entries.push(entry);
- }
+ arraySort(state.entries, function (a, b) {
+ return a.key > b.key ? 1 : -1;
+ });
state.updateURL();
},
// `URLSearchParams.prototype.forEach` method
forEach: function forEach(callback /* , thisArg */) {
var entries = getInternalParamsState(this).entries;
- var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3);
+ var boundFunction = bind$8(callback, arguments.length > 1 ? arguments[1] : undefined);
var index = 0;
var entry;
while (index < entries.length) {
@@ -4559,53 +5884,63 @@
}, { enumerable: true });
// `URLSearchParams.prototype[@@iterator]` method
- redefine(URLSearchParamsPrototype, ITERATOR$8, URLSearchParamsPrototype.entries);
+ redefine$7(URLSearchParamsPrototype, ITERATOR$2, URLSearchParamsPrototype.entries, { name: 'entries' });
// `URLSearchParams.prototype.toString` method
// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior
- redefine(URLSearchParamsPrototype, 'toString', function toString() {
- var entries = getInternalParamsState(this).entries;
- var result = [];
- var index = 0;
- var entry;
- while (index < entries.length) {
- entry = entries[index++];
- result.push(serialize(entry.key) + '=' + serialize(entry.value));
- } return result.join('&');
+ redefine$7(URLSearchParamsPrototype, 'toString', function toString() {
+ return getInternalParamsState(this).serialize();
}, { enumerable: true });
- setToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);
+ setToStringTag$4(URLSearchParamsConstructor, URL_SEARCH_PARAMS);
- _export({ global: true, forced: !nativeUrl }, {
+ $$X({ global: true, forced: !USE_NATIVE_URL$1 }, {
URLSearchParams: URLSearchParamsConstructor
});
- // Wrap `fetch` for correct work with polyfilled `URLSearchParams`
- // https://github.com/zloirock/core-js/issues/674
- if (!nativeUrl && typeof $fetch$1 == 'function' && typeof Headers == 'function') {
- _export({ global: true, enumerable: true, forced: true }, {
- fetch: function fetch(input /* , init */) {
- var args = [input];
- var init, body, headers;
- if (arguments.length > 1) {
- init = arguments[1];
- if (isObject(init)) {
- body = init.body;
- if (classof(body) === URL_SEARCH_PARAMS) {
- headers = init.headers ? new Headers(init.headers) : new Headers();
- if (!headers.has('content-type')) {
- headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
- }
- init = objectCreate(init, {
- body: createPropertyDescriptor(0, String(body)),
- headers: createPropertyDescriptor(0, headers)
- });
- }
- }
- args.push(init);
- } return $fetch$1.apply(this, args);
- }
- });
+ // Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams`
+ if (!USE_NATIVE_URL$1 && isCallable$5(Headers$1)) {
+ var headersHas = uncurryThis$u(HeadersPrototype.has);
+ var headersSet = uncurryThis$u(HeadersPrototype.set);
+
+ var wrapRequestOptions = function (init) {
+ if (isObject$d(init)) {
+ var body = init.body;
+ var headers;
+ if (classof$3(body) === URL_SEARCH_PARAMS) {
+ headers = init.headers ? new Headers$1(init.headers) : new Headers$1();
+ if (!headersHas(headers, 'content-type')) {
+ headersSet(headers, 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
+ }
+ return create$6(init, {
+ body: createPropertyDescriptor(0, $toString$2(body)),
+ headers: createPropertyDescriptor(0, headers)
+ });
+ }
+ } return init;
+ };
+
+ if (isCallable$5(n$Fetch)) {
+ $$X({ global: true, enumerable: true, forced: true }, {
+ fetch: function fetch(input /* , init */) {
+ return n$Fetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});
+ }
+ });
+ }
+
+ if (isCallable$5(N$Request)) {
+ var RequestConstructor = function Request(input /* , init */) {
+ anInstance$3(this, RequestPrototype);
+ return new N$Request(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});
+ };
+
+ RequestPrototype.constructor = RequestConstructor;
+ RequestConstructor.prototype = RequestPrototype;
+
+ $$X({ global: true, forced: true }, {
+ Request: RequestConstructor
+ });
+ }
}
var web_urlSearchParams = {
@@ -4613,2689 +5948,1704 @@
getState: getInternalParamsState
};
- // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
+ var uncurryThis$t = functionUncurryThis;
+ var PROPER_FUNCTION_NAME$1 = functionName.PROPER;
+ var redefine$6 = redefine$h.exports;
+ var anObject$8 = anObject$n;
+ var isPrototypeOf$2 = objectIsPrototypeOf;
+ var $toString$1 = toString$k;
+ var fails$s = fails$V;
+ var regExpFlags$2 = regexpFlags$1;
+
+ var TO_STRING = 'toString';
+ var RegExpPrototype$3 = RegExp.prototype;
+ var n$ToString = RegExpPrototype$3[TO_STRING];
+ var getFlags$1 = uncurryThis$t(regExpFlags$2);
+ var NOT_GENERIC = fails$s(function () { return n$ToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });
+ // FF44- RegExp#toString has a wrong name
+ var INCORRECT_NAME = PROPER_FUNCTION_NAME$1 && n$ToString.name != TO_STRING;
+ // `RegExp.prototype.toString` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype.tostring
+ if (NOT_GENERIC || INCORRECT_NAME) {
+ redefine$6(RegExp.prototype, TO_STRING, function toString() {
+ var R = anObject$8(this);
+ var p = $toString$1(R.source);
+ var rf = R.flags;
+ var f = $toString$1(rf === undefined && isPrototypeOf$2(RegExpPrototype$3, R) && !('flags' in RegExpPrototype$3) ? getFlags$1(R) : rf);
+ return '/' + p + '/' + f;
+ }, { unsafe: true });
+ }
+ // TODO: Remove from `core-js@4` since it's moved to entry points
+ var uncurryThis$s = functionUncurryThis;
+ var redefine$5 = redefine$h.exports;
+ var regexpExec$2 = regexpExec$3;
+ var fails$r = fails$V;
+ var wellKnownSymbol$5 = wellKnownSymbol$t;
+ var createNonEnumerableProperty$1 = createNonEnumerableProperty$b;
+ var SPECIES = wellKnownSymbol$5('species');
+ var RegExpPrototype$2 = RegExp.prototype;
+ var fixRegexpWellKnownSymbolLogic = function (KEY, exec, FORCED, SHAM) {
+ var SYMBOL = wellKnownSymbol$5(KEY);
+ var DELEGATES_TO_SYMBOL = !fails$r(function () {
+ // String methods call symbol-named RegEp methods
+ var O = {};
+ O[SYMBOL] = function () { return 7; };
+ return ''[KEY](O) != 7;
+ });
+ var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails$r(function () {
+ // Symbol-named RegExp methods call .exec
+ var execCalled = false;
+ var re = /a/;
+ if (KEY === 'split') {
+ // We can't use real regex here since it causes deoptimization
+ // and serious performance degradation in V8
+ // https://github.com/zloirock/core-js/issues/306
+ re = {};
+ // RegExp[@@split] doesn't call the regex's exec method, but first creates
+ // a new one. We need to return the patched regex when creating the new one.
+ re.constructor = {};
+ re.constructor[SPECIES] = function () { return re; };
+ re.flags = '';
+ re[SYMBOL] = /./[SYMBOL];
+ }
+ re.exec = function () { execCalled = true; return null; };
- var codeAt = stringMultibyte.codeAt;
+ re[SYMBOL]('');
+ return !execCalled;
+ });
+ if (
+ !DELEGATES_TO_SYMBOL ||
+ !DELEGATES_TO_EXEC ||
+ FORCED
+ ) {
+ var uncurriedNativeRegExpMethod = uncurryThis$s(/./[SYMBOL]);
+ var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
+ var uncurriedNativeMethod = uncurryThis$s(nativeMethod);
+ var $exec = regexp.exec;
+ if ($exec === regexpExec$2 || $exec === RegExpPrototype$2.exec) {
+ if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
+ // The native String method already delegates to @@method (this
+ // polyfilled function), leasing to infinite recursion.
+ // We avoid it by directly calling the native @@method method.
+ return { done: true, value: uncurriedNativeRegExpMethod(regexp, str, arg2) };
+ }
+ return { done: true, value: uncurriedNativeMethod(str, regexp, arg2) };
+ }
+ return { done: false };
+ });
+ redefine$5(String.prototype, KEY, methods[0]);
+ redefine$5(RegExpPrototype$2, SYMBOL, methods[1]);
+ }
+ if (SHAM) createNonEnumerableProperty$1(RegExpPrototype$2[SYMBOL], 'sham', true);
+ };
+ var charAt$4 = stringMultibyte.charAt;
- var NativeURL = global_1.URL;
- var URLSearchParams$1 = web_urlSearchParams.URLSearchParams;
- var getInternalSearchParamsState = web_urlSearchParams.getState;
- var setInternalState$6 = internalState.set;
- var getInternalURLState = internalState.getterFor('URL');
- var floor$4 = Math.floor;
- var pow$1 = Math.pow;
+ // `AdvanceStringIndex` abstract operation
+ // https://tc39.es/ecma262/#sec-advancestringindex
+ var advanceStringIndex$3 = function (S, index, unicode) {
+ return index + (unicode ? charAt$4(S, index).length : 1);
+ };
- var INVALID_AUTHORITY = 'Invalid authority';
- var INVALID_SCHEME = 'Invalid scheme';
- var INVALID_HOST = 'Invalid host';
- var INVALID_PORT = 'Invalid port';
+ var uncurryThis$r = functionUncurryThis;
+ var toObject$9 = toObject$i;
- var ALPHA = /[A-Za-z]/;
- var ALPHANUMERIC = /[\d+-.A-Za-z]/;
- var DIGIT = /\d/;
- var HEX_START = /^(0x|0X)/;
- var OCT = /^[0-7]+$/;
- var DEC = /^\d+$/;
- var HEX = /^[\dA-Fa-f]+$/;
- /* eslint-disable no-control-regex -- safe */
- var FORBIDDEN_HOST_CODE_POINT = /[\u0000\t\u000A\u000D #%/:?@[\\]]/;
- var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\u0000\t\u000A\u000D #/:?@[\\]]/;
- var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g;
- var TAB_AND_NEW_LINE = /[\t\u000A\u000D]/g;
- /* eslint-enable no-control-regex -- safe */
- var EOF;
+ var floor$3 = Math.floor;
+ var charAt$3 = uncurryThis$r(''.charAt);
+ var replace$5 = uncurryThis$r(''.replace);
+ var stringSlice$7 = uncurryThis$r(''.slice);
+ var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g;
+ var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g;
- var parseHost = function (url, input) {
- var result, codePoints, index;
- if (input.charAt(0) == '[') {
- if (input.charAt(input.length - 1) != ']') return INVALID_HOST;
- result = parseIPv6(input.slice(1, -1));
- if (!result) return INVALID_HOST;
- url.host = result;
- // opaque host
- } else if (!isSpecial(url)) {
- if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;
- result = '';
- codePoints = arrayFrom(input);
- for (index = 0; index < codePoints.length; index++) {
- result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
- }
- url.host = result;
- } else {
- input = stringPunycodeToAscii(input);
- if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;
- result = parseIPv4(input);
- if (result === null) return INVALID_HOST;
- url.host = result;
+ // `GetSubstitution` abstract operation
+ // https://tc39.es/ecma262/#sec-getsubstitution
+ var getSubstitution$1 = function (matched, str, position, captures, namedCaptures, replacement) {
+ var tailPos = position + matched.length;
+ var m = captures.length;
+ var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
+ if (namedCaptures !== undefined) {
+ namedCaptures = toObject$9(namedCaptures);
+ symbols = SUBSTITUTION_SYMBOLS;
}
+ return replace$5(replacement, symbols, function (match, ch) {
+ var capture;
+ switch (charAt$3(ch, 0)) {
+ case '$': return '$';
+ case '&': return matched;
+ case '`': return stringSlice$7(str, 0, position);
+ case "'": return stringSlice$7(str, tailPos);
+ case '<':
+ capture = namedCaptures[stringSlice$7(ch, 1, -1)];
+ break;
+ default: // \d\d?
+ var n = +ch;
+ if (n === 0) return match;
+ if (n > m) {
+ var f = floor$3(n / 10);
+ if (f === 0) return match;
+ if (f <= m) return captures[f - 1] === undefined ? charAt$3(ch, 1) : captures[f - 1] + charAt$3(ch, 1);
+ return match;
+ }
+ capture = captures[n - 1];
+ }
+ return capture === undefined ? '' : capture;
+ });
};
- var parseIPv4 = function (input) {
- var parts = input.split('.');
- var partsLength, numbers, index, part, radix, number, ipv4;
- if (parts.length && parts[parts.length - 1] == '') {
- parts.pop();
+ var global$m = global$1o;
+ var call$8 = functionCall;
+ var anObject$7 = anObject$n;
+ var isCallable$4 = isCallable$r;
+ var classof$2 = classofRaw$1;
+ var regexpExec$1 = regexpExec$3;
+
+ var TypeError$7 = global$m.TypeError;
+
+ // `RegExpExec` abstract operation
+ // https://tc39.es/ecma262/#sec-regexpexec
+ var regexpExecAbstract = function (R, S) {
+ var exec = R.exec;
+ if (isCallable$4(exec)) {
+ var result = call$8(exec, R, S);
+ if (result !== null) anObject$7(result);
+ return result;
}
- partsLength = parts.length;
- if (partsLength > 4) return input;
- numbers = [];
- for (index = 0; index < partsLength; index++) {
- part = parts[index];
- if (part == '') return input;
- radix = 10;
- if (part.length > 1 && part.charAt(0) == '0') {
- radix = HEX_START.test(part) ? 16 : 8;
- part = part.slice(radix == 8 ? 1 : 2);
- }
- if (part === '') {
- number = 0;
- } else {
- if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;
- number = parseInt(part, radix);
- }
- numbers.push(number);
- }
- for (index = 0; index < partsLength; index++) {
- number = numbers[index];
- if (index == partsLength - 1) {
- if (number >= pow$1(256, 5 - partsLength)) return null;
- } else if (number > 255) return null;
- }
- ipv4 = numbers.pop();
- for (index = 0; index < numbers.length; index++) {
- ipv4 += numbers[index] * pow$1(256, 3 - index);
- }
- return ipv4;
+ if (classof$2(R) === 'RegExp') return call$8(regexpExec$1, R, S);
+ throw TypeError$7('RegExp#exec called on incompatible receiver');
};
- // eslint-disable-next-line max-statements -- TODO
- var parseIPv6 = function (input) {
- var address = [0, 0, 0, 0, 0, 0, 0, 0];
- var pieceIndex = 0;
- var compress = null;
- var pointer = 0;
- var value, length, numbersSeen, ipv4Piece, number, swaps, swap;
-
- var char = function () {
- return input.charAt(pointer);
- };
+ var apply$3 = functionApply;
+ var call$7 = functionCall;
+ var uncurryThis$q = functionUncurryThis;
+ var fixRegExpWellKnownSymbolLogic$3 = fixRegexpWellKnownSymbolLogic;
+ var fails$q = fails$V;
+ var anObject$6 = anObject$n;
+ var isCallable$3 = isCallable$r;
+ var toIntegerOrInfinity$3 = toIntegerOrInfinity$b;
+ var toLength$5 = toLength$c;
+ var toString$f = toString$k;
+ var requireObjectCoercible$a = requireObjectCoercible$e;
+ var advanceStringIndex$2 = advanceStringIndex$3;
+ var getMethod$3 = getMethod$7;
+ var getSubstitution = getSubstitution$1;
+ var regExpExec$3 = regexpExecAbstract;
+ var wellKnownSymbol$4 = wellKnownSymbol$t;
+
+ var REPLACE = wellKnownSymbol$4('replace');
+ var max$2 = Math.max;
+ var min$5 = Math.min;
+ var concat$2 = uncurryThis$q([].concat);
+ var push$6 = uncurryThis$q([].push);
+ var stringIndexOf$2 = uncurryThis$q(''.indexOf);
+ var stringSlice$6 = uncurryThis$q(''.slice);
- if (char() == ':') {
- if (input.charAt(1) != ':') return;
- pointer += 2;
- pieceIndex++;
- compress = pieceIndex;
- }
- while (char()) {
- if (pieceIndex == 8) return;
- if (char() == ':') {
- if (compress !== null) return;
- pointer++;
- pieceIndex++;
- compress = pieceIndex;
- continue;
- }
- value = length = 0;
- while (length < 4 && HEX.test(char())) {
- value = value * 16 + parseInt(char(), 16);
- pointer++;
- length++;
- }
- if (char() == '.') {
- if (length == 0) return;
- pointer -= length;
- if (pieceIndex > 6) return;
- numbersSeen = 0;
- while (char()) {
- ipv4Piece = null;
- if (numbersSeen > 0) {
- if (char() == '.' && numbersSeen < 4) pointer++;
- else return;
- }
- if (!DIGIT.test(char())) return;
- while (DIGIT.test(char())) {
- number = parseInt(char(), 10);
- if (ipv4Piece === null) ipv4Piece = number;
- else if (ipv4Piece == 0) return;
- else ipv4Piece = ipv4Piece * 10 + number;
- if (ipv4Piece > 255) return;
- pointer++;
- }
- address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;
- numbersSeen++;
- if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;
- }
- if (numbersSeen != 4) return;
- break;
- } else if (char() == ':') {
- pointer++;
- if (!char()) return;
- } else if (char()) return;
- address[pieceIndex++] = value;
- }
- if (compress !== null) {
- swaps = pieceIndex - compress;
- pieceIndex = 7;
- while (pieceIndex != 0 && swaps > 0) {
- swap = address[pieceIndex];
- address[pieceIndex--] = address[compress + swaps - 1];
- address[compress + --swaps] = swap;
- }
- } else if (pieceIndex != 8) return;
- return address;
+ var maybeToString = function (it) {
+ return it === undefined ? it : String(it);
};
- var findLongestZeroSequence = function (ipv6) {
- var maxIndex = null;
- var maxLength = 1;
- var currStart = null;
- var currLength = 0;
- var index = 0;
- for (; index < 8; index++) {
- if (ipv6[index] !== 0) {
- if (currLength > maxLength) {
- maxIndex = currStart;
- maxLength = currLength;
- }
- currStart = null;
- currLength = 0;
- } else {
- if (currStart === null) currStart = index;
- ++currLength;
- }
- }
- if (currLength > maxLength) {
- maxIndex = currStart;
- maxLength = currLength;
- }
- return maxIndex;
- };
+ // IE <= 11 replaces $0 with the whole match, as if it was $&
+ // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0
+ var REPLACE_KEEPS_$0 = (function () {
+ // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing
+ return 'a'.replace(/./, '$0') === '$0';
+ })();
- var serializeHost = function (host) {
- var result, index, compress, ignore0;
- // ipv4
- if (typeof host == 'number') {
- result = [];
- for (index = 0; index < 4; index++) {
- result.unshift(host % 256);
- host = floor$4(host / 256);
- } return result.join('.');
- // ipv6
- } else if (typeof host == 'object') {
- result = '';
- compress = findLongestZeroSequence(host);
- for (index = 0; index < 8; index++) {
- if (ignore0 && host[index] === 0) continue;
- if (ignore0) ignore0 = false;
- if (compress === index) {
- result += index ? ':' : '::';
- ignore0 = true;
- } else {
- result += host[index].toString(16);
- if (index < 7) result += ':';
- }
- }
- return '[' + result + ']';
- } return host;
- };
+ // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string
+ var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {
+ if (/./[REPLACE]) {
+ return /./[REPLACE]('a', '$0') === '';
+ }
+ return false;
+ })();
- var C0ControlPercentEncodeSet = {};
- var fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, {
- ' ': 1, '"': 1, '<': 1, '>': 1, '`': 1
- });
- var pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, {
- '#': 1, '?': 1, '{': 1, '}': 1
- });
- var userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, {
- '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\': 1, ']': 1, '^': 1, '|': 1
+ var REPLACE_SUPPORTS_NAMED_GROUPS = !fails$q(function () {
+ var re = /./;
+ re.exec = function () {
+ var result = [];
+ result.groups = { a: '7' };
+ return result;
+ };
+ // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive
+ return ''.replace(re, '$') !== '7';
});
- var percentEncode = function (char, set) {
- var code = codeAt(char, 0);
- return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);
- };
-
- var specialSchemes = {
- ftp: 21,
- file: null,
- http: 80,
- https: 443,
- ws: 80,
- wss: 443
- };
+ // @@replace logic
+ fixRegExpWellKnownSymbolLogic$3('replace', function (_, nativeReplace, maybeCallNative) {
+ var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';
- var isSpecial = function (url) {
- return has(specialSchemes, url.scheme);
- };
+ return [
+ // `String.prototype.replace` method
+ // https://tc39.es/ecma262/#sec-string.prototype.replace
+ function replace(searchValue, replaceValue) {
+ var O = requireObjectCoercible$a(this);
+ var replacer = searchValue == undefined ? undefined : getMethod$3(searchValue, REPLACE);
+ return replacer
+ ? call$7(replacer, searchValue, O, replaceValue)
+ : call$7(nativeReplace, toString$f(O), searchValue, replaceValue);
+ },
+ // `RegExp.prototype[@@replace]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace
+ function (string, replaceValue) {
+ var rx = anObject$6(this);
+ var S = toString$f(string);
- var includesCredentials = function (url) {
- return url.username != '' || url.password != '';
- };
+ if (
+ typeof replaceValue == 'string' &&
+ stringIndexOf$2(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&
+ stringIndexOf$2(replaceValue, '$<') === -1
+ ) {
+ var res = maybeCallNative(nativeReplace, rx, S, replaceValue);
+ if (res.done) return res.value;
+ }
- var cannotHaveUsernamePasswordPort = function (url) {
- return !url.host || url.cannotBeABaseURL || url.scheme == 'file';
- };
+ var functionalReplace = isCallable$3(replaceValue);
+ if (!functionalReplace) replaceValue = toString$f(replaceValue);
- var isWindowsDriveLetter = function (string, normalized) {
- var second;
- return string.length == 2 && ALPHA.test(string.charAt(0))
- && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));
- };
+ var global = rx.global;
+ if (global) {
+ var fullUnicode = rx.unicode;
+ rx.lastIndex = 0;
+ }
+ var results = [];
+ while (true) {
+ var result = regExpExec$3(rx, S);
+ if (result === null) break;
- var startsWithWindowsDriveLetter = function (string) {
- var third;
- return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (
- string.length == 2 ||
- ((third = string.charAt(2)) === '/' || third === '\\' || third === '?' || third === '#')
- );
- };
+ push$6(results, result);
+ if (!global) break;
- var shortenURLsPath = function (url) {
- var path = url.path;
- var pathSize = path.length;
- if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {
- path.pop();
- }
- };
+ var matchStr = toString$f(result[0]);
+ if (matchStr === '') rx.lastIndex = advanceStringIndex$2(S, toLength$5(rx.lastIndex), fullUnicode);
+ }
- var isSingleDot = function (segment) {
- return segment === '.' || segment.toLowerCase() === '%2e';
- };
+ var accumulatedResult = '';
+ var nextSourcePosition = 0;
+ for (var i = 0; i < results.length; i++) {
+ result = results[i];
- var isDoubleDot = function (segment) {
- segment = segment.toLowerCase();
- return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';
- };
+ var matched = toString$f(result[0]);
+ var position = max$2(min$5(toIntegerOrInfinity$3(result.index), S.length), 0);
+ var captures = [];
+ // NOTE: This is equivalent to
+ // captures = result.slice(1).map(maybeToString)
+ // but for some reason `nativeSlice.call(result, 1, result.length)` (called in
+ // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
+ // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
+ for (var j = 1; j < result.length; j++) push$6(captures, maybeToString(result[j]));
+ var namedCaptures = result.groups;
+ if (functionalReplace) {
+ var replacerArgs = concat$2([matched], captures, position, S);
+ if (namedCaptures !== undefined) push$6(replacerArgs, namedCaptures);
+ var replacement = toString$f(apply$3(replaceValue, undefined, replacerArgs));
+ } else {
+ replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
+ }
+ if (position >= nextSourcePosition) {
+ accumulatedResult += stringSlice$6(S, nextSourcePosition, position) + replacement;
+ nextSourcePosition = position + matched.length;
+ }
+ }
+ return accumulatedResult + stringSlice$6(S, nextSourcePosition);
+ }
+ ];
+ }, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);
- // States:
- var SCHEME_START = {};
- var SCHEME = {};
- var NO_SCHEME = {};
- var SPECIAL_RELATIVE_OR_AUTHORITY = {};
- var PATH_OR_AUTHORITY = {};
- var RELATIVE = {};
- var RELATIVE_SLASH = {};
- var SPECIAL_AUTHORITY_SLASHES = {};
- var SPECIAL_AUTHORITY_IGNORE_SLASHES = {};
- var AUTHORITY = {};
- var HOST = {};
- var HOSTNAME = {};
- var PORT = {};
- var FILE = {};
- var FILE_SLASH = {};
- var FILE_HOST = {};
- var PATH_START = {};
- var PATH = {};
- var CANNOT_BE_A_BASE_URL_PATH = {};
- var QUERY = {};
- var FRAGMENT = {};
+ var isObject$c = isObject$s;
+ var classof$1 = classofRaw$1;
+ var wellKnownSymbol$3 = wellKnownSymbol$t;
- // eslint-disable-next-line max-statements -- TODO
- var parseURL = function (url, input, stateOverride, base) {
- var state = stateOverride || SCHEME_START;
- var pointer = 0;
- var buffer = '';
- var seenAt = false;
- var seenBracket = false;
- var seenPasswordToken = false;
- var codePoints, char, bufferCodePoints, failure;
-
- if (!stateOverride) {
- url.scheme = '';
- url.username = '';
- url.password = '';
- url.host = null;
- url.port = null;
- url.path = [];
- url.query = null;
- url.fragment = null;
- url.cannotBeABaseURL = false;
- input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');
- }
-
- input = input.replace(TAB_AND_NEW_LINE, '');
-
- codePoints = arrayFrom(input);
-
- while (pointer <= codePoints.length) {
- char = codePoints[pointer];
- switch (state) {
- case SCHEME_START:
- if (char && ALPHA.test(char)) {
- buffer += char.toLowerCase();
- state = SCHEME;
- } else if (!stateOverride) {
- state = NO_SCHEME;
- continue;
- } else return INVALID_SCHEME;
- break;
+ var MATCH$2 = wellKnownSymbol$3('match');
- case SCHEME:
- if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {
- buffer += char.toLowerCase();
- } else if (char == ':') {
- if (stateOverride && (
- (isSpecial(url) != has(specialSchemes, buffer)) ||
- (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||
- (url.scheme == 'file' && !url.host)
- )) return;
- url.scheme = buffer;
- if (stateOverride) {
- if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;
- return;
- }
- buffer = '';
- if (url.scheme == 'file') {
- state = FILE;
- } else if (isSpecial(url) && base && base.scheme == url.scheme) {
- state = SPECIAL_RELATIVE_OR_AUTHORITY;
- } else if (isSpecial(url)) {
- state = SPECIAL_AUTHORITY_SLASHES;
- } else if (codePoints[pointer + 1] == '/') {
- state = PATH_OR_AUTHORITY;
- pointer++;
- } else {
- url.cannotBeABaseURL = true;
- url.path.push('');
- state = CANNOT_BE_A_BASE_URL_PATH;
- }
- } else if (!stateOverride) {
- buffer = '';
- state = NO_SCHEME;
- pointer = 0;
- continue;
- } else return INVALID_SCHEME;
- break;
+ // `IsRegExp` abstract operation
+ // https://tc39.es/ecma262/#sec-isregexp
+ var isRegexp = function (it) {
+ var isRegExp;
+ return isObject$c(it) && ((isRegExp = it[MATCH$2]) !== undefined ? !!isRegExp : classof$1(it) == 'RegExp');
+ };
- case NO_SCHEME:
- if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;
- if (base.cannotBeABaseURL && char == '#') {
- url.scheme = base.scheme;
- url.path = base.path.slice();
- url.query = base.query;
- url.fragment = '';
- url.cannotBeABaseURL = true;
- state = FRAGMENT;
- break;
- }
- state = base.scheme == 'file' ? FILE : RELATIVE;
- continue;
+ var apply$2 = functionApply;
+ var call$6 = functionCall;
+ var uncurryThis$p = functionUncurryThis;
+ var fixRegExpWellKnownSymbolLogic$2 = fixRegexpWellKnownSymbolLogic;
+ var isRegExp$2 = isRegexp;
+ var anObject$5 = anObject$n;
+ var requireObjectCoercible$9 = requireObjectCoercible$e;
+ var speciesConstructor$1 = speciesConstructor$5;
+ var advanceStringIndex$1 = advanceStringIndex$3;
+ var toLength$4 = toLength$c;
+ var toString$e = toString$k;
+ var getMethod$2 = getMethod$7;
+ var arraySlice$4 = arraySliceSimple;
+ var callRegExpExec = regexpExecAbstract;
+ var regexpExec = regexpExec$3;
+ var stickyHelpers$1 = regexpStickyHelpers;
+ var fails$p = fails$V;
+
+ var UNSUPPORTED_Y$1 = stickyHelpers$1.UNSUPPORTED_Y;
+ var MAX_UINT32 = 0xFFFFFFFF;
+ var min$4 = Math.min;
+ var $push = [].push;
+ var exec$4 = uncurryThis$p(/./.exec);
+ var push$5 = uncurryThis$p($push);
+ var stringSlice$5 = uncurryThis$p(''.slice);
- case SPECIAL_RELATIVE_OR_AUTHORITY:
- if (char == '/' && codePoints[pointer + 1] == '/') {
- state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
- pointer++;
- } else {
- state = RELATIVE;
- continue;
- } break;
+ // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
+ // Weex JS has frozen built-in prototypes, so use try / catch wrapper
+ var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails$p(function () {
+ // eslint-disable-next-line regexp/no-empty-group -- required for testing
+ var re = /(?:)/;
+ var originalExec = re.exec;
+ re.exec = function () { return originalExec.apply(this, arguments); };
+ var result = 'ab'.split(re);
+ return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';
+ });
- case PATH_OR_AUTHORITY:
- if (char == '/') {
- state = AUTHORITY;
- break;
- } else {
- state = PATH;
- continue;
+ // @@split logic
+ fixRegExpWellKnownSymbolLogic$2('split', function (SPLIT, nativeSplit, maybeCallNative) {
+ var internalSplit;
+ if (
+ 'abbc'.split(/(b)*/)[1] == 'c' ||
+ // eslint-disable-next-line regexp/no-empty-group -- required for testing
+ 'test'.split(/(?:)/, -1).length != 4 ||
+ 'ab'.split(/(?:ab)*/).length != 2 ||
+ '.'.split(/(.?)(.?)/).length != 4 ||
+ // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing
+ '.'.split(/()()/).length > 1 ||
+ ''.split(/.?/).length
+ ) {
+ // based on es5-shim implementation, need to rework it
+ internalSplit = function (separator, limit) {
+ var string = toString$e(requireObjectCoercible$9(this));
+ var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
+ if (lim === 0) return [];
+ if (separator === undefined) return [string];
+ // If `separator` is not a regex, use native split
+ if (!isRegExp$2(separator)) {
+ return call$6(nativeSplit, string, separator, lim);
+ }
+ var output = [];
+ var flags = (separator.ignoreCase ? 'i' : '') +
+ (separator.multiline ? 'm' : '') +
+ (separator.unicode ? 'u' : '') +
+ (separator.sticky ? 'y' : '');
+ var lastLastIndex = 0;
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ var separatorCopy = new RegExp(separator.source, flags + 'g');
+ var match, lastIndex, lastLength;
+ while (match = call$6(regexpExec, separatorCopy, string)) {
+ lastIndex = separatorCopy.lastIndex;
+ if (lastIndex > lastLastIndex) {
+ push$5(output, stringSlice$5(string, lastLastIndex, match.index));
+ if (match.length > 1 && match.index < string.length) apply$2($push, output, arraySlice$4(match, 1));
+ lastLength = match[0].length;
+ lastLastIndex = lastIndex;
+ if (output.length >= lim) break;
}
+ if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop
+ }
+ if (lastLastIndex === string.length) {
+ if (lastLength || !exec$4(separatorCopy, '')) push$5(output, '');
+ } else push$5(output, stringSlice$5(string, lastLastIndex));
+ return output.length > lim ? arraySlice$4(output, 0, lim) : output;
+ };
+ // Chakra, V8
+ } else if ('0'.split(undefined, 0).length) {
+ internalSplit = function (separator, limit) {
+ return separator === undefined && limit === 0 ? [] : call$6(nativeSplit, this, separator, limit);
+ };
+ } else internalSplit = nativeSplit;
- case RELATIVE:
- url.scheme = base.scheme;
- if (char == EOF) {
- url.username = base.username;
- url.password = base.password;
- url.host = base.host;
- url.port = base.port;
- url.path = base.path.slice();
- url.query = base.query;
- } else if (char == '/' || (char == '\\' && isSpecial(url))) {
- state = RELATIVE_SLASH;
- } else if (char == '?') {
- url.username = base.username;
- url.password = base.password;
- url.host = base.host;
- url.port = base.port;
- url.path = base.path.slice();
- url.query = '';
- state = QUERY;
- } else if (char == '#') {
- url.username = base.username;
- url.password = base.password;
- url.host = base.host;
- url.port = base.port;
- url.path = base.path.slice();
- url.query = base.query;
- url.fragment = '';
- state = FRAGMENT;
- } else {
- url.username = base.username;
- url.password = base.password;
- url.host = base.host;
- url.port = base.port;
- url.path = base.path.slice();
- url.path.pop();
- state = PATH;
- continue;
- } break;
+ return [
+ // `String.prototype.split` method
+ // https://tc39.es/ecma262/#sec-string.prototype.split
+ function split(separator, limit) {
+ var O = requireObjectCoercible$9(this);
+ var splitter = separator == undefined ? undefined : getMethod$2(separator, SPLIT);
+ return splitter
+ ? call$6(splitter, separator, O, limit)
+ : call$6(internalSplit, toString$e(O), separator, limit);
+ },
+ // `RegExp.prototype[@@split]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@split
+ //
+ // NOTE: This cannot be properly polyfilled in engines that don't support
+ // the 'y' flag.
+ function (string, limit) {
+ var rx = anObject$5(this);
+ var S = toString$e(string);
+ var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);
- case RELATIVE_SLASH:
- if (isSpecial(url) && (char == '/' || char == '\\')) {
- state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
- } else if (char == '/') {
- state = AUTHORITY;
- } else {
- url.username = base.username;
- url.password = base.password;
- url.host = base.host;
- url.port = base.port;
- state = PATH;
- continue;
- } break;
+ if (res.done) return res.value;
- case SPECIAL_AUTHORITY_SLASHES:
- state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
- if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;
- pointer++;
- break;
+ var C = speciesConstructor$1(rx, RegExp);
- case SPECIAL_AUTHORITY_IGNORE_SLASHES:
- if (char != '/' && char != '\\') {
- state = AUTHORITY;
- continue;
- } break;
-
- case AUTHORITY:
- if (char == '@') {
- if (seenAt) buffer = '%40' + buffer;
- seenAt = true;
- bufferCodePoints = arrayFrom(buffer);
- for (var i = 0; i < bufferCodePoints.length; i++) {
- var codePoint = bufferCodePoints[i];
- if (codePoint == ':' && !seenPasswordToken) {
- seenPasswordToken = true;
- continue;
- }
- var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
- if (seenPasswordToken) url.password += encodedCodePoints;
- else url.username += encodedCodePoints;
- }
- buffer = '';
- } else if (
- char == EOF || char == '/' || char == '?' || char == '#' ||
- (char == '\\' && isSpecial(url))
- ) {
- if (seenAt && buffer == '') return INVALID_AUTHORITY;
- pointer -= arrayFrom(buffer).length + 1;
- buffer = '';
- state = HOST;
- } else buffer += char;
- break;
+ var unicodeMatching = rx.unicode;
+ var flags = (rx.ignoreCase ? 'i' : '') +
+ (rx.multiline ? 'm' : '') +
+ (rx.unicode ? 'u' : '') +
+ (UNSUPPORTED_Y$1 ? 'g' : 'y');
- case HOST:
- case HOSTNAME:
- if (stateOverride && url.scheme == 'file') {
- state = FILE_HOST;
- continue;
- } else if (char == ':' && !seenBracket) {
- if (buffer == '') return INVALID_HOST;
- failure = parseHost(url, buffer);
- if (failure) return failure;
- buffer = '';
- state = PORT;
- if (stateOverride == HOSTNAME) return;
- } else if (
- char == EOF || char == '/' || char == '?' || char == '#' ||
- (char == '\\' && isSpecial(url))
+ // ^(? + rx + ) is needed, in combination with some S slicing, to
+ // simulate the 'y' flag.
+ var splitter = new C(UNSUPPORTED_Y$1 ? '^(?:' + rx.source + ')' : rx, flags);
+ var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
+ if (lim === 0) return [];
+ if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];
+ var p = 0;
+ var q = 0;
+ var A = [];
+ while (q < S.length) {
+ splitter.lastIndex = UNSUPPORTED_Y$1 ? 0 : q;
+ var z = callRegExpExec(splitter, UNSUPPORTED_Y$1 ? stringSlice$5(S, q) : S);
+ var e;
+ if (
+ z === null ||
+ (e = min$4(toLength$4(splitter.lastIndex + (UNSUPPORTED_Y$1 ? q : 0)), S.length)) === p
) {
- if (isSpecial(url) && buffer == '') return INVALID_HOST;
- if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;
- failure = parseHost(url, buffer);
- if (failure) return failure;
- buffer = '';
- state = PATH_START;
- if (stateOverride) return;
- continue;
+ q = advanceStringIndex$1(S, q, unicodeMatching);
} else {
- if (char == '[') seenBracket = true;
- else if (char == ']') seenBracket = false;
- buffer += char;
- } break;
-
- case PORT:
- if (DIGIT.test(char)) {
- buffer += char;
- } else if (
- char == EOF || char == '/' || char == '?' || char == '#' ||
- (char == '\\' && isSpecial(url)) ||
- stateOverride
- ) {
- if (buffer != '') {
- var port = parseInt(buffer, 10);
- if (port > 0xFFFF) return INVALID_PORT;
- url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;
- buffer = '';
- }
- if (stateOverride) return;
- state = PATH_START;
- continue;
- } else return INVALID_PORT;
- break;
-
- case FILE:
- url.scheme = 'file';
- if (char == '/' || char == '\\') state = FILE_SLASH;
- else if (base && base.scheme == 'file') {
- if (char == EOF) {
- url.host = base.host;
- url.path = base.path.slice();
- url.query = base.query;
- } else if (char == '?') {
- url.host = base.host;
- url.path = base.path.slice();
- url.query = '';
- state = QUERY;
- } else if (char == '#') {
- url.host = base.host;
- url.path = base.path.slice();
- url.query = base.query;
- url.fragment = '';
- state = FRAGMENT;
- } else {
- if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
- url.host = base.host;
- url.path = base.path.slice();
- shortenURLsPath(url);
- }
- state = PATH;
- continue;
+ push$5(A, stringSlice$5(S, p, q));
+ if (A.length === lim) return A;
+ for (var i = 1; i <= z.length - 1; i++) {
+ push$5(A, z[i]);
+ if (A.length === lim) return A;
}
- } else {
- state = PATH;
- continue;
- } break;
-
- case FILE_SLASH:
- if (char == '/' || char == '\\') {
- state = FILE_HOST;
- break;
- }
- if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
- if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);
- else url.host = base.host;
+ q = p = e;
}
- state = PATH;
- continue;
+ }
+ push$5(A, stringSlice$5(S, p));
+ return A;
+ }
+ ];
+ }, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y$1);
- case FILE_HOST:
- if (char == EOF || char == '/' || char == '\\' || char == '?' || char == '#') {
- if (!stateOverride && isWindowsDriveLetter(buffer)) {
- state = PATH;
- } else if (buffer == '') {
- url.host = '';
- if (stateOverride) return;
- state = PATH_START;
- } else {
- failure = parseHost(url, buffer);
- if (failure) return failure;
- if (url.host == 'localhost') url.host = '';
- if (stateOverride) return;
- buffer = '';
- state = PATH_START;
- } continue;
- } else buffer += char;
- break;
+ // a string of all valid unicode whitespaces
+ var whitespaces$4 = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
+ '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
- case PATH_START:
- if (isSpecial(url)) {
- state = PATH;
- if (char != '/' && char != '\\') continue;
- } else if (!stateOverride && char == '?') {
- url.query = '';
- state = QUERY;
- } else if (!stateOverride && char == '#') {
- url.fragment = '';
- state = FRAGMENT;
- } else if (char != EOF) {
- state = PATH;
- if (char != '/') continue;
- } break;
+ var uncurryThis$o = functionUncurryThis;
+ var requireObjectCoercible$8 = requireObjectCoercible$e;
+ var toString$d = toString$k;
+ var whitespaces$3 = whitespaces$4;
- case PATH:
- if (
- char == EOF || char == '/' ||
- (char == '\\' && isSpecial(url)) ||
- (!stateOverride && (char == '?' || char == '#'))
- ) {
- if (isDoubleDot(buffer)) {
- shortenURLsPath(url);
- if (char != '/' && !(char == '\\' && isSpecial(url))) {
- url.path.push('');
- }
- } else if (isSingleDot(buffer)) {
- if (char != '/' && !(char == '\\' && isSpecial(url))) {
- url.path.push('');
- }
- } else {
- if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {
- if (url.host) url.host = '';
- buffer = buffer.charAt(0) + ':'; // normalize windows drive letter
- }
- url.path.push(buffer);
- }
- buffer = '';
- if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {
- while (url.path.length > 1 && url.path[0] === '') {
- url.path.shift();
- }
- }
- if (char == '?') {
- url.query = '';
- state = QUERY;
- } else if (char == '#') {
- url.fragment = '';
- state = FRAGMENT;
- }
- } else {
- buffer += percentEncode(char, pathPercentEncodeSet);
- } break;
-
- case CANNOT_BE_A_BASE_URL_PATH:
- if (char == '?') {
- url.query = '';
- state = QUERY;
- } else if (char == '#') {
- url.fragment = '';
- state = FRAGMENT;
- } else if (char != EOF) {
- url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);
- } break;
-
- case QUERY:
- if (!stateOverride && char == '#') {
- url.fragment = '';
- state = FRAGMENT;
- } else if (char != EOF) {
- if (char == "'" && isSpecial(url)) url.query += '%27';
- else if (char == '#') url.query += '%23';
- else url.query += percentEncode(char, C0ControlPercentEncodeSet);
- } break;
-
- case FRAGMENT:
- if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);
- break;
- }
+ var replace$4 = uncurryThis$o(''.replace);
+ var whitespace = '[' + whitespaces$3 + ']';
+ var ltrim = RegExp('^' + whitespace + whitespace + '*');
+ var rtrim$2 = RegExp(whitespace + whitespace + '*$');
- pointer++;
- }
+ // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
+ var createMethod$2 = function (TYPE) {
+ return function ($this) {
+ var string = toString$d(requireObjectCoercible$8($this));
+ if (TYPE & 1) string = replace$4(string, ltrim, '');
+ if (TYPE & 2) string = replace$4(string, rtrim$2, '');
+ return string;
+ };
};
- // `URL` constructor
- // https://url.spec.whatwg.org/#url-class
- var URLConstructor = function URL(url /* , base */) {
- var that = anInstance(this, URLConstructor, 'URL');
- var base = arguments.length > 1 ? arguments[1] : undefined;
- var urlString = String(url);
- var state = setInternalState$6(that, { type: 'URL' });
- var baseState, failure;
- if (base !== undefined) {
- if (base instanceof URLConstructor) baseState = getInternalURLState(base);
- else {
- failure = parseURL(baseState = {}, String(base));
- if (failure) throw TypeError(failure);
- }
- }
- failure = parseURL(state, urlString, null, baseState);
- if (failure) throw TypeError(failure);
- var searchParams = state.searchParams = new URLSearchParams$1();
- var searchParamsState = getInternalSearchParamsState(searchParams);
- searchParamsState.updateSearchParams(state.query);
- searchParamsState.updateURL = function () {
- state.query = String(searchParams) || null;
- };
- if (!descriptors) {
- that.href = serializeURL.call(that);
- that.origin = getOrigin.call(that);
- that.protocol = getProtocol.call(that);
- that.username = getUsername.call(that);
- that.password = getPassword.call(that);
- that.host = getHost.call(that);
- that.hostname = getHostname.call(that);
- that.port = getPort.call(that);
- that.pathname = getPathname.call(that);
- that.search = getSearch.call(that);
- that.searchParams = getSearchParams.call(that);
- that.hash = getHash.call(that);
- }
+ var stringTrim = {
+ // `String.prototype.{ trimLeft, trimStart }` methods
+ // https://tc39.es/ecma262/#sec-string.prototype.trimstart
+ start: createMethod$2(1),
+ // `String.prototype.{ trimRight, trimEnd }` methods
+ // https://tc39.es/ecma262/#sec-string.prototype.trimend
+ end: createMethod$2(2),
+ // `String.prototype.trim` method
+ // https://tc39.es/ecma262/#sec-string.prototype.trim
+ trim: createMethod$2(3)
};
- var URLPrototype = URLConstructor.prototype;
+ var PROPER_FUNCTION_NAME = functionName.PROPER;
+ var fails$o = fails$V;
+ var whitespaces$2 = whitespaces$4;
- var serializeURL = function () {
- var url = getInternalURLState(this);
- var scheme = url.scheme;
- var username = url.username;
- var password = url.password;
- var host = url.host;
- var port = url.port;
- var path = url.path;
- var query = url.query;
- var fragment = url.fragment;
- var output = scheme + ':';
- if (host !== null) {
- output += '//';
- if (includesCredentials(url)) {
- output += username + (password ? ':' + password : '') + '@';
- }
- output += serializeHost(host);
- if (port !== null) output += ':' + port;
- } else if (scheme == 'file') output += '//';
- output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
- if (query !== null) output += '?' + query;
- if (fragment !== null) output += '#' + fragment;
- return output;
+ var non = '\u200B\u0085\u180E';
+
+ // check that a method works with the correct list
+ // of whitespaces and has a correct name
+ var stringTrimForced = function (METHOD_NAME) {
+ return fails$o(function () {
+ return !!whitespaces$2[METHOD_NAME]()
+ || non[METHOD_NAME]() !== non
+ || (PROPER_FUNCTION_NAME && whitespaces$2[METHOD_NAME].name !== METHOD_NAME);
+ });
};
- var getOrigin = function () {
- var url = getInternalURLState(this);
- var scheme = url.scheme;
- var port = url.port;
- if (scheme == 'blob') try {
- return new URL(scheme.path[0]).origin;
- } catch (error) {
- return 'null';
+ var $$W = _export;
+ var $trim = stringTrim.trim;
+ var forcedStringTrimMethod$2 = stringTrimForced;
+
+ // `String.prototype.trim` method
+ // https://tc39.es/ecma262/#sec-string.prototype.trim
+ $$W({ target: 'String', proto: true, forced: forcedStringTrimMethod$2('trim') }, {
+ trim: function trim() {
+ return $trim(this);
}
- if (scheme == 'file' || !isSpecial(url)) return 'null';
- return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');
- };
+ });
- var getProtocol = function () {
- return getInternalURLState(this).scheme + ':';
- };
+ var DESCRIPTORS$b = descriptors;
+ var FUNCTION_NAME_EXISTS = functionName.EXISTS;
+ var uncurryThis$n = functionUncurryThis;
+ var defineProperty$6 = objectDefineProperty.f;
- var getUsername = function () {
- return getInternalURLState(this).username;
- };
+ var FunctionPrototype = Function.prototype;
+ var functionToString = uncurryThis$n(FunctionPrototype.toString);
+ var nameRE = /function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/;
+ var regExpExec$2 = uncurryThis$n(nameRE.exec);
+ var NAME = 'name';
- var getPassword = function () {
- return getInternalURLState(this).password;
- };
+ // Function instances `.name` property
+ // https://tc39.es/ecma262/#sec-function-instances-name
+ if (DESCRIPTORS$b && !FUNCTION_NAME_EXISTS) {
+ defineProperty$6(FunctionPrototype, NAME, {
+ configurable: true,
+ get: function () {
+ try {
+ return regExpExec$2(nameRE, functionToString(this))[1];
+ } catch (error) {
+ return '';
+ }
+ }
+ });
+ }
- var getHost = function () {
- var url = getInternalURLState(this);
- var host = url.host;
- var port = url.port;
- return host === null ? ''
- : port === null ? serializeHost(host)
- : serializeHost(host) + ':' + port;
- };
+ var $$V = _export;
+ var DESCRIPTORS$a = descriptors;
+ var create$5 = objectCreate;
- var getHostname = function () {
- var host = getInternalURLState(this).host;
- return host === null ? '' : serializeHost(host);
- };
+ // `Object.create` method
+ // https://tc39.es/ecma262/#sec-object.create
+ $$V({ target: 'Object', stat: true, sham: !DESCRIPTORS$a }, {
+ create: create$5
+ });
- var getPort = function () {
- var port = getInternalURLState(this).port;
- return port === null ? '' : String(port);
- };
+ var $$U = _export;
+ var global$l = global$1o;
+ var apply$1 = functionApply;
+ var isCallable$2 = isCallable$r;
+ var userAgent$1 = engineUserAgent;
+ var arraySlice$3 = arraySlice$b;
+ var validateArgumentsLength$1 = validateArgumentsLength$4;
- var getPathname = function () {
- var url = getInternalURLState(this);
- var path = url.path;
- return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
- };
+ var MSIE = /MSIE .\./.test(userAgent$1); // <- dirty ie9- check
+ var Function$2 = global$l.Function;
- var getSearch = function () {
- var query = getInternalURLState(this).query;
- return query ? '?' + query : '';
+ var wrap$1 = function (scheduler) {
+ return function (handler, timeout /* , ...arguments */) {
+ var boundArgs = validateArgumentsLength$1(arguments.length, 1) > 2;
+ var fn = isCallable$2(handler) ? handler : Function$2(handler);
+ var args = boundArgs ? arraySlice$3(arguments, 2) : undefined;
+ return scheduler(boundArgs ? function () {
+ apply$1(fn, this, args);
+ } : fn, timeout);
+ };
};
- var getSearchParams = function () {
- return getInternalURLState(this).searchParams;
- };
+ // ie9- setTimeout & setInterval additional parameters fix
+ // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers
+ $$U({ global: true, bind: true, forced: MSIE }, {
+ // `setTimeout` method
+ // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
+ setTimeout: wrap$1(global$l.setTimeout),
+ // `setInterval` method
+ // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
+ setInterval: wrap$1(global$l.setInterval)
+ });
- var getHash = function () {
- var fragment = getInternalURLState(this).fragment;
- return fragment ? '#' + fragment : '';
+ var global$k = typeof globalThis !== 'undefined' && globalThis || typeof self !== 'undefined' && self || typeof global$k !== 'undefined' && global$k;
+ var support = {
+ searchParams: 'URLSearchParams' in global$k,
+ iterable: 'Symbol' in global$k && 'iterator' in Symbol,
+ blob: 'FileReader' in global$k && 'Blob' in global$k && function () {
+ try {
+ new Blob();
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }(),
+ formData: 'FormData' in global$k,
+ arrayBuffer: 'ArrayBuffer' in global$k
};
- var accessorDescriptor = function (getter, setter) {
- return { get: getter, set: setter, configurable: true, enumerable: true };
- };
+ function isDataView(obj) {
+ return obj && DataView.prototype.isPrototypeOf(obj);
+ }
- if (descriptors) {
- objectDefineProperties(URLPrototype, {
- // `URL.prototype.href` accessors pair
- // https://url.spec.whatwg.org/#dom-url-href
- href: accessorDescriptor(serializeURL, function (href) {
- var url = getInternalURLState(this);
- var urlString = String(href);
- var failure = parseURL(url, urlString);
- if (failure) throw TypeError(failure);
- getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
- }),
- // `URL.prototype.origin` getter
- // https://url.spec.whatwg.org/#dom-url-origin
- origin: accessorDescriptor(getOrigin),
- // `URL.prototype.protocol` accessors pair
- // https://url.spec.whatwg.org/#dom-url-protocol
- protocol: accessorDescriptor(getProtocol, function (protocol) {
- var url = getInternalURLState(this);
- parseURL(url, String(protocol) + ':', SCHEME_START);
- }),
- // `URL.prototype.username` accessors pair
- // https://url.spec.whatwg.org/#dom-url-username
- username: accessorDescriptor(getUsername, function (username) {
- var url = getInternalURLState(this);
- var codePoints = arrayFrom(String(username));
- if (cannotHaveUsernamePasswordPort(url)) return;
- url.username = '';
- for (var i = 0; i < codePoints.length; i++) {
- url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
- }
- }),
- // `URL.prototype.password` accessors pair
- // https://url.spec.whatwg.org/#dom-url-password
- password: accessorDescriptor(getPassword, function (password) {
- var url = getInternalURLState(this);
- var codePoints = arrayFrom(String(password));
- if (cannotHaveUsernamePasswordPort(url)) return;
- url.password = '';
- for (var i = 0; i < codePoints.length; i++) {
- url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
- }
- }),
- // `URL.prototype.host` accessors pair
- // https://url.spec.whatwg.org/#dom-url-host
- host: accessorDescriptor(getHost, function (host) {
- var url = getInternalURLState(this);
- if (url.cannotBeABaseURL) return;
- parseURL(url, String(host), HOST);
- }),
- // `URL.prototype.hostname` accessors pair
- // https://url.spec.whatwg.org/#dom-url-hostname
- hostname: accessorDescriptor(getHostname, function (hostname) {
- var url = getInternalURLState(this);
- if (url.cannotBeABaseURL) return;
- parseURL(url, String(hostname), HOSTNAME);
- }),
- // `URL.prototype.port` accessors pair
- // https://url.spec.whatwg.org/#dom-url-port
- port: accessorDescriptor(getPort, function (port) {
- var url = getInternalURLState(this);
- if (cannotHaveUsernamePasswordPort(url)) return;
- port = String(port);
- if (port == '') url.port = null;
- else parseURL(url, port, PORT);
- }),
- // `URL.prototype.pathname` accessors pair
- // https://url.spec.whatwg.org/#dom-url-pathname
- pathname: accessorDescriptor(getPathname, function (pathname) {
- var url = getInternalURLState(this);
- if (url.cannotBeABaseURL) return;
- url.path = [];
- parseURL(url, pathname + '', PATH_START);
- }),
- // `URL.prototype.search` accessors pair
- // https://url.spec.whatwg.org/#dom-url-search
- search: accessorDescriptor(getSearch, function (search) {
- var url = getInternalURLState(this);
- search = String(search);
- if (search == '') {
- url.query = null;
- } else {
- if ('?' == search.charAt(0)) search = search.slice(1);
- url.query = '';
- parseURL(url, search, QUERY);
- }
- getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
- }),
- // `URL.prototype.searchParams` getter
- // https://url.spec.whatwg.org/#dom-url-searchparams
- searchParams: accessorDescriptor(getSearchParams),
- // `URL.prototype.hash` accessors pair
- // https://url.spec.whatwg.org/#dom-url-hash
- hash: accessorDescriptor(getHash, function (hash) {
- var url = getInternalURLState(this);
- hash = String(hash);
- if (hash == '') {
- url.fragment = null;
- return;
- }
- if ('#' == hash.charAt(0)) hash = hash.slice(1);
- url.fragment = '';
- parseURL(url, hash, FRAGMENT);
- })
- });
+ if (support.arrayBuffer) {
+ var viewClasses = ['[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]'];
+
+ var isArrayBufferView = ArrayBuffer.isView || function (obj) {
+ return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;
+ };
}
- // `URL.prototype.toJSON` method
- // https://url.spec.whatwg.org/#dom-url-tojson
- redefine(URLPrototype, 'toJSON', function toJSON() {
- return serializeURL.call(this);
- }, { enumerable: true });
+ function normalizeName(name) {
+ if (typeof name !== 'string') {
+ name = String(name);
+ }
- // `URL.prototype.toString` method
- // https://url.spec.whatwg.org/#URL-stringification-behavior
- redefine(URLPrototype, 'toString', function toString() {
- return serializeURL.call(this);
- }, { enumerable: true });
+ if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {
+ throw new TypeError('Invalid character in header field name: "' + name + '"');
+ }
- if (NativeURL) {
- var nativeCreateObjectURL = NativeURL.createObjectURL;
- var nativeRevokeObjectURL = NativeURL.revokeObjectURL;
- // `URL.createObjectURL` method
- // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
- // eslint-disable-next-line no-unused-vars -- required for `.length`
- if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {
- return nativeCreateObjectURL.apply(NativeURL, arguments);
- });
- // `URL.revokeObjectURL` method
- // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL
- // eslint-disable-next-line no-unused-vars -- required for `.length`
- if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {
- return nativeRevokeObjectURL.apply(NativeURL, arguments);
- });
+ return name.toLowerCase();
}
- setToStringTag(URLConstructor, 'URL');
-
- _export({ global: true, forced: !nativeUrl, sham: !descriptors }, {
- URL: URLConstructor
- });
+ function normalizeValue(value) {
+ if (typeof value !== 'string') {
+ value = String(value);
+ }
- // `RegExp.prototype.flags` getter implementation
- // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
- var regexpFlags = function () {
- var that = anObject(this);
- var result = '';
- if (that.global) result += 'g';
- if (that.ignoreCase) result += 'i';
- if (that.multiline) result += 'm';
- if (that.dotAll) result += 's';
- if (that.unicode) result += 'u';
- if (that.sticky) result += 'y';
- return result;
- };
+ return value;
+ } // Build a destructive iterator for the value list
- var TO_STRING$1 = 'toString';
- var RegExpPrototype = RegExp.prototype;
- var nativeToString = RegExpPrototype[TO_STRING$1];
- var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });
- // FF44- RegExp#toString has a wrong name
- var INCORRECT_NAME = nativeToString.name != TO_STRING$1;
+ function iteratorFor(items) {
+ var iterator = {
+ next: function next() {
+ var value = items.shift();
+ return {
+ done: value === undefined,
+ value: value
+ };
+ }
+ };
- // `RegExp.prototype.toString` method
- // https://tc39.es/ecma262/#sec-regexp.prototype.tostring
- if (NOT_GENERIC || INCORRECT_NAME) {
- redefine(RegExp.prototype, TO_STRING$1, function toString() {
- var R = anObject(this);
- var p = String(R.source);
- var rf = R.flags;
- var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);
- return '/' + p + '/' + f;
- }, { unsafe: true });
- }
+ if (support.iterable) {
+ iterator[Symbol.iterator] = function () {
+ return iterator;
+ };
+ }
- // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,
- // so we use an intermediate function.
- function RE(s, f) {
- return RegExp(s, f);
+ return iterator;
}
- var UNSUPPORTED_Y = fails(function () {
- // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError
- var re = RE('a', 'y');
- re.lastIndex = 2;
- return re.exec('abcd') != null;
- });
+ function Headers(headers) {
+ this.map = {};
- var BROKEN_CARET = fails(function () {
- // https://bugzilla.mozilla.org/show_bug.cgi?id=773687
- var re = RE('^r', 'gy');
- re.lastIndex = 2;
- return re.exec('str') != null;
- });
+ if (headers instanceof Headers) {
+ headers.forEach(function (value, name) {
+ this.append(name, value);
+ }, this);
+ } else if (Array.isArray(headers)) {
+ headers.forEach(function (header) {
+ this.append(header[0], header[1]);
+ }, this);
+ } else if (headers) {
+ Object.getOwnPropertyNames(headers).forEach(function (name) {
+ this.append(name, headers[name]);
+ }, this);
+ }
+ }
- var regexpStickyHelpers = {
- UNSUPPORTED_Y: UNSUPPORTED_Y,
- BROKEN_CARET: BROKEN_CARET
+ Headers.prototype.append = function (name, value) {
+ name = normalizeName(name);
+ value = normalizeValue(value);
+ var oldValue = this.map[name];
+ this.map[name] = oldValue ? oldValue + ', ' + value : value;
};
- var nativeExec = RegExp.prototype.exec;
- // This always refers to the native implementation, because the
- // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,
- // which loads this file before patching the method.
- var nativeReplace = String.prototype.replace;
+ Headers.prototype['delete'] = function (name) {
+ delete this.map[normalizeName(name)];
+ };
- var patchedExec = nativeExec;
+ Headers.prototype.get = function (name) {
+ name = normalizeName(name);
+ return this.has(name) ? this.map[name] : null;
+ };
- var UPDATES_LAST_INDEX_WRONG = (function () {
- var re1 = /a/;
- var re2 = /b*/g;
- nativeExec.call(re1, 'a');
- nativeExec.call(re2, 'a');
- return re1.lastIndex !== 0 || re2.lastIndex !== 0;
- })();
+ Headers.prototype.has = function (name) {
+ return this.map.hasOwnProperty(normalizeName(name));
+ };
- var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;
+ Headers.prototype.set = function (name, value) {
+ this.map[normalizeName(name)] = normalizeValue(value);
+ };
- // nonparticipating capturing group, copied from es5-shim's String#split patch.
- // eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing
- var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
+ Headers.prototype.forEach = function (callback, thisArg) {
+ for (var name in this.map) {
+ if (this.map.hasOwnProperty(name)) {
+ callback.call(thisArg, this.map[name], name, this);
+ }
+ }
+ };
- var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1;
+ Headers.prototype.keys = function () {
+ var items = [];
+ this.forEach(function (value, name) {
+ items.push(name);
+ });
+ return iteratorFor(items);
+ };
- if (PATCH) {
- patchedExec = function exec(str) {
- var re = this;
- var lastIndex, reCopy, match, i;
- var sticky = UNSUPPORTED_Y$1 && re.sticky;
- var flags = regexpFlags.call(re);
- var source = re.source;
- var charsAdded = 0;
- var strCopy = str;
+ Headers.prototype.values = function () {
+ var items = [];
+ this.forEach(function (value) {
+ items.push(value);
+ });
+ return iteratorFor(items);
+ };
- if (sticky) {
- flags = flags.replace('y', '');
- if (flags.indexOf('g') === -1) {
- flags += 'g';
- }
+ Headers.prototype.entries = function () {
+ var items = [];
+ this.forEach(function (value, name) {
+ items.push([name, value]);
+ });
+ return iteratorFor(items);
+ };
- strCopy = String(str).slice(re.lastIndex);
- // Support anchored sticky behavior.
- if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\n')) {
- source = '(?: ' + source + ')';
- strCopy = ' ' + strCopy;
- charsAdded++;
- }
- // ^(? + rx + ) is needed, in combination with some str slicing, to
- // simulate the 'y' flag.
- reCopy = new RegExp('^(?:' + source + ')', flags);
- }
+ if (support.iterable) {
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
+ }
- if (NPCG_INCLUDED) {
- reCopy = new RegExp('^' + source + '$(?!\\s)', flags);
- }
- if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;
+ function consumed(body) {
+ if (body.bodyUsed) {
+ return Promise.reject(new TypeError('Already read'));
+ }
- match = nativeExec.call(sticky ? reCopy : re, strCopy);
+ body.bodyUsed = true;
+ }
- if (sticky) {
- if (match) {
- match.input = match.input.slice(charsAdded);
- match[0] = match[0].slice(charsAdded);
- match.index = re.lastIndex;
- re.lastIndex += match[0].length;
- } else re.lastIndex = 0;
- } else if (UPDATES_LAST_INDEX_WRONG && match) {
- re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
- }
- if (NPCG_INCLUDED && match && match.length > 1) {
- // Fix browsers whose `exec` methods don't consistently return `undefined`
- // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
- nativeReplace.call(match[0], reCopy, function () {
- for (i = 1; i < arguments.length - 2; i++) {
- if (arguments[i] === undefined) match[i] = undefined;
- }
- });
- }
+ function fileReaderReady(reader) {
+ return new Promise(function (resolve, reject) {
+ reader.onload = function () {
+ resolve(reader.result);
+ };
- return match;
- };
+ reader.onerror = function () {
+ reject(reader.error);
+ };
+ });
}
- var regexpExec = patchedExec;
+ function readBlobAsArrayBuffer(blob) {
+ var reader = new FileReader();
+ var promise = fileReaderReady(reader);
+ reader.readAsArrayBuffer(blob);
+ return promise;
+ }
- // `RegExp.prototype.exec` method
- // https://tc39.es/ecma262/#sec-regexp.prototype.exec
- _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {
- exec: regexpExec
- });
+ function readBlobAsText(blob) {
+ var reader = new FileReader();
+ var promise = fileReaderReady(reader);
+ reader.readAsText(blob);
+ return promise;
+ }
- // TODO: Remove from `core-js@4` since it's moved to entry points
+ function readArrayBufferAsText(buf) {
+ var view = new Uint8Array(buf);
+ var chars = new Array(view.length);
+ for (var i = 0; i < view.length; i++) {
+ chars[i] = String.fromCharCode(view[i]);
+ }
+ return chars.join('');
+ }
+ function bufferClone(buf) {
+ if (buf.slice) {
+ return buf.slice(0);
+ } else {
+ var view = new Uint8Array(buf.byteLength);
+ view.set(new Uint8Array(buf));
+ return view.buffer;
+ }
+ }
+ function Body() {
+ this.bodyUsed = false;
+ this._initBody = function (body) {
+ /*
+ fetch-mock wraps the Response object in an ES6 Proxy to
+ provide useful test harness features such as flush. However, on
+ ES5 browsers without fetch or Proxy support pollyfills must be used;
+ the proxy-pollyfill is unable to proxy an attribute unless it exists
+ on the object before the Proxy is created. This change ensures
+ Response.bodyUsed exists on the instance, while maintaining the
+ semantic of setting Request.bodyUsed in the constructor before
+ _initBody is called.
+ */
+ this.bodyUsed = this.bodyUsed;
+ this._bodyInit = body;
+ if (!body) {
+ this._bodyText = '';
+ } else if (typeof body === 'string') {
+ this._bodyText = body;
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+ this._bodyBlob = body;
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+ this._bodyFormData = body;
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this._bodyText = body.toString();
+ } else if (support.arrayBuffer && support.blob && isDataView(body)) {
+ this._bodyArrayBuffer = bufferClone(body.buffer); // IE 10-11 can't handle a DataView body.
- var SPECIES$6 = wellKnownSymbol('species');
+ this._bodyInit = new Blob([this._bodyArrayBuffer]);
+ } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
+ this._bodyArrayBuffer = bufferClone(body);
+ } else {
+ this._bodyText = body = Object.prototype.toString.call(body);
+ }
- var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {
- // #replace needs built-in support for named groups.
- // #match works fine because it just return the exec results, even if it has
- // a "grops" property.
- var re = /./;
- re.exec = function () {
- var result = [];
- result.groups = { a: '7' };
- return result;
+ if (!this.headers.get('content-type')) {
+ if (typeof body === 'string') {
+ this.headers.set('content-type', 'text/plain;charset=UTF-8');
+ } else if (this._bodyBlob && this._bodyBlob.type) {
+ this.headers.set('content-type', this._bodyBlob.type);
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
+ }
+ }
};
- return ''.replace(re, '$') !== '7';
- });
- // IE <= 11 replaces $0 with the whole match, as if it was $&
- // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0
- var REPLACE_KEEPS_$0 = (function () {
- return 'a'.replace(/./, '$0') === '$0';
- })();
+ if (support.blob) {
+ this.blob = function () {
+ var rejected = consumed(this);
- var REPLACE = wellKnownSymbol('replace');
- // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string
- var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {
- if (/./[REPLACE]) {
- return /./[REPLACE]('a', '$0') === '';
- }
- return false;
- })();
+ if (rejected) {
+ return rejected;
+ }
- // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
- // Weex JS has frozen built-in prototypes, so use try / catch wrapper
- var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {
- // eslint-disable-next-line regexp/no-empty-group -- required for testing
- var re = /(?:)/;
- var originalExec = re.exec;
- re.exec = function () { return originalExec.apply(this, arguments); };
- var result = 'ab'.split(re);
- return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';
- });
+ if (this._bodyBlob) {
+ return Promise.resolve(this._bodyBlob);
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]));
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as blob');
+ } else {
+ return Promise.resolve(new Blob([this._bodyText]));
+ }
+ };
- var fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {
- var SYMBOL = wellKnownSymbol(KEY);
+ this.arrayBuffer = function () {
+ if (this._bodyArrayBuffer) {
+ var isConsumed = consumed(this);
- var DELEGATES_TO_SYMBOL = !fails(function () {
- // String methods call symbol-named RegEp methods
- var O = {};
- O[SYMBOL] = function () { return 7; };
- return ''[KEY](O) != 7;
- });
+ if (isConsumed) {
+ return isConsumed;
+ }
- var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {
- // Symbol-named RegExp methods call .exec
- var execCalled = false;
- var re = /a/;
+ if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
+ return Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength));
+ } else {
+ return Promise.resolve(this._bodyArrayBuffer);
+ }
+ } else {
+ return this.blob().then(readBlobAsArrayBuffer);
+ }
+ };
+ }
- if (KEY === 'split') {
- // We can't use real regex here since it causes deoptimization
- // and serious performance degradation in V8
- // https://github.com/zloirock/core-js/issues/306
- re = {};
- // RegExp[@@split] doesn't call the regex's exec method, but first creates
- // a new one. We need to return the patched regex when creating the new one.
- re.constructor = {};
- re.constructor[SPECIES$6] = function () { return re; };
- re.flags = '';
- re[SYMBOL] = /./[SYMBOL];
- }
+ this.text = function () {
+ var rejected = consumed(this);
- re.exec = function () { execCalled = true; return null; };
+ if (rejected) {
+ return rejected;
+ }
- re[SYMBOL]('');
- return !execCalled;
- });
+ if (this._bodyBlob) {
+ return readBlobAsText(this._bodyBlob);
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as text');
+ } else {
+ return Promise.resolve(this._bodyText);
+ }
+ };
- if (
- !DELEGATES_TO_SYMBOL ||
- !DELEGATES_TO_EXEC ||
- (KEY === 'replace' && !(
- REPLACE_SUPPORTS_NAMED_GROUPS &&
- REPLACE_KEEPS_$0 &&
- !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE
- )) ||
- (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)
- ) {
- var nativeRegExpMethod = /./[SYMBOL];
- var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
- if (regexp.exec === regexpExec) {
- if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
- // The native String method already delegates to @@method (this
- // polyfilled function), leasing to infinite recursion.
- // We avoid it by directly calling the native @@method method.
- return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };
- }
- return { done: true, value: nativeMethod.call(str, regexp, arg2) };
- }
- return { done: false };
- }, {
- REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,
- REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE
- });
- var stringMethod = methods[0];
- var regexMethod = methods[1];
-
- redefine(String.prototype, KEY, stringMethod);
- redefine(RegExp.prototype, SYMBOL, length == 2
- // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
- // 21.2.5.11 RegExp.prototype[@@split](string, limit)
- ? function (string, arg) { return regexMethod.call(string, this, arg); }
- // 21.2.5.6 RegExp.prototype[@@match](string)
- // 21.2.5.9 RegExp.prototype[@@search](string)
- : function (string) { return regexMethod.call(string, this); }
- );
+ if (support.formData) {
+ this.formData = function () {
+ return this.text().then(decode);
+ };
}
- if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);
- };
+ this.json = function () {
+ return this.text().then(JSON.parse);
+ };
- var charAt$1 = stringMultibyte.charAt;
+ return this;
+ } // HTTP methods whose capitalization should be normalized
- // `AdvanceStringIndex` abstract operation
- // https://tc39.es/ecma262/#sec-advancestringindex
- var advanceStringIndex = function (S, index, unicode) {
- return index + (unicode ? charAt$1(S, index).length : 1);
- };
- var floor$5 = Math.floor;
- var replace$1 = ''.replace;
- var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g;
- var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g;
+ var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
- // https://tc39.es/ecma262/#sec-getsubstitution
- var getSubstitution = function (matched, str, position, captures, namedCaptures, replacement) {
- var tailPos = position + matched.length;
- var m = captures.length;
- var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
- if (namedCaptures !== undefined) {
- namedCaptures = toObject(namedCaptures);
- symbols = SUBSTITUTION_SYMBOLS;
+ function normalizeMethod(method) {
+ var upcased = method.toUpperCase();
+ return methods.indexOf(upcased) > -1 ? upcased : method;
+ }
+
+ function Request(input, options) {
+ if (!(this instanceof Request)) {
+ throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
}
- return replace$1.call(replacement, symbols, function (match, ch) {
- var capture;
- switch (ch.charAt(0)) {
- case '$': return '$';
- case '&': return matched;
- case '`': return str.slice(0, position);
- case "'": return str.slice(tailPos);
- case '<':
- capture = namedCaptures[ch.slice(1, -1)];
- break;
- default: // \d\d?
- var n = +ch;
- if (n === 0) return match;
- if (n > m) {
- var f = floor$5(n / 10);
- if (f === 0) return match;
- if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);
- return match;
- }
- capture = captures[n - 1];
+
+ options = options || {};
+ var body = options.body;
+
+ if (input instanceof Request) {
+ if (input.bodyUsed) {
+ throw new TypeError('Already read');
}
- return capture === undefined ? '' : capture;
- });
- };
- // `RegExpExec` abstract operation
- // https://tc39.es/ecma262/#sec-regexpexec
- var regexpExecAbstract = function (R, S) {
- var exec = R.exec;
- if (typeof exec === 'function') {
- var result = exec.call(R, S);
- if (typeof result !== 'object') {
- throw TypeError('RegExp exec method returned something other than an Object or null');
+ this.url = input.url;
+ this.credentials = input.credentials;
+
+ if (!options.headers) {
+ this.headers = new Headers(input.headers);
}
- return result;
- }
- if (classofRaw(R) !== 'RegExp') {
- throw TypeError('RegExp#exec called on incompatible receiver');
+ this.method = input.method;
+ this.mode = input.mode;
+ this.signal = input.signal;
+
+ if (!body && input._bodyInit != null) {
+ body = input._bodyInit;
+ input.bodyUsed = true;
+ }
+ } else {
+ this.url = String(input);
}
- return regexpExec.call(R, S);
- };
+ this.credentials = options.credentials || this.credentials || 'same-origin';
- var max$2 = Math.max;
- var min$4 = Math.min;
+ if (options.headers || !this.headers) {
+ this.headers = new Headers(options.headers);
+ }
- var maybeToString = function (it) {
- return it === undefined ? it : String(it);
- };
-
- // @@replace logic
- fixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {
- var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;
- var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;
- var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';
-
- return [
- // `String.prototype.replace` method
- // https://tc39.es/ecma262/#sec-string.prototype.replace
- function replace(searchValue, replaceValue) {
- var O = requireObjectCoercible(this);
- var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];
- return replacer !== undefined
- ? replacer.call(searchValue, O, replaceValue)
- : nativeReplace.call(String(O), searchValue, replaceValue);
- },
- // `RegExp.prototype[@@replace]` method
- // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace
- function (regexp, replaceValue) {
- if (
- (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||
- (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)
- ) {
- var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);
- if (res.done) return res.value;
- }
-
- var rx = anObject(regexp);
- var S = String(this);
-
- var functionalReplace = typeof replaceValue === 'function';
- if (!functionalReplace) replaceValue = String(replaceValue);
-
- var global = rx.global;
- if (global) {
- var fullUnicode = rx.unicode;
- rx.lastIndex = 0;
- }
- var results = [];
- while (true) {
- var result = regexpExecAbstract(rx, S);
- if (result === null) break;
+ this.method = normalizeMethod(options.method || this.method || 'GET');
+ this.mode = options.mode || this.mode || null;
+ this.signal = options.signal || this.signal;
+ this.referrer = null;
- results.push(result);
- if (!global) break;
+ if ((this.method === 'GET' || this.method === 'HEAD') && body) {
+ throw new TypeError('Body not allowed for GET or HEAD requests');
+ }
- var matchStr = String(result[0]);
- if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
- }
+ this._initBody(body);
- var accumulatedResult = '';
- var nextSourcePosition = 0;
- for (var i = 0; i < results.length; i++) {
- result = results[i];
+ if (this.method === 'GET' || this.method === 'HEAD') {
+ if (options.cache === 'no-store' || options.cache === 'no-cache') {
+ // Search for a '_' parameter in the query string
+ var reParamSearch = /([?&])_=[^&]*/;
- var matched = String(result[0]);
- var position = max$2(min$4(toInteger(result.index), S.length), 0);
- var captures = [];
- // NOTE: This is equivalent to
- // captures = result.slice(1).map(maybeToString)
- // but for some reason `nativeSlice.call(result, 1, result.length)` (called in
- // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
- // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
- for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));
- var namedCaptures = result.groups;
- if (functionalReplace) {
- var replacerArgs = [matched].concat(captures, position, S);
- if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);
- var replacement = String(replaceValue.apply(undefined, replacerArgs));
- } else {
- replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
- }
- if (position >= nextSourcePosition) {
- accumulatedResult += S.slice(nextSourcePosition, position) + replacement;
- nextSourcePosition = position + matched.length;
- }
+ if (reParamSearch.test(this.url)) {
+ // If it already exists then set the value with the current time
+ this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());
+ } else {
+ // Otherwise add a new '_' parameter to the end with the current time
+ var reQueryString = /\?/;
+ this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();
}
- return accumulatedResult + S.slice(nextSourcePosition);
}
- ];
- });
-
- var MATCH = wellKnownSymbol('match');
+ }
+ }
- // `IsRegExp` abstract operation
- // https://tc39.es/ecma262/#sec-isregexp
- var isRegexp = function (it) {
- var isRegExp;
- return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');
+ Request.prototype.clone = function () {
+ return new Request(this, {
+ body: this._bodyInit
+ });
};
- var arrayPush = [].push;
- var min$5 = Math.min;
- var MAX_UINT32 = 0xFFFFFFFF;
+ function decode(body) {
+ var form = new FormData();
+ body.trim().split('&').forEach(function (bytes) {
+ if (bytes) {
+ var split = bytes.split('=');
+ var name = split.shift().replace(/\+/g, ' ');
+ var value = split.join('=').replace(/\+/g, ' ');
+ form.append(decodeURIComponent(name), decodeURIComponent(value));
+ }
+ });
+ return form;
+ }
- // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError
- var SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });
+ function parseHeaders(rawHeaders) {
+ var headers = new Headers(); // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
+ // https://tools.ietf.org/html/rfc7230#section-3.2
- // @@split logic
- fixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {
- var internalSplit;
- if (
- 'abbc'.split(/(b)*/)[1] == 'c' ||
- // eslint-disable-next-line regexp/no-empty-group -- required for testing
- 'test'.split(/(?:)/, -1).length != 4 ||
- 'ab'.split(/(?:ab)*/).length != 2 ||
- '.'.split(/(.?)(.?)/).length != 4 ||
- // eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing
- '.'.split(/()()/).length > 1 ||
- ''.split(/.?/).length
- ) {
- // based on es5-shim implementation, need to rework it
- internalSplit = function (separator, limit) {
- var string = String(requireObjectCoercible(this));
- var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
- if (lim === 0) return [];
- if (separator === undefined) return [string];
- // If `separator` is not a regex, use native split
- if (!isRegexp(separator)) {
- return nativeSplit.call(string, separator, lim);
- }
- var output = [];
- var flags = (separator.ignoreCase ? 'i' : '') +
- (separator.multiline ? 'm' : '') +
- (separator.unicode ? 'u' : '') +
- (separator.sticky ? 'y' : '');
- var lastLastIndex = 0;
- // Make `global` and avoid `lastIndex` issues by working with a copy
- var separatorCopy = new RegExp(separator.source, flags + 'g');
- var match, lastIndex, lastLength;
- while (match = regexpExec.call(separatorCopy, string)) {
- lastIndex = separatorCopy.lastIndex;
- if (lastIndex > lastLastIndex) {
- output.push(string.slice(lastLastIndex, match.index));
- if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));
- lastLength = match[0].length;
- lastLastIndex = lastIndex;
- if (output.length >= lim) break;
- }
- if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop
- }
- if (lastLastIndex === string.length) {
- if (lastLength || !separatorCopy.test('')) output.push('');
- } else output.push(string.slice(lastLastIndex));
- return output.length > lim ? output.slice(0, lim) : output;
- };
- // Chakra, V8
- } else if ('0'.split(undefined, 0).length) {
- internalSplit = function (separator, limit) {
- return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);
- };
- } else internalSplit = nativeSplit;
+ var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill
+ // https://github.com/github/fetch/issues/748
+ // https://github.com/zloirock/core-js/issues/751
- return [
- // `String.prototype.split` method
- // https://tc39.es/ecma262/#sec-string.prototype.split
- function split(separator, limit) {
- var O = requireObjectCoercible(this);
- var splitter = separator == undefined ? undefined : separator[SPLIT];
- return splitter !== undefined
- ? splitter.call(separator, O, limit)
- : internalSplit.call(String(O), separator, limit);
- },
- // `RegExp.prototype[@@split]` method
- // https://tc39.es/ecma262/#sec-regexp.prototype-@@split
- //
- // NOTE: This cannot be properly polyfilled in engines that don't support
- // the 'y' flag.
- function (regexp, limit) {
- var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);
- if (res.done) return res.value;
+ preProcessedHeaders.split('\r').map(function (header) {
+ return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header;
+ }).forEach(function (line) {
+ var parts = line.split(':');
+ var key = parts.shift().trim();
- var rx = anObject(regexp);
- var S = String(this);
- var C = speciesConstructor(rx, RegExp);
+ if (key) {
+ var value = parts.join(':').trim();
+ headers.append(key, value);
+ }
+ });
+ return headers;
+ }
- var unicodeMatching = rx.unicode;
- var flags = (rx.ignoreCase ? 'i' : '') +
- (rx.multiline ? 'm' : '') +
- (rx.unicode ? 'u' : '') +
- (SUPPORTS_Y ? 'y' : 'g');
+ Body.call(Request.prototype);
+ function Response(bodyInit, options) {
+ if (!(this instanceof Response)) {
+ throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
+ }
- // ^(? + rx + ) is needed, in combination with some S slicing, to
- // simulate the 'y' flag.
- var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);
- var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
- if (lim === 0) return [];
- if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];
- var p = 0;
- var q = 0;
- var A = [];
- while (q < S.length) {
- splitter.lastIndex = SUPPORTS_Y ? q : 0;
- var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));
- var e;
- if (
- z === null ||
- (e = min$5(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p
- ) {
- q = advanceStringIndex(S, q, unicodeMatching);
- } else {
- A.push(S.slice(p, q));
- if (A.length === lim) return A;
- for (var i = 1; i <= z.length - 1; i++) {
- A.push(z[i]);
- if (A.length === lim) return A;
- }
- q = p = e;
- }
- }
- A.push(S.slice(p));
- return A;
- }
- ];
- }, !SUPPORTS_Y);
+ if (!options) {
+ options = {};
+ }
- // a string of all valid unicode whitespaces
- var whitespaces = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
- '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
+ this.type = 'default';
+ this.status = options.status === undefined ? 200 : options.status;
+ this.ok = this.status >= 200 && this.status < 300;
+ this.statusText = options.statusText === undefined ? '' : '' + options.statusText;
+ this.headers = new Headers(options.headers);
+ this.url = options.url || '';
- var whitespace = '[' + whitespaces + ']';
- var ltrim = RegExp('^' + whitespace + whitespace + '*');
- var rtrim = RegExp(whitespace + whitespace + '*$');
+ this._initBody(bodyInit);
+ }
+ Body.call(Response.prototype);
- // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
- var createMethod$4 = function (TYPE) {
- return function ($this) {
- var string = String(requireObjectCoercible($this));
- if (TYPE & 1) string = string.replace(ltrim, '');
- if (TYPE & 2) string = string.replace(rtrim, '');
- return string;
- };
+ Response.prototype.clone = function () {
+ return new Response(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new Headers(this.headers),
+ url: this.url
+ });
};
- var stringTrim = {
- // `String.prototype.{ trimLeft, trimStart }` methods
- // https://tc39.es/ecma262/#sec-string.prototype.trimstart
- start: createMethod$4(1),
- // `String.prototype.{ trimRight, trimEnd }` methods
- // https://tc39.es/ecma262/#sec-string.prototype.trimend
- end: createMethod$4(2),
- // `String.prototype.trim` method
- // https://tc39.es/ecma262/#sec-string.prototype.trim
- trim: createMethod$4(3)
+ Response.error = function () {
+ var response = new Response(null, {
+ status: 0,
+ statusText: ''
+ });
+ response.type = 'error';
+ return response;
};
- var non = '\u200B\u0085\u180E';
+ var redirectStatuses = [301, 302, 303, 307, 308];
- // check that a method works with the correct list
- // of whitespaces and has a correct name
- var stringTrimForced = function (METHOD_NAME) {
- return fails(function () {
- return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;
+ Response.redirect = function (url, status) {
+ if (redirectStatuses.indexOf(status) === -1) {
+ throw new RangeError('Invalid status code');
+ }
+
+ return new Response(null, {
+ status: status,
+ headers: {
+ location: url
+ }
});
};
- var $trim = stringTrim.trim;
+ var DOMException$1 = global$k.DOMException;
+
+ try {
+ new DOMException$1();
+ } catch (err) {
+ DOMException$1 = function DOMException(message, name) {
+ this.message = message;
+ this.name = name;
+ var error = Error(message);
+ this.stack = error.stack;
+ };
+ DOMException$1.prototype = Object.create(Error.prototype);
+ DOMException$1.prototype.constructor = DOMException$1;
+ }
- // `String.prototype.trim` method
- // https://tc39.es/ecma262/#sec-string.prototype.trim
- _export({ target: 'String', proto: true, forced: stringTrimForced('trim') }, {
- trim: function trim() {
- return $trim(this);
- }
- });
+ function fetch$1(input, init) {
+ return new Promise(function (resolve, reject) {
+ var request = new Request(input, init);
- var defineProperty$6 = objectDefineProperty.f;
+ if (request.signal && request.signal.aborted) {
+ return reject(new DOMException$1('Aborted', 'AbortError'));
+ }
- var FunctionPrototype = Function.prototype;
- var FunctionPrototypeToString = FunctionPrototype.toString;
- var nameRE = /^\s*function ([^ (]*)/;
- var NAME$1 = 'name';
+ var xhr = new XMLHttpRequest();
- // Function instances `.name` property
- // https://tc39.es/ecma262/#sec-function-instances-name
- if (descriptors && !(NAME$1 in FunctionPrototype)) {
- defineProperty$6(FunctionPrototype, NAME$1, {
- configurable: true,
- get: function () {
- try {
- return FunctionPrototypeToString.call(this).match(nameRE)[1];
- } catch (error) {
- return '';
- }
+ function abortXhr() {
+ xhr.abort();
}
- });
- }
- // `Object.create` method
- // https://tc39.es/ecma262/#sec-object.create
- _export({ target: 'Object', stat: true, sham: !descriptors }, {
- create: objectCreate
- });
+ xhr.onload = function () {
+ var options = {
+ status: xhr.status,
+ statusText: xhr.statusText,
+ headers: parseHeaders(xhr.getAllResponseHeaders() || '')
+ };
+ options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
+ var body = 'response' in xhr ? xhr.response : xhr.responseText;
+ setTimeout(function () {
+ resolve(new Response(body, options));
+ }, 0);
+ };
- var slice = [].slice;
- var MSIE = /MSIE .\./.test(engineUserAgent); // <- dirty ie9- check
+ xhr.onerror = function () {
+ setTimeout(function () {
+ reject(new TypeError('Network request failed'));
+ }, 0);
+ };
- var wrap$1 = function (scheduler) {
- return function (handler, timeout /* , ...arguments */) {
- var boundArgs = arguments.length > 2;
- var args = boundArgs ? slice.call(arguments, 2) : undefined;
- return scheduler(boundArgs ? function () {
- // eslint-disable-next-line no-new-func -- spec requirement
- (typeof handler == 'function' ? handler : Function(handler)).apply(this, args);
- } : handler, timeout);
- };
- };
+ xhr.ontimeout = function () {
+ setTimeout(function () {
+ reject(new TypeError('Network request failed'));
+ }, 0);
+ };
- // ie9- setTimeout & setInterval additional parameters fix
- // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers
- _export({ global: true, bind: true, forced: MSIE }, {
- // `setTimeout` method
- // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
- setTimeout: wrap$1(global_1.setTimeout),
- // `setInterval` method
- // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
- setInterval: wrap$1(global_1.setInterval)
- });
+ xhr.onabort = function () {
+ setTimeout(function () {
+ reject(new DOMException$1('Aborted', 'AbortError'));
+ }, 0);
+ };
- var global$1 = typeof globalThis !== 'undefined' && globalThis || typeof self !== 'undefined' && self || typeof global$1 !== 'undefined' && global$1;
- var support = {
- searchParams: 'URLSearchParams' in global$1,
- iterable: 'Symbol' in global$1 && 'iterator' in Symbol,
- blob: 'FileReader' in global$1 && 'Blob' in global$1 && function () {
- try {
- new Blob();
- return true;
- } catch (e) {
- return false;
+ function fixUrl(url) {
+ try {
+ return url === '' && global$k.location.href ? global$k.location.href : url;
+ } catch (e) {
+ return url;
+ }
}
- }(),
- formData: 'FormData' in global$1,
- arrayBuffer: 'ArrayBuffer' in global$1
- };
- function isDataView(obj) {
- return obj && DataView.prototype.isPrototypeOf(obj);
- }
+ xhr.open(request.method, fixUrl(request.url), true);
- if (support.arrayBuffer) {
- var viewClasses = ['[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]'];
+ if (request.credentials === 'include') {
+ xhr.withCredentials = true;
+ } else if (request.credentials === 'omit') {
+ xhr.withCredentials = false;
+ }
- var isArrayBufferView = ArrayBuffer.isView || function (obj) {
- return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;
- };
- }
+ if ('responseType' in xhr) {
+ if (support.blob) {
+ xhr.responseType = 'blob';
+ } else if (support.arrayBuffer && request.headers.get('Content-Type') && request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1) {
+ xhr.responseType = 'arraybuffer';
+ }
+ }
- function normalizeName(name) {
- if (typeof name !== 'string') {
- name = String(name);
- }
+ if (init && _typeof(init.headers) === 'object' && !(init.headers instanceof Headers)) {
+ Object.getOwnPropertyNames(init.headers).forEach(function (name) {
+ xhr.setRequestHeader(name, normalizeValue(init.headers[name]));
+ });
+ } else {
+ request.headers.forEach(function (value, name) {
+ xhr.setRequestHeader(name, value);
+ });
+ }
- if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {
- throw new TypeError('Invalid character in header field name: "' + name + '"');
- }
+ if (request.signal) {
+ request.signal.addEventListener('abort', abortXhr);
- return name.toLowerCase();
+ xhr.onreadystatechange = function () {
+ // DONE (success or failure)
+ if (xhr.readyState === 4) {
+ request.signal.removeEventListener('abort', abortXhr);
+ }
+ };
+ }
+
+ xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
+ });
}
+ fetch$1.polyfill = true;
- function normalizeValue(value) {
- if (typeof value !== 'string') {
- value = String(value);
- }
+ if (!global$k.fetch) {
+ global$k.fetch = fetch$1;
+ global$k.Headers = Headers;
+ global$k.Request = Request;
+ global$k.Response = Response;
+ }
- return value;
- } // Build a destructive iterator for the value list
+ var $$T = _export;
+ var DESCRIPTORS$9 = descriptors;
+ var defineProperty$5 = objectDefineProperty.f;
+ // `Object.defineProperty` method
+ // https://tc39.es/ecma262/#sec-object.defineproperty
+ // eslint-disable-next-line es/no-object-defineproperty -- safe
+ $$T({ target: 'Object', stat: true, forced: Object.defineProperty !== defineProperty$5, sham: !DESCRIPTORS$9 }, {
+ defineProperty: defineProperty$5
+ });
- function iteratorFor(items) {
- var iterator = {
- next: function next() {
- var value = items.shift();
- return {
- done: value === undefined,
- value: value
- };
- }
- };
+ var $$S = _export;
+ var setPrototypeOf = objectSetPrototypeOf;
- if (support.iterable) {
- iterator[Symbol.iterator] = function () {
- return iterator;
- };
- }
+ // `Object.setPrototypeOf` method
+ // https://tc39.es/ecma262/#sec-object.setprototypeof
+ $$S({ target: 'Object', stat: true }, {
+ setPrototypeOf: setPrototypeOf
+ });
- return iterator;
- }
+ var $$R = _export;
+ var fails$n = fails$V;
+ var toObject$8 = toObject$i;
+ var nativeGetPrototypeOf = objectGetPrototypeOf;
+ var CORRECT_PROTOTYPE_GETTER = correctPrototypeGetter;
- function Headers$1(headers) {
- this.map = {};
+ var FAILS_ON_PRIMITIVES$4 = fails$n(function () { nativeGetPrototypeOf(1); });
- if (headers instanceof Headers$1) {
- headers.forEach(function (value, name) {
- this.append(name, value);
- }, this);
- } else if (Array.isArray(headers)) {
- headers.forEach(function (header) {
- this.append(header[0], header[1]);
- }, this);
- } else if (headers) {
- Object.getOwnPropertyNames(headers).forEach(function (name) {
- this.append(name, headers[name]);
- }, this);
+ // `Object.getPrototypeOf` method
+ // https://tc39.es/ecma262/#sec-object.getprototypeof
+ $$R({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$4, sham: !CORRECT_PROTOTYPE_GETTER }, {
+ getPrototypeOf: function getPrototypeOf(it) {
+ return nativeGetPrototypeOf(toObject$8(it));
}
- }
+ });
- Headers$1.prototype.append = function (name, value) {
- name = normalizeName(name);
- value = normalizeValue(value);
- var oldValue = this.map[name];
- this.map[name] = oldValue ? oldValue + ', ' + value : value;
- };
+ var global$j = global$1o;
+ var uncurryThis$m = functionUncurryThis;
+ var aCallable$2 = aCallable$a;
+ var isObject$b = isObject$s;
+ var hasOwn$5 = hasOwnProperty_1;
+ var arraySlice$2 = arraySlice$b;
+ var NATIVE_BIND = functionBindNative;
+
+ var Function$1 = global$j.Function;
+ var concat$1 = uncurryThis$m([].concat);
+ var join$3 = uncurryThis$m([].join);
+ var factories = {};
- Headers$1.prototype['delete'] = function (name) {
- delete this.map[normalizeName(name)];
+ var construct = function (C, argsLength, args) {
+ if (!hasOwn$5(factories, argsLength)) {
+ for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';
+ factories[argsLength] = Function$1('C,a', 'return new C(' + join$3(list, ',') + ')');
+ } return factories[argsLength](C, args);
};
- Headers$1.prototype.get = function (name) {
- name = normalizeName(name);
- return this.has(name) ? this.map[name] : null;
+ // `Function.prototype.bind` method implementation
+ // https://tc39.es/ecma262/#sec-function.prototype.bind
+ var functionBind = NATIVE_BIND ? Function$1.bind : function bind(that /* , ...args */) {
+ var F = aCallable$2(this);
+ var Prototype = F.prototype;
+ var partArgs = arraySlice$2(arguments, 1);
+ var boundFunction = function bound(/* args... */) {
+ var args = concat$1(partArgs, arraySlice$2(arguments));
+ return this instanceof boundFunction ? construct(F, args.length, args) : F.apply(that, args);
+ };
+ if (isObject$b(Prototype)) boundFunction.prototype = Prototype;
+ return boundFunction;
};
- Headers$1.prototype.has = function (name) {
- return this.map.hasOwnProperty(normalizeName(name));
- };
+ var $$Q = _export;
+ var getBuiltIn$1 = getBuiltIn$b;
+ var apply = functionApply;
+ var bind$7 = functionBind;
+ var aConstructor = aConstructor$3;
+ var anObject$4 = anObject$n;
+ var isObject$a = isObject$s;
+ var create$4 = objectCreate;
+ var fails$m = fails$V;
+
+ var nativeConstruct = getBuiltIn$1('Reflect', 'construct');
+ var ObjectPrototype = Object.prototype;
+ var push$4 = [].push;
- Headers$1.prototype.set = function (name, value) {
- this.map[normalizeName(name)] = normalizeValue(value);
- };
+ // `Reflect.construct` method
+ // https://tc39.es/ecma262/#sec-reflect.construct
+ // MS Edge supports only 2 arguments and argumentsList argument is optional
+ // FF Nightly sets third argument as `new.target`, but does not create `this` from it
+ var NEW_TARGET_BUG = fails$m(function () {
+ function F() { /* empty */ }
+ return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);
+ });
- Headers$1.prototype.forEach = function (callback, thisArg) {
- for (var name in this.map) {
- if (this.map.hasOwnProperty(name)) {
- callback.call(thisArg, this.map[name], name, this);
+ var ARGS_BUG = !fails$m(function () {
+ nativeConstruct(function () { /* empty */ });
+ });
+
+ var FORCED$c = NEW_TARGET_BUG || ARGS_BUG;
+
+ $$Q({ target: 'Reflect', stat: true, forced: FORCED$c, sham: FORCED$c }, {
+ construct: function construct(Target, args /* , newTarget */) {
+ aConstructor(Target);
+ anObject$4(args);
+ var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]);
+ if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);
+ if (Target == newTarget) {
+ // w/o altered newTarget, optimization for 0-4 arguments
+ switch (args.length) {
+ case 0: return new Target();
+ case 1: return new Target(args[0]);
+ case 2: return new Target(args[0], args[1]);
+ case 3: return new Target(args[0], args[1], args[2]);
+ case 4: return new Target(args[0], args[1], args[2], args[3]);
+ }
+ // w/o altered newTarget, lot of arguments case
+ var $args = [null];
+ apply(push$4, $args, args);
+ return new (apply(bind$7, Target, $args))();
}
+ // with altered newTarget, not support built-in constructors
+ var proto = newTarget.prototype;
+ var instance = create$4(isObject$a(proto) ? proto : ObjectPrototype);
+ var result = apply(Target, instance, args);
+ return isObject$a(result) ? result : instance;
}
- };
+ });
- Headers$1.prototype.keys = function () {
- var items = [];
- this.forEach(function (value, name) {
- items.push(name);
- });
- return iteratorFor(items);
- };
+ var hasOwn$4 = hasOwnProperty_1;
- Headers$1.prototype.values = function () {
- var items = [];
- this.forEach(function (value) {
- items.push(value);
- });
- return iteratorFor(items);
+ var isDataDescriptor$1 = function (descriptor) {
+ return descriptor !== undefined && (hasOwn$4(descriptor, 'value') || hasOwn$4(descriptor, 'writable'));
};
- Headers$1.prototype.entries = function () {
- var items = [];
- this.forEach(function (value, name) {
- items.push([name, value]);
- });
- return iteratorFor(items);
- };
-
- if (support.iterable) {
- Headers$1.prototype[Symbol.iterator] = Headers$1.prototype.entries;
- }
-
- function consumed(body) {
- if (body.bodyUsed) {
- return Promise.reject(new TypeError('Already read'));
- }
-
- body.bodyUsed = true;
- }
-
- function fileReaderReady(reader) {
- return new Promise(function (resolve, reject) {
- reader.onload = function () {
- resolve(reader.result);
- };
-
- reader.onerror = function () {
- reject(reader.error);
- };
- });
- }
-
- function readBlobAsArrayBuffer(blob) {
- var reader = new FileReader();
- var promise = fileReaderReady(reader);
- reader.readAsArrayBuffer(blob);
- return promise;
- }
+ var $$P = _export;
+ var call$5 = functionCall;
+ var isObject$9 = isObject$s;
+ var anObject$3 = anObject$n;
+ var isDataDescriptor = isDataDescriptor$1;
+ var getOwnPropertyDescriptorModule = objectGetOwnPropertyDescriptor;
+ var getPrototypeOf = objectGetPrototypeOf;
- function readBlobAsText(blob) {
- var reader = new FileReader();
- var promise = fileReaderReady(reader);
- reader.readAsText(blob);
- return promise;
+ // `Reflect.get` method
+ // https://tc39.es/ecma262/#sec-reflect.get
+ function get$3(target, propertyKey /* , receiver */) {
+ var receiver = arguments.length < 3 ? target : arguments[2];
+ var descriptor, prototype;
+ if (anObject$3(target) === receiver) return target[propertyKey];
+ descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey);
+ if (descriptor) return isDataDescriptor(descriptor)
+ ? descriptor.value
+ : descriptor.get === undefined ? undefined : call$5(descriptor.get, receiver);
+ if (isObject$9(prototype = getPrototypeOf(target))) return get$3(prototype, propertyKey, receiver);
}
- function readArrayBufferAsText(buf) {
- var view = new Uint8Array(buf);
- var chars = new Array(view.length);
+ $$P({ target: 'Reflect', stat: true }, {
+ get: get$3
+ });
- for (var i = 0; i < view.length; i++) {
- chars[i] = String.fromCharCode(view[i]);
- }
+ var $$O = _export;
+ var fails$l = fails$V;
+ var toIndexedObject$1 = toIndexedObject$d;
+ var nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+ var DESCRIPTORS$8 = descriptors;
- return chars.join('');
- }
+ var FAILS_ON_PRIMITIVES$3 = fails$l(function () { nativeGetOwnPropertyDescriptor(1); });
+ var FORCED$b = !DESCRIPTORS$8 || FAILS_ON_PRIMITIVES$3;
- function bufferClone(buf) {
- if (buf.slice) {
- return buf.slice(0);
- } else {
- var view = new Uint8Array(buf.byteLength);
- view.set(new Uint8Array(buf));
- return view.buffer;
+ // `Object.getOwnPropertyDescriptor` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
+ $$O({ target: 'Object', stat: true, forced: FORCED$b, sham: !DESCRIPTORS$8 }, {
+ getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
+ return nativeGetOwnPropertyDescriptor(toIndexedObject$1(it), key);
}
- }
+ });
- function Body() {
- this.bodyUsed = false;
+ var $$N = _export;
+ var global$i = global$1o;
+ var toAbsoluteIndex$1 = toAbsoluteIndex$9;
+ var toIntegerOrInfinity$2 = toIntegerOrInfinity$b;
+ var lengthOfArrayLike$5 = lengthOfArrayLike$i;
+ var toObject$7 = toObject$i;
+ var arraySpeciesCreate$2 = arraySpeciesCreate$4;
+ var createProperty$2 = createProperty$5;
+ var arrayMethodHasSpeciesSupport$2 = arrayMethodHasSpeciesSupport$5;
- this._initBody = function (body) {
- /*
- fetch-mock wraps the Response object in an ES6 Proxy to
- provide useful test harness features such as flush. However, on
- ES5 browsers without fetch or Proxy support pollyfills must be used;
- the proxy-pollyfill is unable to proxy an attribute unless it exists
- on the object before the Proxy is created. This change ensures
- Response.bodyUsed exists on the instance, while maintaining the
- semantic of setting Request.bodyUsed in the constructor before
- _initBody is called.
- */
- this.bodyUsed = this.bodyUsed;
- this._bodyInit = body;
+ var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport$2('splice');
- if (!body) {
- this._bodyText = '';
- } else if (typeof body === 'string') {
- this._bodyText = body;
- } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
- this._bodyBlob = body;
- } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
- this._bodyFormData = body;
- } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
- this._bodyText = body.toString();
- } else if (support.arrayBuffer && support.blob && isDataView(body)) {
- this._bodyArrayBuffer = bufferClone(body.buffer); // IE 10-11 can't handle a DataView body.
+ var TypeError$6 = global$i.TypeError;
+ var max$1 = Math.max;
+ var min$3 = Math.min;
+ var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;
+ var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';
- this._bodyInit = new Blob([this._bodyArrayBuffer]);
- } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
- this._bodyArrayBuffer = bufferClone(body);
+ // `Array.prototype.splice` method
+ // https://tc39.es/ecma262/#sec-array.prototype.splice
+ // with adding support of @@species
+ $$N({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 }, {
+ splice: function splice(start, deleteCount /* , ...items */) {
+ var O = toObject$7(this);
+ var len = lengthOfArrayLike$5(O);
+ var actualStart = toAbsoluteIndex$1(start, len);
+ var argumentsLength = arguments.length;
+ var insertCount, actualDeleteCount, A, k, from, to;
+ if (argumentsLength === 0) {
+ insertCount = actualDeleteCount = 0;
+ } else if (argumentsLength === 1) {
+ insertCount = 0;
+ actualDeleteCount = len - actualStart;
} else {
- this._bodyText = body = Object.prototype.toString.call(body);
+ insertCount = argumentsLength - 2;
+ actualDeleteCount = min$3(max$1(toIntegerOrInfinity$2(deleteCount), 0), len - actualStart);
}
-
- if (!this.headers.get('content-type')) {
- if (typeof body === 'string') {
- this.headers.set('content-type', 'text/plain;charset=UTF-8');
- } else if (this._bodyBlob && this._bodyBlob.type) {
- this.headers.set('content-type', this._bodyBlob.type);
- } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
- this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
+ if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {
+ throw TypeError$6(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
+ }
+ A = arraySpeciesCreate$2(O, actualDeleteCount);
+ for (k = 0; k < actualDeleteCount; k++) {
+ from = actualStart + k;
+ if (from in O) createProperty$2(A, k, O[from]);
+ }
+ A.length = actualDeleteCount;
+ if (insertCount < actualDeleteCount) {
+ for (k = actualStart; k < len - actualDeleteCount; k++) {
+ from = k + actualDeleteCount;
+ to = k + insertCount;
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ }
+ for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];
+ } else if (insertCount > actualDeleteCount) {
+ for (k = len - actualDeleteCount; k > actualStart; k--) {
+ from = k + actualDeleteCount - 1;
+ to = k + insertCount - 1;
+ if (from in O) O[to] = O[from];
+ else delete O[to];
}
}
- };
+ for (k = 0; k < insertCount; k++) {
+ O[k + actualStart] = arguments[k + 2];
+ }
+ O.length = len - actualDeleteCount + insertCount;
+ return A;
+ }
+ });
- if (support.blob) {
- this.blob = function () {
- var rejected = consumed(this);
+ var defineWellKnownSymbol$1 = defineWellKnownSymbol$4;
- if (rejected) {
- return rejected;
- }
+ // `Symbol.toStringTag` well-known symbol
+ // https://tc39.es/ecma262/#sec-symbol.tostringtag
+ defineWellKnownSymbol$1('toStringTag');
- if (this._bodyBlob) {
- return Promise.resolve(this._bodyBlob);
- } else if (this._bodyArrayBuffer) {
- return Promise.resolve(new Blob([this._bodyArrayBuffer]));
- } else if (this._bodyFormData) {
- throw new Error('could not read FormData body as blob');
- } else {
- return Promise.resolve(new Blob([this._bodyText]));
- }
- };
+ var global$h = global$1o;
+ var setToStringTag$3 = setToStringTag$a;
- this.arrayBuffer = function () {
- if (this._bodyArrayBuffer) {
- var isConsumed = consumed(this);
+ // JSON[@@toStringTag] property
+ // https://tc39.es/ecma262/#sec-json-@@tostringtag
+ setToStringTag$3(global$h.JSON, 'JSON', true);
- if (isConsumed) {
- return isConsumed;
- }
+ var setToStringTag$2 = setToStringTag$a;
- if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
- return Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength));
- } else {
- return Promise.resolve(this._bodyArrayBuffer);
- }
- } else {
- return this.blob().then(readBlobAsArrayBuffer);
- }
- };
- }
+ // Math[@@toStringTag] property
+ // https://tc39.es/ecma262/#sec-math-@@tostringtag
+ setToStringTag$2(Math, 'Math', true);
- this.text = function () {
- var rejected = consumed(this);
+ (function (factory) {
+ factory();
+ })(function () {
- if (rejected) {
- return rejected;
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
}
+ }
- if (this._bodyBlob) {
- return readBlobAsText(this._bodyBlob);
- } else if (this._bodyArrayBuffer) {
- return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
- } else if (this._bodyFormData) {
- throw new Error('could not read FormData body as text');
- } else {
- return Promise.resolve(this._bodyText);
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
}
- };
-
- if (support.formData) {
- this.formData = function () {
- return this.text().then(decode);
- };
}
- this.json = function () {
- return this.text().then(JSON.parse);
- };
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
- return this;
- } // HTTP methods whose capitalization should be normalized
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) _setPrototypeOf(subClass, superClass);
+ }
- var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
+ function _getPrototypeOf(o) {
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
+ return o.__proto__ || Object.getPrototypeOf(o);
+ };
+ return _getPrototypeOf(o);
+ }
- function normalizeMethod(method) {
- var upcased = method.toUpperCase();
- return methods.indexOf(upcased) > -1 ? upcased : method;
- }
+ function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
- function Request(input, options) {
- if (!(this instanceof Request)) {
- throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
+ return _setPrototypeOf(o, p);
}
- options = options || {};
- var body = options.body;
+ function _isNativeReflectConstruct() {
+ if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+ if (Reflect.construct.sham) return false;
+ if (typeof Proxy === "function") return true;
- if (input instanceof Request) {
- if (input.bodyUsed) {
- throw new TypeError('Already read');
+ try {
+ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
+ return true;
+ } catch (e) {
+ return false;
}
+ }
- this.url = input.url;
- this.credentials = input.credentials;
-
- if (!options.headers) {
- this.headers = new Headers$1(input.headers);
+ function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
- this.method = input.method;
- this.mode = input.mode;
- this.signal = input.signal;
-
- if (!body && input._bodyInit != null) {
- body = input._bodyInit;
- input.bodyUsed = true;
- }
- } else {
- this.url = String(input);
+ return self;
}
- this.credentials = options.credentials || this.credentials || 'same-origin';
+ function _possibleConstructorReturn(self, call) {
+ if (call && (_typeof(call) === "object" || typeof call === "function")) {
+ return call;
+ }
- if (options.headers || !this.headers) {
- this.headers = new Headers$1(options.headers);
+ return _assertThisInitialized(self);
}
- this.method = normalizeMethod(options.method || this.method || 'GET');
- this.mode = options.mode || this.mode || null;
- this.signal = options.signal || this.signal;
- this.referrer = null;
-
- if ((this.method === 'GET' || this.method === 'HEAD') && body) {
- throw new TypeError('Body not allowed for GET or HEAD requests');
- }
+ function _createSuper(Derived) {
+ var hasNativeReflectConstruct = _isNativeReflectConstruct();
- this._initBody(body);
+ return function _createSuperInternal() {
+ var Super = _getPrototypeOf(Derived),
+ result;
- if (this.method === 'GET' || this.method === 'HEAD') {
- if (options.cache === 'no-store' || options.cache === 'no-cache') {
- // Search for a '_' parameter in the query string
- var reParamSearch = /([?&])_=[^&]*/;
+ if (hasNativeReflectConstruct) {
+ var NewTarget = _getPrototypeOf(this).constructor;
- if (reParamSearch.test(this.url)) {
- // If it already exists then set the value with the current time
- this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());
+ result = Reflect.construct(Super, arguments, NewTarget);
} else {
- // Otherwise add a new '_' parameter to the end with the current time
- var reQueryString = /\?/;
- this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();
+ result = Super.apply(this, arguments);
}
- }
- }
- }
- Request.prototype.clone = function () {
- return new Request(this, {
- body: this._bodyInit
- });
- };
+ return _possibleConstructorReturn(this, result);
+ };
+ }
- function decode(body) {
- var form = new FormData();
- body.trim().split('&').forEach(function (bytes) {
- if (bytes) {
- var split = bytes.split('=');
- var name = split.shift().replace(/\+/g, ' ');
- var value = split.join('=').replace(/\+/g, ' ');
- form.append(decodeURIComponent(name), decodeURIComponent(value));
+ function _superPropBase(object, property) {
+ while (!Object.prototype.hasOwnProperty.call(object, property)) {
+ object = _getPrototypeOf(object);
+ if (object === null) break;
}
- });
- return form;
- }
- function parseHeaders(rawHeaders) {
- var headers = new Headers$1(); // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
- // https://tools.ietf.org/html/rfc7230#section-3.2
+ return object;
+ }
- var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill
- // https://github.com/github/fetch/issues/748
- // https://github.com/zloirock/core-js/issues/751
+ function _get(target, property, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.get) {
+ _get = Reflect.get;
+ } else {
+ _get = function _get(target, property, receiver) {
+ var base = _superPropBase(target, property);
- preProcessedHeaders.split('\r').map(function (header) {
- return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header;
- }).forEach(function (line) {
- var parts = line.split(':');
- var key = parts.shift().trim();
+ if (!base) return;
+ var desc = Object.getOwnPropertyDescriptor(base, property);
- if (key) {
- var value = parts.join(':').trim();
- headers.append(key, value);
+ if (desc.get) {
+ return desc.get.call(receiver);
+ }
+
+ return desc.value;
+ };
}
- });
- return headers;
- }
- Body.call(Request.prototype);
- function Response(bodyInit, options) {
- if (!(this instanceof Response)) {
- throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
+ return _get(target, property, receiver || target);
}
- if (!options) {
- options = {};
- }
+ var Emitter = /*#__PURE__*/function () {
+ function Emitter() {
+ _classCallCheck(this, Emitter);
- this.type = 'default';
- this.status = options.status === undefined ? 200 : options.status;
- this.ok = this.status >= 200 && this.status < 300;
- this.statusText = options.statusText === undefined ? '' : '' + options.statusText;
- this.headers = new Headers$1(options.headers);
- this.url = options.url || '';
+ Object.defineProperty(this, 'listeners', {
+ value: {},
+ writable: true,
+ configurable: true
+ });
+ }
- this._initBody(bodyInit);
- }
- Body.call(Response.prototype);
+ _createClass(Emitter, [{
+ key: "addEventListener",
+ value: function addEventListener(type, callback, options) {
+ if (!(type in this.listeners)) {
+ this.listeners[type] = [];
+ }
- Response.prototype.clone = function () {
- return new Response(this._bodyInit, {
- status: this.status,
- statusText: this.statusText,
- headers: new Headers$1(this.headers),
- url: this.url
- });
- };
+ this.listeners[type].push({
+ callback: callback,
+ options: options
+ });
+ }
+ }, {
+ key: "removeEventListener",
+ value: function removeEventListener(type, callback) {
+ if (!(type in this.listeners)) {
+ return;
+ }
- Response.error = function () {
- var response = new Response(null, {
- status: 0,
- statusText: ''
- });
- response.type = 'error';
- return response;
- };
+ var stack = this.listeners[type];
- var redirectStatuses = [301, 302, 303, 307, 308];
+ for (var i = 0, l = stack.length; i < l; i++) {
+ if (stack[i].callback === callback) {
+ stack.splice(i, 1);
+ return;
+ }
+ }
+ }
+ }, {
+ key: "dispatchEvent",
+ value: function dispatchEvent(event) {
+ if (!(event.type in this.listeners)) {
+ return;
+ }
- Response.redirect = function (url, status) {
- if (redirectStatuses.indexOf(status) === -1) {
- throw new RangeError('Invalid status code');
- }
+ var stack = this.listeners[event.type];
+ var stackToCall = stack.slice();
- return new Response(null, {
- status: status,
- headers: {
- location: url
- }
- });
- };
+ for (var i = 0, l = stackToCall.length; i < l; i++) {
+ var listener = stackToCall[i];
- var DOMException$1 = global$1.DOMException;
+ try {
+ listener.callback.call(this, event);
+ } catch (e) {
+ Promise.resolve().then(function () {
+ throw e;
+ });
+ }
- try {
- new DOMException$1();
- } catch (err) {
- DOMException$1 = function DOMException(message, name) {
- this.message = message;
- this.name = name;
- var error = Error(message);
- this.stack = error.stack;
- };
+ if (listener.options && listener.options.once) {
+ this.removeEventListener(event.type, listener.callback);
+ }
+ }
- DOMException$1.prototype = Object.create(Error.prototype);
- DOMException$1.prototype.constructor = DOMException$1;
- }
+ return !event.defaultPrevented;
+ }
+ }]);
- function fetch$1(input, init) {
- return new Promise(function (resolve, reject) {
- var request = new Request(input, init);
+ return Emitter;
+ }();
- if (request.signal && request.signal.aborted) {
- return reject(new DOMException$1('Aborted', 'AbortError'));
- }
+ var AbortSignal = /*#__PURE__*/function (_Emitter) {
+ _inherits(AbortSignal, _Emitter);
- var xhr = new XMLHttpRequest();
-
- function abortXhr() {
- xhr.abort();
- }
-
- xhr.onload = function () {
- var options = {
- status: xhr.status,
- statusText: xhr.statusText,
- headers: parseHeaders(xhr.getAllResponseHeaders() || '')
- };
- options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
- var body = 'response' in xhr ? xhr.response : xhr.responseText;
- setTimeout(function () {
- resolve(new Response(body, options));
- }, 0);
- };
-
- xhr.onerror = function () {
- setTimeout(function () {
- reject(new TypeError('Network request failed'));
- }, 0);
- };
-
- xhr.ontimeout = function () {
- setTimeout(function () {
- reject(new TypeError('Network request failed'));
- }, 0);
- };
-
- xhr.onabort = function () {
- setTimeout(function () {
- reject(new DOMException$1('Aborted', 'AbortError'));
- }, 0);
- };
-
- function fixUrl(url) {
- try {
- return url === '' && global$1.location.href ? global$1.location.href : url;
- } catch (e) {
- return url;
- }
- }
-
- xhr.open(request.method, fixUrl(request.url), true);
-
- if (request.credentials === 'include') {
- xhr.withCredentials = true;
- } else if (request.credentials === 'omit') {
- xhr.withCredentials = false;
- }
-
- if ('responseType' in xhr) {
- if (support.blob) {
- xhr.responseType = 'blob';
- } else if (support.arrayBuffer && request.headers.get('Content-Type') && request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1) {
- xhr.responseType = 'arraybuffer';
- }
- }
-
- if (init && _typeof(init.headers) === 'object' && !(init.headers instanceof Headers$1)) {
- Object.getOwnPropertyNames(init.headers).forEach(function (name) {
- xhr.setRequestHeader(name, normalizeValue(init.headers[name]));
- });
- } else {
- request.headers.forEach(function (value, name) {
- xhr.setRequestHeader(name, value);
- });
- }
-
- if (request.signal) {
- request.signal.addEventListener('abort', abortXhr);
-
- xhr.onreadystatechange = function () {
- // DONE (success or failure)
- if (xhr.readyState === 4) {
- request.signal.removeEventListener('abort', abortXhr);
- }
- };
- }
-
- xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
- });
- }
- fetch$1.polyfill = true;
-
- if (!global$1.fetch) {
- global$1.fetch = fetch$1;
- global$1.Headers = Headers$1;
- global$1.Request = Request;
- global$1.Response = Response;
- }
-
- // `Object.defineProperty` method
- // https://tc39.es/ecma262/#sec-object.defineproperty
- _export({ target: 'Object', stat: true, forced: !descriptors, sham: !descriptors }, {
- defineProperty: objectDefineProperty.f
- });
-
- // `Object.setPrototypeOf` method
- // https://tc39.es/ecma262/#sec-object.setprototypeof
- _export({ target: 'Object', stat: true }, {
- setPrototypeOf: objectSetPrototypeOf
- });
-
- var FAILS_ON_PRIMITIVES$1 = fails(function () { objectGetPrototypeOf(1); });
-
- // `Object.getPrototypeOf` method
- // https://tc39.es/ecma262/#sec-object.getprototypeof
- _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$1, sham: !correctPrototypeGetter }, {
- getPrototypeOf: function getPrototypeOf(it) {
- return objectGetPrototypeOf(toObject(it));
- }
- });
-
- var slice$1 = [].slice;
- var factories = {};
-
- var construct = function (C, argsLength, args) {
- if (!(argsLength in factories)) {
- for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';
- // eslint-disable-next-line no-new-func -- we have no proper alternatives, IE8- only
- factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')');
- } return factories[argsLength](C, args);
- };
-
- // `Function.prototype.bind` method implementation
- // https://tc39.es/ecma262/#sec-function.prototype.bind
- var functionBind = Function.bind || function bind(that /* , ...args */) {
- var fn = aFunction$1(this);
- var partArgs = slice$1.call(arguments, 1);
- var boundFunction = function bound(/* args... */) {
- var args = partArgs.concat(slice$1.call(arguments));
- return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args);
- };
- if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype;
- return boundFunction;
- };
-
- var nativeConstruct = getBuiltIn('Reflect', 'construct');
-
- // `Reflect.construct` method
- // https://tc39.es/ecma262/#sec-reflect.construct
- // MS Edge supports only 2 arguments and argumentsList argument is optional
- // FF Nightly sets third argument as `new.target`, but does not create `this` from it
- var NEW_TARGET_BUG = fails(function () {
- function F() { /* empty */ }
- return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);
- });
- var ARGS_BUG = !fails(function () {
- nativeConstruct(function () { /* empty */ });
- });
- var FORCED$5 = NEW_TARGET_BUG || ARGS_BUG;
-
- _export({ target: 'Reflect', stat: true, forced: FORCED$5, sham: FORCED$5 }, {
- construct: function construct(Target, args /* , newTarget */) {
- aFunction$1(Target);
- anObject(args);
- var newTarget = arguments.length < 3 ? Target : aFunction$1(arguments[2]);
- if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);
- if (Target == newTarget) {
- // w/o altered newTarget, optimization for 0-4 arguments
- switch (args.length) {
- case 0: return new Target();
- case 1: return new Target(args[0]);
- case 2: return new Target(args[0], args[1]);
- case 3: return new Target(args[0], args[1], args[2]);
- case 4: return new Target(args[0], args[1], args[2], args[3]);
- }
- // w/o altered newTarget, lot of arguments case
- var $args = [null];
- $args.push.apply($args, args);
- return new (functionBind.apply(Target, $args))();
- }
- // with altered newTarget, not support built-in constructors
- var proto = newTarget.prototype;
- var instance = objectCreate(isObject(proto) ? proto : Object.prototype);
- var result = Function.apply.call(Target, instance, args);
- return isObject(result) ? result : instance;
- }
- });
-
- // `Reflect.get` method
- // https://tc39.es/ecma262/#sec-reflect.get
- function get$2(target, propertyKey /* , receiver */) {
- var receiver = arguments.length < 3 ? target : arguments[2];
- var descriptor, prototype;
- if (anObject(target) === receiver) return target[propertyKey];
- if (descriptor = objectGetOwnPropertyDescriptor.f(target, propertyKey)) return has(descriptor, 'value')
- ? descriptor.value
- : descriptor.get === undefined
- ? undefined
- : descriptor.get.call(receiver);
- if (isObject(prototype = objectGetPrototypeOf(target))) return get$2(prototype, propertyKey, receiver);
- }
-
- _export({ target: 'Reflect', stat: true }, {
- get: get$2
- });
-
- var nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;
-
-
- var FAILS_ON_PRIMITIVES$2 = fails(function () { nativeGetOwnPropertyDescriptor$2(1); });
- var FORCED$6 = !descriptors || FAILS_ON_PRIMITIVES$2;
-
- // `Object.getOwnPropertyDescriptor` method
- // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
- _export({ target: 'Object', stat: true, forced: FORCED$6, sham: !descriptors }, {
- getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
- return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key);
- }
- });
-
- var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('splice');
-
- var max$3 = Math.max;
- var min$6 = Math.min;
- var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
- var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';
-
- // `Array.prototype.splice` method
- // https://tc39.es/ecma262/#sec-array.prototype.splice
- // with adding support of @@species
- _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 }, {
- splice: function splice(start, deleteCount /* , ...items */) {
- var O = toObject(this);
- var len = toLength(O.length);
- var actualStart = toAbsoluteIndex(start, len);
- var argumentsLength = arguments.length;
- var insertCount, actualDeleteCount, A, k, from, to;
- if (argumentsLength === 0) {
- insertCount = actualDeleteCount = 0;
- } else if (argumentsLength === 1) {
- insertCount = 0;
- actualDeleteCount = len - actualStart;
- } else {
- insertCount = argumentsLength - 2;
- actualDeleteCount = min$6(max$3(toInteger(deleteCount), 0), len - actualStart);
- }
- if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {
- throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
- }
- A = arraySpeciesCreate(O, actualDeleteCount);
- for (k = 0; k < actualDeleteCount; k++) {
- from = actualStart + k;
- if (from in O) createProperty(A, k, O[from]);
- }
- A.length = actualDeleteCount;
- if (insertCount < actualDeleteCount) {
- for (k = actualStart; k < len - actualDeleteCount; k++) {
- from = k + actualDeleteCount;
- to = k + insertCount;
- if (from in O) O[to] = O[from];
- else delete O[to];
- }
- for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];
- } else if (insertCount > actualDeleteCount) {
- for (k = len - actualDeleteCount; k > actualStart; k--) {
- from = k + actualDeleteCount - 1;
- to = k + insertCount - 1;
- if (from in O) O[to] = O[from];
- else delete O[to];
- }
- }
- for (k = 0; k < insertCount; k++) {
- O[k + actualStart] = arguments[k + 2];
- }
- O.length = len - actualDeleteCount + insertCount;
- return A;
- }
- });
-
- // `Symbol.toStringTag` well-known symbol
- // https://tc39.es/ecma262/#sec-symbol.tostringtag
- defineWellKnownSymbol('toStringTag');
-
- // Math[@@toStringTag] property
- // https://tc39.es/ecma262/#sec-math-@@tostringtag
- setToStringTag(Math, 'Math', true);
-
- // JSON[@@toStringTag] property
- // https://tc39.es/ecma262/#sec-json-@@tostringtag
- setToStringTag(global_1.JSON, 'JSON', true);
-
- (function (factory) {
- factory();
- })(function () {
-
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
-
- function _defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
-
- function _createClass(Constructor, protoProps, staticProps) {
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
- if (staticProps) _defineProperties(Constructor, staticProps);
- return Constructor;
- }
-
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function");
- }
-
- subClass.prototype = Object.create(superClass && superClass.prototype, {
- constructor: {
- value: subClass,
- writable: true,
- configurable: true
- }
- });
- if (superClass) _setPrototypeOf(subClass, superClass);
- }
-
- function _getPrototypeOf(o) {
- _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
- return o.__proto__ || Object.getPrototypeOf(o);
- };
- return _getPrototypeOf(o);
- }
-
- function _setPrototypeOf(o, p) {
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
- o.__proto__ = p;
- return o;
- };
-
- return _setPrototypeOf(o, p);
- }
-
- function _isNativeReflectConstruct() {
- if (typeof Reflect === "undefined" || !Reflect.construct) return false;
- if (Reflect.construct.sham) return false;
- if (typeof Proxy === "function") return true;
-
- try {
- Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
- return true;
- } catch (e) {
- return false;
- }
- }
-
- function _assertThisInitialized(self) {
- if (self === void 0) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }
-
- return self;
- }
-
- function _possibleConstructorReturn(self, call) {
- if (call && (_typeof(call) === "object" || typeof call === "function")) {
- return call;
- }
-
- return _assertThisInitialized(self);
- }
-
- function _createSuper(Derived) {
- var hasNativeReflectConstruct = _isNativeReflectConstruct();
-
- return function _createSuperInternal() {
- var Super = _getPrototypeOf(Derived),
- result;
-
- if (hasNativeReflectConstruct) {
- var NewTarget = _getPrototypeOf(this).constructor;
-
- result = Reflect.construct(Super, arguments, NewTarget);
- } else {
- result = Super.apply(this, arguments);
- }
-
- return _possibleConstructorReturn(this, result);
- };
- }
-
- function _superPropBase(object, property) {
- while (!Object.prototype.hasOwnProperty.call(object, property)) {
- object = _getPrototypeOf(object);
- if (object === null) break;
- }
-
- return object;
- }
-
- function _get(target, property, receiver) {
- if (typeof Reflect !== "undefined" && Reflect.get) {
- _get = Reflect.get;
- } else {
- _get = function _get(target, property, receiver) {
- var base = _superPropBase(target, property);
-
- if (!base) return;
- var desc = Object.getOwnPropertyDescriptor(base, property);
-
- if (desc.get) {
- return desc.get.call(receiver);
- }
-
- return desc.value;
- };
- }
-
- return _get(target, property, receiver || target);
- }
-
- var Emitter = /*#__PURE__*/function () {
- function Emitter() {
- _classCallCheck(this, Emitter);
-
- Object.defineProperty(this, 'listeners', {
- value: {},
- writable: true,
- configurable: true
- });
- }
-
- _createClass(Emitter, [{
- key: "addEventListener",
- value: function addEventListener(type, callback, options) {
- if (!(type in this.listeners)) {
- this.listeners[type] = [];
- }
-
- this.listeners[type].push({
- callback: callback,
- options: options
- });
- }
- }, {
- key: "removeEventListener",
- value: function removeEventListener(type, callback) {
- if (!(type in this.listeners)) {
- return;
- }
-
- var stack = this.listeners[type];
-
- for (var i = 0, l = stack.length; i < l; i++) {
- if (stack[i].callback === callback) {
- stack.splice(i, 1);
- return;
- }
- }
- }
- }, {
- key: "dispatchEvent",
- value: function dispatchEvent(event) {
- if (!(event.type in this.listeners)) {
- return;
- }
-
- var stack = this.listeners[event.type];
- var stackToCall = stack.slice();
-
- for (var i = 0, l = stackToCall.length; i < l; i++) {
- var listener = stackToCall[i];
-
- try {
- listener.callback.call(this, event);
- } catch (e) {
- Promise.resolve().then(function () {
- throw e;
- });
- }
-
- if (listener.options && listener.options.once) {
- this.removeEventListener(event.type, listener.callback);
- }
- }
-
- return !event.defaultPrevented;
- }
- }]);
-
- return Emitter;
- }();
-
- var AbortSignal = /*#__PURE__*/function (_Emitter) {
- _inherits(AbortSignal, _Emitter);
-
- var _super = _createSuper(AbortSignal);
+ var _super = _createSuper(AbortSignal);
function AbortSignal() {
var _this;
@@ -7603,48 +7953,62 @@
};
}
- var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
- var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;
+ var $$M = _export;
+ var global$g = global$1o;
+ var fails$k = fails$V;
+ var isArray$3 = isArray$8;
+ var isObject$8 = isObject$s;
+ var toObject$6 = toObject$i;
+ var lengthOfArrayLike$4 = lengthOfArrayLike$i;
+ var createProperty$1 = createProperty$5;
+ var arraySpeciesCreate$1 = arraySpeciesCreate$4;
+ var arrayMethodHasSpeciesSupport$1 = arrayMethodHasSpeciesSupport$5;
+ var wellKnownSymbol$2 = wellKnownSymbol$t;
+ var V8_VERSION = engineV8Version;
+
+ var IS_CONCAT_SPREADABLE = wellKnownSymbol$2('isConcatSpreadable');
+ var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
+ var TypeError$5 = global$g.TypeError;
// We can't use this feature detection in V8 since it causes
// deoptimization and serious performance degradation
// https://github.com/zloirock/core-js/issues/679
- var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {
+ var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails$k(function () {
var array = [];
array[IS_CONCAT_SPREADABLE] = false;
return array.concat()[0] !== array;
});
- var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');
+ var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport$1('concat');
var isConcatSpreadable = function (O) {
- if (!isObject(O)) return false;
+ if (!isObject$8(O)) return false;
var spreadable = O[IS_CONCAT_SPREADABLE];
- return spreadable !== undefined ? !!spreadable : isArray(O);
+ return spreadable !== undefined ? !!spreadable : isArray$3(O);
};
- var FORCED$7 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
+ var FORCED$a = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
// `Array.prototype.concat` method
// https://tc39.es/ecma262/#sec-array.prototype.concat
// with adding support of @@isConcatSpreadable and @@species
- _export({ target: 'Array', proto: true, forced: FORCED$7 }, {
+ $$M({ target: 'Array', proto: true, forced: FORCED$a }, {
// eslint-disable-next-line no-unused-vars -- required for `.length`
concat: function concat(arg) {
- var O = toObject(this);
- var A = arraySpeciesCreate(O, 0);
+ var O = toObject$6(this);
+ var A = arraySpeciesCreate$1(O, 0);
var n = 0;
var i, k, length, len, E;
for (i = -1, length = arguments.length; i < length; i++) {
E = i === -1 ? O : arguments[i];
if (isConcatSpreadable(E)) {
- len = toLength(E.length);
- if (n + len > MAX_SAFE_INTEGER$1) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
- for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
+ len = lengthOfArrayLike$4(E);
+ if (n + len > MAX_SAFE_INTEGER) throw TypeError$5(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
+ for (k = 0; k < len; k++, n++) if (k in E) createProperty$1(A, n, E[k]);
} else {
- if (n >= MAX_SAFE_INTEGER$1) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
- createProperty(A, n++, E);
+ if (n >= MAX_SAFE_INTEGER) throw TypeError$5(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
+ createProperty$1(A, n++, E);
}
}
A.length = n;
@@ -7652,69 +8016,152 @@
}
});
+ var DESCRIPTORS$7 = descriptors;
+ var uncurryThis$l = functionUncurryThis;
+ var call$4 = functionCall;
+ var fails$j = fails$V;
+ var objectKeys$1 = objectKeys$4;
+ var getOwnPropertySymbolsModule = objectGetOwnPropertySymbols;
+ var propertyIsEnumerableModule = objectPropertyIsEnumerable;
+ var toObject$5 = toObject$i;
+ var IndexedObject = indexedObject;
+
+ // eslint-disable-next-line es/no-object-assign -- safe
+ var $assign = Object.assign;
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+ var defineProperty$4 = Object.defineProperty;
+ var concat = uncurryThis$l([].concat);
+
// `Object.assign` method
// https://tc39.es/ecma262/#sec-object.assign
- _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {
- assign: objectAssign
- });
+ var objectAssign = !$assign || fails$j(function () {
+ // should have correct order of operations (Edge bug)
+ if (DESCRIPTORS$7 && $assign({ b: 1 }, $assign(defineProperty$4({}, 'a', {
+ enumerable: true,
+ get: function () {
+ defineProperty$4(this, 'b', {
+ value: 3,
+ enumerable: false
+ });
+ }
+ }), { b: 2 })).b !== 1) return true;
+ // should work with symbols and should have deterministic property order (V8 bug)
+ var A = {};
+ var B = {};
+ // eslint-disable-next-line es/no-symbol -- safe
+ var symbol = Symbol();
+ var alphabet = 'abcdefghijklmnopqrst';
+ A[symbol] = 7;
+ alphabet.split('').forEach(function (chr) { B[chr] = chr; });
+ return $assign({}, A)[symbol] != 7 || objectKeys$1($assign({}, B)).join('') != alphabet;
+ }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`
+ var T = toObject$5(target);
+ var argumentsLength = arguments.length;
+ var index = 1;
+ var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
+ var propertyIsEnumerable = propertyIsEnumerableModule.f;
+ while (argumentsLength > index) {
+ var S = IndexedObject(arguments[index++]);
+ var keys = getOwnPropertySymbols ? concat(objectKeys$1(S), getOwnPropertySymbols(S)) : objectKeys$1(S);
+ var length = keys.length;
+ var j = 0;
+ var key;
+ while (length > j) {
+ key = keys[j++];
+ if (!DESCRIPTORS$7 || call$4(propertyIsEnumerable, S, key)) T[key] = S[key];
+ }
+ } return T;
+ } : $assign;
- var $filter$1 = arrayIteration.filter;
+ var $$L = _export;
+ var assign$2 = objectAssign;
+
+ // `Object.assign` method
+ // https://tc39.es/ecma262/#sec-object.assign
+ // eslint-disable-next-line es/no-object-assign -- required for testing
+ $$L({ target: 'Object', stat: true, forced: Object.assign !== assign$2 }, {
+ assign: assign$2
+ });
+ var $$K = _export;
+ var $filter = arrayIteration.filter;
+ var arrayMethodHasSpeciesSupport = arrayMethodHasSpeciesSupport$5;
- var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('filter');
+ var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');
// `Array.prototype.filter` method
// https://tc39.es/ecma262/#sec-array.prototype.filter
// with adding support of @@species
- _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 }, {
+ $$K({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
filter: function filter(callbackfn /* , thisArg */) {
- return $filter$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
- var FAILS_ON_PRIMITIVES$3 = fails(function () { objectKeys(1); });
+ var $$J = _export;
+ var toObject$4 = toObject$i;
+ var nativeKeys = objectKeys$4;
+ var fails$i = fails$V;
+
+ var FAILS_ON_PRIMITIVES$2 = fails$i(function () { nativeKeys(1); });
// `Object.keys` method
// https://tc39.es/ecma262/#sec-object.keys
- _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$3 }, {
+ $$J({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$2 }, {
keys: function keys(it) {
- return objectKeys(toObject(it));
+ return nativeKeys(toObject$4(it));
}
});
- var nativeReverse = [].reverse;
+ var $$I = _export;
+ var uncurryThis$k = functionUncurryThis;
+ var isArray$2 = isArray$8;
+
+ var un$Reverse = uncurryThis$k([].reverse);
var test$1 = [1, 2];
// `Array.prototype.reverse` method
// https://tc39.es/ecma262/#sec-array.prototype.reverse
// fix for Safari 12.0 bug
// https://bugs.webkit.org/show_bug.cgi?id=188794
- _export({ target: 'Array', proto: true, forced: String(test$1) === String(test$1.reverse()) }, {
+ $$I({ target: 'Array', proto: true, forced: String(test$1) === String(test$1.reverse()) }, {
reverse: function reverse() {
// eslint-disable-next-line no-self-assign -- dirty hack
- if (isArray(this)) this.length = this.length;
- return nativeReverse.call(this);
+ if (isArray$2(this)) this.length = this.length;
+ return un$Reverse(this);
}
});
- var trim = stringTrim.trim;
-
-
- var $parseFloat = global_1.parseFloat;
- var FORCED$8 = 1 / $parseFloat(whitespaces + '-0') !== -Infinity;
+ var global$f = global$1o;
+ var fails$h = fails$V;
+ var uncurryThis$j = functionUncurryThis;
+ var toString$c = toString$k;
+ var trim$4 = stringTrim.trim;
+ var whitespaces$1 = whitespaces$4;
+
+ var charAt$2 = uncurryThis$j(''.charAt);
+ var n$ParseFloat = global$f.parseFloat;
+ var Symbol$2 = global$f.Symbol;
+ var ITERATOR$1 = Symbol$2 && Symbol$2.iterator;
+ var FORCED$9 = 1 / n$ParseFloat(whitespaces$1 + '-0') !== -Infinity
+ // MS Edge 18- broken with boxed symbols
+ || (ITERATOR$1 && !fails$h(function () { n$ParseFloat(Object(ITERATOR$1)); }));
// `parseFloat` method
// https://tc39.es/ecma262/#sec-parsefloat-string
- var numberParseFloat = FORCED$8 ? function parseFloat(string) {
- var trimmedString = trim(String(string));
- var result = $parseFloat(trimmedString);
- return result === 0 && trimmedString.charAt(0) == '-' ? -0 : result;
- } : $parseFloat;
+ var numberParseFloat = FORCED$9 ? function parseFloat(string) {
+ var trimmedString = trim$4(toString$c(string));
+ var result = n$ParseFloat(trimmedString);
+ return result === 0 && charAt$2(trimmedString, 0) == '-' ? -0 : result;
+ } : n$ParseFloat;
+
+ var $$H = _export;
+ var $parseFloat = numberParseFloat;
// `parseFloat` method
// https://tc39.es/ecma262/#sec-parsefloat-string
- _export({ global: true, forced: parseFloat != numberParseFloat }, {
- parseFloat: numberParseFloat
+ $$H({ global: true, forced: parseFloat != $parseFloat }, {
+ parseFloat: $parseFloat
});
/*
@@ -8005,6 +8452,10 @@
'sled': true,
'yes': true
},
+ 'seamark:type': {
+ 'separation_lane': true,
+ 'separation_roundabout': true
+ },
'waterway': {
'canal': true,
'ditch': true,
@@ -8120,53 +8571,102 @@
tidal_channel: true
};
- var trim$1 = stringTrim.trim;
-
-
- var $parseInt = global_1.parseInt;
- var hex$1 = /^[+-]?0[Xx]/;
- var FORCED$9 = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22;
+ var global$e = global$1o;
+ var fails$g = fails$V;
+ var uncurryThis$i = functionUncurryThis;
+ var toString$b = toString$k;
+ var trim$3 = stringTrim.trim;
+ var whitespaces = whitespaces$4;
+
+ var $parseInt$1 = global$e.parseInt;
+ var Symbol$1 = global$e.Symbol;
+ var ITERATOR = Symbol$1 && Symbol$1.iterator;
+ var hex$2 = /^[+-]?0x/i;
+ var exec$3 = uncurryThis$i(hex$2.exec);
+ var FORCED$8 = $parseInt$1(whitespaces + '08') !== 8 || $parseInt$1(whitespaces + '0x16') !== 22
+ // MS Edge 18- broken with boxed symbols
+ || (ITERATOR && !fails$g(function () { $parseInt$1(Object(ITERATOR)); }));
// `parseInt` method
// https://tc39.es/ecma262/#sec-parseint-string-radix
- var numberParseInt = FORCED$9 ? function parseInt(string, radix) {
- var S = trim$1(String(string));
- return $parseInt(S, (radix >>> 0) || (hex$1.test(S) ? 16 : 10));
- } : $parseInt;
+ var numberParseInt = FORCED$8 ? function parseInt(string, radix) {
+ var S = trim$3(toString$b(string));
+ return $parseInt$1(S, (radix >>> 0) || (exec$3(hex$2, S) ? 16 : 10));
+ } : $parseInt$1;
+
+ var $$G = _export;
+ var $parseInt = numberParseInt;
// `parseInt` method
// https://tc39.es/ecma262/#sec-parseint-string-radix
- _export({ global: true, forced: parseInt != numberParseInt }, {
- parseInt: numberParseInt
+ $$G({ global: true, forced: parseInt != $parseInt }, {
+ parseInt: $parseInt
});
- var freezing = !fails(function () {
- return Object.isExtensible(Object.preventExtensions({}));
+ var internalMetadata = {exports: {}};
+
+ // FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it
+ var fails$f = fails$V;
+
+ var arrayBufferNonExtensible = fails$f(function () {
+ if (typeof ArrayBuffer == 'function') {
+ var buffer = new ArrayBuffer(8);
+ // eslint-disable-next-line es/no-object-isextensible, es/no-object-defineproperty -- safe
+ if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });
+ }
});
- var internalMetadata = createCommonjsModule(function (module) {
- var defineProperty = objectDefineProperty.f;
+ var fails$e = fails$V;
+ var isObject$7 = isObject$s;
+ var classof = classofRaw$1;
+ var ARRAY_BUFFER_NON_EXTENSIBLE = arrayBufferNonExtensible;
+ // eslint-disable-next-line es/no-object-isextensible -- safe
+ var $isExtensible = Object.isExtensible;
+ var FAILS_ON_PRIMITIVES$1 = fails$e(function () { $isExtensible(1); });
+ // `Object.isExtensible` method
+ // https://tc39.es/ecma262/#sec-object.isextensible
+ var objectIsExtensible = (FAILS_ON_PRIMITIVES$1 || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {
+ if (!isObject$7(it)) return false;
+ if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') return false;
+ return $isExtensible ? $isExtensible(it) : true;
+ } : $isExtensible;
- var METADATA = uid('meta');
- var id = 0;
+ var fails$d = fails$V;
- var isExtensible = Object.isExtensible || function () {
- return true;
- };
+ var freezing = !fails$d(function () {
+ // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing
+ return Object.isExtensible(Object.preventExtensions({}));
+ });
+
+ var $$F = _export;
+ var uncurryThis$h = functionUncurryThis;
+ var hiddenKeys = hiddenKeys$6;
+ var isObject$6 = isObject$s;
+ var hasOwn$3 = hasOwnProperty_1;
+ var defineProperty$3 = objectDefineProperty.f;
+ var getOwnPropertyNamesModule = objectGetOwnPropertyNames;
+ var getOwnPropertyNamesExternalModule = objectGetOwnPropertyNamesExternal;
+ var isExtensible = objectIsExtensible;
+ var uid = uid$5;
+ var FREEZING$1 = freezing;
+
+ var REQUIRED = false;
+ var METADATA = uid('meta');
+ var id$1 = 0;
var setMetadata = function (it) {
- defineProperty(it, METADATA, { value: {
- objectID: 'O' + ++id, // object ID
+ defineProperty$3(it, METADATA, { value: {
+ objectID: 'O' + id$1++, // object ID
weakData: {} // weak collections IDs
} });
};
- var fastKey = function (it, create) {
+ var fastKey$1 = function (it, create) {
// return a primitive with prefix
- if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
- if (!has(it, METADATA)) {
+ if (!isObject$6(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!hasOwn$3(it, METADATA)) {
// can't set metadata to uncaught frozen object
if (!isExtensible(it)) return 'F';
// not necessary to add metadata
@@ -8178,7 +8678,7 @@
};
var getWeakData = function (it, create) {
- if (!has(it, METADATA)) {
+ if (!hasOwn$3(it, METADATA)) {
// can't set metadata to uncaught frozen object
if (!isExtensible(it)) return true;
// not necessary to add metadata
@@ -8190,52 +8690,92 @@
};
// add metadata on freeze-family methods calling
- var onFreeze = function (it) {
- if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);
+ var onFreeze$1 = function (it) {
+ if (FREEZING$1 && REQUIRED && isExtensible(it) && !hasOwn$3(it, METADATA)) setMetadata(it);
return it;
};
- var meta = module.exports = {
- REQUIRED: false,
- fastKey: fastKey,
+ var enable = function () {
+ meta.enable = function () { /* empty */ };
+ REQUIRED = true;
+ var getOwnPropertyNames = getOwnPropertyNamesModule.f;
+ var splice = uncurryThis$h([].splice);
+ var test = {};
+ test[METADATA] = 1;
+
+ // prevent exposing of metadata key
+ if (getOwnPropertyNames(test).length) {
+ getOwnPropertyNamesModule.f = function (it) {
+ var result = getOwnPropertyNames(it);
+ for (var i = 0, length = result.length; i < length; i++) {
+ if (result[i] === METADATA) {
+ splice(result, i, 1);
+ break;
+ }
+ } return result;
+ };
+
+ $$F({ target: 'Object', stat: true, forced: true }, {
+ getOwnPropertyNames: getOwnPropertyNamesExternalModule.f
+ });
+ }
+ };
+
+ var meta = internalMetadata.exports = {
+ enable: enable,
+ fastKey: fastKey$1,
getWeakData: getWeakData,
- onFreeze: onFreeze
+ onFreeze: onFreeze$1
};
hiddenKeys[METADATA] = true;
- });
- var collection = function (CONSTRUCTOR_NAME, wrapper, common) {
+ var $$E = _export;
+ var global$d = global$1o;
+ var uncurryThis$g = functionUncurryThis;
+ var isForced$2 = isForced_1;
+ var redefine$4 = redefine$h.exports;
+ var InternalMetadataModule = internalMetadata.exports;
+ var iterate$1 = iterate$3;
+ var anInstance$2 = anInstance$7;
+ var isCallable$1 = isCallable$r;
+ var isObject$5 = isObject$s;
+ var fails$c = fails$V;
+ var checkCorrectnessOfIteration$1 = checkCorrectnessOfIteration$4;
+ var setToStringTag$1 = setToStringTag$a;
+ var inheritIfRequired$2 = inheritIfRequired$4;
+
+ var collection$2 = function (CONSTRUCTOR_NAME, wrapper, common) {
var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;
var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;
var ADDER = IS_MAP ? 'set' : 'add';
- var NativeConstructor = global_1[CONSTRUCTOR_NAME];
+ var NativeConstructor = global$d[CONSTRUCTOR_NAME];
var NativePrototype = NativeConstructor && NativeConstructor.prototype;
var Constructor = NativeConstructor;
var exported = {};
var fixMethod = function (KEY) {
- var nativeMethod = NativePrototype[KEY];
- redefine(NativePrototype, KEY,
+ var uncurriedNativeMethod = uncurryThis$g(NativePrototype[KEY]);
+ redefine$4(NativePrototype, KEY,
KEY == 'add' ? function add(value) {
- nativeMethod.call(this, value === 0 ? 0 : value);
+ uncurriedNativeMethod(this, value === 0 ? 0 : value);
return this;
} : KEY == 'delete' ? function (key) {
- return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);
+ return IS_WEAK && !isObject$5(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);
} : KEY == 'get' ? function get(key) {
- return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);
+ return IS_WEAK && !isObject$5(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);
} : KEY == 'has' ? function has(key) {
- return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);
+ return IS_WEAK && !isObject$5(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);
} : function set(key, value) {
- nativeMethod.call(this, key === 0 ? 0 : key, value);
+ uncurriedNativeMethod(this, key === 0 ? 0 : key, value);
return this;
}
);
};
- var REPLACE = isForced_1(
+ var REPLACE = isForced$2(
CONSTRUCTOR_NAME,
- typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {
+ !isCallable$1(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails$c(function () {
new NativeConstructor().entries().next();
}))
);
@@ -8243,18 +8783,18 @@
if (REPLACE) {
// create collection constructor
Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
- internalMetadata.REQUIRED = true;
- } else if (isForced_1(CONSTRUCTOR_NAME, true)) {
+ InternalMetadataModule.enable();
+ } else if (isForced$2(CONSTRUCTOR_NAME, true)) {
var instance = new Constructor();
// early implementations not supports chaining
var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
// V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
- var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });
+ var THROWS_ON_PRIMITIVES = fails$c(function () { instance.has(1); });
// most early implementations doesn't supports iterables, most modern - not close it correctly
// eslint-disable-next-line no-new -- required for testing
- var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });
+ var ACCEPT_ITERABLES = checkCorrectnessOfIteration$1(function (iterable) { new NativeConstructor(iterable); });
// for early implementations -0 and +0 not the same
- var BUGGY_ZERO = !IS_WEAK && fails(function () {
+ var BUGGY_ZERO = !IS_WEAK && fails$c(function () {
// V8 ~ Chromium 42- fails only with 5+ elements
var $instance = new NativeConstructor();
var index = 5;
@@ -8264,9 +8804,9 @@
if (!ACCEPT_ITERABLES) {
Constructor = wrapper(function (dummy, iterable) {
- anInstance(dummy, Constructor, CONSTRUCTOR_NAME);
- var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);
- if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+ anInstance$2(dummy, NativePrototype);
+ var that = inheritIfRequired$2(new NativeConstructor(), dummy, Constructor);
+ if (iterable != undefined) iterate$1(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
return that;
});
Constructor.prototype = NativePrototype;
@@ -8286,44 +8826,46 @@
}
exported[CONSTRUCTOR_NAME] = Constructor;
- _export({ global: true, forced: Constructor != NativeConstructor }, exported);
+ $$E({ global: true, forced: Constructor != NativeConstructor }, exported);
- setToStringTag(Constructor, CONSTRUCTOR_NAME);
+ setToStringTag$1(Constructor, CONSTRUCTOR_NAME);
if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);
return Constructor;
};
- var defineProperty$7 = objectDefineProperty.f;
+ var defineProperty$2 = objectDefineProperty.f;
+ var create$3 = objectCreate;
+ var redefineAll = redefineAll$4;
+ var bind$6 = functionBindContext;
+ var anInstance$1 = anInstance$7;
+ var iterate = iterate$3;
+ var defineIterator = defineIterator$3;
+ var setSpecies$1 = setSpecies$5;
+ var DESCRIPTORS$6 = descriptors;
+ var fastKey = internalMetadata.exports.fastKey;
+ var InternalStateModule$1 = internalState;
+
+ var setInternalState$1 = InternalStateModule$1.set;
+ var internalStateGetterFor = InternalStateModule$1.getterFor;
+
+ var collectionStrong$2 = {
+ getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
+ var Constructor = wrapper(function (that, iterable) {
+ anInstance$1(that, Prototype);
+ setInternalState$1(that, {
+ type: CONSTRUCTOR_NAME,
+ index: create$3(null),
+ first: undefined,
+ last: undefined,
+ size: 0
+ });
+ if (!DESCRIPTORS$6) that.size = 0;
+ if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+ });
-
-
-
-
-
-
-
- var fastKey = internalMetadata.fastKey;
-
-
- var setInternalState$7 = internalState.set;
- var internalStateGetterFor = internalState.getterFor;
-
- var collectionStrong = {
- getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
- var C = wrapper(function (that, iterable) {
- anInstance(that, C, CONSTRUCTOR_NAME);
- setInternalState$7(that, {
- type: CONSTRUCTOR_NAME,
- index: objectCreate(null),
- first: undefined,
- last: undefined,
- size: 0
- });
- if (!descriptors) that.size = 0;
- if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
- });
+ var Prototype = Constructor.prototype;
var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
@@ -8346,7 +8888,7 @@
};
if (!state.first) state.first = entry;
if (previous) previous.next = entry;
- if (descriptors) state.size++;
+ if (DESCRIPTORS$6) state.size++;
else that.size++;
// add to index
if (index !== 'F') state.index[index] = entry;
@@ -8365,9 +8907,10 @@
}
};
- redefineAll(C.prototype, {
- // 23.1.3.1 Map.prototype.clear()
- // 23.2.3.2 Set.prototype.clear()
+ redefineAll(Prototype, {
+ // `{ Map, Set }.prototype.clear()` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.clear
+ // https://tc39.es/ecma262/#sec-set.prototype.clear
clear: function clear() {
var that = this;
var state = getInternalState(that);
@@ -8380,11 +8923,12 @@
entry = entry.next;
}
state.first = state.last = undefined;
- if (descriptors) state.size = 0;
+ if (DESCRIPTORS$6) state.size = 0;
else that.size = 0;
},
- // 23.1.3.3 Map.prototype.delete(key)
- // 23.2.3.4 Set.prototype.delete(value)
+ // `{ Map, Set }.prototype.delete(key)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.delete
+ // https://tc39.es/ecma262/#sec-set.prototype.delete
'delete': function (key) {
var that = this;
var state = getInternalState(that);
@@ -8398,15 +8942,16 @@
if (next) next.previous = prev;
if (state.first == entry) state.first = next;
if (state.last == entry) state.last = prev;
- if (descriptors) state.size--;
+ if (DESCRIPTORS$6) state.size--;
else that.size--;
} return !!entry;
},
- // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
- // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
+ // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.foreach
+ // https://tc39.es/ecma262/#sec-set.prototype.foreach
forEach: function forEach(callbackfn /* , that = undefined */) {
var state = getInternalState(this);
- var boundFunction = functionBindContext(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
+ var boundFunction = bind$6(callbackfn, arguments.length > 1 ? arguments[1] : undefined);
var entry;
while (entry = entry ? entry.next : state.first) {
boundFunction(entry.value, entry.key, this);
@@ -8414,44 +8959,55 @@
while (entry && entry.removed) entry = entry.previous;
}
},
- // 23.1.3.7 Map.prototype.has(key)
- // 23.2.3.7 Set.prototype.has(value)
+ // `{ Map, Set}.prototype.has(key)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.has
+ // https://tc39.es/ecma262/#sec-set.prototype.has
has: function has(key) {
return !!getEntry(this, key);
}
});
- redefineAll(C.prototype, IS_MAP ? {
- // 23.1.3.6 Map.prototype.get(key)
+ redefineAll(Prototype, IS_MAP ? {
+ // `Map.prototype.get(key)` method
+ // https://tc39.es/ecma262/#sec-map.prototype.get
get: function get(key) {
var entry = getEntry(this, key);
return entry && entry.value;
},
- // 23.1.3.9 Map.prototype.set(key, value)
+ // `Map.prototype.set(key, value)` method
+ // https://tc39.es/ecma262/#sec-map.prototype.set
set: function set(key, value) {
return define(this, key === 0 ? 0 : key, value);
}
} : {
- // 23.2.3.1 Set.prototype.add(value)
+ // `Set.prototype.add(value)` method
+ // https://tc39.es/ecma262/#sec-set.prototype.add
add: function add(value) {
return define(this, value = value === 0 ? 0 : value, value);
}
});
- if (descriptors) defineProperty$7(C.prototype, 'size', {
+ if (DESCRIPTORS$6) defineProperty$2(Prototype, 'size', {
get: function () {
return getInternalState(this).size;
}
});
- return C;
+ return Constructor;
},
- setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) {
+ setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {
var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';
var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);
var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);
- // add .keys, .values, .entries, [@@iterator]
- // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
- defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {
- setInternalState$7(this, {
+ // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.entries
+ // https://tc39.es/ecma262/#sec-map.prototype.keys
+ // https://tc39.es/ecma262/#sec-map.prototype.values
+ // https://tc39.es/ecma262/#sec-map.prototype-@@iterator
+ // https://tc39.es/ecma262/#sec-set.prototype.entries
+ // https://tc39.es/ecma262/#sec-set.prototype.keys
+ // https://tc39.es/ecma262/#sec-set.prototype.values
+ // https://tc39.es/ecma262/#sec-set.prototype-@@iterator
+ defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {
+ setInternalState$1(this, {
type: ITERATOR_NAME,
target: iterated,
state: getInternalCollectionState(iterated),
@@ -8476,16 +9032,21 @@
return { value: [entry.key, entry.value], done: false };
}, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
- // add [@@species], 23.1.2.2, 23.2.2.2
- setSpecies(CONSTRUCTOR_NAME);
+ // `{ Map, Set }.prototype[@@species]` accessors
+ // https://tc39.es/ecma262/#sec-get-map-@@species
+ // https://tc39.es/ecma262/#sec-get-set-@@species
+ setSpecies$1(CONSTRUCTOR_NAME);
}
};
+ var collection$1 = collection$2;
+ var collectionStrong$1 = collectionStrong$2;
+
// `Set` constructor
// https://tc39.es/ecma262/#sec-set-objects
- var es_set = collection('Set', function (init) {
+ collection$1('Set', function (init) {
return function Set() { return init(this, arguments.length ? arguments[0] : undefined); };
- }, collectionStrong);
+ }, collectionStrong$1);
function d3_ascending (a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
@@ -8547,17 +9108,15 @@
};
}
+ var defineWellKnownSymbol = defineWellKnownSymbol$4;
+
// `Symbol.asyncIterator` well-known symbol
// https://tc39.es/ecma262/#sec-symbol.asynciterator
defineWellKnownSymbol('asyncIterator');
- var runtime_1 = createCommonjsModule(function (module) {
- /**
- * Copyright (c) 2014-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
+ var runtime = {exports: {}};
+
+ (function (module) {
var runtime = function (exports) {
var Op = Object.prototype;
@@ -8644,11 +9203,9 @@
var IteratorPrototype = {};
-
- IteratorPrototype[iteratorSymbol] = function () {
+ define(IteratorPrototype, iteratorSymbol, function () {
return this;
- };
-
+ });
var getProto = Object.getPrototypeOf;
var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
@@ -8659,8 +9216,9 @@
}
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
- GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
- GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunction.prototype = GeneratorFunctionPrototype;
+ define(Gp, "constructor", GeneratorFunctionPrototype);
+ define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the
// Iterator interface in terms of a single ._invoke method.
@@ -8765,11 +9323,9 @@
}
defineIteratorMethods(AsyncIterator.prototype);
-
- AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+ define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
return this;
- };
-
+ });
exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
// AsyncIterator objects; they just return a Promise for the value of
// the final result produced by the iterator.
@@ -8946,13 +9502,12 @@
// object to not be returned from this call. This ensures that doesn't happen.
// See https://github.com/facebook/regenerator/issues/274 for more details.
- Gp[iteratorSymbol] = function () {
+ define(Gp, iteratorSymbol, function () {
return this;
- };
-
- Gp.toString = function () {
+ });
+ define(Gp, "toString", function () {
return "[object Generator]";
- };
+ });
function pushTryEntry(locs) {
var entry = {
@@ -9257,27 +9812,32 @@
// as the regeneratorRuntime namespace. Otherwise create a new empty
// object. Either way, the resulting object will be used to initialize
// the regeneratorRuntime variable at the top of this file.
- module.exports );
+ module.exports );
try {
regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
// This module should not be running in strict mode, so the above
// assignment should always work unless something is misconfigured. Just
- // in case runtime.js accidentally runs in strict mode, we can escape
+ // in case runtime.js accidentally runs in strict mode, in modern engines
+ // we can explicitly access globalThis. In older engines we can escape
// strict mode using a global Function call. This could conceivably fail
// if a Content Security Policy forbids using Function, but in that case
// the proper solution is to fix the accidental strict mode problem. If
// you've misconfigured your bundler to force strict mode and applied a
// CSP to forbid Function, and you're not willing to fix either of those
// problems, please detail your unique predicament in a GitHub issue.
- Function("r", "regeneratorRuntime = r")(runtime);
+ if ((typeof globalThis === "undefined" ? "undefined" : _typeof(globalThis)) === "object") {
+ globalThis.regeneratorRuntime = runtime;
+ } else {
+ Function("r", "regeneratorRuntime = r")(runtime);
+ }
}
- });
+ })(runtime);
- var _marked = /*#__PURE__*/regeneratorRuntime.mark(numbers);
+ var _marked$3 = /*#__PURE__*/regeneratorRuntime.mark(numbers);
- function number (x) {
+ function number$1 (x) {
return x === null ? NaN : +x;
}
function numbers(values, valueof) {
@@ -9387,55 +9947,127 @@
return _context.stop();
}
}
- }, _marked, null, [[2, 13, 16, 19], [23, 34, 37, 40]]);
+ }, _marked$3, null, [[2, 13, 16, 19], [23, 34, 37, 40]]);
}
var ascendingBisect = d3_bisector(d3_ascending);
var bisectRight = ascendingBisect.right;
- var bisectCenter = d3_bisector(number).center;
+ d3_bisector(number$1).center;
+
+ var anObject$2 = anObject$n;
+ var iteratorClose = iteratorClose$2;
+
+ // call something on iterator step with safe closing on error
+ var callWithSafeIterationClosing$1 = function (iterator, fn, value, ENTRIES) {
+ try {
+ return ENTRIES ? fn(anObject$2(value)[0], value[1]) : fn(value);
+ } catch (error) {
+ iteratorClose(iterator, 'throw', error);
+ }
+ };
- var INCORRECT_ITERATION$1 = !checkCorrectnessOfIteration(function (iterable) {
+ var global$c = global$1o;
+ var bind$5 = functionBindContext;
+ var call$3 = functionCall;
+ var toObject$3 = toObject$i;
+ var callWithSafeIterationClosing = callWithSafeIterationClosing$1;
+ var isArrayIteratorMethod = isArrayIteratorMethod$3;
+ var isConstructor = isConstructor$4;
+ var lengthOfArrayLike$3 = lengthOfArrayLike$i;
+ var createProperty = createProperty$5;
+ var getIterator = getIterator$4;
+ var getIteratorMethod = getIteratorMethod$5;
+
+ var Array$1 = global$c.Array;
+
+ // `Array.from` method implementation
+ // https://tc39.es/ecma262/#sec-array.from
+ var arrayFrom$1 = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
+ var O = toObject$3(arrayLike);
+ var IS_CONSTRUCTOR = isConstructor(this);
+ var argumentsLength = arguments.length;
+ var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ if (mapping) mapfn = bind$5(mapfn, argumentsLength > 2 ? arguments[2] : undefined);
+ var iteratorMethod = getIteratorMethod(O);
+ var index = 0;
+ var length, result, step, iterator, next, value;
+ // if the target is not iterable or it's an array with the default iterator - use a simple case
+ if (iteratorMethod && !(this == Array$1 && isArrayIteratorMethod(iteratorMethod))) {
+ iterator = getIterator(O, iteratorMethod);
+ next = iterator.next;
+ result = IS_CONSTRUCTOR ? new this() : [];
+ for (;!(step = call$3(next, iterator)).done; index++) {
+ value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
+ createProperty(result, index, value);
+ }
+ } else {
+ length = lengthOfArrayLike$3(O);
+ result = IS_CONSTRUCTOR ? new this(length) : Array$1(length);
+ for (;length > index; index++) {
+ value = mapping ? mapfn(O[index], index) : O[index];
+ createProperty(result, index, value);
+ }
+ }
+ result.length = index;
+ return result;
+ };
+
+ var $$D = _export;
+ var from = arrayFrom$1;
+ var checkCorrectnessOfIteration = checkCorrectnessOfIteration$4;
+
+ var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
+ // eslint-disable-next-line es/no-array-from -- required for testing
Array.from(iterable);
});
// `Array.from` method
// https://tc39.es/ecma262/#sec-array.from
- _export({ target: 'Array', stat: true, forced: INCORRECT_ITERATION$1 }, {
- from: arrayFrom
+ $$D({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
+ from: from
});
+ var $$C = _export;
+ var fill = arrayFill$1;
+ var addToUnscopables$4 = addToUnscopables$6;
+
// `Array.prototype.fill` method
// https://tc39.es/ecma262/#sec-array.prototype.fill
- _export({ target: 'Array', proto: true }, {
- fill: arrayFill
+ $$C({ target: 'Array', proto: true }, {
+ fill: fill
});
// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
- addToUnscopables('fill');
-
- var $some$1 = arrayIteration.some;
+ addToUnscopables$4('fill');
+ var $$B = _export;
+ var $some = arrayIteration.some;
+ var arrayMethodIsStrict$4 = arrayMethodIsStrict$9;
- var STRICT_METHOD$4 = arrayMethodIsStrict('some');
+ var STRICT_METHOD$4 = arrayMethodIsStrict$4('some');
// `Array.prototype.some` method
// https://tc39.es/ecma262/#sec-array.prototype.some
- _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 }, {
+ $$B({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 }, {
some: function some(callbackfn /* , thisArg */) {
- return $some$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
- var exportTypedArrayStaticMethod$1 = arrayBufferViewCore.exportTypedArrayStaticMethod;
-
+ var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = typedArrayConstructorsRequireWrappers;
+ var exportTypedArrayStaticMethod = arrayBufferViewCore.exportTypedArrayStaticMethod;
+ var typedArrayFrom = typedArrayFrom$2;
// `%TypedArray%.from` method
// https://tc39.es/ecma262/#sec-%typedarray%.from
- exportTypedArrayStaticMethod$1('from', typedArrayFrom, typedArrayConstructorsRequireWrappers);
+ exportTypedArrayStaticMethod('from', typedArrayFrom, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);
+
+ var createTypedArrayConstructor = typedArrayConstructor.exports;
// `Float64Array` constructor
// https://tc39.es/ecma262/#sec-typedarray-objects
- typedArrayConstructor('Float64', function (init) {
+ createTypedArrayConstructor('Float64', function (init) {
return function Float64Array(data, byteOffset, length) {
return init(this, data, byteOffset, length);
};
@@ -9448,13 +10080,13 @@
// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423
var Adder = /*#__PURE__*/function () {
function Adder() {
- _classCallCheck(this, Adder);
+ _classCallCheck$1(this, Adder);
this._partials = new Float64Array(32);
this._n = 0;
}
- _createClass(Adder, [{
+ _createClass$1(Adder, [{
key: "add",
value: function add(x) {
var p = this._partials;
@@ -9507,41 +10139,128 @@
return Adder;
}();
+ var $$A = _export;
+ var DESCRIPTORS$5 = descriptors;
+ var defineProperties$1 = objectDefineProperties.f;
+
// `Object.defineProperties` method
// https://tc39.es/ecma262/#sec-object.defineproperties
- _export({ target: 'Object', stat: true, forced: !descriptors, sham: !descriptors }, {
- defineProperties: objectDefineProperties
+ // eslint-disable-next-line es/no-object-defineproperties -- safe
+ $$A({ target: 'Object', stat: true, forced: Object.defineProperties !== defineProperties$1, sham: !DESCRIPTORS$5 }, {
+ defineProperties: defineProperties$1
});
+ var collection = collection$2;
+ var collectionStrong = collectionStrong$2;
+
// `Map` constructor
// https://tc39.es/ecma262/#sec-map-objects
- var es_map = collection('Map', function (init) {
+ collection('Map', function (init) {
return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };
}, collectionStrong);
- var test$2 = [];
- var nativeSort = test$2.sort;
+ var $$z = _export;
+ var uncurryThis$f = functionUncurryThis;
+ var aCallable$1 = aCallable$a;
+ var toObject$2 = toObject$i;
+ var lengthOfArrayLike$2 = lengthOfArrayLike$i;
+ var toString$a = toString$k;
+ var fails$b = fails$V;
+ var internalSort = arraySort$1;
+ var arrayMethodIsStrict$3 = arrayMethodIsStrict$9;
+ var FF = engineFfVersion;
+ var IE_OR_EDGE = engineIsIeOrEdge;
+ var V8 = engineV8Version;
+ var WEBKIT = engineWebkitVersion;
+
+ var test = [];
+ var un$Sort = uncurryThis$f(test.sort);
+ var push$3 = uncurryThis$f(test.push);
// IE8-
- var FAILS_ON_UNDEFINED = fails(function () {
- test$2.sort(undefined);
+ var FAILS_ON_UNDEFINED = fails$b(function () {
+ test.sort(undefined);
});
// V8 bug
- var FAILS_ON_NULL = fails(function () {
- test$2.sort(null);
+ var FAILS_ON_NULL = fails$b(function () {
+ test.sort(null);
});
// Old WebKit
- var STRICT_METHOD$5 = arrayMethodIsStrict('sort');
+ var STRICT_METHOD$3 = arrayMethodIsStrict$3('sort');
+
+ var STABLE_SORT = !fails$b(function () {
+ // feature detection can be too slow, so check engines versions
+ if (V8) return V8 < 70;
+ if (FF && FF > 3) return;
+ if (IE_OR_EDGE) return true;
+ if (WEBKIT) return WEBKIT < 603;
+
+ var result = '';
+ var code, chr, value, index;
+
+ // generate an array with more 512 elements (Chakra and old V8 fails only in this case)
+ for (code = 65; code < 76; code++) {
+ chr = String.fromCharCode(code);
+
+ switch (code) {
+ case 66: case 69: case 70: case 72: value = 3; break;
+ case 68: case 71: value = 4; break;
+ default: value = 2;
+ }
+
+ for (index = 0; index < 47; index++) {
+ test.push({ k: chr + index, v: value });
+ }
+ }
+
+ test.sort(function (a, b) { return b.v - a.v; });
+
+ for (index = 0; index < test.length; index++) {
+ chr = test[index].k.charAt(0);
+ if (result.charAt(result.length - 1) !== chr) result += chr;
+ }
+
+ return result !== 'DGBEFHACIJK';
+ });
- var FORCED$a = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD$5;
+ var FORCED$7 = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD$3 || !STABLE_SORT;
+
+ var getSortCompare = function (comparefn) {
+ return function (x, y) {
+ if (y === undefined) return -1;
+ if (x === undefined) return 1;
+ if (comparefn !== undefined) return +comparefn(x, y) || 0;
+ return toString$a(x) > toString$a(y) ? 1 : -1;
+ };
+ };
// `Array.prototype.sort` method
// https://tc39.es/ecma262/#sec-array.prototype.sort
- _export({ target: 'Array', proto: true, forced: FORCED$a }, {
+ $$z({ target: 'Array', proto: true, forced: FORCED$7 }, {
sort: function sort(comparefn) {
- return comparefn === undefined
- ? nativeSort.call(toObject(this))
- : nativeSort.call(toObject(this), aFunction$1(comparefn));
+ if (comparefn !== undefined) aCallable$1(comparefn);
+
+ var array = toObject$2(this);
+
+ if (STABLE_SORT) return comparefn === undefined ? un$Sort(array) : un$Sort(array, comparefn);
+
+ var items = [];
+ var arrayLength = lengthOfArrayLike$2(array);
+ var itemsLength, index;
+
+ for (index = 0; index < arrayLength; index++) {
+ if (index in array) push$3(items, array[index]);
+ }
+
+ internalSort(items, getSortCompare(comparefn));
+
+ itemsLength = items.length;
+ index = 0;
+
+ while (index < itemsLength) array[index] = items[index++];
+ while (index < arrayLength) delete array[index++];
+
+ return array;
}
});
@@ -9560,21 +10279,27 @@
if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
if (step > 0) {
- start = Math.ceil(start / step);
- stop = Math.floor(stop / step);
- ticks = new Array(n = Math.ceil(stop - start + 1));
+ var r0 = Math.round(start / step),
+ r1 = Math.round(stop / step);
+ if (r0 * step < start) ++r0;
+ if (r1 * step > stop) --r1;
+ ticks = new Array(n = r1 - r0 + 1);
while (++i < n) {
- ticks[i] = (start + i) * step;
+ ticks[i] = (r0 + i) * step;
}
} else {
step = -step;
- start = Math.ceil(start * step);
- stop = Math.floor(stop * step);
- ticks = new Array(n = Math.ceil(stop - start + 1));
+
+ var _r = Math.round(start * step),
+ _r2 = Math.round(stop * step);
+
+ if (_r / step < start) ++_r;
+ if (_r2 / step > stop) --_r2;
+ ticks = new Array(n = _r2 - _r + 1);
while (++i < n) {
- ticks[i] = (start + i) / step;
+ ticks[i] = (_r + i) / step;
}
}
@@ -9595,7 +10320,7 @@
return stop < start ? -step1 : step1;
}
- function max$4(values, valueof) {
+ function max(values, valueof) {
var max;
if (valueof === undefined) {
@@ -9639,7 +10364,7 @@
return max;
}
- function min$7(values, valueof) {
+ function min$2(values, valueof) {
var min;
if (valueof === undefined) {
@@ -9685,7 +10410,7 @@
// ISC license, Copyright 2018 Vladimir Agafonkin.
- function quickselect(array, k) {
+ function quickselect$3(array, k) {
var left = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var right = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length - 1;
var compare = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : d3_ascending;
@@ -9699,17 +10424,17 @@
var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
- quickselect(array, k, newLeft, newRight, compare);
+ quickselect$3(array, k, newLeft, newRight, compare);
}
var t = array[k];
var i = left;
var j = right;
- swap(array, left, k);
- if (compare(array[right], t) > 0) swap(array, left, right);
+ swap$1(array, left, k);
+ if (compare(array[right], t) > 0) swap$1(array, left, right);
while (i < j) {
- swap(array, i, j), ++i, --j;
+ swap$1(array, i, j), ++i, --j;
while (compare(array[i], t) < 0) {
++i;
@@ -9720,7 +10445,7 @@
}
}
- if (compare(array[left], t) === 0) swap(array, left, j);else ++j, swap(array, j, right);
+ if (compare(array[left], t) === 0) swap$1(array, left, j);else ++j, swap$1(array, j, right);
if (j <= k) left = j + 1;
if (k <= j) right = j - 1;
}
@@ -9728,7 +10453,7 @@
return array;
}
- function swap(array, i, j) {
+ function swap$1(array, i, j) {
var t = array[i];
array[i] = array[j];
array[j] = t;
@@ -9737,13 +10462,13 @@
function quantile(values, p, valueof) {
values = Float64Array.from(numbers(values, valueof));
if (!(n = values.length)) return;
- if ((p = +p) <= 0 || n < 2) return min$7(values);
- if (p >= 1) return max$4(values);
+ if ((p = +p) <= 0 || n < 2) return min$2(values);
+ if (p >= 1) return max(values);
var n,
i = (n - 1) * p,
i0 = Math.floor(i),
- value0 = max$4(quickselect(values, i0).subarray(0, i0 + 1)),
- value1 = min$7(values.subarray(i0 + 1));
+ value0 = max(quickselect$3(values, i0).subarray(0, i0 + 1)),
+ value1 = min$2(values.subarray(i0 + 1));
return value0 + (value1 - value0) * (i - i0);
}
@@ -9751,7 +10476,7 @@
return quantile(values, 0.5, valueof);
}
- var _marked$1 = /*#__PURE__*/regeneratorRuntime.mark(flatten);
+ var _marked$2 = /*#__PURE__*/regeneratorRuntime.mark(flatten);
function flatten(arrays) {
var _iterator, _step, array;
@@ -9800,14 +10525,14 @@
return _context.stop();
}
}
- }, _marked$1, null, [[1, 10, 13, 16]]);
+ }, _marked$2, null, [[1, 10, 13, 16]]);
}
- function merge(arrays) {
+ function merge$4(arrays) {
return Array.from(flatten(arrays));
}
- function range (start, stop, step) {
+ function range$1 (start, stop, step) {
start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
var i = -1,
n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
@@ -9822,14 +10547,18 @@
// `SameValue` abstract operation
// https://tc39.es/ecma262/#sec-samevalue
- var sameValue = Object.is || function is(x, y) {
+ // eslint-disable-next-line es/no-object-is -- safe
+ var sameValue$1 = Object.is || function is(x, y) {
// eslint-disable-next-line no-self-compare -- NaN check
return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
};
+ var $$y = _export;
+
+ // eslint-disable-next-line es/no-math-hypot -- required for testing
var $hypot = Math.hypot;
- var abs$1 = Math.abs;
- var sqrt = Math.sqrt;
+ var abs$3 = Math.abs;
+ var sqrt$1 = Math.sqrt;
// Chrome 77 bug
// https://bugs.chromium.org/p/v8/issues/detail?id=9546
@@ -9837,7 +10566,7 @@
// `Math.hypot` method
// https://tc39.es/ecma262/#sec-math.hypot
- _export({ target: 'Math', stat: true, forced: BUGGY }, {
+ $$y({ target: 'Math', stat: true, forced: BUGGY }, {
// eslint-disable-next-line no-unused-vars -- required for `.length`
hypot: function hypot(value1, value2) {
var sum = 0;
@@ -9846,7 +10575,7 @@
var larg = 0;
var arg, div;
while (i < aLen) {
- arg = abs$1(arguments[i++]);
+ arg = abs$3(arguments[i++]);
if (larg < arg) {
div = larg / arg;
sum = sum * div * div + 1;
@@ -9856,43 +10585,46 @@
sum += div * div;
} else sum += arg;
}
- return larg === Infinity ? Infinity : larg * sqrt(sum);
+ return larg === Infinity ? Infinity : larg * sqrt$1(sum);
}
});
// `Math.sign` method implementation
// https://tc39.es/ecma262/#sec-math.sign
+ // eslint-disable-next-line es/no-math-sign -- safe
var mathSign = Math.sign || function sign(x) {
// eslint-disable-next-line no-self-compare -- NaN check
return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
};
+ var $$x = _export;
+ var sign$1 = mathSign;
+
// `Math.sign` method
// https://tc39.es/ecma262/#sec-math.sign
- _export({ target: 'Math', stat: true }, {
- sign: mathSign
+ $$x({ target: 'Math', stat: true }, {
+ sign: sign$1
});
- var epsilon = 1e-6;
- var epsilon2 = 1e-12;
+ var epsilon$1 = 1e-6;
+ var epsilon2$1 = 1e-12;
var pi = Math.PI;
var halfPi = pi / 2;
var quarterPi = pi / 4;
var tau = pi * 2;
- var degrees = 180 / pi;
+ var degrees$1 = 180 / pi;
var radians = pi / 180;
var abs$2 = Math.abs;
var atan = Math.atan;
var atan2 = Math.atan2;
var cos = Math.cos;
- var exp = Math.exp;
- var hypot = Math.hypot;
+ var exp$2 = Math.exp;
var log$1 = Math.log;
var sin = Math.sin;
var sign = Math.sign || function (x) {
return x > 0 ? 1 : x < 0 ? -1 : 0;
};
- var sqrt$1 = Math.sqrt;
+ var sqrt = Math.sqrt;
var tan = Math.tan;
function acos(x) {
return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
@@ -9901,7 +10633,7 @@
return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);
}
- function noop() {}
+ function noop$1() {}
function streamGeometry(geometry, stream) {
if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
@@ -10008,72 +10740,72 @@
}
}
- var areaRingSum = new Adder(); // hello?
+ var areaRingSum$1 = new Adder(); // hello?
- var areaSum = new Adder(),
- lambda00,
- phi00,
- lambda0,
- cosPhi0,
- sinPhi0;
- var areaStream = {
- point: noop,
- lineStart: noop,
- lineEnd: noop,
+ var areaSum$1 = new Adder(),
+ lambda00$1,
+ phi00$1,
+ lambda0$2,
+ cosPhi0$1,
+ sinPhi0$1;
+ var areaStream$1 = {
+ point: noop$1,
+ lineStart: noop$1,
+ lineEnd: noop$1,
polygonStart: function polygonStart() {
- areaRingSum = new Adder();
- areaStream.lineStart = areaRingStart;
- areaStream.lineEnd = areaRingEnd;
+ areaRingSum$1 = new Adder();
+ areaStream$1.lineStart = areaRingStart$1;
+ areaStream$1.lineEnd = areaRingEnd$1;
},
polygonEnd: function polygonEnd() {
- var areaRing = +areaRingSum;
- areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);
- this.lineStart = this.lineEnd = this.point = noop;
+ var areaRing = +areaRingSum$1;
+ areaSum$1.add(areaRing < 0 ? tau + areaRing : areaRing);
+ this.lineStart = this.lineEnd = this.point = noop$1;
},
sphere: function sphere() {
- areaSum.add(tau);
+ areaSum$1.add(tau);
}
};
- function areaRingStart() {
- areaStream.point = areaPointFirst;
+ function areaRingStart$1() {
+ areaStream$1.point = areaPointFirst$1;
}
- function areaRingEnd() {
- areaPoint(lambda00, phi00);
+ function areaRingEnd$1() {
+ areaPoint$1(lambda00$1, phi00$1);
}
- function areaPointFirst(lambda, phi) {
- areaStream.point = areaPoint;
- lambda00 = lambda, phi00 = phi;
+ function areaPointFirst$1(lambda, phi) {
+ areaStream$1.point = areaPoint$1;
+ lambda00$1 = lambda, phi00$1 = phi;
lambda *= radians, phi *= radians;
- lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);
+ lambda0$2 = lambda, cosPhi0$1 = cos(phi = phi / 2 + quarterPi), sinPhi0$1 = sin(phi);
}
- function areaPoint(lambda, phi) {
+ function areaPoint$1(lambda, phi) {
lambda *= radians, phi *= radians;
phi = phi / 2 + quarterPi; // half the angular distance from south pole
// Spherical excess E for a spherical triangle with vertices: south pole,
// previous point, current point. Uses a formula derived from Cagnoliâs
// theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
- var dLambda = lambda - lambda0,
+ var dLambda = lambda - lambda0$2,
sdLambda = dLambda >= 0 ? 1 : -1,
adLambda = sdLambda * dLambda,
cosPhi = cos(phi),
sinPhi = sin(phi),
- k = sinPhi0 * sinPhi,
- u = cosPhi0 * cosPhi + k * cos(adLambda),
+ k = sinPhi0$1 * sinPhi,
+ u = cosPhi0$1 * cosPhi + k * cos(adLambda),
v = k * sdLambda * sin(adLambda);
- areaRingSum.add(atan2(v, u)); // Advance the previous points.
+ areaRingSum$1.add(atan2(v, u)); // Advance the previous points.
- lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
+ lambda0$2 = lambda, cosPhi0$1 = cosPhi, sinPhi0$1 = sinPhi;
}
function d3_geoArea (object) {
- areaSum = new Adder();
- d3_geoStream(object, areaStream);
- return areaSum * 2;
+ areaSum$1 = new Adder();
+ d3_geoStream(object, areaStream$1);
+ return areaSum$1 * 2;
}
function spherical(cartesian) {
@@ -10100,41 +10832,41 @@
} // TODO return d
function cartesianNormalizeInPlace(d) {
- var l = sqrt$1(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+ var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
d[0] /= l, d[1] /= l, d[2] /= l;
}
var lambda0$1, phi0, lambda1, phi1, // bounds
lambda2, // previous lambda-coordinate
- lambda00$1, phi00$1, // first point
+ lambda00, phi00, // first point
p0, // previous 3D point
- deltaSum, ranges, range$1;
- var boundsStream = {
- point: boundsPoint,
+ deltaSum, ranges, range;
+ var boundsStream$1 = {
+ point: boundsPoint$1,
lineStart: boundsLineStart,
lineEnd: boundsLineEnd,
polygonStart: function polygonStart() {
- boundsStream.point = boundsRingPoint;
- boundsStream.lineStart = boundsRingStart;
- boundsStream.lineEnd = boundsRingEnd;
+ boundsStream$1.point = boundsRingPoint;
+ boundsStream$1.lineStart = boundsRingStart;
+ boundsStream$1.lineEnd = boundsRingEnd;
deltaSum = new Adder();
- areaStream.polygonStart();
+ areaStream$1.polygonStart();
},
polygonEnd: function polygonEnd() {
- areaStream.polygonEnd();
- boundsStream.point = boundsPoint;
- boundsStream.lineStart = boundsLineStart;
- boundsStream.lineEnd = boundsLineEnd;
- if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);else if (deltaSum > epsilon) phi1 = 90;else if (deltaSum < -epsilon) phi0 = -90;
- range$1[0] = lambda0$1, range$1[1] = lambda1;
+ areaStream$1.polygonEnd();
+ boundsStream$1.point = boundsPoint$1;
+ boundsStream$1.lineStart = boundsLineStart;
+ boundsStream$1.lineEnd = boundsLineEnd;
+ if (areaRingSum$1 < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);else if (deltaSum > epsilon$1) phi1 = 90;else if (deltaSum < -epsilon$1) phi0 = -90;
+ range[0] = lambda0$1, range[1] = lambda1;
},
sphere: function sphere() {
lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
}
};
- function boundsPoint(lambda, phi) {
- ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
+ function boundsPoint$1(lambda, phi) {
+ ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
if (phi < phi0) phi0 = phi;
if (phi > phi1) phi1 = phi;
}
@@ -10150,15 +10882,15 @@
inflection = spherical(inflection);
var delta = lambda - lambda2,
sign = delta > 0 ? 1 : -1,
- lambdai = inflection[0] * degrees * sign,
+ lambdai = inflection[0] * degrees$1 * sign,
phii,
antimeridian = abs$2(delta) > 180;
if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
- phii = inflection[1] * degrees;
+ phii = inflection[1] * degrees$1;
if (phii > phi1) phi1 = phii;
} else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
- phii = -inflection[1] * degrees;
+ phii = -inflection[1] * degrees$1;
if (phii < phi0) phi0 = phii;
} else {
if (phi < phi0) phi0 = phi;
@@ -10184,7 +10916,7 @@
}
}
} else {
- ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
+ ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
}
if (phi < phi0) phi0 = phi;
@@ -10193,12 +10925,12 @@
}
function boundsLineStart() {
- boundsStream.point = linePoint;
+ boundsStream$1.point = linePoint;
}
function boundsLineEnd() {
- range$1[0] = lambda0$1, range$1[1] = lambda1;
- boundsStream.point = boundsPoint;
+ range[0] = lambda0$1, range[1] = lambda1;
+ boundsStream$1.point = boundsPoint$1;
p0 = null;
}
@@ -10207,22 +10939,22 @@
var delta = lambda - lambda2;
deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
} else {
- lambda00$1 = lambda, phi00$1 = phi;
+ lambda00 = lambda, phi00 = phi;
}
- areaStream.point(lambda, phi);
+ areaStream$1.point(lambda, phi);
linePoint(lambda, phi);
}
function boundsRingStart() {
- areaStream.lineStart();
+ areaStream$1.lineStart();
}
function boundsRingEnd() {
- boundsRingPoint(lambda00$1, phi00$1);
- areaStream.lineEnd();
- if (abs$2(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180);
- range$1[0] = lambda0$1, range$1[1] = lambda1;
+ boundsRingPoint(lambda00, phi00);
+ areaStream$1.lineEnd();
+ if (abs$2(deltaSum) > epsilon$1) lambda0$1 = -(lambda1 = 180);
+ range[0] = lambda0$1, range[1] = lambda1;
p0 = null;
} // Finds the left-right distance between two longitudes.
// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
@@ -10245,7 +10977,7 @@
var i, n, a, b, merged, deltaMax, delta;
phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
ranges = [];
- d3_geoStream(feature, boundsStream); // First, sort ranges by their minimum longitudes.
+ d3_geoStream(feature, boundsStream$1); // First, sort ranges by their minimum longitudes.
if (n = ranges.length) {
ranges.sort(rangeCompare); // Then, merge any ranges that overlap.
@@ -10269,142 +11001,10 @@
}
}
- ranges = range$1 = null;
+ ranges = range = null;
return lambda0$1 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0$1, phi0], [lambda1, phi1]];
}
- var W0, W1, X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, lambda00$2, phi00$2, // first point
- x0, y0, z0; // previous point
-
- var centroidStream = {
- sphere: noop,
- point: centroidPoint,
- lineStart: centroidLineStart,
- lineEnd: centroidLineEnd,
- polygonStart: function polygonStart() {
- centroidStream.lineStart = centroidRingStart;
- centroidStream.lineEnd = centroidRingEnd;
- },
- polygonEnd: function polygonEnd() {
- centroidStream.lineStart = centroidLineStart;
- centroidStream.lineEnd = centroidLineEnd;
- }
- }; // Arithmetic mean of Cartesian vectors.
-
- function centroidPoint(lambda, phi) {
- lambda *= radians, phi *= radians;
- var cosPhi = cos(phi);
- centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi));
- }
-
- function centroidPointCartesian(x, y, z) {
- ++W0;
- X0 += (x - X0) / W0;
- Y0 += (y - Y0) / W0;
- Z0 += (z - Z0) / W0;
- }
-
- function centroidLineStart() {
- centroidStream.point = centroidLinePointFirst;
- }
-
- function centroidLinePointFirst(lambda, phi) {
- lambda *= radians, phi *= radians;
- var cosPhi = cos(phi);
- x0 = cosPhi * cos(lambda);
- y0 = cosPhi * sin(lambda);
- z0 = sin(phi);
- centroidStream.point = centroidLinePoint;
- centroidPointCartesian(x0, y0, z0);
- }
-
- function centroidLinePoint(lambda, phi) {
- lambda *= radians, phi *= radians;
- var cosPhi = cos(phi),
- x = cosPhi * cos(lambda),
- y = cosPhi * sin(lambda),
- z = sin(phi),
- w = atan2(sqrt$1((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
- W1 += w;
- X1 += w * (x0 + (x0 = x));
- Y1 += w * (y0 + (y0 = y));
- Z1 += w * (z0 + (z0 = z));
- centroidPointCartesian(x0, y0, z0);
- }
-
- function centroidLineEnd() {
- centroidStream.point = centroidPoint;
- } // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
- // J. Applied Mechanics 42, 239 (1975).
-
-
- function centroidRingStart() {
- centroidStream.point = centroidRingPointFirst;
- }
-
- function centroidRingEnd() {
- centroidRingPoint(lambda00$2, phi00$2);
- centroidStream.point = centroidPoint;
- }
-
- function centroidRingPointFirst(lambda, phi) {
- lambda00$2 = lambda, phi00$2 = phi;
- lambda *= radians, phi *= radians;
- centroidStream.point = centroidRingPoint;
- var cosPhi = cos(phi);
- x0 = cosPhi * cos(lambda);
- y0 = cosPhi * sin(lambda);
- z0 = sin(phi);
- centroidPointCartesian(x0, y0, z0);
- }
-
- function centroidRingPoint(lambda, phi) {
- lambda *= radians, phi *= radians;
- var cosPhi = cos(phi),
- x = cosPhi * cos(lambda),
- y = cosPhi * sin(lambda),
- z = sin(phi),
- cx = y0 * z - z0 * y,
- cy = z0 * x - x0 * z,
- cz = x0 * y - y0 * x,
- m = hypot(cx, cy, cz),
- w = asin(m),
- // line weight = angle
- v = m && -w / m; // area weight multiplier
-
- X2.add(v * cx);
- Y2.add(v * cy);
- Z2.add(v * cz);
- W1 += w;
- X1 += w * (x0 + (x0 = x));
- Y1 += w * (y0 + (y0 = y));
- Z1 += w * (z0 + (z0 = z));
- centroidPointCartesian(x0, y0, z0);
- }
-
- function d3_geoCentroid (object) {
- W0 = W1 = X0 = Y0 = Z0 = X1 = Y1 = Z1 = 0;
- X2 = new Adder();
- Y2 = new Adder();
- Z2 = new Adder();
- d3_geoStream(object, centroidStream);
- var x = +X2,
- y = +Y2,
- z = +Z2,
- m = hypot(x, y, z); // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
-
- if (m < epsilon2) {
- x = X1, y = Y1, z = Z1; // If the feature has zero length, fall back to arithmetic mean of point vectors.
-
- if (W1 < epsilon) x = X0, y = Y0, z = Z0;
- m = hypot(x, y, z); // If the feature still has an undefined ccentroid, then return.
-
- if (m < epsilon2) return [NaN, NaN];
- }
-
- return [atan2(y, x) * degrees, asin(z / m) * degrees];
- }
-
function compose (a, b) {
function compose(x, y) {
return x = a(x, y), b(x[0], x[1]);
@@ -10469,12 +11069,12 @@
function forward(coordinates) {
coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
- return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;
+ return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
}
forward.invert = function (coordinates) {
coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
- return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;
+ return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
};
return forward;
@@ -10505,7 +11105,7 @@
point = cartesian(point), point[0] -= cosRadius;
cartesianNormalizeInPlace(point);
var radius = acos(-point[1]);
- return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;
+ return ((-point[2] < 0 ? -radius : radius) + tau - epsilon$1) % tau;
}
function clipBuffer () {
@@ -10518,7 +11118,7 @@
lineStart: function lineStart() {
lines.push(line = []);
},
- lineEnd: noop,
+ lineEnd: noop$1,
rejoin: function rejoin() {
if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
},
@@ -10532,7 +11132,7 @@
}
function pointEqual (a, b) {
- return abs$2(a[0] - b[0]) < epsilon && abs$2(a[1] - b[1]) < epsilon;
+ return abs$2(a[0] - b[0]) < epsilon$1 && abs$2(a[1] - b[1]) < epsilon$1;
}
function Intersection(point, points, other, entry) {
@@ -10575,7 +11175,7 @@
} // handle degenerate cases by moving the point
- p1[0] += 2 * epsilon;
+ p1[0] += 2 * epsilon$1;
}
subject.push(x = new Intersection(p0, segment, null, true));
@@ -10673,7 +11273,7 @@
angle = 0,
winding = 0;
var sum = new Adder();
- if (sinPhi === 1) phi = halfPi + epsilon;else if (sinPhi === -1) phi = -halfPi - epsilon;
+ if (sinPhi === 1) phi = halfPi + epsilon$1;else if (sinPhi === -1) phi = -halfPi - epsilon$1;
for (var i = 0, n = polygon.length; i < n; ++i) {
if (!(m = (ring = polygon[i]).length)) continue;
@@ -10724,7 +11324,7 @@
// same side as the South pole.
- return (angle < -epsilon || angle < epsilon && sum < -epsilon2) ^ winding & 1;
+ return (angle < -epsilon$1 || angle < epsilon$1 && sum < -epsilon2$1) ^ winding & 1;
}
function clip (pointVisible, clipLine, interpolate, start) {
@@ -10751,7 +11351,7 @@
clip.point = point;
clip.lineStart = lineStart;
clip.lineEnd = lineEnd;
- segments = merge(segments);
+ segments = merge$4(segments);
var startInside = polygonContains(polygon, start);
if (segments.length) {
@@ -10853,7 +11453,7 @@
function compareIntersection(a, b) {
- 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]);
+ return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon$1 : halfPi - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon$1 : halfPi - b[1]);
}
var clipAntimeridian = clip(function () {
@@ -10878,7 +11478,7 @@
var sign1 = lambda1 > 0 ? pi : -pi,
delta = abs$2(lambda1 - lambda0);
- if (abs$2(delta - pi) < epsilon) {
+ if (abs$2(delta - pi) < epsilon$1) {
// line crosses a pole
stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);
stream.point(sign0, phi0);
@@ -10889,9 +11489,9 @@
_clean = 0;
} else if (sign0 !== sign1 && delta >= pi) {
// line crosses antimeridian
- if (abs$2(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies
+ if (abs$2(lambda0 - sign0) < epsilon$1) lambda0 -= sign0 * epsilon$1; // handle degeneracies
- if (abs$2(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon;
+ if (abs$2(lambda1 - sign1) < epsilon$1) lambda1 -= sign1 * epsilon$1;
phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
stream.point(sign0, phi0);
stream.lineEnd();
@@ -10917,7 +11517,7 @@
var cosPhi0,
cosPhi1,
sinLambda0Lambda1 = sin(lambda0 - lambda1);
- return abs$2(sinLambda0Lambda1) > epsilon ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi0 + phi1) / 2;
+ return abs$2(sinLambda0Lambda1) > epsilon$1 ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi0 + phi1) / 2;
}
function clipAntimeridianInterpolate(from, to, direction, stream) {
@@ -10934,7 +11534,7 @@
stream.point(-pi, -phi);
stream.point(-pi, 0);
stream.point(-pi, phi);
- } else if (abs$2(from[0] - to[0]) > epsilon) {
+ } else if (abs$2(from[0] - to[0]) > epsilon$1) {
var lambda = from[0] < to[0] ? pi : -pi;
phi = direction * lambda / 2;
stream.point(-lambda, phi);
@@ -10949,7 +11549,7 @@
var cr = cos(radius),
delta = 6 * radians,
smallRadius = cr > 0,
- notHemisphere = abs$2(cr) > epsilon; // TODO optimise for this common case
+ notHemisphere = abs$2(cr) > epsilon$1; // TODO optimise for this common case
function interpolate(from, to, direction, stream) {
circleStream(stream, radius, delta, direction, from, to);
@@ -11070,7 +11670,7 @@
uu = cartesianDot(u, u),
t2 = w * w - uu * (cartesianDot(A, A) - 1);
if (t2 < 0) return;
- var t = sqrt$1(t2),
+ var t = sqrt(t2),
q = cartesianScale(u, (-w - t) / uu);
cartesianAddInPlace(q, A);
q = spherical(q);
@@ -11083,11 +11683,11 @@
z;
if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
var delta = lambda1 - lambda0,
- polar = abs$2(delta - pi) < epsilon,
- meridian = polar || delta < epsilon;
+ polar = abs$2(delta - pi) < epsilon$1,
+ meridian = polar || delta < epsilon$1;
if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; // Check that the first point is between a and b.
- if (meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
+ if (meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon$1 ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
var q1 = cartesianScale(u, (-w + t) / uu);
cartesianAddInPlace(q1, A);
return [q, spherical(q1)];
@@ -11197,7 +11797,7 @@
}
function corner(p, direction) {
- return abs$2(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 : abs$2(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 : abs$2(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
+ return abs$2(p[0] - x0) < epsilon$1 ? direction > 0 ? 0 : 3 : abs$2(p[0] - x1) < epsilon$1 ? direction > 0 ? 2 : 1 : abs$2(p[1] - y0) < epsilon$1 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
}
function compareIntersection(a, b) {
@@ -11264,7 +11864,7 @@
function polygonEnd() {
var startInside = polygonInside(),
cleanInside = clean && startInside,
- visible = (segments = merge(segments)).length;
+ visible = (segments = merge$4(segments)).length;
if (cleanInside || visible) {
stream.polygonStart();
@@ -11348,109 +11948,109 @@
};
}
- var lengthSum, lambda0$2, sinPhi0$1, cosPhi0$1;
- var lengthStream = {
- sphere: noop,
- point: noop,
+ var lengthSum$1, lambda0, sinPhi0, cosPhi0;
+ var lengthStream$1 = {
+ sphere: noop$1,
+ point: noop$1,
lineStart: lengthLineStart,
- lineEnd: noop,
- polygonStart: noop,
- polygonEnd: noop
+ lineEnd: noop$1,
+ polygonStart: noop$1,
+ polygonEnd: noop$1
};
function lengthLineStart() {
- lengthStream.point = lengthPointFirst;
- lengthStream.lineEnd = lengthLineEnd;
+ lengthStream$1.point = lengthPointFirst$1;
+ lengthStream$1.lineEnd = lengthLineEnd;
}
function lengthLineEnd() {
- lengthStream.point = lengthStream.lineEnd = noop;
+ lengthStream$1.point = lengthStream$1.lineEnd = noop$1;
}
- function lengthPointFirst(lambda, phi) {
+ function lengthPointFirst$1(lambda, phi) {
lambda *= radians, phi *= radians;
- lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi);
- lengthStream.point = lengthPoint;
+ lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi);
+ lengthStream$1.point = lengthPoint$1;
}
- function lengthPoint(lambda, phi) {
+ function lengthPoint$1(lambda, phi) {
lambda *= radians, phi *= radians;
var sinPhi = sin(phi),
cosPhi = cos(phi),
- delta = abs$2(lambda - lambda0$2),
+ delta = abs$2(lambda - lambda0),
cosDelta = cos(delta),
sinDelta = sin(delta),
x = cosPhi * sinDelta,
- y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
- z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
- lengthSum.add(atan2(sqrt$1(x * x + y * y), z));
- lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
+ y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,
+ z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;
+ lengthSum$1.add(atan2(sqrt(x * x + y * y), z));
+ lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;
}
function d3_geoLength (object) {
- lengthSum = new Adder();
- d3_geoStream(object, lengthStream);
- return +lengthSum;
+ lengthSum$1 = new Adder();
+ d3_geoStream(object, lengthStream$1);
+ return +lengthSum$1;
}
- var identity = (function (x) {
+ var identity$4 = (function (x) {
return x;
});
- var areaSum$1 = new Adder(),
- areaRingSum$1 = new Adder(),
- x00,
- y00,
- x0$1,
- y0$1;
- var areaStream$1 = {
- point: noop,
- lineStart: noop,
- lineEnd: noop,
+ var areaSum = new Adder(),
+ areaRingSum = new Adder(),
+ x00$2,
+ y00$2,
+ x0$3,
+ y0$3;
+ var areaStream = {
+ point: noop$1,
+ lineStart: noop$1,
+ lineEnd: noop$1,
polygonStart: function polygonStart() {
- areaStream$1.lineStart = areaRingStart$1;
- areaStream$1.lineEnd = areaRingEnd$1;
+ areaStream.lineStart = areaRingStart;
+ areaStream.lineEnd = areaRingEnd;
},
polygonEnd: function polygonEnd() {
- areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop;
- areaSum$1.add(abs$2(areaRingSum$1));
- areaRingSum$1 = new Adder();
+ areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$1;
+ areaSum.add(abs$2(areaRingSum));
+ areaRingSum = new Adder();
},
result: function result() {
- var area = areaSum$1 / 2;
- areaSum$1 = new Adder();
+ var area = areaSum / 2;
+ areaSum = new Adder();
return area;
}
};
- function areaRingStart$1() {
- areaStream$1.point = areaPointFirst$1;
+ function areaRingStart() {
+ areaStream.point = areaPointFirst;
}
- function areaPointFirst$1(x, y) {
- areaStream$1.point = areaPoint$1;
- x00 = x0$1 = x, y00 = y0$1 = y;
+ function areaPointFirst(x, y) {
+ areaStream.point = areaPoint;
+ x00$2 = x0$3 = x, y00$2 = y0$3 = y;
}
- function areaPoint$1(x, y) {
- areaRingSum$1.add(y0$1 * x - x0$1 * y);
- x0$1 = x, y0$1 = y;
+ function areaPoint(x, y) {
+ areaRingSum.add(y0$3 * x - x0$3 * y);
+ x0$3 = x, y0$3 = y;
}
- function areaRingEnd$1() {
- areaPoint$1(x00, y00);
+ function areaRingEnd() {
+ areaPoint(x00$2, y00$2);
}
var x0$2 = Infinity,
y0$2 = x0$2,
x1 = -x0$2,
y1 = x1;
- var boundsStream$1 = {
- point: boundsPoint$1,
- lineStart: noop,
- lineEnd: noop,
- polygonStart: noop,
- polygonEnd: noop,
+ var boundsStream = {
+ point: boundsPoint,
+ lineStart: noop$1,
+ lineEnd: noop$1,
+ polygonStart: noop$1,
+ polygonEnd: noop$1,
result: function result() {
var bounds = [[x0$2, y0$2], [x1, y1]];
x1 = y1 = -(y0$2 = x0$2 = Infinity);
@@ -11458,100 +12058,100 @@
}
};
- function boundsPoint$1(x, y) {
+ function boundsPoint(x, y) {
if (x < x0$2) x0$2 = x;
if (x > x1) x1 = x;
if (y < y0$2) y0$2 = y;
if (y > y1) y1 = y;
}
- var X0$1 = 0,
- Y0$1 = 0,
- Z0$1 = 0,
- X1$1 = 0,
- Y1$1 = 0,
- Z1$1 = 0,
- X2$1 = 0,
- Y2$1 = 0,
- Z2$1 = 0,
+ var X0 = 0,
+ Y0 = 0,
+ Z0 = 0,
+ X1 = 0,
+ Y1 = 0,
+ Z1 = 0,
+ X2 = 0,
+ Y2 = 0,
+ Z2 = 0,
x00$1,
y00$1,
- x0$3,
- y0$3;
- var centroidStream$1 = {
- point: centroidPoint$1,
- lineStart: centroidLineStart$1,
- lineEnd: centroidLineEnd$1,
+ x0$1,
+ y0$1;
+ var centroidStream = {
+ point: centroidPoint,
+ lineStart: centroidLineStart,
+ lineEnd: centroidLineEnd,
polygonStart: function polygonStart() {
- centroidStream$1.lineStart = centroidRingStart$1;
- centroidStream$1.lineEnd = centroidRingEnd$1;
+ centroidStream.lineStart = centroidRingStart;
+ centroidStream.lineEnd = centroidRingEnd;
},
polygonEnd: function polygonEnd() {
- centroidStream$1.point = centroidPoint$1;
- centroidStream$1.lineStart = centroidLineStart$1;
- centroidStream$1.lineEnd = centroidLineEnd$1;
+ centroidStream.point = centroidPoint;
+ centroidStream.lineStart = centroidLineStart;
+ centroidStream.lineEnd = centroidLineEnd;
},
result: function result() {
- var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] : [NaN, NaN];
- X0$1 = Y0$1 = Z0$1 = X1$1 = Y1$1 = Z1$1 = X2$1 = Y2$1 = Z2$1 = 0;
+ var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];
+ X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;
return centroid;
}
};
- function centroidPoint$1(x, y) {
- X0$1 += x;
- Y0$1 += y;
- ++Z0$1;
+ function centroidPoint(x, y) {
+ X0 += x;
+ Y0 += y;
+ ++Z0;
}
- function centroidLineStart$1() {
- centroidStream$1.point = centroidPointFirstLine;
+ function centroidLineStart() {
+ centroidStream.point = centroidPointFirstLine;
}
function centroidPointFirstLine(x, y) {
- centroidStream$1.point = centroidPointLine;
- centroidPoint$1(x0$3 = x, y0$3 = y);
+ centroidStream.point = centroidPointLine;
+ centroidPoint(x0$1 = x, y0$1 = y);
}
function centroidPointLine(x, y) {
- var dx = x - x0$3,
- dy = y - y0$3,
- z = sqrt$1(dx * dx + dy * dy);
- X1$1 += z * (x0$3 + x) / 2;
- Y1$1 += z * (y0$3 + y) / 2;
- Z1$1 += z;
- centroidPoint$1(x0$3 = x, y0$3 = y);
+ var dx = x - x0$1,
+ dy = y - y0$1,
+ z = sqrt(dx * dx + dy * dy);
+ X1 += z * (x0$1 + x) / 2;
+ Y1 += z * (y0$1 + y) / 2;
+ Z1 += z;
+ centroidPoint(x0$1 = x, y0$1 = y);
}
- function centroidLineEnd$1() {
- centroidStream$1.point = centroidPoint$1;
+ function centroidLineEnd() {
+ centroidStream.point = centroidPoint;
}
- function centroidRingStart$1() {
- centroidStream$1.point = centroidPointFirstRing;
+ function centroidRingStart() {
+ centroidStream.point = centroidPointFirstRing;
}
- function centroidRingEnd$1() {
+ function centroidRingEnd() {
centroidPointRing(x00$1, y00$1);
}
function centroidPointFirstRing(x, y) {
- centroidStream$1.point = centroidPointRing;
- centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
+ centroidStream.point = centroidPointRing;
+ centroidPoint(x00$1 = x0$1 = x, y00$1 = y0$1 = y);
}
function centroidPointRing(x, y) {
- var dx = x - x0$3,
- dy = y - y0$3,
- z = sqrt$1(dx * dx + dy * dy);
- X1$1 += z * (x0$3 + x) / 2;
- Y1$1 += z * (y0$3 + y) / 2;
- Z1$1 += z;
- z = y0$3 * x - x0$3 * y;
- X2$1 += z * (x0$3 + x);
- Y2$1 += z * (y0$3 + y);
- Z2$1 += z * 3;
- centroidPoint$1(x0$3 = x, y0$3 = y);
+ var dx = x - x0$1,
+ dy = y - y0$1,
+ z = sqrt(dx * dx + dy * dy);
+ X1 += z * (x0$1 + x) / 2;
+ Y1 += z * (y0$1 + y) / 2;
+ Z1 += z;
+ z = y0$1 * x - x0$1 * y;
+ X2 += z * (x0$1 + x);
+ Y2 += z * (y0$1 + y);
+ Z2 += z * 3;
+ centroidPoint(x0$1 = x, y0$1 = y);
}
function PathContext(context) {
@@ -11602,23 +12202,23 @@
}
}
},
- result: noop
+ result: noop$1
};
- var lengthSum$1 = new Adder(),
+ var lengthSum = new Adder(),
lengthRing,
- x00$2,
- y00$2,
- x0$4,
- y0$4;
- var lengthStream$1 = {
- point: noop,
+ x00,
+ y00,
+ x0,
+ y0;
+ var lengthStream = {
+ point: noop$1,
lineStart: function lineStart() {
- lengthStream$1.point = lengthPointFirst$1;
+ lengthStream.point = lengthPointFirst;
},
lineEnd: function lineEnd() {
- if (lengthRing) lengthPoint$1(x00$2, y00$2);
- lengthStream$1.point = noop;
+ if (lengthRing) lengthPoint(x00, y00);
+ lengthStream.point = noop$1;
},
polygonStart: function polygonStart() {
lengthRing = true;
@@ -11627,21 +12227,21 @@
lengthRing = null;
},
result: function result() {
- var length = +lengthSum$1;
- lengthSum$1 = new Adder();
+ var length = +lengthSum;
+ lengthSum = new Adder();
return length;
}
};
- function lengthPointFirst$1(x, y) {
- lengthStream$1.point = lengthPoint$1;
- x00$2 = x0$4 = x, y00$2 = y0$4 = y;
+ function lengthPointFirst(x, y) {
+ lengthStream.point = lengthPoint;
+ x00 = x0 = x, y00 = y0 = y;
}
- function lengthPoint$1(x, y) {
- x0$4 -= x, y0$4 -= y;
- lengthSum$1.add(sqrt$1(x0$4 * x0$4 + y0$4 * y0$4));
- x0$4 = x, y0$4 = y;
+ function lengthPoint(x, y) {
+ x0 -= x, y0 -= y;
+ lengthSum.add(sqrt(x0 * x0 + y0 * y0));
+ x0 = x, y0 = y;
}
function PathString() {
@@ -11725,27 +12325,27 @@
}
path.area = function (object) {
- d3_geoStream(object, projectionStream(areaStream$1));
- return areaStream$1.result();
+ d3_geoStream(object, projectionStream(areaStream));
+ return areaStream.result();
};
path.measure = function (object) {
- d3_geoStream(object, projectionStream(lengthStream$1));
- return lengthStream$1.result();
+ d3_geoStream(object, projectionStream(lengthStream));
+ return lengthStream.result();
};
path.bounds = function (object) {
- d3_geoStream(object, projectionStream(boundsStream$1));
- return boundsStream$1.result();
+ d3_geoStream(object, projectionStream(boundsStream));
+ return boundsStream.result();
};
path.centroid = function (object) {
- d3_geoStream(object, projectionStream(centroidStream$1));
- return centroidStream$1.result();
+ d3_geoStream(object, projectionStream(centroidStream));
+ return centroidStream.result();
};
path.projection = function (_) {
- return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection;
+ return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
};
path.context = function (_) {
@@ -11766,10 +12366,10 @@
function d3_geoTransform (methods) {
return {
- stream: transformer(methods)
+ stream: transformer$1(methods)
};
}
- function transformer(methods) {
+ function transformer$1(methods) {
return function (stream) {
var s = new TransformStream();
@@ -11810,8 +12410,8 @@
var clip = projection.clipExtent && projection.clipExtent();
projection.scale(150).translate([0, 0]);
if (clip != null) projection.clipExtent(null);
- d3_geoStream(object, projection.stream(boundsStream$1));
- fitBounds(boundsStream$1.result());
+ d3_geoStream(object, projection.stream(boundsStream));
+ fitBounds(boundsStream.result());
if (clip != null) projection.clipExtent(clip);
return projection;
}
@@ -11857,7 +12457,7 @@
}
function resampleNone(project) {
- return transformer({
+ return transformer$1({
point: function point(x, y) {
x = project(x, y);
this.stream.point(x[0], x[1]);
@@ -11875,9 +12475,9 @@
var a = a0 + a1,
b = b0 + b1,
c = c0 + c1,
- m = sqrt$1(a * a + b * b + c * c),
+ m = sqrt(a * a + b * b + c * c),
phi2 = asin(c /= m),
- lambda2 = abs$2(abs$2(c) - 1) < epsilon || abs$2(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),
+ lambda2 = abs$2(abs$2(c) - 1) < epsilon$1 || abs$2(lambda0 - lambda1) < epsilon$1 ? (lambda0 + lambda1) / 2 : atan2(b, a),
p = project(lambda2, phi2),
x2 = p[0],
y2 = p[1],
@@ -11958,14 +12558,14 @@
};
}
- var transformRadians = transformer({
+ var transformRadians = transformer$1({
point: function point(x, y) {
this.stream.point(x * radians, y * radians);
}
});
function transformRotate(rotate) {
- return transformer({
+ return transformer$1({
point: function point(x, y) {
var r = rotate(x, y);
return this.stream.point(r[0], r[1]);
@@ -12044,7 +12644,7 @@
y0,
x1,
y1,
- postclip = identity,
+ postclip = identity$4,
// post-clip extent
delta2 = 0.5,
// precision
@@ -12060,7 +12660,7 @@
function invert(point) {
point = projectRotateTransform.invert(point[0], point[1]);
- return point && [point[0] * degrees, point[1] * degrees];
+ return point && [point[0] * degrees$1, point[1] * degrees$1];
}
projection.stream = function (stream) {
@@ -12076,11 +12676,11 @@
};
projection.clipAngle = function (_) {
- return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees;
+ return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
};
projection.clipExtent = function (_) {
- return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
+ return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
};
projection.scale = function (_) {
@@ -12092,15 +12692,15 @@
};
projection.center = function (_) {
- return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];
+ return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
};
projection.rotate = function (_) {
- 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];
+ return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1];
};
projection.angle = function (_) {
- return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;
+ return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1;
};
projection.reflectX = function (_) {
@@ -12112,7 +12712,7 @@
};
projection.precision = function (_) {
- return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt$1(delta2);
+ return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
};
projection.fitExtent = function (extent, object) {
@@ -12158,7 +12758,7 @@
}
mercatorRaw.invert = function (x, y) {
- return [x, 2 * atan(exp(y)) - halfPi];
+ return [x, 2 * atan(exp$2(y)) - halfPi];
};
function mercator () {
@@ -12218,13 +12818,13 @@
// clip extent
kx = 1,
ky = 1,
- transform = transformer({
+ transform = transformer$1({
point: function point(x, y) {
var p = projection([x, y]);
this.stream.point(p[0], p[1]);
}
}),
- postclip = identity,
+ postclip = identity$4,
cache,
cacheStream;
@@ -12270,7 +12870,7 @@
};
projection.clipExtent = function (_) {
- return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
+ return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
};
projection.scale = function (_) {
@@ -12282,7 +12882,7 @@
};
projection.angle = function (_) {
- return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees;
+ return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees$1;
};
projection.reflectX = function (_) {
@@ -12466,34 +13066,37 @@
}
});
- var $every$1 = arrayIteration.every;
-
+ var $$w = _export;
+ var $every = arrayIteration.every;
+ var arrayMethodIsStrict$2 = arrayMethodIsStrict$9;
- var STRICT_METHOD$6 = arrayMethodIsStrict('every');
+ var STRICT_METHOD$2 = arrayMethodIsStrict$2('every');
// `Array.prototype.every` method
// https://tc39.es/ecma262/#sec-array.prototype.every
- _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$6 }, {
+ $$w({ target: 'Array', proto: true, forced: !STRICT_METHOD$2 }, {
every: function every(callbackfn /* , thisArg */) {
- return $every$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
- var $reduce$1 = arrayReduce.left;
-
-
-
+ var $$v = _export;
+ var $reduce = arrayReduce.left;
+ var arrayMethodIsStrict$1 = arrayMethodIsStrict$9;
+ var CHROME_VERSION$1 = engineV8Version;
+ var IS_NODE$1 = engineIsNode;
- var STRICT_METHOD$7 = arrayMethodIsStrict('reduce');
+ var STRICT_METHOD$1 = arrayMethodIsStrict$1('reduce');
// Chrome 80-82 has a critical bug
// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
- var CHROME_BUG = !engineIsNode && engineV8Version > 79 && engineV8Version < 83;
+ var CHROME_BUG$1 = !IS_NODE$1 && CHROME_VERSION$1 > 79 && CHROME_VERSION$1 < 83;
// `Array.prototype.reduce` method
// https://tc39.es/ecma262/#sec-array.prototype.reduce
- _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$7 || CHROME_BUG }, {
+ $$v({ target: 'Array', proto: true, forced: !STRICT_METHOD$1 || CHROME_BUG$1 }, {
reduce: function reduce(callbackfn /* , initialValue */) {
- return $reduce$1(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+ var length = arguments.length;
+ return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);
}
});
@@ -13018,10 +13621,22 @@
var x = 0;
var y = 0;
- if (point[0] > dimensions[0] - pad[1]) x = -10;
- if (point[0] < pad[3]) x = 10;
- if (point[1] > dimensions[1] - pad[2]) y = -10;
- if (point[1] < pad[0]) y = 10;
+
+ if (point[0] > dimensions[0] - pad[1]) {
+ x = -10;
+ }
+
+ if (point[0] < pad[3]) {
+ x = 10;
+ }
+
+ if (point[1] > dimensions[1] - pad[2]) {
+ y = -10;
+ }
+
+ if (point[1] < pad[0]) {
+ y = 10;
+ }
if (x || y) {
return [x, y];
@@ -13030,24 +13645,24 @@
}
}
- var noop$1 = {
+ var noop = {
value: function value() {}
};
- function dispatch() {
+ function dispatch$8() {
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t)) throw new Error("illegal type: " + t);
_[t] = [];
}
- return new Dispatch$1(_);
+ return new Dispatch(_);
}
- function Dispatch$1(_) {
+ function Dispatch(_) {
this._ = _;
}
- function parseTypenames(typenames, types) {
+ function parseTypenames$1(typenames, types) {
return typenames.trim().split(/^|\s+/).map(function (t) {
var name = "",
i = t.indexOf(".");
@@ -13060,18 +13675,18 @@
});
}
- Dispatch$1.prototype = dispatch.prototype = {
- constructor: Dispatch$1,
+ Dispatch.prototype = dispatch$8.prototype = {
+ constructor: Dispatch,
on: function on(typename, callback) {
var _ = this._,
- T = parseTypenames(typename + "", _),
+ T = parseTypenames$1(typename + "", _),
t,
i = -1,
n = T.length; // If no callback was specified, return the callback of the given type and name.
if (arguments.length < 2) {
while (++i < n) {
- if ((t = (typename = T[i]).type) && (t = get$3(_[t], typename.name))) return t;
+ if ((t = (typename = T[i]).type) && (t = get$2(_[t], typename.name))) return t;
}
return;
@@ -13082,8 +13697,8 @@
if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
while (++i < n) {
- if (t = (typename = T[i]).type) _[t] = set$3(_[t], typename.name, callback);else if (callback == null) for (t in _) {
- _[t] = set$3(_[t], typename.name, null);
+ if (t = (typename = T[i]).type) _[t] = set$1(_[t], typename.name, callback);else if (callback == null) for (t in _) {
+ _[t] = set$1(_[t], typename.name, null);
}
}
@@ -13097,7 +13712,7 @@
copy[t] = _[t].slice();
}
- return new Dispatch$1(copy);
+ return new Dispatch(copy);
},
call: function call(type, that) {
if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) {
@@ -13118,7 +13733,7 @@
}
};
- function get$3(type, name) {
+ function get$2(type, name) {
for (var i = 0, n = type.length, c; i < n; ++i) {
if ((c = type[i]).name === name) {
return c.value;
@@ -13126,10 +13741,10 @@
}
}
- function set$3(type, name, callback) {
+ function set$1(type, name, callback) {
for (var i = 0, n = type.length; i < n; ++i) {
if (type[i].name === name) {
- type[i] = noop$1, type = type.slice(0, i).concat(type.slice(i + 1));
+ type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
break;
}
}
@@ -13199,7 +13814,7 @@
}
}
- return new Selection(subgroups, this._parents);
+ return new Selection$1(subgroups, this._parents);
}
function array (x) {
@@ -13236,28 +13851,29 @@
}
}
- return new Selection(subgroups, parents);
+ return new Selection$1(subgroups, parents);
}
- var $find$1 = arrayIteration.find;
-
+ var $$u = _export;
+ var $find = arrayIteration.find;
+ var addToUnscopables$3 = addToUnscopables$6;
var FIND = 'find';
- var SKIPS_HOLES = true;
+ var SKIPS_HOLES$1 = true;
// Shouldn't skip holes
- if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });
+ if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES$1 = false; });
// `Array.prototype.find` method
// https://tc39.es/ecma262/#sec-array.prototype.find
- _export({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
+ $$u({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 }, {
find: function find(callbackfn /* , that = undefined */) {
- return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
- addToUnscopables(FIND);
+ addToUnscopables$3(FIND);
function matcher (selector) {
return function () {
@@ -13270,11 +13886,11 @@
};
}
- var find$1 = Array.prototype.find;
+ var find = Array.prototype.find;
function childFind(match) {
return function () {
- return find$1.call(this.children, match);
+ return find.call(this.children, match);
};
}
@@ -13313,7 +13929,7 @@
}
}
- return new Selection(subgroups, this._parents);
+ return new Selection$1(subgroups, this._parents);
}
function sparse (update) {
@@ -13321,7 +13937,7 @@
}
function selection_enter () {
- return new Selection(this._enter || this._groups.map(sparse), this._parents);
+ return new Selection$1(this._enter || this._groups.map(sparse), this._parents);
}
function EnterNode(parent, datum) {
this.ownerDocument = parent.ownerDocument;
@@ -13346,7 +13962,7 @@
}
};
- function constant (x) {
+ function constant$3 (x) {
return function () {
return x;
};
@@ -13431,7 +14047,7 @@
var bind = key ? bindKey : bindIndex,
parents = this._parents,
groups = this._groups;
- if (typeof value !== "function") value = constant(value);
+ if (typeof value !== "function") value = constant$3(value);
for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
var parent = parents[j],
@@ -13458,14 +14074,14 @@
}
}
- update = new Selection(update, parents);
+ update = new Selection$1(update, parents);
update._enter = enter;
update._exit = exit;
return update;
}
function selection_exit () {
- return new Selection(this._exit || this._groups.map(sparse), this._parents);
+ return new Selection$1(this._exit || this._groups.map(sparse), this._parents);
}
function selection_join (onenter, onupdate, onexit) {
@@ -13479,7 +14095,7 @@
}
function selection_merge (selection) {
- if (!(selection instanceof Selection)) throw new Error("invalid merge");
+ if (!(selection instanceof Selection$1)) throw new Error("invalid merge");
for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
@@ -13493,7 +14109,7 @@
merges[j] = groups0[j];
}
- return new Selection(merges, this._parents);
+ return new Selection$1(merges, this._parents);
}
function selection_order () {
@@ -13526,7 +14142,7 @@
sortgroup.sort(compareNode);
}
- return new Selection(sortgroups, this._parents).order();
+ return new Selection$1(sortgroups, this._parents).order();
}
function ascending(a, b) {
@@ -13590,38 +14206,38 @@
return this;
}
- function attrRemove(name) {
+ function attrRemove$1(name) {
return function () {
this.removeAttribute(name);
};
}
- function attrRemoveNS(fullname) {
+ function attrRemoveNS$1(fullname) {
return function () {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
- function attrConstant(name, value) {
+ function attrConstant$1(name, value) {
return function () {
this.setAttribute(name, value);
};
}
- function attrConstantNS(fullname, value) {
+ function attrConstantNS$1(fullname, value) {
return function () {
this.setAttributeNS(fullname.space, fullname.local, value);
};
}
- function attrFunction(name, value) {
+ function attrFunction$1(name, value) {
return function () {
var v = value.apply(this, arguments);
if (v == null) this.removeAttribute(name);else this.setAttribute(name, v);
};
}
- function attrFunctionNS(fullname, value) {
+ function attrFunctionNS$1(fullname, value) {
return function () {
var v = value.apply(this, arguments);
if (v == null) this.removeAttributeNS(fullname.space, fullname.local);else this.setAttributeNS(fullname.space, fullname.local, v);
@@ -13636,28 +14252,28 @@
return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname);
}
- return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value));
+ return this.each((value == null ? fullname.local ? attrRemoveNS$1 : attrRemove$1 : typeof value === "function" ? fullname.local ? attrFunctionNS$1 : attrFunction$1 : fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, value));
}
function defaultView (node) {
- return node.ownerDocument && node.ownerDocument.defaultView || // node is a Node
- node.document && node // node is a Window
+ return node.ownerDocument && node.ownerDocument.defaultView // node is a Node
+ || node.document && node // node is a Window
|| node.defaultView; // node is a Document
}
- function styleRemove(name) {
+ function styleRemove$1(name) {
return function () {
this.style.removeProperty(name);
};
}
- function styleConstant(name, value, priority) {
+ function styleConstant$1(name, value, priority) {
return function () {
this.style.setProperty(name, value, priority);
};
}
- function styleFunction(name, value, priority) {
+ function styleFunction$1(name, value, priority) {
return function () {
var v = value.apply(this, arguments);
if (v == null) this.style.removeProperty(name);else this.style.setProperty(name, v, priority);
@@ -13665,7 +14281,7 @@
}
function selection_style (name, value, priority) {
- return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name);
+ return arguments.length > 1 ? this.each((value == null ? styleRemove$1 : typeof value === "function" ? styleFunction$1 : styleConstant$1)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name);
}
function styleValue(node, name) {
return node.style.getPropertyValue(name) || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
@@ -13791,13 +14407,13 @@
this.textContent = "";
}
- function textConstant(value) {
+ function textConstant$1(value) {
return function () {
this.textContent = value;
};
}
- function textFunction(value) {
+ function textFunction$1(value) {
return function () {
var v = value.apply(this, arguments);
this.textContent = v == null ? "" : v;
@@ -13805,7 +14421,7 @@
}
function selection_text (value) {
- return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent;
+ return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction$1 : textConstant$1)(value)) : this.node().textContent;
}
function htmlRemove() {
@@ -13864,13 +14480,13 @@
});
}
- function remove() {
+ function remove$7() {
var parent = this.parentNode;
if (parent) parent.removeChild(this);
}
function selection_remove () {
- return this.each(remove);
+ return this.each(remove$7);
}
function selection_cloneShallow() {
@@ -13899,7 +14515,7 @@
};
}
- function parseTypenames$1(typenames) {
+ function parseTypenames(typenames) {
return typenames.trim().split(/^|\s+/).map(function (t) {
var name = "",
i = t.indexOf(".");
@@ -13954,7 +14570,7 @@
}
function selection_on (typename, value, options) {
- var typenames = parseTypenames$1(typename + ""),
+ var typenames = parseTypenames(typename + ""),
i,
n = typenames.length,
t;
@@ -13981,7 +14597,7 @@
return this;
}
- function dispatchEvent$1(node, type, params) {
+ function dispatchEvent(node, type, params) {
var window = defaultView(node),
event = window.CustomEvent;
@@ -13997,13 +14613,13 @@
function dispatchConstant(type, params) {
return function () {
- return dispatchEvent$1(this, type, params);
+ return dispatchEvent(this, type, params);
};
}
function dispatchFunction(type, params) {
return function () {
- return dispatchEvent$1(this, type, params.apply(this, arguments));
+ return dispatchEvent(this, type, params.apply(this, arguments));
};
}
@@ -14011,7 +14627,7 @@
return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type, params));
}
- var _marked$2 = /*#__PURE__*/regeneratorRuntime.mark(_callee);
+ var _marked$1 = /*#__PURE__*/regeneratorRuntime.mark(_callee);
function _callee() {
var groups, j, m, group, i, n, node;
@@ -14058,25 +14674,25 @@
return _context.stop();
}
}
- }, _marked$2, this);
+ }, _marked$1, this);
}
- var root = [null];
- function Selection(groups, parents) {
+ var root$1 = [null];
+ function Selection$1(groups, parents) {
this._groups = groups;
this._parents = parents;
}
function selection() {
- return new Selection([[document.documentElement]], root);
+ return new Selection$1([[document.documentElement]], root$1);
}
function selection_selection() {
return this;
}
- Selection.prototype = selection.prototype = _defineProperty({
- constructor: Selection,
+ Selection$1.prototype = selection.prototype = _defineProperty({
+ constructor: Selection$1,
select: selection_select,
selectAll: selection_selectAll,
selectChild: selection_selectChild,
@@ -14114,7 +14730,7 @@
}, Symbol.iterator, _callee);
function select (selector) {
- return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root);
+ return typeof selector === "string" ? new Selection$1([[document.querySelector(selector)]], [document.documentElement]) : new Selection$1([[selector]], root$1);
}
function sourceEvent (event) {
@@ -14151,23 +14767,23 @@
}
function selectAll (selector) {
- return typeof selector === "string" ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) : new Selection([selector == null ? [] : array(selector)], root);
+ return typeof selector === "string" ? new Selection$1([document.querySelectorAll(selector)], [document.documentElement]) : new Selection$1([selector == null ? [] : array(selector)], root$1);
}
- function nopropagation(event) {
+ function nopropagation$1(event) {
event.stopImmediatePropagation();
}
- function noevent (event) {
+ function noevent$1 (event) {
event.preventDefault();
event.stopImmediatePropagation();
}
function dragDisable (view) {
var root = view.document.documentElement,
- selection = select(view).on("dragstart.drag", noevent, true);
+ selection = select(view).on("dragstart.drag", noevent$1, true);
if ("onselectstart" in root) {
- selection.on("selectstart.drag", noevent, true);
+ selection.on("selectstart.drag", noevent$1, true);
} else {
root.__noselect = root.style.MozUserSelect;
root.style.MozUserSelect = "none";
@@ -14178,7 +14794,7 @@
selection = select(view).on("dragstart.drag", null);
if (noclick) {
- selection.on("click.drag", noevent, true);
+ selection.on("click.drag", noevent$1, true);
setTimeout(function () {
selection.on("click.drag", null);
}, 0);
@@ -14192,7 +14808,7 @@
}
}
- var constant$1 = (function (x) {
+ var constant$2 = (function (x) {
return function () {
return x;
};
@@ -14272,7 +14888,7 @@
return value === this._ ? this : value;
};
- function defaultFilter(event) {
+ function defaultFilter$2(event) {
return !event.ctrlKey && !event.button;
}
@@ -14287,17 +14903,17 @@
} : d;
}
- function defaultTouchable() {
+ function defaultTouchable$1() {
return navigator.maxTouchPoints || "ontouchstart" in this;
}
function d3_drag () {
- var filter = defaultFilter,
+ var filter = defaultFilter$2,
container = defaultContainer,
subject = defaultSubject,
- touchable = defaultTouchable,
+ touchable = defaultTouchable$1,
gestures = {},
- listeners = dispatch("start", "drag", "end"),
+ listeners = dispatch$8("start", "drag", "end"),
active = 0,
mousedownx,
mousedowny,
@@ -14315,7 +14931,7 @@
if (!gesture) return;
select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
dragDisable(event.view);
- nopropagation(event);
+ nopropagation$1(event);
mousemoving = false;
mousedownx = event.clientX;
mousedowny = event.clientY;
@@ -14323,7 +14939,7 @@
}
function mousemoved(event) {
- noevent(event);
+ noevent$1(event);
if (!mousemoving) {
var dx = event.clientX - mousedownx,
@@ -14337,7 +14953,7 @@
function mouseupped(event) {
select(event.view).on("mousemove.drag mouseup.drag", null);
yesdrag(event.view, mousemoving);
- noevent(event);
+ noevent$1(event);
gestures.mouse("end", event);
}
@@ -14351,7 +14967,7 @@
for (i = 0; i < n; ++i) {
if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {
- nopropagation(event);
+ nopropagation$1(event);
gesture("start", event, touches[i]);
}
}
@@ -14365,7 +14981,7 @@
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
- noevent(event);
+ noevent$1(event);
gesture("drag", event, touches[i]);
}
}
@@ -14383,7 +14999,7 @@
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
- nopropagation(event);
+ nopropagation$1(event);
gesture("end", event, touches[i]);
}
}
@@ -14442,19 +15058,19 @@
}
drag.filter = function (_) {
- return arguments.length ? (filter = typeof _ === "function" ? _ : constant$1(!!_), drag) : filter;
+ return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
};
drag.container = function (_) {
- return arguments.length ? (container = typeof _ === "function" ? _ : constant$1(_), drag) : container;
+ return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
};
drag.subject = function (_) {
- return arguments.length ? (subject = typeof _ === "function" ? _ : constant$1(_), drag) : subject;
+ return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
};
drag.touchable = function (_) {
- return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$1(!!_), drag) : touchable;
+ return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
};
drag.on = function () {
@@ -14469,82 +15085,201 @@
return drag;
}
- var defineProperty$8 = objectDefineProperty.f;
+ var DESCRIPTORS$4 = descriptors;
+ var global$b = global$1o;
+ var uncurryThis$e = functionUncurryThis;
+ var isForced$1 = isForced_1;
+ var inheritIfRequired$1 = inheritIfRequired$4;
+ var createNonEnumerableProperty = createNonEnumerableProperty$b;
+ var defineProperty$1 = objectDefineProperty.f;
var getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;
+ var isPrototypeOf$1 = objectIsPrototypeOf;
+ var isRegExp$1 = isRegexp;
+ var toString$9 = toString$k;
+ var regExpFlags$1 = regexpFlags$1;
+ var stickyHelpers = regexpStickyHelpers;
+ var redefine$3 = redefine$h.exports;
+ var fails$a = fails$V;
+ var hasOwn$2 = hasOwnProperty_1;
+ var enforceInternalState = internalState.enforce;
+ var setSpecies = setSpecies$5;
+ var wellKnownSymbol$1 = wellKnownSymbol$t;
+ var UNSUPPORTED_DOT_ALL = regexpUnsupportedDotAll;
+ var UNSUPPORTED_NCG = regexpUnsupportedNcg;
-
-
-
-
- var setInternalState$8 = internalState.set;
-
-
-
- var MATCH$1 = wellKnownSymbol('match');
- var NativeRegExp = global_1.RegExp;
+ var MATCH$1 = wellKnownSymbol$1('match');
+ var NativeRegExp = global$b.RegExp;
var RegExpPrototype$1 = NativeRegExp.prototype;
+ var SyntaxError$1 = global$b.SyntaxError;
+ var getFlags = uncurryThis$e(regExpFlags$1);
+ var exec$2 = uncurryThis$e(RegExpPrototype$1.exec);
+ var charAt$1 = uncurryThis$e(''.charAt);
+ var replace$3 = uncurryThis$e(''.replace);
+ var stringIndexOf$1 = uncurryThis$e(''.indexOf);
+ var stringSlice$4 = uncurryThis$e(''.slice);
+ // TODO: Use only propper RegExpIdentifierName
+ var IS_NCG = /^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/;
var re1 = /a/g;
var re2 = /a/g;
// "new" should create a new object, old webkit bug
var CORRECT_NEW = new NativeRegExp(re1) !== re1;
- var UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y;
+ var MISSED_STICKY = stickyHelpers.MISSED_STICKY;
+ var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;
+
+ var BASE_FORCED = DESCRIPTORS$4 &&
+ (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails$a(function () {
+ re2[MATCH$1] = false;
+ // RegExp constructor can alter flags and IsRegExp works correct with @@match
+ return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';
+ }));
+
+ var handleDotAll = function (string) {
+ var length = string.length;
+ var index = 0;
+ var result = '';
+ var brackets = false;
+ var chr;
+ for (; index <= length; index++) {
+ chr = charAt$1(string, index);
+ if (chr === '\\') {
+ result += chr + charAt$1(string, ++index);
+ continue;
+ }
+ if (!brackets && chr === '.') {
+ result += '[\\s\\S]';
+ } else {
+ if (chr === '[') {
+ brackets = true;
+ } else if (chr === ']') {
+ brackets = false;
+ } result += chr;
+ }
+ } return result;
+ };
- var FORCED$b = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$2 || fails(function () {
- re2[MATCH$1] = false;
- // RegExp constructor can alter flags and IsRegExp works correct with @@match
- return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';
- })));
+ var handleNCG = function (string) {
+ var length = string.length;
+ var index = 0;
+ var result = '';
+ var named = [];
+ var names = {};
+ var brackets = false;
+ var ncg = false;
+ var groupid = 0;
+ var groupname = '';
+ var chr;
+ for (; index <= length; index++) {
+ chr = charAt$1(string, index);
+ if (chr === '\\') {
+ chr = chr + charAt$1(string, ++index);
+ } else if (chr === ']') {
+ brackets = false;
+ } else if (!brackets) switch (true) {
+ case chr === '[':
+ brackets = true;
+ break;
+ case chr === '(':
+ if (exec$2(IS_NCG, stringSlice$4(string, index + 1))) {
+ index += 2;
+ ncg = true;
+ }
+ result += chr;
+ groupid++;
+ continue;
+ case chr === '>' && ncg:
+ if (groupname === '' || hasOwn$2(names, groupname)) {
+ throw new SyntaxError$1('Invalid capture group name');
+ }
+ names[groupname] = true;
+ named[named.length] = [groupname, groupid];
+ ncg = false;
+ groupname = '';
+ continue;
+ }
+ if (ncg) groupname += chr;
+ else result += chr;
+ } return [result, named];
+ };
// `RegExp` constructor
// https://tc39.es/ecma262/#sec-regexp-constructor
- if (FORCED$b) {
+ if (isForced$1('RegExp', BASE_FORCED)) {
var RegExpWrapper = function RegExp(pattern, flags) {
- var thisIsRegExp = this instanceof RegExpWrapper;
- var patternIsRegExp = isRegexp(pattern);
+ var thisIsRegExp = isPrototypeOf$1(RegExpPrototype$1, this);
+ var patternIsRegExp = isRegExp$1(pattern);
var flagsAreUndefined = flags === undefined;
- var sticky;
+ var groups = [];
+ var rawPattern = pattern;
+ var rawFlags, dotAll, sticky, handled, result, state;
- if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {
+ if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {
return pattern;
}
- if (CORRECT_NEW) {
- if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;
- } else if (pattern instanceof RegExpWrapper) {
- if (flagsAreUndefined) flags = regexpFlags.call(pattern);
+ if (patternIsRegExp || isPrototypeOf$1(RegExpPrototype$1, pattern)) {
pattern = pattern.source;
+ if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : getFlags(rawPattern);
+ }
+
+ pattern = pattern === undefined ? '' : toString$9(pattern);
+ flags = flags === undefined ? '' : toString$9(flags);
+ rawPattern = pattern;
+
+ if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {
+ dotAll = !!flags && stringIndexOf$1(flags, 's') > -1;
+ if (dotAll) flags = replace$3(flags, /s/g, '');
}
- if (UNSUPPORTED_Y$2) {
- sticky = !!flags && flags.indexOf('y') > -1;
- if (sticky) flags = flags.replace(/y/g, '');
+ rawFlags = flags;
+
+ if (MISSED_STICKY && 'sticky' in re1) {
+ sticky = !!flags && stringIndexOf$1(flags, 'y') > -1;
+ if (sticky && UNSUPPORTED_Y) flags = replace$3(flags, /y/g, '');
}
- var result = inheritIfRequired(
- CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),
- thisIsRegExp ? this : RegExpPrototype$1,
- RegExpWrapper
- );
+ if (UNSUPPORTED_NCG) {
+ handled = handleNCG(pattern);
+ pattern = handled[0];
+ groups = handled[1];
+ }
+
+ result = inheritIfRequired$1(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype$1, RegExpWrapper);
+
+ if (dotAll || sticky || groups.length) {
+ state = enforceInternalState(result);
+ if (dotAll) {
+ state.dotAll = true;
+ state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);
+ }
+ if (sticky) state.sticky = true;
+ if (groups.length) state.groups = groups;
+ }
- if (UNSUPPORTED_Y$2 && sticky) setInternalState$8(result, { sticky: sticky });
+ if (pattern !== rawPattern) try {
+ // fails in old engines, but we have no alternatives for unsupported regex syntax
+ createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);
+ } catch (error) { /* empty */ }
return result;
};
+
var proxy = function (key) {
- key in RegExpWrapper || defineProperty$8(RegExpWrapper, key, {
+ key in RegExpWrapper || defineProperty$1(RegExpWrapper, key, {
configurable: true,
get: function () { return NativeRegExp[key]; },
set: function (it) { NativeRegExp[key] = it; }
});
};
- var keys$2 = getOwnPropertyNames$1(NativeRegExp);
- var index = 0;
- while (keys$2.length > index) proxy(keys$2[index++]);
+
+ for (var keys$1 = getOwnPropertyNames$1(NativeRegExp), index$1 = 0; keys$1.length > index$1;) {
+ proxy(keys$1[index$1++]);
+ }
+
RegExpPrototype$1.constructor = RegExpWrapper;
RegExpWrapper.prototype = RegExpPrototype$1;
- redefine(global_1, 'RegExp', RegExpWrapper);
+ redefine$3(global$b, 'RegExp', RegExpWrapper);
}
// https://tc39.es/ecma262/#sec-get-regexp-@@species
@@ -14554,7 +15289,7 @@
constructor.prototype = factory.prototype = prototype;
prototype.constructor = constructor;
}
- function extend(parent, definition) {
+ function extend$3(parent, definition) {
var prototype = Object.create(parent.prototype);
for (var key in definition) {
@@ -14797,7 +15532,7 @@
this.b = +b;
this.opacity = +opacity;
}
- define(Rgb, rgb, extend(Color, {
+ define(Rgb, rgb, extend$3(Color, {
brighter: function brighter(k) {
k = k == null ? _brighter : Math.pow(_brighter, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
@@ -14820,7 +15555,7 @@
}));
function rgb_formatHex() {
- return "#" + hex$2(this.r) + hex$2(this.g) + hex$2(this.b);
+ return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b);
}
function rgb_formatRgb() {
@@ -14829,7 +15564,7 @@
return (a === 1 ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? ")" : ", " + a + ")");
}
- function hex$2(value) {
+ function hex$1(value) {
value = Math.max(0, Math.min(255, Math.round(value) || 0));
return (value < 16 ? "0" : "") + value.toString(16);
}
@@ -14875,7 +15610,7 @@
this.opacity = +opacity;
}
- define(Hsl, hsl, extend(Color, {
+ define(Hsl, hsl, extend$3(Color, {
brighter: function brighter(k) {
k = k == null ? _brighter : Math.pow(_brighter, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
@@ -14907,13 +15642,13 @@
return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
}
- var constant$2 = (function (x) {
+ var constant$1 = (function (x) {
return function () {
return x;
};
});
- function linear(a, d) {
+ function linear$2(a, d) {
return function (t) {
return a + t * d;
};
@@ -14926,12 +15661,12 @@
}
function gamma(y) {
return (y = +y) === 1 ? nogamma : function (a, b) {
- return b - a ? exponential(a, b, y) : constant$2(isNaN(a) ? b : a);
+ return b - a ? exponential(a, b, y) : constant$1(isNaN(a) ? b : a);
};
}
function nogamma(a, b) {
var d = b - a;
- return d ? linear(a, d) : constant$2(isNaN(a) ? b : a);
+ return d ? linear$2(a, d) : constant$1(isNaN(a) ? b : a);
}
var d3_interpolateRgb = (function rgbGamma(y) {
@@ -14980,7 +15715,7 @@
i;
for (i = 0; i < na; ++i) {
- x[i] = interpolate(a[i], b[i]);
+ x[i] = interpolate$1(a[i], b[i]);
}
for (; i < nb; ++i) {
@@ -15018,7 +15753,7 @@
for (k in b) {
if (k in a) {
- i[k] = interpolate(a[k], b[k]);
+ i[k] = interpolate$1(a[k], b[k]);
} else {
c[k] = b[k];
}
@@ -15108,11 +15843,11 @@
});
}
- function interpolate (a, b) {
+ function interpolate$1 (a, b) {
var t = _typeof(b),
c;
- return b == null || t === "boolean" ? constant$2(b) : (t === "number" ? d3_interpolateNumber : t === "string" ? (c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString : b instanceof color ? d3_interpolateRgb : b instanceof Date ? date : isNumberArray(b) ? numberArray : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object : d3_interpolateNumber)(a, b);
+ return b == null || t === "boolean" ? constant$1(b) : (t === "number" ? d3_interpolateNumber : t === "string" ? (c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString : b instanceof color ? d3_interpolateRgb : b instanceof Date ? date : isNumberArray(b) ? numberArray : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object : d3_interpolateNumber)(a, b);
}
function interpolateRound (a, b) {
@@ -15121,8 +15856,8 @@
};
}
- var degrees$1 = 180 / Math.PI;
- var identity$1 = {
+ var degrees = 180 / Math.PI;
+ var identity$3 = {
translateX: 0,
translateY: 0,
rotate: 0,
@@ -15139,8 +15874,8 @@
return {
translateX: e,
translateY: f,
- rotate: Math.atan2(b, a) * degrees$1,
- skewX: Math.atan(skewX) * degrees$1,
+ rotate: Math.atan2(b, a) * degrees,
+ skewX: Math.atan(skewX) * degrees,
scaleX: scaleX,
scaleY: scaleY
};
@@ -15151,13 +15886,13 @@
function parseCss(value) {
var m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");
- return m.isIdentity ? identity$1 : decompose(m.a, m.b, m.c, m.d, m.e, m.f);
+ return m.isIdentity ? identity$3 : decompose(m.a, m.b, m.c, m.d, m.e, m.f);
}
function parseSvg(value) {
- if (value == null) return identity$1;
+ if (value == null) return identity$3;
if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
svgNode.setAttribute("transform", value);
- if (!(value = svgNode.transform.baseVal.consolidate())) return identity$1;
+ if (!(value = svgNode.transform.baseVal.consolidate())) return identity$3;
value = value.matrix;
return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
}
@@ -15250,7 +15985,7 @@
var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
- var epsilon2$1 = 1e-12;
+ var epsilon2 = 1e-12;
function cosh(x) {
return ((x = Math.exp(x)) + 1 / x) / 2;
@@ -15280,7 +16015,7 @@
i,
S; // Special case for u0 â
u1.
- if (d2 < epsilon2$1) {
+ if (d2 < epsilon2) {
S = Math.log(w1 / w0) / rho;
i = function i(t) {
@@ -15288,20 +16023,20 @@
};
} // General case.
else {
- 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);
- S = (r1 - r0) / rho;
-
- i = function i(t) {
- var s = t * S,
- coshr0 = cosh(r0),
- u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
- return [ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / cosh(rho * s + r0)];
- };
- }
+ 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);
+ S = (r1 - r0) / rho;
+
+ i = function i(t) {
+ var s = t * S,
+ coshr0 = cosh(r0),
+ u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
+ return [ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / cosh(rho * s + r0)];
+ };
+ }
i.duration = S * 1000 * rho / Math.SQRT2;
return i;
@@ -15328,10 +16063,13 @@
return samples;
}
+ var $$t = _export;
+ var bind$4 = functionBind;
+
// `Function.prototype.bind` method
// https://tc39.es/ecma262/#sec-function.prototype.bind
- _export({ target: 'Function', proto: true }, {
- bind: functionBind
+ $$t({ target: 'Function', proto: true, forced: Function.bind !== bind$4 }, {
+ bind: bind$4
});
var frame = 0,
@@ -15351,7 +16089,7 @@
setFrame = (typeof window === "undefined" ? "undefined" : _typeof(window)) === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) {
setTimeout(f, 17);
};
- function now() {
+ function now$1() {
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
}
@@ -15366,7 +16104,7 @@
constructor: Timer,
restart: function restart(callback, delay, time) {
if (typeof callback !== "function") throw new TypeError("callback is not a function");
- time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
+ time = (time == null ? now$1() : +time) + (delay == null ? 0 : +delay);
if (!this._next && taskTail !== this) {
if (taskTail) taskTail._next = this;else taskHead = this;
@@ -15391,7 +16129,7 @@
return t;
}
function timerFlush() {
- now(); // Get the current time, if not already set.
+ now$1(); // Get the current time, if not already set.
++frame; // Pretend weâve set an alarm, if we havenât already.
@@ -15470,7 +16208,7 @@
return t;
}
- var emptyOn = dispatch("start", "end", "cancel", "interrupt");
+ var emptyOn = dispatch$8("start", "end", "cancel", "interrupt");
var emptyTween = [];
var CREATED = 0;
var SCHEDULED = 1;
@@ -15482,7 +16220,7 @@
function schedule (node, name, id, index, group, timing) {
var schedules = node.__transition;
if (!schedules) node.__transition = {};else if (id in schedules) return;
- create(node, id, {
+ create$2(node, id, {
name: name,
index: index,
// For context during callback.
@@ -15499,22 +16237,22 @@
});
}
function init(node, id) {
- var schedule = get$4(node, id);
+ var schedule = get$1(node, id);
if (schedule.state > CREATED) throw new Error("too late; already scheduled");
return schedule;
}
- function set$4(node, id) {
- var schedule = get$4(node, id);
+ function set(node, id) {
+ var schedule = get$1(node, id);
if (schedule.state > STARTED) throw new Error("too late; already running");
return schedule;
}
- function get$4(node, id) {
+ function get$1(node, id) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
return schedule;
}
- function create(node, id, self) {
+ function create$2(node, id, self) {
var schedules = node.__transition,
tween; // Initialize the self timer when the transition is created.
// Note the actual delay is not known until the first callback!
@@ -15549,11 +16287,11 @@
delete schedules[i];
} // Cancel any pre-empted transitions.
else if (+i < id) {
- o.state = ENDED;
- o.timer.stop();
- o.on.call("cancel", node, node.__data__, o.index, o.group);
- delete schedules[i];
- }
+ o.state = ENDED;
+ o.timer.stop();
+ o.on.call("cancel", node, node.__data__, o.index, o.group);
+ delete schedules[i];
+ }
} // Defer the first tick to end of the current frame; see d3/d3#1576.
// Note the transition may be canceled after start and before the first tick!
// Note this must be scheduled before the start event; see d3/d3-transition#16!
@@ -15650,7 +16388,7 @@
function tweenRemove(id, name) {
var tween0, tween1;
return function () {
- var schedule = set$4(this, id),
+ var schedule = set(this, id),
tween = schedule.tween; // If this node shared tween with the previous node,
// just assign the updated shared tween and weâre done!
// Otherwise, copy-on-write.
@@ -15675,7 +16413,7 @@
var tween0, tween1;
if (typeof value !== "function") throw new Error();
return function () {
- var schedule = set$4(this, id),
+ var schedule = set(this, id),
tween = schedule.tween; // If this node shared tween with the previous node,
// just assign the updated shared tween and weâre done!
// Otherwise, copy-on-write.
@@ -15705,7 +16443,7 @@
name += "";
if (arguments.length < 2) {
- var tween = get$4(this.node(), id).tween;
+ var tween = get$1(this.node(), id).tween;
for (var i = 0, n = tween.length, t; i < n; ++i) {
if ((t = tween[i]).name === name) {
@@ -15721,32 +16459,32 @@
function tweenValue(transition, name, value) {
var id = transition._id;
transition.each(function () {
- var schedule = set$4(this, id);
+ var schedule = set(this, id);
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
});
return function (node) {
- return get$4(node, id).value[name];
+ return get$1(node, id).value[name];
};
}
- function interpolate$1 (a, b) {
+ function interpolate (a, b) {
var c;
return (typeof b === "number" ? d3_interpolateNumber : b instanceof color ? d3_interpolateRgb : (c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)(a, b);
}
- function attrRemove$1(name) {
+ function attrRemove(name) {
return function () {
this.removeAttribute(name);
};
}
- function attrRemoveNS$1(fullname) {
+ function attrRemoveNS(fullname) {
return function () {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
- function attrConstant$1(name, interpolate, value1) {
+ function attrConstant(name, interpolate, value1) {
var string00,
string1 = value1 + "",
interpolate0;
@@ -15756,7 +16494,7 @@
};
}
- function attrConstantNS$1(fullname, interpolate, value1) {
+ function attrConstantNS(fullname, interpolate, value1) {
var string00,
string1 = value1 + "",
interpolate0;
@@ -15766,7 +16504,7 @@
};
}
- function attrFunction$1(name, interpolate, value) {
+ function attrFunction(name, interpolate, value) {
var string00, string10, interpolate0;
return function () {
var string0,
@@ -15779,7 +16517,7 @@
};
}
- function attrFunctionNS$1(fullname, interpolate, value) {
+ function attrFunctionNS(fullname, interpolate, value) {
var string00, string10, interpolate0;
return function () {
var string0,
@@ -15794,8 +16532,8 @@
function transition_attr (name, value) {
var fullname = namespace(name),
- i = fullname === "transform" ? interpolateTransformSvg : interpolate$1;
- return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
+ i = fullname === "transform" ? interpolateTransformSvg : interpolate;
+ return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));
}
function attrInterpolate(name, i) {
@@ -15859,43 +16597,43 @@
function transition_delay (value) {
var id = this._id;
- return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id, value)) : get$4(this.node(), id).delay;
+ return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id, value)) : get$1(this.node(), id).delay;
}
function durationFunction(id, value) {
return function () {
- set$4(this, id).duration = +value.apply(this, arguments);
+ set(this, id).duration = +value.apply(this, arguments);
};
}
function durationConstant(id, value) {
return value = +value, function () {
- set$4(this, id).duration = value;
+ set(this, id).duration = value;
};
}
function transition_duration (value) {
var id = this._id;
- return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id, value)) : get$4(this.node(), id).duration;
+ return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id, value)) : get$1(this.node(), id).duration;
}
function easeConstant(id, value) {
if (typeof value !== "function") throw new Error();
return function () {
- set$4(this, id).ease = value;
+ set(this, id).ease = value;
};
}
function transition_ease (value) {
var id = this._id;
- return arguments.length ? this.each(easeConstant(id, value)) : get$4(this.node(), id).ease;
+ return arguments.length ? this.each(easeConstant(id, value)) : get$1(this.node(), id).ease;
}
function easeVarying(id, value) {
return function () {
var v = value.apply(this, arguments);
if (typeof v !== "function") throw new Error();
- set$4(this, id).ease = v;
+ set(this, id).ease = v;
};
}
@@ -15947,7 +16685,7 @@
function onFunction(id, name, listener) {
var on0,
on1,
- sit = start(name) ? init : set$4;
+ sit = start(name) ? init : set;
return function () {
var schedule = sit(this, id),
on = schedule.on; // If this node shared a dispatch with the previous node,
@@ -15961,7 +16699,7 @@
function transition_on (name, listener) {
var id = this._id;
- return arguments.length < 2 ? get$4(this.node(), id).on.on(name) : this.each(onFunction(id, name, listener));
+ return arguments.length < 2 ? get$1(this.node(), id).on.on(name) : this.each(onFunction(id, name, listener));
}
function removeFunction(id) {
@@ -15990,7 +16728,7 @@
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node) subnode.__data__ = node.__data__;
subgroup[i] = subnode;
- schedule(subgroup[i], name, id, i, subgroup, get$4(node, id));
+ schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
}
}
}
@@ -16006,7 +16744,7 @@
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
- for (var children = select.call(node, node.__data__, i, group), child, inherit = get$4(node, id), k = 0, l = children.length; k < l; ++k) {
+ for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
if (child = children[k]) {
schedule(child, name, id, k, children, inherit);
}
@@ -16021,9 +16759,9 @@
return new Transition(subgroups, parents, name, id);
}
- var Selection$1 = selection.prototype.constructor;
+ var Selection = selection.prototype.constructor;
function transition_selection () {
- return new Selection$1(this._groups, this._parents);
+ return new Selection(this._groups, this._parents);
}
function styleNull(name, interpolate) {
@@ -16035,13 +16773,13 @@
};
}
- function styleRemove$1(name) {
+ function styleRemove(name) {
return function () {
this.style.removeProperty(name);
};
}
- function styleConstant$1(name, interpolate, value1) {
+ function styleConstant(name, interpolate, value1) {
var string00,
string1 = value1 + "",
interpolate0;
@@ -16051,7 +16789,7 @@
};
}
- function styleFunction$1(name, interpolate, value) {
+ function styleFunction(name, interpolate, value) {
var string00, string10, interpolate0;
return function () {
var string0 = styleValue(this, name),
@@ -16070,9 +16808,9 @@
event = "end." + key,
remove;
return function () {
- var schedule = set$4(this, id),
+ var schedule = set(this, id),
on = schedule.on,
- listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined; // If this node shared a dispatch with the previous node,
+ listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; // If this node shared a dispatch with the previous node,
// just assign the updated shared dispatch and weâre done!
// Otherwise, copy-on-write.
@@ -16082,8 +16820,8 @@
}
function transition_style (name, value, priority) {
- var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1;
- return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove$1(name)) : typeof value === "function" ? this.styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant$1(name, i, value), priority).on("end.style." + name, null);
+ var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
+ return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove(name)) : typeof value === "function" ? this.styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant(name, i, value), priority).on("end.style." + name, null);
}
function styleInterpolate(name, i, priority) {
@@ -16113,13 +16851,13 @@
return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
}
- function textConstant$1(value) {
+ function textConstant(value) {
return function () {
this.textContent = value;
};
}
- function textFunction$1(value) {
+ function textFunction(value) {
return function () {
var value1 = value(this);
this.textContent = value1 == null ? "" : value1;
@@ -16127,7 +16865,7 @@
}
function transition_text (value) {
- return this.tween("text", typeof value === "function" ? textFunction$1(tweenValue(this, "text", value)) : textConstant$1(value == null ? "" : value + ""));
+ return this.tween("text", typeof value === "function" ? textFunction(tweenValue(this, "text", value)) : textConstant(value == null ? "" : value + ""));
}
function textInterpolate(i) {
@@ -16165,7 +16903,7 @@
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
- var inherit = get$4(node, id0);
+ var inherit = get$1(node, id0);
schedule(node, name, id1, i, group, {
time: inherit.time + inherit.delay + inherit.duration,
delay: 0,
@@ -16195,7 +16933,7 @@
}
};
that.each(function () {
- var schedule = set$4(this, id),
+ var schedule = set(this, id),
on = schedule.on; // If this node shared a dispatch with the previous node,
// just assign the updated shared dispatch and weâre done!
// Otherwise, copy-on-write.
@@ -16217,21 +16955,18 @@
});
}
- var id$1 = 0;
+ var id = 0;
function Transition(groups, parents, name, id) {
this._groups = groups;
this._parents = parents;
this._name = name;
this._id = id;
}
- function transition(name) {
- return selection().transition(name);
- }
function newId() {
- return ++id$1;
+ return ++id;
}
var selection_prototype = selection.prototype;
- Transition.prototype = transition.prototype = _defineProperty({
+ Transition.prototype = _defineProperty({
constructor: Transition,
select: transition_select,
selectAll: transition_selectAll,
@@ -16295,7 +17030,7 @@
if (name instanceof Transition) {
id = name._id, name = name._name;
} else {
- id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
+ id = newId(), (timing = defaultTiming).time = now$1(), name = name == null ? null : name + "";
}
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
@@ -16312,7 +17047,7 @@
selection.prototype.interrupt = selection_interrupt;
selection.prototype.transition = selection_transition;
- var constant$3 = (function (x) {
+ var constant = (function (x) {
return function () {
return x;
};
@@ -16393,10 +17128,10 @@
};
var identity$2 = new Transform(1, 0, 0);
- function nopropagation$1(event) {
+ function nopropagation(event) {
event.stopImmediatePropagation();
}
- function noevent$1 (event) {
+ function noevent (event) {
event.preventDefault();
event.stopImmediatePropagation();
}
@@ -16407,7 +17142,7 @@
return (!event.ctrlKey || event.type === 'wheel') && !event.button;
}
- function defaultExtent() {
+ function defaultExtent$1() {
var e = this;
if (e instanceof SVGElement) {
@@ -16428,15 +17163,15 @@
return this.__zoom || identity$2;
}
- function defaultWheelDelta(event) {
+ function defaultWheelDelta$1(event) {
return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);
}
- function defaultTouchable$1() {
+ function defaultTouchable() {
return navigator.maxTouchPoints || "ontouchstart" in this;
}
- function defaultConstrain(transform, extent, translateExtent) {
+ function defaultConstrain$1(transform, extent, translateExtent) {
var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
@@ -16446,15 +17181,15 @@
function d3_zoom () {
var filter = defaultFilter$1,
- extent = defaultExtent,
- constrain = defaultConstrain,
- wheelDelta = defaultWheelDelta,
- touchable = defaultTouchable$1,
+ extent = defaultExtent$1,
+ constrain = defaultConstrain$1,
+ wheelDelta = defaultWheelDelta$1,
+ touchable = defaultTouchable,
scaleExtent = [0, Infinity],
translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
duration = 250,
interpolate = interpolateZoom,
- listeners = dispatch("start", "zoom", "end"),
+ listeners = dispatch$8("start", "zoom", "end"),
touchstarting,
touchfirst,
touchending,
@@ -16547,10 +17282,10 @@
return function (t) {
if (t === 1) t = b; // Avoid rounding error on end.
else {
- var l = i(t),
- k = w / l[2];
- t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
- }
+ var l = i(t),
+ k = w / l[2];
+ t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
+ }
g.zoom(null, t);
};
});
@@ -16630,13 +17365,13 @@
clearTimeout(g.wheel);
} // If this wheel event wonât trigger a transform change, ignore it.
else if (t.k === k) return; // Otherwise, capture the mouse point and location at the start.
- else {
- g.mouse = [p, t.invert(p)];
- interrupt(this);
- g.start();
- }
+ else {
+ g.mouse = [p, t.invert(p)];
+ interrupt(this);
+ g.start();
+ }
- noevent$1(event);
+ noevent(event);
g.wheel = setTimeout(wheelidled, wheelDelay);
g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
@@ -16659,13 +17394,13 @@
x0 = event.clientX,
y0 = event.clientY;
dragDisable(event.view);
- nopropagation$1(event);
+ nopropagation(event);
g.mouse = [p, this.__zoom.invert(p)];
interrupt(this);
g.start();
function mousemoved(event) {
- noevent$1(event);
+ noevent(event);
if (!g.moved) {
var dx = event.clientX - x0,
@@ -16679,7 +17414,7 @@
function mouseupped(event) {
v.on("mousemove.zoom mouseup.zoom", null);
yesdrag(event.view, g.moved);
- noevent$1(event);
+ noevent(event);
g.event(event).end();
}
}
@@ -16695,7 +17430,7 @@
p1 = t0.invert(p0),
k1 = t0.k * (event.shiftKey ? 0.5 : 2),
t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);
- noevent$1(event);
+ noevent(event);
if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);else select(this).call(zoom.transform, t1, p0, event);
}
@@ -16712,7 +17447,7 @@
i,
t,
p;
- nopropagation$1(event);
+ nopropagation(event);
for (i = 0; i < n; ++i) {
t = touches[i], p = pointer(t, this);
@@ -16745,7 +17480,7 @@
t,
p,
l;
- noevent$1(event);
+ noevent(event);
for (i = 0; i < n; ++i) {
t = touches[i], p = pointer(t, this);
@@ -16780,7 +17515,7 @@
n = touches.length,
i,
t;
- nopropagation$1(event);
+ nopropagation(event);
if (touchending) clearTimeout(touchending);
touchending = setTimeout(function () {
touchending = null;
@@ -16807,19 +17542,19 @@
}
zoom.wheelDelta = function (_) {
- return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$3(+_), zoom) : wheelDelta;
+ return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta;
};
zoom.filter = function (_) {
- return arguments.length ? (filter = typeof _ === "function" ? _ : constant$3(!!_), zoom) : filter;
+ return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter;
};
zoom.touchable = function (_) {
- return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$3(!!_), zoom) : touchable;
+ return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable;
};
zoom.extent = function (_) {
- return arguments.length ? (extent = typeof _ === "function" ? _ : constant$3([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
+ return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
};
zoom.scaleExtent = function (_) {
@@ -17007,16 +17742,68 @@
return score;
}
- var onFreeze = internalMetadata.onFreeze;
+ var call$2 = functionCall;
+ var fixRegExpWellKnownSymbolLogic$1 = fixRegexpWellKnownSymbolLogic;
+ var anObject$1 = anObject$n;
+ var toLength$3 = toLength$c;
+ var toString$8 = toString$k;
+ var requireObjectCoercible$7 = requireObjectCoercible$e;
+ var getMethod$1 = getMethod$7;
+ var advanceStringIndex = advanceStringIndex$3;
+ var regExpExec$1 = regexpExecAbstract;
+
+ // @@match logic
+ fixRegExpWellKnownSymbolLogic$1('match', function (MATCH, nativeMatch, maybeCallNative) {
+ return [
+ // `String.prototype.match` method
+ // https://tc39.es/ecma262/#sec-string.prototype.match
+ function match(regexp) {
+ var O = requireObjectCoercible$7(this);
+ var matcher = regexp == undefined ? undefined : getMethod$1(regexp, MATCH);
+ return matcher ? call$2(matcher, regexp, O) : new RegExp(regexp)[MATCH](toString$8(O));
+ },
+ // `RegExp.prototype[@@match]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@match
+ function (string) {
+ var rx = anObject$1(this);
+ var S = toString$8(string);
+ var res = maybeCallNative(nativeMatch, rx, S);
+
+ if (res.done) return res.value;
+
+ if (!rx.global) return regExpExec$1(rx, S);
+
+ var fullUnicode = rx.unicode;
+ rx.lastIndex = 0;
+ var A = [];
+ var n = 0;
+ var result;
+ while ((result = regExpExec$1(rx, S)) !== null) {
+ var matchStr = toString$8(result[0]);
+ A[n] = matchStr;
+ if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength$3(rx.lastIndex), fullUnicode);
+ n++;
+ }
+ return n === 0 ? null : A;
+ }
+ ];
+ });
+
+ var $$s = _export;
+ var FREEZING = freezing;
+ var fails$9 = fails$V;
+ var isObject$4 = isObject$s;
+ var onFreeze = internalMetadata.exports.onFreeze;
- var nativeFreeze = Object.freeze;
- var FAILS_ON_PRIMITIVES$4 = fails(function () { nativeFreeze(1); });
+ // eslint-disable-next-line es/no-object-freeze -- safe
+ var $freeze = Object.freeze;
+ var FAILS_ON_PRIMITIVES = fails$9(function () { $freeze(1); });
// `Object.freeze` method
// https://tc39.es/ecma262/#sec-object.freeze
- _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$4, sham: !freezing }, {
+ $$s({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
freeze: function freeze(it) {
- return nativeFreeze && isObject(it) ? nativeFreeze(onFreeze(it)) : it;
+ return $freeze && isObject$4(it) ? $freeze(onFreeze(it)) : it;
}
});
@@ -17164,44 +17951,103 @@
}, []);
}
- // @@match logic
- fixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {
- return [
- // `String.prototype.match` method
- // https://tc39.es/ecma262/#sec-string.prototype.match
- function match(regexp) {
- var O = requireObjectCoercible(this);
- var matcher = regexp == undefined ? undefined : regexp[MATCH];
- return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
- },
- // `RegExp.prototype[@@match]` method
- // https://tc39.es/ecma262/#sec-regexp.prototype-@@match
- function (regexp) {
- var res = maybeCallNative(nativeMatch, regexp, this);
- if (res.done) return res.value;
+ var uncurryThis$d = functionUncurryThis;
- var rx = anObject(regexp);
- var S = String(this);
+ // `thisNumberValue` abstract operation
+ // https://tc39.es/ecma262/#sec-thisnumbervalue
+ var thisNumberValue$3 = uncurryThis$d(1.0.valueOf);
+
+ var DESCRIPTORS$3 = descriptors;
+ var global$a = global$1o;
+ var uncurryThis$c = functionUncurryThis;
+ var isForced = isForced_1;
+ var redefine$2 = redefine$h.exports;
+ var hasOwn$1 = hasOwnProperty_1;
+ var inheritIfRequired = inheritIfRequired$4;
+ var isPrototypeOf = objectIsPrototypeOf;
+ var isSymbol$1 = isSymbol$6;
+ var toPrimitive$1 = toPrimitive$3;
+ var fails$8 = fails$V;
+ var getOwnPropertyNames = objectGetOwnPropertyNames.f;
+ var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;
+ var defineProperty = objectDefineProperty.f;
+ var thisNumberValue$2 = thisNumberValue$3;
+ var trim$2 = stringTrim.trim;
- if (!rx.global) return regexpExecAbstract(rx, S);
+ var NUMBER = 'Number';
+ var NativeNumber = global$a[NUMBER];
+ var NumberPrototype = NativeNumber.prototype;
+ var TypeError$4 = global$a.TypeError;
+ var arraySlice$1 = uncurryThis$c(''.slice);
+ var charCodeAt$1 = uncurryThis$c(''.charCodeAt);
+
+ // `ToNumeric` abstract operation
+ // https://tc39.es/ecma262/#sec-tonumeric
+ var toNumeric = function (value) {
+ var primValue = toPrimitive$1(value, 'number');
+ return typeof primValue == 'bigint' ? primValue : toNumber$1(primValue);
+ };
- var fullUnicode = rx.unicode;
- rx.lastIndex = 0;
- var A = [];
- var n = 0;
- var result;
- while ((result = regexpExecAbstract(rx, S)) !== null) {
- var matchStr = String(result[0]);
- A[n] = matchStr;
- if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
- n++;
+ // `ToNumber` abstract operation
+ // https://tc39.es/ecma262/#sec-tonumber
+ var toNumber$1 = function (argument) {
+ var it = toPrimitive$1(argument, 'number');
+ var first, third, radix, maxCode, digits, length, index, code;
+ if (isSymbol$1(it)) throw TypeError$4('Cannot convert a Symbol value to a number');
+ if (typeof it == 'string' && it.length > 2) {
+ it = trim$2(it);
+ first = charCodeAt$1(it, 0);
+ if (first === 43 || first === 45) {
+ third = charCodeAt$1(it, 2);
+ if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
+ } else if (first === 48) {
+ switch (charCodeAt$1(it, 1)) {
+ case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i
+ case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i
+ default: return +it;
}
- return n === 0 ? null : A;
+ digits = arraySlice$1(it, 2);
+ length = digits.length;
+ for (index = 0; index < length; index++) {
+ code = charCodeAt$1(digits, index);
+ // parseInt parses a string to a first unavailable symbol
+ // but ToNumber should return NaN if a string contains unavailable symbols
+ if (code < 48 || code > maxCode) return NaN;
+ } return parseInt(digits, radix);
}
- ];
- });
+ } return +it;
+ };
+
+ // `Number` constructor
+ // https://tc39.es/ecma262/#sec-number-constructor
+ if (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {
+ var NumberWrapper = function Number(value) {
+ var n = arguments.length < 1 ? 0 : NativeNumber(toNumeric(value));
+ var dummy = this;
+ // check on 1..constructor(foo) case
+ return isPrototypeOf(NumberPrototype, dummy) && fails$8(function () { thisNumberValue$2(dummy); })
+ ? inheritIfRequired(Object(n), dummy, NumberWrapper) : n;
+ };
+ for (var keys = DESCRIPTORS$3 ? getOwnPropertyNames(NativeNumber) : (
+ // ES3:
+ 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
+ // ES2015 (in case, if modules with ES2015 Number statics required before):
+ 'EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,' +
+ // ESNext
+ 'fromString,range'
+ ).split(','), j$1 = 0, key; keys.length > j$1; j$1++) {
+ if (hasOwn$1(NativeNumber, key = keys[j$1]) && !hasOwn$1(NumberWrapper, key)) {
+ defineProperty(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key));
+ }
+ }
+ NumberWrapper.prototype = NumberPrototype;
+ NumberPrototype.constructor = NumberWrapper;
+ redefine$2(global$a, NUMBER, NumberWrapper);
+ }
+
+ var diacritics = {};
- var remove$1 = removeDiacritics;
+ var remove$6 = diacritics.remove = removeDiacritics;
var replacementList = [{
base: ' ',
chars: "\xA0"
@@ -17499,11 +18345,11 @@
}];
var diacriticsMap = {};
- for (var i = 0; i < replacementList.length; i += 1) {
- var chars = replacementList[i].chars;
+ for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) {
+ var chars = replacementList[i$1].chars;
- for (var j$1 = 0; j$1 < chars.length; j$1 += 1) {
- diacriticsMap[chars[j$1]] = replacementList[i].base;
+ for (var j = 0; j < chars.length; j += 1) {
+ diacriticsMap[chars[j]] = replacementList[i$1].base;
}
}
@@ -17513,2185 +18359,2198 @@
});
}
- var replacementList_1 = replacementList;
- var diacriticsMap_1 = diacriticsMap;
- var diacritics = {
- remove: remove$1,
- replacementList: replacementList_1,
- diacriticsMap: diacriticsMap_1
- };
+ diacritics.replacementList = replacementList;
+ diacritics.diacriticsMap = diacriticsMap;
- var isArabic_1 = createCommonjsModule(function (module, exports) {
+ var lib = {};
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- var arabicBlocks = [[0x0600, 0x06FF], [0x0750, 0x077F], [0x08A0, 0x08FF], [0xFB50, 0xFDFF], [0xFE70, 0xFEFF], [0x10E60, 0x10E7F], [0x1EC70, 0x1ECBF], [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
- ];
+ var isArabic$1 = {};
- function isArabic(_char) {
- if (_char.length > 1) {
- // allow the newer chars?
- throw new Error('isArabic works on only one-character strings');
- }
+ Object.defineProperty(isArabic$1, "__esModule", {
+ value: true
+ });
+ var arabicBlocks = [[0x0600, 0x06FF], [0x0750, 0x077F], [0x08A0, 0x08FF], [0xFB50, 0xFDFF], [0xFE70, 0xFEFF], [0x10E60, 0x10E7F], [0x1EC70, 0x1ECBF], [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
+ ];
+
+ function isArabic(_char) {
+ if (_char.length > 1) {
+ // allow the newer chars?
+ throw new Error('isArabic works on only one-character strings');
+ }
- var code = _char.charCodeAt(0);
+ var code = _char.charCodeAt(0);
- for (var i = 0; i < arabicBlocks.length; i++) {
- var block = arabicBlocks[i];
+ for (var i = 0; i < arabicBlocks.length; i++) {
+ var block = arabicBlocks[i];
- if (code >= block[0] && code <= block[1]) {
- return true;
- }
+ if (code >= block[0] && code <= block[1]) {
+ return true;
}
+ }
- return false;
+ return false;
+ }
+
+ isArabic$1.isArabic = isArabic;
+
+ function isMath(_char2) {
+ if (_char2.length > 2) {
+ // allow the newer chars?
+ throw new Error('isMath works on only one-character strings');
}
- exports.isArabic = isArabic;
+ var code = _char2.charCodeAt(0);
- function isMath(_char2) {
- if (_char2.length > 2) {
- // allow the newer chars?
- throw new Error('isMath works on only one-character strings');
- }
+ return code >= 0x660 && code <= 0x66C || code >= 0x6F0 && code <= 0x6F9;
+ }
- var code = _char2.charCodeAt(0);
+ isArabic$1.isMath = isMath;
- return code >= 0x660 && code <= 0x66C || code >= 0x6F0 && code <= 0x6F9;
- }
+ var GlyphSplitter$1 = {};
- exports.isMath = isMath;
- });
+ var reference = {};
- var unicodeArabic = createCommonjsModule(function (module, exports) {
+ var unicodeArabic = {};
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- var arabicReference = {
- "alef": {
- "normal": ["\u0627"],
- "madda_above": {
- "normal": ["\u0627\u0653", "\u0622"],
- "isolated": "\uFE81",
- "final": "\uFE82"
- },
- "hamza_above": {
- "normal": ["\u0627\u0654", "\u0623"],
- "isolated": "\uFE83",
- "final": "\uFE84"
- },
- "hamza_below": {
- "normal": ["\u0627\u0655", "\u0625"],
- "isolated": "\uFE87",
- "final": "\uFE88"
- },
- "wasla": {
- "normal": "\u0671",
- "isolated": "\uFB50",
- "final": "\uFB51"
- },
- "wavy_hamza_above": ["\u0672"],
- "wavy_hamza_below": ["\u0627\u065F", "\u0673"],
- "high_hamza": ["\u0675", "\u0627\u0674"],
- "indic_two_above": ["\u0773"],
- "indic_three_above": ["\u0774"],
- "fathatan": {
- "normal": ["\u0627\u064B"],
- "final": "\uFD3C",
- "isolated": "\uFD3D"
- },
- "isolated": "\uFE8D",
- "final": "\uFE8E"
- },
- "beh": {
- "normal": ["\u0628"],
- "dotless": ["\u066E"],
- "three_dots_horizontally_below": ["\u0750"],
- "dot_below_three_dots_above": ["\u0751"],
- "three_dots_pointing_upwards_below": ["\u0752"],
- "three_dots_pointing_upwards_below_two_dots_above": ["\u0753"],
- "two_dots_below_dot_above": ["\u0754"],
- "inverted_small_v_below": ["\u0755"],
- "small_v": ["\u0756"],
- "small_v_below": ["\u08A0"],
- "hamza_above": ["\u08A1"],
- "small_meem_above": ["\u08B6"],
- "isolated": "\uFE8F",
- "final": "\uFE90",
- "initial": "\uFE91",
- "medial": "\uFE92"
- },
- "teh marbuta": {
- "normal": ["\u0629"],
- "isolated": "\uFE93",
- "final": "\uFE94"
- },
- "teh": {
- "normal": ["\u062A"],
- "ring": ["\u067C"],
- "three_dots_above_downwards": ["\u067D"],
- "small_teh_above": ["\u08B8"],
- "isolated": "\uFE95",
- "final": "\uFE96",
- "initial": "\uFE97",
- "medial": "\uFE98"
- },
- "theh": {
- "normal": ["\u062B"],
- "isolated": "\uFE99",
- "final": "\uFE9A",
- "initial": "\uFE9B",
- "medial": "\uFE9C"
- },
- "jeem": {
- "normal": ["\u062C"],
- "two_dots_above": ["\u08A2"],
- "isolated": "\uFE9D",
- "final": "\uFE9E",
- "initial": "\uFE9F",
- "medial": "\uFEA0"
- },
- "hah": {
- "normal": ["\u062D"],
- "hamza_above": ["\u0681"],
- "two_dots_vertical_above": ["\u0682"],
- "three_dots_above": ["\u0685"],
- "two_dots_above": ["\u0757"],
- "three_dots_pointing_upwards_below": ["\u0758"],
- "small_tah_below": ["\u076E"],
- "small_tah_two_dots": ["\u076F"],
- "small_tah_above": ["\u0772"],
- "indic_four_below": ["\u077C"],
- "isolated": "\uFEA1",
- "final": "\uFEA2",
- "initial": "\uFEA3",
- "medial": "\uFEA4"
- },
- "khah": {
- "normal": ["\u062E"],
- "isolated": "\uFEA5",
- "final": "\uFEA6",
- "initial": "\uFEA7",
- "medial": "\uFEA8"
- },
- "dal": {
- "normal": ["\u062F"],
- "ring": ["\u0689"],
- "dot_below": ["\u068A"],
- "dot_below_small_tah": ["\u068B"],
- "three_dots_above_downwards": ["\u068F"],
- "four_dots_above": ["\u0690"],
- "inverted_v": ["\u06EE"],
- "two_dots_vertically_below_small_tah": ["\u0759"],
- "inverted_small_v_below": ["\u075A"],
- "three_dots_below": ["\u08AE"],
- "isolated": "\uFEA9",
- "final": "\uFEAA"
- },
- "thal": {
- "normal": ["\u0630"],
- "isolated": "\uFEAB",
- "final": "\uFEAC"
- },
- "reh": {
- "normal": ["\u0631"],
- "small_v": ["\u0692"],
- "ring": ["\u0693"],
- "dot_below": ["\u0694"],
- "small_v_below": ["\u0695"],
- "dot_below_dot_above": ["\u0696"],
- "two_dots_above": ["\u0697"],
- "four_dots_above": ["\u0699"],
- "inverted_v": ["\u06EF"],
- "stroke": ["\u075B"],
- "two_dots_vertically_above": ["\u076B"],
- "hamza_above": ["\u076C"],
- "small_tah_two_dots": ["\u0771"],
- "loop": ["\u08AA"],
- "small_noon_above": ["\u08B9"],
- "isolated": "\uFEAD",
- "final": "\uFEAE"
- },
- "zain": {
- "normal": ["\u0632"],
- "inverted_v_above": ["\u08B2"],
- "isolated": "\uFEAF",
- "final": "\uFEB0"
- },
- "seen": {
- "normal": ["\u0633"],
- "dot_below_dot_above": ["\u069A"],
- "three_dots_below": ["\u069B"],
- "three_dots_below_three_dots_above": ["\u069C"],
- "four_dots_above": ["\u075C"],
- "two_dots_vertically_above": ["\u076D"],
- "small_tah_two_dots": ["\u0770"],
- "indic_four_above": ["\u077D"],
- "inverted_v": ["\u077E"],
- "isolated": "\uFEB1",
- "final": "\uFEB2",
- "initial": "\uFEB3",
- "medial": "\uFEB4"
- },
- "sheen": {
- "normal": ["\u0634"],
- "dot_below": ["\u06FA"],
- "isolated": "\uFEB5",
- "final": "\uFEB6",
- "initial": "\uFEB7",
- "medial": "\uFEB8"
- },
- "sad": {
- "normal": ["\u0635"],
- "two_dots_below": ["\u069D"],
- "three_dots_above": ["\u069E"],
- "three_dots_below": ["\u08AF"],
- "isolated": "\uFEB9",
- "final": "\uFEBA",
- "initial": "\uFEBB",
- "medial": "\uFEBC"
- },
- "dad": {
- "normal": ["\u0636"],
- "dot_below": ["\u06FB"],
- "isolated": "\uFEBD",
- "final": "\uFEBE",
- "initial": "\uFEBF",
- "medial": "\uFEC0"
- },
- "tah": {
- "normal": ["\u0637"],
- "three_dots_above": ["\u069F"],
- "two_dots_above": ["\u08A3"],
- "isolated": "\uFEC1",
- "final": "\uFEC2",
- "initial": "\uFEC3",
- "medial": "\uFEC4"
- },
- "zah": {
- "normal": ["\u0638"],
- "isolated": "\uFEC5",
- "final": "\uFEC6",
- "initial": "\uFEC7",
- "medial": "\uFEC8"
- },
- "ain": {
- "normal": ["\u0639"],
- "three_dots_above": ["\u06A0"],
- "two_dots_above": ["\u075D"],
- "three_dots_pointing_downwards_above": ["\u075E"],
- "two_dots_vertically_above": ["\u075F"],
- "three_dots_below": ["\u08B3"],
- "isolated": "\uFEC9",
- "final": "\uFECA",
- "initial": "\uFECB",
- "medial": "\uFECC"
- },
- "ghain": {
- "normal": ["\u063A"],
- "dot_below": ["\u06FC"],
- "isolated": "\uFECD",
- "final": "\uFECE",
- "initial": "\uFECF",
- "medial": "\uFED0"
- },
- "feh": {
- "normal": ["\u0641"],
- "dotless": ["\u06A1"],
- "dot_moved_below": ["\u06A2"],
- "dot_below": ["\u06A3"],
- "three_dots_below": ["\u06A5"],
- "two_dots_below": ["\u0760"],
- "three_dots_pointing_upwards_below": ["\u0761"],
- "dot_below_three_dots_above": ["\u08A4"],
- "isolated": "\uFED1",
- "final": "\uFED2",
- "initial": "\uFED3",
- "medial": "\uFED4"
- },
- "qaf": {
- "normal": ["\u0642"],
- "dotless": ["\u066F"],
- "dot_above": ["\u06A7"],
- "three_dots_above": ["\u06A8"],
- "dot_below": ["\u08A5"],
- "isolated": "\uFED5",
- "final": "\uFED6",
- "initial": "\uFED7",
- "medial": "\uFED8"
- },
- "kaf": {
- "normal": ["\u0643"],
- "swash": ["\u06AA"],
- "ring": ["\u06AB"],
- "dot_above": ["\u06AC"],
- "three_dots_below": ["\u06AE"],
- "two_dots_above": ["\u077F"],
- "dot_below": ["\u08B4"],
- "isolated": "\uFED9",
- "final": "\uFEDA",
- "initial": "\uFEDB",
- "medial": "\uFEDC"
- },
- "lam": {
- "normal": ["\u0644"],
- "small_v": ["\u06B5"],
- "dot_above": ["\u06B6"],
- "three_dots_above": ["\u06B7"],
- "three_dots_below": ["\u06B8"],
- "bar": ["\u076A"],
- "double_bar": ["\u08A6"],
- "isolated": "\uFEDD",
- "final": "\uFEDE",
- "initial": "\uFEDF",
- "medial": "\uFEE0"
- },
- "meem": {
- "normal": ["\u0645"],
- "dot_above": ["\u0765"],
- "dot_below": ["\u0766"],
- "three_dots_above": ["\u08A7"],
- "isolated": "\uFEE1",
- "final": "\uFEE2",
- "initial": "\uFEE3",
- "medial": "\uFEE4"
- },
- "noon": {
- "normal": ["\u0646"],
- "dot_below": ["\u06B9"],
- "ring": ["\u06BC"],
- "three_dots_above": ["\u06BD"],
- "two_dots_below": ["\u0767"],
- "small_tah": ["\u0768"],
- "small_v": ["\u0769"],
- "isolated": "\uFEE5",
- "final": "\uFEE6",
- "initial": "\uFEE7",
- "medial": "\uFEE8"
- },
- "heh": {
- "normal": ["\u0647"],
- "isolated": "\uFEE9",
- "final": "\uFEEA",
- "initial": "\uFEEB",
- "medial": "\uFEEC"
- },
- "waw": {
- "normal": ["\u0648"],
- "hamza_above": {
- "normal": ["\u0624", "\u0648\u0654"],
- "isolated": "\uFE85",
- "final": "\uFE86"
- },
- "high_hamza": ["\u0676", "\u0648\u0674"],
- "ring": ["\u06C4"],
- "two_dots_above": ["\u06CA"],
- "dot_above": ["\u06CF"],
- "indic_two_above": ["\u0778"],
- "indic_three_above": ["\u0779"],
- "dot_within": ["\u08AB"],
- "isolated": "\uFEED",
- "final": "\uFEEE"
- },
- "alef_maksura": {
- "normal": ["\u0649"],
- "hamza_above": ["\u0626", "\u064A\u0654"],
- "initial": "\uFBE8",
- "medial": "\uFBE9",
- "isolated": "\uFEEF",
- "final": "\uFEF0"
- },
- "yeh": {
- "normal": ["\u064A"],
- "hamza_above": {
- "normal": ["\u0626", "\u0649\u0654"],
- "isolated": "\uFE89",
- "final": "\uFE8A",
- "initial": "\uFE8B",
- "medial": "\uFE8C"
- },
- "two_dots_below_hamza_above": ["\u08A8"],
- "high_hamza": ["\u0678", "\u064A\u0674"],
- "tail": ["\u06CD"],
- "small_v": ["\u06CE"],
- "three_dots_below": ["\u06D1"],
- "two_dots_below_dot_above": ["\u08A9"],
- "two_dots_below_small_noon_above": ["\u08BA"],
- "isolated": "\uFEF1",
- "final": "\uFEF2",
- "initial": "\uFEF3",
- "medial": "\uFEF4"
- },
- "tteh": {
- "normal": ["\u0679"],
- "isolated": "\uFB66",
- "final": "\uFB67",
- "initial": "\uFB68",
- "medial": "\uFB69"
- },
- "tteheh": {
- "normal": ["\u067A"],
- "isolated": "\uFB5E",
- "final": "\uFB5F",
- "initial": "\uFB60",
- "medial": "\uFB61"
- },
- "beeh": {
- "normal": ["\u067B"],
- "isolated": "\uFB52",
- "final": "\uFB53",
- "initial": "\uFB54",
- "medial": "\uFB55"
- },
- "peh": {
- "normal": ["\u067E"],
- "small_meem_above": ["\u08B7"],
- "isolated": "\uFB56",
- "final": "\uFB57",
- "initial": "\uFB58",
- "medial": "\uFB59"
- },
- "teheh": {
- "normal": ["\u067F"],
- "isolated": "\uFB62",
- "final": "\uFB63",
- "initial": "\uFB64",
- "medial": "\uFB65"
- },
- "beheh": {
- "normal": ["\u0680"],
- "isolated": "\uFB5A",
- "final": "\uFB5B",
- "initial": "\uFB5C",
- "medial": "\uFB5D"
- },
- "nyeh": {
- "normal": ["\u0683"],
- "isolated": "\uFB76",
- "final": "\uFB77",
- "initial": "\uFB78",
- "medial": "\uFB79"
- },
- "dyeh": {
- "normal": ["\u0684"],
- "isolated": "\uFB72",
- "final": "\uFB73",
- "initial": "\uFB74",
- "medial": "\uFB75"
- },
- "tcheh": {
- "normal": ["\u0686"],
- "dot_above": ["\u06BF"],
- "isolated": "\uFB7A",
- "final": "\uFB7B",
- "initial": "\uFB7C",
- "medial": "\uFB7D"
- },
- "tcheheh": {
- "normal": ["\u0687"],
- "isolated": "\uFB7E",
- "final": "\uFB7F",
- "initial": "\uFB80",
- "medial": "\uFB81"
- },
- "ddal": {
- "normal": ["\u0688"],
- "isolated": "\uFB88",
- "final": "\uFB89"
- },
- "dahal": {
- "normal": ["\u068C"],
- "isolated": "\uFB84",
- "final": "\uFB85"
- },
- "ddahal": {
- "normal": ["\u068D"],
- "isolated": "\uFB82",
- "final": "\uFB83"
- },
- "dul": {
- "normal": ["\u068F", "\u068E"],
- "isolated": "\uFB86",
- "final": "\uFB87"
- },
- "rreh": {
- "normal": ["\u0691"],
- "isolated": "\uFB8C",
- "final": "\uFB8D"
- },
- "jeh": {
- "normal": ["\u0698"],
- "isolated": "\uFB8A",
- "final": "\uFB8B"
- },
- "veh": {
- "normal": ["\u06A4"],
- "isolated": "\uFB6A",
- "final": "\uFB6B",
- "initial": "\uFB6C",
- "medial": "\uFB6D"
- },
- "peheh": {
- "normal": ["\u06A6"],
- "isolated": "\uFB6E",
- "final": "\uFB6F",
- "initial": "\uFB70",
- "medial": "\uFB71"
- },
- "keheh": {
- "normal": ["\u06A9"],
- "dot_above": ["\u0762"],
- "three_dots_above": ["\u0763"],
- "three_dots_pointing_upwards_below": ["\u0764"],
- "isolated": "\uFB8E",
- "final": "\uFB8F",
- "initial": "\uFB90",
- "medial": "\uFB91"
- },
- "ng": {
- "normal": ["\u06AD"],
- "isolated": "\uFBD3",
- "final": "\uFBD4",
- "initial": "\uFBD5",
- "medial": "\uFBD6"
- },
- "gaf": {
- "normal": ["\u06AF"],
- "ring": ["\u06B0"],
- "two_dots_below": ["\u06B2"],
- "three_dots_above": ["\u06B4"],
- "inverted_stroke": ["\u08B0"],
- "isolated": "\uFB92",
- "final": "\uFB93",
- "initial": "\uFB94",
- "medial": "\uFB95"
- },
- "ngoeh": {
- "normal": ["\u06B1"],
- "isolated": "\uFB9A",
- "final": "\uFB9B",
- "initial": "\uFB9C",
- "medial": "\uFB9D"
- },
- "gueh": {
- "normal": ["\u06B3"],
- "isolated": "\uFB96",
- "final": "\uFB97",
- "initial": "\uFB98",
- "medial": "\uFB99"
- },
- "noon ghunna": {
- "normal": ["\u06BA"],
- "isolated": "\uFB9E",
- "final": "\uFB9F"
- },
- "rnoon": {
- "normal": ["\u06BB"],
- "isolated": "\uFBA0",
- "final": "\uFBA1",
- "initial": "\uFBA2",
- "medial": "\uFBA3"
- },
- "heh doachashmee": {
- "normal": ["\u06BE"],
- "isolated": "\uFBAA",
- "final": "\uFBAB",
- "initial": "\uFBAC",
- "medial": "\uFBAD"
- },
- "heh goal": {
- "normal": ["\u06C1"],
- "hamza_above": ["\u06C1\u0654", "\u06C2"],
- "isolated": "\uFBA6",
- "final": "\uFBA7",
- "initial": "\uFBA8",
- "medial": "\uFBA9"
- },
- "teh marbuta goal": {
- "normal": ["\u06C3"]
- },
- "kirghiz oe": {
- "normal": ["\u06C5"],
- "isolated": "\uFBE0",
- "final": "\uFBE1"
- },
- "oe": {
- "normal": ["\u06C6"],
- "isolated": "\uFBD9",
- "final": "\uFBDA"
- },
- "u": {
- "normal": ["\u06C7"],
- "hamza_above": {
- "normal": ["\u0677", "\u06C7\u0674"],
- "isolated": "\uFBDD"
- },
- "isolated": "\uFBD7",
- "final": "\uFBD8"
- },
- "yu": {
- "normal": ["\u06C8"],
- "isolated": "\uFBDB",
- "final": "\uFBDC"
- },
- "kirghiz yu": {
- "normal": ["\u06C9"],
- "isolated": "\uFBE2",
- "final": "\uFBE3"
- },
- "ve": {
- "normal": ["\u06CB"],
- "isolated": "\uFBDE",
- "final": "\uFBDF"
- },
- "farsi yeh": {
- "normal": ["\u06CC"],
- "indic_two_above": ["\u0775"],
- "indic_three_above": ["\u0776"],
- "indic_four_above": ["\u0777"],
- "isolated": "\uFBFC",
- "final": "\uFBFD",
- "initial": "\uFBFE",
- "medial": "\uFBFF"
+ Object.defineProperty(unicodeArabic, "__esModule", {
+ value: true
+ });
+ var arabicReference = {
+ "alef": {
+ "normal": ["\u0627"],
+ "madda_above": {
+ "normal": ["\u0627\u0653", "\u0622"],
+ "isolated": "\uFE81",
+ "final": "\uFE82"
},
- "e": {
- "normal": ["\u06D0"],
- "isolated": "\uFBE4",
- "final": "\uFBE5",
- "initial": "\uFBE6",
- "medial": "\uFBE7"
+ "hamza_above": {
+ "normal": ["\u0627\u0654", "\u0623"],
+ "isolated": "\uFE83",
+ "final": "\uFE84"
},
- "yeh barree": {
- "normal": ["\u06D2"],
- "hamza_above": {
- "normal": ["\u06D2\u0654", "\u06D3"],
- "isolated": "\uFBB0",
- "final": "\uFBB1"
- },
- "indic_two_above": ["\u077A"],
- "indic_three_above": ["\u077B"],
- "isolated": "\uFBAE",
- "final": "\uFBAF"
+ "hamza_below": {
+ "normal": ["\u0627\u0655", "\u0625"],
+ "isolated": "\uFE87",
+ "final": "\uFE88"
},
- "ae": {
- "normal": ["\u06D5"],
- "isolated": "\u06D5",
- "final": "\uFEEA",
- "yeh_above": {
- "normal": ["\u06C0", "\u06D5\u0654"],
- "isolated": "\uFBA4",
- "final": "\uFBA5"
- }
+ "wasla": {
+ "normal": "\u0671",
+ "isolated": "\uFB50",
+ "final": "\uFB51"
},
- "rohingya yeh": {
- "normal": ["\u08AC"]
+ "wavy_hamza_above": ["\u0672"],
+ "wavy_hamza_below": ["\u0627\u065F", "\u0673"],
+ "high_hamza": ["\u0675", "\u0627\u0674"],
+ "indic_two_above": ["\u0773"],
+ "indic_three_above": ["\u0774"],
+ "fathatan": {
+ "normal": ["\u0627\u064B"],
+ "final": "\uFD3C",
+ "isolated": "\uFD3D"
},
- "low alef": {
- "normal": ["\u08AD"]
+ "isolated": "\uFE8D",
+ "final": "\uFE8E"
+ },
+ "beh": {
+ "normal": ["\u0628"],
+ "dotless": ["\u066E"],
+ "three_dots_horizontally_below": ["\u0750"],
+ "dot_below_three_dots_above": ["\u0751"],
+ "three_dots_pointing_upwards_below": ["\u0752"],
+ "three_dots_pointing_upwards_below_two_dots_above": ["\u0753"],
+ "two_dots_below_dot_above": ["\u0754"],
+ "inverted_small_v_below": ["\u0755"],
+ "small_v": ["\u0756"],
+ "small_v_below": ["\u08A0"],
+ "hamza_above": ["\u08A1"],
+ "small_meem_above": ["\u08B6"],
+ "isolated": "\uFE8F",
+ "final": "\uFE90",
+ "initial": "\uFE91",
+ "medial": "\uFE92"
+ },
+ "teh marbuta": {
+ "normal": ["\u0629"],
+ "isolated": "\uFE93",
+ "final": "\uFE94"
+ },
+ "teh": {
+ "normal": ["\u062A"],
+ "ring": ["\u067C"],
+ "three_dots_above_downwards": ["\u067D"],
+ "small_teh_above": ["\u08B8"],
+ "isolated": "\uFE95",
+ "final": "\uFE96",
+ "initial": "\uFE97",
+ "medial": "\uFE98"
+ },
+ "theh": {
+ "normal": ["\u062B"],
+ "isolated": "\uFE99",
+ "final": "\uFE9A",
+ "initial": "\uFE9B",
+ "medial": "\uFE9C"
+ },
+ "jeem": {
+ "normal": ["\u062C"],
+ "two_dots_above": ["\u08A2"],
+ "isolated": "\uFE9D",
+ "final": "\uFE9E",
+ "initial": "\uFE9F",
+ "medial": "\uFEA0"
+ },
+ "hah": {
+ "normal": ["\u062D"],
+ "hamza_above": ["\u0681"],
+ "two_dots_vertical_above": ["\u0682"],
+ "three_dots_above": ["\u0685"],
+ "two_dots_above": ["\u0757"],
+ "three_dots_pointing_upwards_below": ["\u0758"],
+ "small_tah_below": ["\u076E"],
+ "small_tah_two_dots": ["\u076F"],
+ "small_tah_above": ["\u0772"],
+ "indic_four_below": ["\u077C"],
+ "isolated": "\uFEA1",
+ "final": "\uFEA2",
+ "initial": "\uFEA3",
+ "medial": "\uFEA4"
+ },
+ "khah": {
+ "normal": ["\u062E"],
+ "isolated": "\uFEA5",
+ "final": "\uFEA6",
+ "initial": "\uFEA7",
+ "medial": "\uFEA8"
+ },
+ "dal": {
+ "normal": ["\u062F"],
+ "ring": ["\u0689"],
+ "dot_below": ["\u068A"],
+ "dot_below_small_tah": ["\u068B"],
+ "three_dots_above_downwards": ["\u068F"],
+ "four_dots_above": ["\u0690"],
+ "inverted_v": ["\u06EE"],
+ "two_dots_vertically_below_small_tah": ["\u0759"],
+ "inverted_small_v_below": ["\u075A"],
+ "three_dots_below": ["\u08AE"],
+ "isolated": "\uFEA9",
+ "final": "\uFEAA"
+ },
+ "thal": {
+ "normal": ["\u0630"],
+ "isolated": "\uFEAB",
+ "final": "\uFEAC"
+ },
+ "reh": {
+ "normal": ["\u0631"],
+ "small_v": ["\u0692"],
+ "ring": ["\u0693"],
+ "dot_below": ["\u0694"],
+ "small_v_below": ["\u0695"],
+ "dot_below_dot_above": ["\u0696"],
+ "two_dots_above": ["\u0697"],
+ "four_dots_above": ["\u0699"],
+ "inverted_v": ["\u06EF"],
+ "stroke": ["\u075B"],
+ "two_dots_vertically_above": ["\u076B"],
+ "hamza_above": ["\u076C"],
+ "small_tah_two_dots": ["\u0771"],
+ "loop": ["\u08AA"],
+ "small_noon_above": ["\u08B9"],
+ "isolated": "\uFEAD",
+ "final": "\uFEAE"
+ },
+ "zain": {
+ "normal": ["\u0632"],
+ "inverted_v_above": ["\u08B2"],
+ "isolated": "\uFEAF",
+ "final": "\uFEB0"
+ },
+ "seen": {
+ "normal": ["\u0633"],
+ "dot_below_dot_above": ["\u069A"],
+ "three_dots_below": ["\u069B"],
+ "three_dots_below_three_dots_above": ["\u069C"],
+ "four_dots_above": ["\u075C"],
+ "two_dots_vertically_above": ["\u076D"],
+ "small_tah_two_dots": ["\u0770"],
+ "indic_four_above": ["\u077D"],
+ "inverted_v": ["\u077E"],
+ "isolated": "\uFEB1",
+ "final": "\uFEB2",
+ "initial": "\uFEB3",
+ "medial": "\uFEB4"
+ },
+ "sheen": {
+ "normal": ["\u0634"],
+ "dot_below": ["\u06FA"],
+ "isolated": "\uFEB5",
+ "final": "\uFEB6",
+ "initial": "\uFEB7",
+ "medial": "\uFEB8"
+ },
+ "sad": {
+ "normal": ["\u0635"],
+ "two_dots_below": ["\u069D"],
+ "three_dots_above": ["\u069E"],
+ "three_dots_below": ["\u08AF"],
+ "isolated": "\uFEB9",
+ "final": "\uFEBA",
+ "initial": "\uFEBB",
+ "medial": "\uFEBC"
+ },
+ "dad": {
+ "normal": ["\u0636"],
+ "dot_below": ["\u06FB"],
+ "isolated": "\uFEBD",
+ "final": "\uFEBE",
+ "initial": "\uFEBF",
+ "medial": "\uFEC0"
+ },
+ "tah": {
+ "normal": ["\u0637"],
+ "three_dots_above": ["\u069F"],
+ "two_dots_above": ["\u08A3"],
+ "isolated": "\uFEC1",
+ "final": "\uFEC2",
+ "initial": "\uFEC3",
+ "medial": "\uFEC4"
+ },
+ "zah": {
+ "normal": ["\u0638"],
+ "isolated": "\uFEC5",
+ "final": "\uFEC6",
+ "initial": "\uFEC7",
+ "medial": "\uFEC8"
+ },
+ "ain": {
+ "normal": ["\u0639"],
+ "three_dots_above": ["\u06A0"],
+ "two_dots_above": ["\u075D"],
+ "three_dots_pointing_downwards_above": ["\u075E"],
+ "two_dots_vertically_above": ["\u075F"],
+ "three_dots_below": ["\u08B3"],
+ "isolated": "\uFEC9",
+ "final": "\uFECA",
+ "initial": "\uFECB",
+ "medial": "\uFECC"
+ },
+ "ghain": {
+ "normal": ["\u063A"],
+ "dot_below": ["\u06FC"],
+ "isolated": "\uFECD",
+ "final": "\uFECE",
+ "initial": "\uFECF",
+ "medial": "\uFED0"
+ },
+ "feh": {
+ "normal": ["\u0641"],
+ "dotless": ["\u06A1"],
+ "dot_moved_below": ["\u06A2"],
+ "dot_below": ["\u06A3"],
+ "three_dots_below": ["\u06A5"],
+ "two_dots_below": ["\u0760"],
+ "three_dots_pointing_upwards_below": ["\u0761"],
+ "dot_below_three_dots_above": ["\u08A4"],
+ "isolated": "\uFED1",
+ "final": "\uFED2",
+ "initial": "\uFED3",
+ "medial": "\uFED4"
+ },
+ "qaf": {
+ "normal": ["\u0642"],
+ "dotless": ["\u066F"],
+ "dot_above": ["\u06A7"],
+ "three_dots_above": ["\u06A8"],
+ "dot_below": ["\u08A5"],
+ "isolated": "\uFED5",
+ "final": "\uFED6",
+ "initial": "\uFED7",
+ "medial": "\uFED8"
+ },
+ "kaf": {
+ "normal": ["\u0643"],
+ "swash": ["\u06AA"],
+ "ring": ["\u06AB"],
+ "dot_above": ["\u06AC"],
+ "three_dots_below": ["\u06AE"],
+ "two_dots_above": ["\u077F"],
+ "dot_below": ["\u08B4"],
+ "isolated": "\uFED9",
+ "final": "\uFEDA",
+ "initial": "\uFEDB",
+ "medial": "\uFEDC"
+ },
+ "lam": {
+ "normal": ["\u0644"],
+ "small_v": ["\u06B5"],
+ "dot_above": ["\u06B6"],
+ "three_dots_above": ["\u06B7"],
+ "three_dots_below": ["\u06B8"],
+ "bar": ["\u076A"],
+ "double_bar": ["\u08A6"],
+ "isolated": "\uFEDD",
+ "final": "\uFEDE",
+ "initial": "\uFEDF",
+ "medial": "\uFEE0"
+ },
+ "meem": {
+ "normal": ["\u0645"],
+ "dot_above": ["\u0765"],
+ "dot_below": ["\u0766"],
+ "three_dots_above": ["\u08A7"],
+ "isolated": "\uFEE1",
+ "final": "\uFEE2",
+ "initial": "\uFEE3",
+ "medial": "\uFEE4"
+ },
+ "noon": {
+ "normal": ["\u0646"],
+ "dot_below": ["\u06B9"],
+ "ring": ["\u06BC"],
+ "three_dots_above": ["\u06BD"],
+ "two_dots_below": ["\u0767"],
+ "small_tah": ["\u0768"],
+ "small_v": ["\u0769"],
+ "isolated": "\uFEE5",
+ "final": "\uFEE6",
+ "initial": "\uFEE7",
+ "medial": "\uFEE8"
+ },
+ "heh": {
+ "normal": ["\u0647"],
+ "isolated": "\uFEE9",
+ "final": "\uFEEA",
+ "initial": "\uFEEB",
+ "medial": "\uFEEC"
+ },
+ "waw": {
+ "normal": ["\u0648"],
+ "hamza_above": {
+ "normal": ["\u0624", "\u0648\u0654"],
+ "isolated": "\uFE85",
+ "final": "\uFE86"
},
- "straight waw": {
- "normal": ["\u08B1"]
+ "high_hamza": ["\u0676", "\u0648\u0674"],
+ "ring": ["\u06C4"],
+ "two_dots_above": ["\u06CA"],
+ "dot_above": ["\u06CF"],
+ "indic_two_above": ["\u0778"],
+ "indic_three_above": ["\u0779"],
+ "dot_within": ["\u08AB"],
+ "isolated": "\uFEED",
+ "final": "\uFEEE"
+ },
+ "alef_maksura": {
+ "normal": ["\u0649"],
+ "hamza_above": ["\u0626", "\u064A\u0654"],
+ "initial": "\uFBE8",
+ "medial": "\uFBE9",
+ "isolated": "\uFEEF",
+ "final": "\uFEF0"
+ },
+ "yeh": {
+ "normal": ["\u064A"],
+ "hamza_above": {
+ "normal": ["\u0626", "\u0649\u0654"],
+ "isolated": "\uFE89",
+ "final": "\uFE8A",
+ "initial": "\uFE8B",
+ "medial": "\uFE8C"
},
- "african feh": {
- "normal": ["\u08BB"]
+ "two_dots_below_hamza_above": ["\u08A8"],
+ "high_hamza": ["\u0678", "\u064A\u0674"],
+ "tail": ["\u06CD"],
+ "small_v": ["\u06CE"],
+ "three_dots_below": ["\u06D1"],
+ "two_dots_below_dot_above": ["\u08A9"],
+ "two_dots_below_small_noon_above": ["\u08BA"],
+ "isolated": "\uFEF1",
+ "final": "\uFEF2",
+ "initial": "\uFEF3",
+ "medial": "\uFEF4"
+ },
+ "tteh": {
+ "normal": ["\u0679"],
+ "isolated": "\uFB66",
+ "final": "\uFB67",
+ "initial": "\uFB68",
+ "medial": "\uFB69"
+ },
+ "tteheh": {
+ "normal": ["\u067A"],
+ "isolated": "\uFB5E",
+ "final": "\uFB5F",
+ "initial": "\uFB60",
+ "medial": "\uFB61"
+ },
+ "beeh": {
+ "normal": ["\u067B"],
+ "isolated": "\uFB52",
+ "final": "\uFB53",
+ "initial": "\uFB54",
+ "medial": "\uFB55"
+ },
+ "peh": {
+ "normal": ["\u067E"],
+ "small_meem_above": ["\u08B7"],
+ "isolated": "\uFB56",
+ "final": "\uFB57",
+ "initial": "\uFB58",
+ "medial": "\uFB59"
+ },
+ "teheh": {
+ "normal": ["\u067F"],
+ "isolated": "\uFB62",
+ "final": "\uFB63",
+ "initial": "\uFB64",
+ "medial": "\uFB65"
+ },
+ "beheh": {
+ "normal": ["\u0680"],
+ "isolated": "\uFB5A",
+ "final": "\uFB5B",
+ "initial": "\uFB5C",
+ "medial": "\uFB5D"
+ },
+ "nyeh": {
+ "normal": ["\u0683"],
+ "isolated": "\uFB76",
+ "final": "\uFB77",
+ "initial": "\uFB78",
+ "medial": "\uFB79"
+ },
+ "dyeh": {
+ "normal": ["\u0684"],
+ "isolated": "\uFB72",
+ "final": "\uFB73",
+ "initial": "\uFB74",
+ "medial": "\uFB75"
+ },
+ "tcheh": {
+ "normal": ["\u0686"],
+ "dot_above": ["\u06BF"],
+ "isolated": "\uFB7A",
+ "final": "\uFB7B",
+ "initial": "\uFB7C",
+ "medial": "\uFB7D"
+ },
+ "tcheheh": {
+ "normal": ["\u0687"],
+ "isolated": "\uFB7E",
+ "final": "\uFB7F",
+ "initial": "\uFB80",
+ "medial": "\uFB81"
+ },
+ "ddal": {
+ "normal": ["\u0688"],
+ "isolated": "\uFB88",
+ "final": "\uFB89"
+ },
+ "dahal": {
+ "normal": ["\u068C"],
+ "isolated": "\uFB84",
+ "final": "\uFB85"
+ },
+ "ddahal": {
+ "normal": ["\u068D"],
+ "isolated": "\uFB82",
+ "final": "\uFB83"
+ },
+ "dul": {
+ "normal": ["\u068F", "\u068E"],
+ "isolated": "\uFB86",
+ "final": "\uFB87"
+ },
+ "rreh": {
+ "normal": ["\u0691"],
+ "isolated": "\uFB8C",
+ "final": "\uFB8D"
+ },
+ "jeh": {
+ "normal": ["\u0698"],
+ "isolated": "\uFB8A",
+ "final": "\uFB8B"
+ },
+ "veh": {
+ "normal": ["\u06A4"],
+ "isolated": "\uFB6A",
+ "final": "\uFB6B",
+ "initial": "\uFB6C",
+ "medial": "\uFB6D"
+ },
+ "peheh": {
+ "normal": ["\u06A6"],
+ "isolated": "\uFB6E",
+ "final": "\uFB6F",
+ "initial": "\uFB70",
+ "medial": "\uFB71"
+ },
+ "keheh": {
+ "normal": ["\u06A9"],
+ "dot_above": ["\u0762"],
+ "three_dots_above": ["\u0763"],
+ "three_dots_pointing_upwards_below": ["\u0764"],
+ "isolated": "\uFB8E",
+ "final": "\uFB8F",
+ "initial": "\uFB90",
+ "medial": "\uFB91"
+ },
+ "ng": {
+ "normal": ["\u06AD"],
+ "isolated": "\uFBD3",
+ "final": "\uFBD4",
+ "initial": "\uFBD5",
+ "medial": "\uFBD6"
+ },
+ "gaf": {
+ "normal": ["\u06AF"],
+ "ring": ["\u06B0"],
+ "two_dots_below": ["\u06B2"],
+ "three_dots_above": ["\u06B4"],
+ "inverted_stroke": ["\u08B0"],
+ "isolated": "\uFB92",
+ "final": "\uFB93",
+ "initial": "\uFB94",
+ "medial": "\uFB95"
+ },
+ "ngoeh": {
+ "normal": ["\u06B1"],
+ "isolated": "\uFB9A",
+ "final": "\uFB9B",
+ "initial": "\uFB9C",
+ "medial": "\uFB9D"
+ },
+ "gueh": {
+ "normal": ["\u06B3"],
+ "isolated": "\uFB96",
+ "final": "\uFB97",
+ "initial": "\uFB98",
+ "medial": "\uFB99"
+ },
+ "noon ghunna": {
+ "normal": ["\u06BA"],
+ "isolated": "\uFB9E",
+ "final": "\uFB9F"
+ },
+ "rnoon": {
+ "normal": ["\u06BB"],
+ "isolated": "\uFBA0",
+ "final": "\uFBA1",
+ "initial": "\uFBA2",
+ "medial": "\uFBA3"
+ },
+ "heh doachashmee": {
+ "normal": ["\u06BE"],
+ "isolated": "\uFBAA",
+ "final": "\uFBAB",
+ "initial": "\uFBAC",
+ "medial": "\uFBAD"
+ },
+ "heh goal": {
+ "normal": ["\u06C1"],
+ "hamza_above": ["\u06C1\u0654", "\u06C2"],
+ "isolated": "\uFBA6",
+ "final": "\uFBA7",
+ "initial": "\uFBA8",
+ "medial": "\uFBA9"
+ },
+ "teh marbuta goal": {
+ "normal": ["\u06C3"]
+ },
+ "kirghiz oe": {
+ "normal": ["\u06C5"],
+ "isolated": "\uFBE0",
+ "final": "\uFBE1"
+ },
+ "oe": {
+ "normal": ["\u06C6"],
+ "isolated": "\uFBD9",
+ "final": "\uFBDA"
+ },
+ "u": {
+ "normal": ["\u06C7"],
+ "hamza_above": {
+ "normal": ["\u0677", "\u06C7\u0674"],
+ "isolated": "\uFBDD"
},
- "african qaf": {
- "normal": ["\u08BC"]
+ "isolated": "\uFBD7",
+ "final": "\uFBD8"
+ },
+ "yu": {
+ "normal": ["\u06C8"],
+ "isolated": "\uFBDB",
+ "final": "\uFBDC"
+ },
+ "kirghiz yu": {
+ "normal": ["\u06C9"],
+ "isolated": "\uFBE2",
+ "final": "\uFBE3"
+ },
+ "ve": {
+ "normal": ["\u06CB"],
+ "isolated": "\uFBDE",
+ "final": "\uFBDF"
+ },
+ "farsi yeh": {
+ "normal": ["\u06CC"],
+ "indic_two_above": ["\u0775"],
+ "indic_three_above": ["\u0776"],
+ "indic_four_above": ["\u0777"],
+ "isolated": "\uFBFC",
+ "final": "\uFBFD",
+ "initial": "\uFBFE",
+ "medial": "\uFBFF"
+ },
+ "e": {
+ "normal": ["\u06D0"],
+ "isolated": "\uFBE4",
+ "final": "\uFBE5",
+ "initial": "\uFBE6",
+ "medial": "\uFBE7"
+ },
+ "yeh barree": {
+ "normal": ["\u06D2"],
+ "hamza_above": {
+ "normal": ["\u06D2\u0654", "\u06D3"],
+ "isolated": "\uFBB0",
+ "final": "\uFBB1"
},
- "african noon": {
- "normal": ["\u08BD"]
+ "indic_two_above": ["\u077A"],
+ "indic_three_above": ["\u077B"],
+ "isolated": "\uFBAE",
+ "final": "\uFBAF"
+ },
+ "ae": {
+ "normal": ["\u06D5"],
+ "isolated": "\u06D5",
+ "final": "\uFEEA",
+ "yeh_above": {
+ "normal": ["\u06C0", "\u06D5\u0654"],
+ "isolated": "\uFBA4",
+ "final": "\uFBA5"
}
- };
- exports["default"] = arabicReference;
- });
+ },
+ "rohingya yeh": {
+ "normal": ["\u08AC"]
+ },
+ "low alef": {
+ "normal": ["\u08AD"]
+ },
+ "straight waw": {
+ "normal": ["\u08B1"]
+ },
+ "african feh": {
+ "normal": ["\u08BB"]
+ },
+ "african qaf": {
+ "normal": ["\u08BC"]
+ },
+ "african noon": {
+ "normal": ["\u08BD"]
+ }
+ };
- var unicodeLigatures = createCommonjsModule(function (module, exports) {
+ unicodeArabic["default"] = arabicReference;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- var ligatureReference = {
- "\u0626\u0627": {
- "isolated": "\uFBEA",
- "final": "\uFBEB"
- },
- "\u0626\u06D5": {
- "isolated": "\uFBEC",
- "final": "\uFBED"
- },
- "\u0626\u0648": {
- "isolated": "\uFBEE",
- "final": "\uFBEF"
- },
- "\u0626\u06C7": {
- "isolated": "\uFBF0",
- "final": "\uFBF1"
- },
- "\u0626\u06C6": {
- "isolated": "\uFBF2",
- "final": "\uFBF3"
- },
- "\u0626\u06C8": {
- "isolated": "\uFBF4",
- "final": "\uFBF5"
- },
- "\u0626\u06D0": {
- "isolated": "\uFBF6",
- "final": "\uFBF7",
- "initial": "\uFBF8"
- },
- "\u0626\u0649": {
- "uighur_kirghiz": {
- "isolated": "\uFBF9",
- "final": "\uFBFA",
- "initial": "\uFBFB"
- },
- "isolated": "\uFC03",
- "final": "\uFC68"
- },
- "\u0626\u062C": {
- "isolated": "\uFC00",
- "initial": "\uFC97"
- },
- "\u0626\u062D": {
- "isolated": "\uFC01",
- "initial": "\uFC98"
- },
- "\u0626\u0645": {
- "isolated": "\uFC02",
- "final": "\uFC66",
- "initial": "\uFC9A",
- "medial": "\uFCDF"
- },
- "\u0626\u064A": {
- "isolated": "\uFC04",
- "final": "\uFC69"
- },
- "\u0628\u062C": {
- "isolated": "\uFC05",
- "initial": "\uFC9C"
- },
- "\u0628\u062D": {
- "isolated": "\uFC06",
- "initial": "\uFC9D"
- },
- "\u0628\u062E": {
- "isolated": "\uFC07",
- "initial": "\uFC9E"
- },
- "\u0628\u0645": {
- "isolated": "\uFC08",
- "final": "\uFC6C",
- "initial": "\uFC9F",
- "medial": "\uFCE1"
- },
- "\u0628\u0649": {
- "isolated": "\uFC09",
- "final": "\uFC6E"
- },
- "\u0628\u064A": {
- "isolated": "\uFC0A",
- "final": "\uFC6F"
- },
- "\u062A\u062C": {
- "isolated": "\uFC0B",
- "initial": "\uFCA1"
- },
- "\u062A\u062D": {
- "isolated": "\uFC0C",
- "initial": "\uFCA2"
- },
- "\u062A\u062E": {
- "isolated": "\uFC0D",
- "initial": "\uFCA3"
- },
- "\u062A\u0645": {
- "isolated": "\uFC0E",
- "final": "\uFC72",
- "initial": "\uFCA4",
- "medial": "\uFCE3"
- },
- "\u062A\u0649": {
- "isolated": "\uFC0F",
- "final": "\uFC74"
- },
- "\u062A\u064A": {
- "isolated": "\uFC10",
- "final": "\uFC75"
- },
- "\u062B\u062C": {
- "isolated": "\uFC11"
- },
- "\u062B\u0645": {
- "isolated": "\uFC12",
- "final": "\uFC78",
- "initial": "\uFCA6",
- "medial": "\uFCE5"
- },
- "\u062B\u0649": {
- "isolated": "\uFC13",
- "final": "\uFC7A"
- },
- "\u062B\u0648": {
- "isolated": "\uFC14"
- },
- "\u062C\u062D": {
- "isolated": "\uFC15",
- "initial": "\uFCA7"
- },
- "\u062C\u0645": {
- "isolated": "\uFC16",
- "initial": "\uFCA8"
- },
- "\u062D\u062C": {
- "isolated": "\uFC17",
- "initial": "\uFCA9"
- },
- "\u062D\u0645": {
- "isolated": "\uFC18",
- "initial": "\uFCAA"
- },
- "\u062E\u062C": {
- "isolated": "\uFC19",
- "initial": "\uFCAB"
- },
- "\u062E\u062D": {
- "isolated": "\uFC1A"
- },
- "\u062E\u0645": {
- "isolated": "\uFC1B",
- "initial": "\uFCAC"
- },
- "\u0633\u062C": {
- "isolated": "\uFC1C",
- "initial": "\uFCAD",
- "medial": "\uFD34"
- },
- "\u0633\u062D": {
- "isolated": "\uFC1D",
- "initial": "\uFCAE",
- "medial": "\uFD35"
- },
- "\u0633\u062E": {
- "isolated": "\uFC1E",
- "initial": "\uFCAF",
- "medial": "\uFD36"
- },
- "\u0633\u0645": {
- "isolated": "\uFC1F",
- "initial": "\uFCB0",
- "medial": "\uFCE7"
- },
- "\u0635\u062D": {
- "isolated": "\uFC20",
- "initial": "\uFCB1"
- },
- "\u0635\u0645": {
- "isolated": "\uFC21",
- "initial": "\uFCB3"
- },
- "\u0636\u062C": {
- "isolated": "\uFC22",
- "initial": "\uFCB4"
- },
- "\u0636\u062D": {
- "isolated": "\uFC23",
- "initial": "\uFCB5"
- },
- "\u0636\u062E": {
- "isolated": "\uFC24",
- "initial": "\uFCB6"
- },
- "\u0636\u0645": {
- "isolated": "\uFC25",
- "initial": "\uFCB7"
- },
- "\u0637\u062D": {
- "isolated": "\uFC26",
- "initial": "\uFCB8"
- },
- "\u0637\u0645": {
- "isolated": "\uFC27",
- "initial": "\uFD33",
- "medial": "\uFD3A"
- },
- "\u0638\u0645": {
- "isolated": "\uFC28",
- "initial": "\uFCB9",
- "medial": "\uFD3B"
- },
- "\u0639\u062C": {
- "isolated": "\uFC29",
- "initial": "\uFCBA"
- },
- "\u0639\u0645": {
- "isolated": "\uFC2A",
- "initial": "\uFCBB"
- },
- "\u063A\u062C": {
- "isolated": "\uFC2B",
- "initial": "\uFCBC"
- },
- "\u063A\u0645": {
- "isolated": "\uFC2C",
- "initial": "\uFCBD"
- },
- "\u0641\u062C": {
- "isolated": "\uFC2D",
- "initial": "\uFCBE"
- },
- "\u0641\u062D": {
- "isolated": "\uFC2E",
- "initial": "\uFCBF"
- },
- "\u0641\u062E": {
- "isolated": "\uFC2F",
- "initial": "\uFCC0"
- },
- "\u0641\u0645": {
- "isolated": "\uFC30",
- "initial": "\uFCC1"
- },
- "\u0641\u0649": {
- "isolated": "\uFC31",
- "final": "\uFC7C"
- },
- "\u0641\u064A": {
- "isolated": "\uFC32",
- "final": "\uFC7D"
- },
- "\u0642\u062D": {
- "isolated": "\uFC33",
- "initial": "\uFCC2"
- },
- "\u0642\u0645": {
- "isolated": "\uFC34",
- "initial": "\uFCC3"
- },
- "\u0642\u0649": {
- "isolated": "\uFC35",
- "final": "\uFC7E"
- },
- "\u0642\u064A": {
- "isolated": "\uFC36",
- "final": "\uFC7F"
- },
- "\u0643\u0627": {
- "isolated": "\uFC37",
- "final": "\uFC80"
- },
- "\u0643\u062C": {
- "isolated": "\uFC38",
- "initial": "\uFCC4"
- },
- "\u0643\u062D": {
- "isolated": "\uFC39",
- "initial": "\uFCC5"
- },
- "\u0643\u062E": {
- "isolated": "\uFC3A",
- "initial": "\uFCC6"
- },
- "\u0643\u0644": {
- "isolated": "\uFC3B",
- "final": "\uFC81",
- "initial": "\uFCC7",
- "medial": "\uFCEB"
- },
- "\u0643\u0645": {
- "isolated": "\uFC3C",
- "final": "\uFC82",
- "initial": "\uFCC8",
- "medial": "\uFCEC"
- },
- "\u0643\u0649": {
- "isolated": "\uFC3D",
- "final": "\uFC83"
- },
- "\u0643\u064A": {
- "isolated": "\uFC3E",
- "final": "\uFC84"
- },
- "\u0644\u062C": {
- "isolated": "\uFC3F",
- "initial": "\uFCC9"
- },
- "\u0644\u062D": {
- "isolated": "\uFC40",
- "initial": "\uFCCA"
- },
- "\u0644\u062E": {
- "isolated": "\uFC41",
- "initial": "\uFCCB"
- },
- "\u0644\u0645": {
- "isolated": "\uFC42",
- "final": "\uFC85",
- "initial": "\uFCCC",
- "medial": "\uFCED"
- },
- "\u0644\u0649": {
- "isolated": "\uFC43",
- "final": "\uFC86"
- },
- "\u0644\u064A": {
- "isolated": "\uFC44",
- "final": "\uFC87"
- },
- "\u0645\u062C": {
- "isolated": "\uFC45",
- "initial": "\uFCCE"
- },
- "\u0645\u062D": {
- "isolated": "\uFC46",
- "initial": "\uFCCF"
- },
- "\u0645\u062E": {
- "isolated": "\uFC47",
- "initial": "\uFCD0"
- },
- "\u0645\u0645": {
- "isolated": "\uFC48",
- "final": "\uFC89",
- "initial": "\uFCD1"
- },
- "\u0645\u0649": {
- "isolated": "\uFC49"
- },
- "\u0645\u064A": {
- "isolated": "\uFC4A"
- },
- "\u0646\u062C": {
- "isolated": "\uFC4B",
- "initial": "\uFCD2"
- },
- "\u0646\u062D": {
- "isolated": "\uFC4C",
- "initial": "\uFCD3"
- },
- "\u0646\u062E": {
- "isolated": "\uFC4D",
- "initial": "\uFCD4"
- },
- "\u0646\u0645": {
- "isolated": "\uFC4E",
- "final": "\uFC8C",
- "initial": "\uFCD5",
- "medial": "\uFCEE"
- },
- "\u0646\u0649": {
- "isolated": "\uFC4F",
- "final": "\uFC8E"
- },
- "\u0646\u064A": {
- "isolated": "\uFC50",
- "final": "\uFC8F"
- },
- "\u0647\u062C": {
- "isolated": "\uFC51",
- "initial": "\uFCD7"
- },
- "\u0647\u0645": {
- "isolated": "\uFC52",
- "initial": "\uFCD8"
- },
- "\u0647\u0649": {
- "isolated": "\uFC53"
- },
- "\u0647\u064A": {
- "isolated": "\uFC54"
- },
- "\u064A\u062C": {
- "isolated": "\uFC55",
- "initial": "\uFCDA"
- },
- "\u064A\u062D": {
- "isolated": "\uFC56",
- "initial": "\uFCDB"
- },
- "\u064A\u062E": {
- "isolated": "\uFC57",
- "initial": "\uFCDC"
- },
- "\u064A\u0645": {
- "isolated": "\uFC58",
- "final": "\uFC93",
- "initial": "\uFCDD",
- "medial": "\uFCF0"
- },
- "\u064A\u0649": {
- "isolated": "\uFC59",
- "final": "\uFC95"
- },
- "\u064A\u064A": {
- "isolated": "\uFC5A",
- "final": "\uFC96"
- },
- "\u0630\u0670": {
- "isolated": "\uFC5B"
- },
- "\u0631\u0670": {
- "isolated": "\uFC5C"
- },
- "\u0649\u0670": {
- "isolated": "\uFC5D",
- "final": "\uFC90"
- },
- "\u064C\u0651": {
- "isolated": "\uFC5E"
- },
- "\u064D\u0651": {
- "isolated": "\uFC5F"
- },
- "\u064E\u0651": {
- "isolated": "\uFC60"
- },
- "\u064F\u0651": {
- "isolated": "\uFC61"
- },
- "\u0650\u0651": {
- "isolated": "\uFC62"
- },
- "\u0651\u0670": {
- "isolated": "\uFC63"
- },
- "\u0626\u0631": {
- "final": "\uFC64"
- },
- "\u0626\u0632": {
- "final": "\uFC65"
- },
- "\u0626\u0646": {
- "final": "\uFC67"
- },
- "\u0628\u0631": {
- "final": "\uFC6A"
- },
- "\u0628\u0632": {
- "final": "\uFC6B"
- },
- "\u0628\u0646": {
- "final": "\uFC6D"
- },
- "\u062A\u0631": {
- "final": "\uFC70"
- },
- "\u062A\u0632": {
- "final": "\uFC71"
- },
- "\u062A\u0646": {
- "final": "\uFC73"
- },
- "\u062B\u0631": {
- "final": "\uFC76"
- },
- "\u062B\u0632": {
- "final": "\uFC77"
- },
- "\u062B\u0646": {
- "final": "\uFC79"
- },
- "\u062B\u064A": {
- "final": "\uFC7B"
- },
- "\u0645\u0627": {
- "final": "\uFC88"
- },
- "\u0646\u0631": {
- "final": "\uFC8A"
- },
- "\u0646\u0632": {
- "final": "\uFC8B"
- },
- "\u0646\u0646": {
- "final": "\uFC8D"
- },
- "\u064A\u0631": {
- "final": "\uFC91"
- },
- "\u064A\u0632": {
- "final": "\uFC92"
- },
- "\u064A\u0646": {
- "final": "\uFC94"
- },
- "\u0626\u062E": {
- "initial": "\uFC99"
- },
- "\u0626\u0647": {
- "initial": "\uFC9B",
- "medial": "\uFCE0"
- },
- "\u0628\u0647": {
- "initial": "\uFCA0",
- "medial": "\uFCE2"
- },
- "\u062A\u0647": {
- "initial": "\uFCA5",
- "medial": "\uFCE4"
- },
- "\u0635\u062E": {
- "initial": "\uFCB2"
- },
- "\u0644\u0647": {
- "initial": "\uFCCD"
- },
- "\u0646\u0647": {
- "initial": "\uFCD6",
- "medial": "\uFCEF"
- },
- "\u0647\u0670": {
- "initial": "\uFCD9"
- },
- "\u064A\u0647": {
- "initial": "\uFCDE",
- "medial": "\uFCF1"
- },
- "\u062B\u0647": {
- "medial": "\uFCE6"
- },
- "\u0633\u0647": {
- "medial": "\uFCE8",
- "initial": "\uFD31"
- },
- "\u0634\u0645": {
- "medial": "\uFCE9",
- "isolated": "\uFD0C",
- "final": "\uFD28",
- "initial": "\uFD30"
- },
- "\u0634\u0647": {
- "medial": "\uFCEA",
- "initial": "\uFD32"
- },
- "\u0640\u064E\u0651": {
- "medial": "\uFCF2"
- },
- "\u0640\u064F\u0651": {
- "medial": "\uFCF3"
- },
- "\u0640\u0650\u0651": {
- "medial": "\uFCF4"
- },
- "\u0637\u0649": {
- "isolated": "\uFCF5",
- "final": "\uFD11"
- },
- "\u0637\u064A": {
- "isolated": "\uFCF6",
- "final": "\uFD12"
- },
- "\u0639\u0649": {
- "isolated": "\uFCF7",
- "final": "\uFD13"
- },
- "\u0639\u064A": {
- "isolated": "\uFCF8",
- "final": "\uFD14"
- },
- "\u063A\u0649": {
- "isolated": "\uFCF9",
- "final": "\uFD15"
- },
- "\u063A\u064A": {
- "isolated": "\uFCFA",
- "final": "\uFD16"
- },
- "\u0633\u0649": {
- "isolated": "\uFCFB"
- },
- "\u0633\u064A": {
- "isolated": "\uFCFC",
- "final": "\uFD18"
- },
- "\u0634\u0649": {
- "isolated": "\uFCFD",
- "final": "\uFD19"
+ var unicodeLigatures = {};
+
+ Object.defineProperty(unicodeLigatures, "__esModule", {
+ value: true
+ });
+ var ligatureReference = {
+ "\u0626\u0627": {
+ "isolated": "\uFBEA",
+ "final": "\uFBEB"
+ },
+ "\u0626\u06D5": {
+ "isolated": "\uFBEC",
+ "final": "\uFBED"
+ },
+ "\u0626\u0648": {
+ "isolated": "\uFBEE",
+ "final": "\uFBEF"
+ },
+ "\u0626\u06C7": {
+ "isolated": "\uFBF0",
+ "final": "\uFBF1"
+ },
+ "\u0626\u06C6": {
+ "isolated": "\uFBF2",
+ "final": "\uFBF3"
+ },
+ "\u0626\u06C8": {
+ "isolated": "\uFBF4",
+ "final": "\uFBF5"
+ },
+ "\u0626\u06D0": {
+ "isolated": "\uFBF6",
+ "final": "\uFBF7",
+ "initial": "\uFBF8"
+ },
+ "\u0626\u0649": {
+ "uighur_kirghiz": {
+ "isolated": "\uFBF9",
+ "final": "\uFBFA",
+ "initial": "\uFBFB"
},
- "\u0634\u064A": {
- "isolated": "\uFCFE",
- "final": "\uFD1A"
- },
- "\u062D\u0649": {
- "isolated": "\uFCFF",
- "final": "\uFD1B"
- },
- "\u062D\u064A": {
- "isolated": "\uFD00",
- "final": "\uFD1C"
- },
- "\u062C\u0649": {
- "isolated": "\uFD01",
- "final": "\uFD1D"
- },
- "\u062C\u064A": {
- "isolated": "\uFD02",
- "final": "\uFD1E"
- },
- "\u062E\u0649": {
- "isolated": "\uFD03",
- "final": "\uFD1F"
- },
- "\u062E\u064A": {
- "isolated": "\uFD04",
- "final": "\uFD20"
- },
- "\u0635\u0649": {
- "isolated": "\uFD05",
- "final": "\uFD21"
- },
- "\u0635\u064A": {
- "isolated": "\uFD06",
- "final": "\uFD22"
- },
- "\u0636\u0649": {
- "isolated": "\uFD07",
- "final": "\uFD23"
- },
- "\u0636\u064A": {
- "isolated": "\uFD08",
- "final": "\uFD24"
- },
- "\u0634\u062C": {
- "isolated": "\uFD09",
- "final": "\uFD25",
- "initial": "\uFD2D",
- "medial": "\uFD37"
- },
- "\u0634\u062D": {
- "isolated": "\uFD0A",
- "final": "\uFD26",
- "initial": "\uFD2E",
- "medial": "\uFD38"
- },
- "\u0634\u062E": {
- "isolated": "\uFD0B",
- "final": "\uFD27",
- "initial": "\uFD2F",
- "medial": "\uFD39"
- },
- "\u0634\u0631": {
- "isolated": "\uFD0D",
- "final": "\uFD29"
- },
- "\u0633\u0631": {
- "isolated": "\uFD0E",
- "final": "\uFD2A"
- },
- "\u0635\u0631": {
- "isolated": "\uFD0F",
- "final": "\uFD2B"
- },
- "\u0636\u0631": {
- "isolated": "\uFD10",
- "final": "\uFD2C"
- },
- "\u0633\u0639": {
- "final": "\uFD17"
- },
- "\u062A\u062C\u0645": {
- "initial": "\uFD50"
- },
- "\u062A\u062D\u062C": {
- "final": "\uFD51",
- "initial": "\uFD52"
- },
- "\u062A\u062D\u0645": {
- "initial": "\uFD53"
- },
- "\u062A\u062E\u0645": {
- "initial": "\uFD54"
- },
- "\u062A\u0645\u062C": {
- "initial": "\uFD55"
- },
- "\u062A\u0645\u062D": {
- "initial": "\uFD56"
- },
- "\u062A\u0645\u062E": {
- "initial": "\uFD57"
- },
- "\u062C\u0645\u062D": {
- "final": "\uFD58",
- "initial": "\uFD59"
- },
- "\u062D\u0645\u064A": {
- "final": "\uFD5A"
- },
- "\u062D\u0645\u0649": {
- "final": "\uFD5B"
- },
- "\u0633\u062D\u062C": {
- "initial": "\uFD5C"
- },
- "\u0633\u062C\u062D": {
- "initial": "\uFD5D"
- },
- "\u0633\u062C\u0649": {
- "final": "\uFD5E"
- },
- "\u0633\u0645\u062D": {
- "final": "\uFD5F",
- "initial": "\uFD60"
- },
- "\u0633\u0645\u062C": {
- "initial": "\uFD61"
- },
- "\u0633\u0645\u0645": {
- "final": "\uFD62",
- "initial": "\uFD63"
- },
- "\u0635\u062D\u062D": {
- "final": "\uFD64",
- "initial": "\uFD65"
- },
- "\u0635\u0645\u0645": {
- "final": "\uFD66",
- "initial": "\uFDC5"
- },
- "\u0634\u062D\u0645": {
- "final": "\uFD67",
- "initial": "\uFD68"
- },
- "\u0634\u062C\u064A": {
- "final": "\uFD69"
- },
- "\u0634\u0645\u062E": {
- "final": "\uFD6A",
- "initial": "\uFD6B"
- },
- "\u0634\u0645\u0645": {
- "final": "\uFD6C",
- "initial": "\uFD6D"
- },
- "\u0636\u062D\u0649": {
- "final": "\uFD6E"
- },
- "\u0636\u062E\u0645": {
- "final": "\uFD6F",
- "initial": "\uFD70"
- },
- "\u0636\u0645\u062D": {
- "final": "\uFD71"
- },
- "\u0637\u0645\u062D": {
- "initial": "\uFD72"
- },
- "\u0637\u0645\u0645": {
- "initial": "\uFD73"
- },
- "\u0637\u0645\u064A": {
- "final": "\uFD74"
- },
- "\u0639\u062C\u0645": {
- "final": "\uFD75",
- "initial": "\uFDC4"
- },
- "\u0639\u0645\u0645": {
- "final": "\uFD76",
- "initial": "\uFD77"
- },
- "\u0639\u0645\u0649": {
- "final": "\uFD78"
- },
- "\u063A\u0645\u0645": {
- "final": "\uFD79"
- },
- "\u063A\u0645\u064A": {
- "final": "\uFD7A"
- },
- "\u063A\u0645\u0649": {
- "final": "\uFD7B"
- },
- "\u0641\u062E\u0645": {
- "final": "\uFD7C",
- "initial": "\uFD7D"
- },
- "\u0642\u0645\u062D": {
- "final": "\uFD7E",
- "initial": "\uFDB4"
- },
- "\u0642\u0645\u0645": {
- "final": "\uFD7F"
- },
- "\u0644\u062D\u0645": {
- "final": "\uFD80",
- "initial": "\uFDB5"
- },
- "\u0644\u062D\u064A": {
- "final": "\uFD81"
- },
- "\u0644\u062D\u0649": {
- "final": "\uFD82"
- },
- "\u0644\u062C\u062C": {
- "initial": "\uFD83",
- "final": "\uFD84"
- },
- "\u0644\u062E\u0645": {
- "final": "\uFD85",
- "initial": "\uFD86"
- },
- "\u0644\u0645\u062D": {
- "final": "\uFD87",
- "initial": "\uFD88"
- },
- "\u0645\u062D\u062C": {
- "initial": "\uFD89"
- },
- "\u0645\u062D\u0645": {
- "initial": "\uFD8A"
- },
- "\u0645\u062D\u064A": {
- "final": "\uFD8B"
- },
- "\u0645\u062C\u062D": {
- "initial": "\uFD8C"
- },
- "\u0645\u062C\u0645": {
- "initial": "\uFD8D"
- },
- "\u0645\u062E\u062C": {
- "initial": "\uFD8E"
- },
- "\u0645\u062E\u0645": {
- "initial": "\uFD8F"
- },
- "\u0645\u062C\u062E": {
- "initial": "\uFD92"
- },
- "\u0647\u0645\u062C": {
- "initial": "\uFD93"
- },
- "\u0647\u0645\u0645": {
- "initial": "\uFD94"
- },
- "\u0646\u062D\u0645": {
- "initial": "\uFD95"
- },
- "\u0646\u062D\u0649": {
- "final": "\uFD96"
- },
- "\u0646\u062C\u0645": {
- "final": "\uFD97",
- "initial": "\uFD98"
- },
- "\u0646\u062C\u0649": {
- "final": "\uFD99"
- },
- "\u0646\u0645\u064A": {
- "final": "\uFD9A"
- },
- "\u0646\u0645\u0649": {
- "final": "\uFD9B"
- },
- "\u064A\u0645\u0645": {
- "final": "\uFD9C",
- "initial": "\uFD9D"
- },
- "\u0628\u062E\u064A": {
- "final": "\uFD9E"
- },
- "\u062A\u062C\u064A": {
- "final": "\uFD9F"
- },
- "\u062A\u062C\u0649": {
- "final": "\uFDA0"
- },
- "\u062A\u062E\u064A": {
- "final": "\uFDA1"
- },
- "\u062A\u062E\u0649": {
- "final": "\uFDA2"
- },
- "\u062A\u0645\u064A": {
- "final": "\uFDA3"
- },
- "\u062A\u0645\u0649": {
- "final": "\uFDA4"
- },
- "\u062C\u0645\u064A": {
- "final": "\uFDA5"
- },
- "\u062C\u062D\u0649": {
- "final": "\uFDA6"
- },
- "\u062C\u0645\u0649": {
- "final": "\uFDA7"
- },
- "\u0633\u062E\u0649": {
- "final": "\uFDA8"
- },
- "\u0635\u062D\u064A": {
- "final": "\uFDA9"
- },
- "\u0634\u062D\u064A": {
- "final": "\uFDAA"
- },
- "\u0636\u062D\u064A": {
- "final": "\uFDAB"
- },
- "\u0644\u062C\u064A": {
- "final": "\uFDAC"
- },
- "\u0644\u0645\u064A": {
- "final": "\uFDAD"
- },
- "\u064A\u062D\u064A": {
- "final": "\uFDAE"
- },
- "\u064A\u062C\u064A": {
- "final": "\uFDAF"
- },
- "\u064A\u0645\u064A": {
- "final": "\uFDB0"
- },
- "\u0645\u0645\u064A": {
- "final": "\uFDB1"
- },
- "\u0642\u0645\u064A": {
- "final": "\uFDB2"
- },
- "\u0646\u062D\u064A": {
- "final": "\uFDB3"
- },
- "\u0639\u0645\u064A": {
- "final": "\uFDB6"
- },
- "\u0643\u0645\u064A": {
- "final": "\uFDB7"
- },
- "\u0646\u062C\u062D": {
- "initial": "\uFDB8",
- "final": "\uFDBD"
- },
- "\u0645\u062E\u064A": {
- "final": "\uFDB9"
- },
- "\u0644\u062C\u0645": {
- "initial": "\uFDBA",
- "final": "\uFDBC"
- },
- "\u0643\u0645\u0645": {
- "final": "\uFDBB",
- "initial": "\uFDC3"
- },
- "\u062C\u062D\u064A": {
- "final": "\uFDBE"
- },
- "\u062D\u062C\u064A": {
- "final": "\uFDBF"
- },
- "\u0645\u062C\u064A": {
- "final": "\uFDC0"
- },
- "\u0641\u0645\u064A": {
- "final": "\uFDC1"
- },
- "\u0628\u062D\u064A": {
- "final": "\uFDC2"
- },
- "\u0633\u062E\u064A": {
- "final": "\uFDC6"
- },
- "\u0646\u062C\u064A": {
- "final": "\uFDC7"
- },
- "\u0644\u0622": {
- "isolated": "\uFEF5",
- "final": "\uFEF6"
- },
- "\u0644\u0623": {
- "isolated": "\uFEF7",
- "final": "\uFEF8"
- },
- "\u0644\u0625": {
- "isolated": "\uFEF9",
- "final": "\uFEFA"
- },
- "\u0644\u0627": {
- "isolated": "\uFEFB",
- "final": "\uFEFC"
- },
- "words": {
- "\u0635\u0644\u06D2": "\uFDF0",
- "\u0642\u0644\u06D2": "\uFDF1",
- "\u0627\u0644\u0644\u0647": "\uFDF2",
- "\u0627\u0643\u0628\u0631": "\uFDF3",
- "\u0645\u062D\u0645\u062F": "\uFDF4",
- "\u0635\u0644\u0639\u0645": "\uFDF5",
- "\u0631\u0633\u0648\u0644": "\uFDF6",
- "\u0639\u0644\u064A\u0647": "\uFDF7",
- "\u0648\u0633\u0644\u0645": "\uFDF8",
- "\u0635\u0644\u0649": "\uFDF9",
- "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
- "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
- "\u0631\u06CC\u0627\u0644": "\uFDFC"
- }
- };
- exports["default"] = ligatureReference;
- });
+ "isolated": "\uFC03",
+ "final": "\uFC68"
+ },
+ "\u0626\u062C": {
+ "isolated": "\uFC00",
+ "initial": "\uFC97"
+ },
+ "\u0626\u062D": {
+ "isolated": "\uFC01",
+ "initial": "\uFC98"
+ },
+ "\u0626\u0645": {
+ "isolated": "\uFC02",
+ "final": "\uFC66",
+ "initial": "\uFC9A",
+ "medial": "\uFCDF"
+ },
+ "\u0626\u064A": {
+ "isolated": "\uFC04",
+ "final": "\uFC69"
+ },
+ "\u0628\u062C": {
+ "isolated": "\uFC05",
+ "initial": "\uFC9C"
+ },
+ "\u0628\u062D": {
+ "isolated": "\uFC06",
+ "initial": "\uFC9D"
+ },
+ "\u0628\u062E": {
+ "isolated": "\uFC07",
+ "initial": "\uFC9E"
+ },
+ "\u0628\u0645": {
+ "isolated": "\uFC08",
+ "final": "\uFC6C",
+ "initial": "\uFC9F",
+ "medial": "\uFCE1"
+ },
+ "\u0628\u0649": {
+ "isolated": "\uFC09",
+ "final": "\uFC6E"
+ },
+ "\u0628\u064A": {
+ "isolated": "\uFC0A",
+ "final": "\uFC6F"
+ },
+ "\u062A\u062C": {
+ "isolated": "\uFC0B",
+ "initial": "\uFCA1"
+ },
+ "\u062A\u062D": {
+ "isolated": "\uFC0C",
+ "initial": "\uFCA2"
+ },
+ "\u062A\u062E": {
+ "isolated": "\uFC0D",
+ "initial": "\uFCA3"
+ },
+ "\u062A\u0645": {
+ "isolated": "\uFC0E",
+ "final": "\uFC72",
+ "initial": "\uFCA4",
+ "medial": "\uFCE3"
+ },
+ "\u062A\u0649": {
+ "isolated": "\uFC0F",
+ "final": "\uFC74"
+ },
+ "\u062A\u064A": {
+ "isolated": "\uFC10",
+ "final": "\uFC75"
+ },
+ "\u062B\u062C": {
+ "isolated": "\uFC11"
+ },
+ "\u062B\u0645": {
+ "isolated": "\uFC12",
+ "final": "\uFC78",
+ "initial": "\uFCA6",
+ "medial": "\uFCE5"
+ },
+ "\u062B\u0649": {
+ "isolated": "\uFC13",
+ "final": "\uFC7A"
+ },
+ "\u062B\u0648": {
+ "isolated": "\uFC14"
+ },
+ "\u062C\u062D": {
+ "isolated": "\uFC15",
+ "initial": "\uFCA7"
+ },
+ "\u062C\u0645": {
+ "isolated": "\uFC16",
+ "initial": "\uFCA8"
+ },
+ "\u062D\u062C": {
+ "isolated": "\uFC17",
+ "initial": "\uFCA9"
+ },
+ "\u062D\u0645": {
+ "isolated": "\uFC18",
+ "initial": "\uFCAA"
+ },
+ "\u062E\u062C": {
+ "isolated": "\uFC19",
+ "initial": "\uFCAB"
+ },
+ "\u062E\u062D": {
+ "isolated": "\uFC1A"
+ },
+ "\u062E\u0645": {
+ "isolated": "\uFC1B",
+ "initial": "\uFCAC"
+ },
+ "\u0633\u062C": {
+ "isolated": "\uFC1C",
+ "initial": "\uFCAD",
+ "medial": "\uFD34"
+ },
+ "\u0633\u062D": {
+ "isolated": "\uFC1D",
+ "initial": "\uFCAE",
+ "medial": "\uFD35"
+ },
+ "\u0633\u062E": {
+ "isolated": "\uFC1E",
+ "initial": "\uFCAF",
+ "medial": "\uFD36"
+ },
+ "\u0633\u0645": {
+ "isolated": "\uFC1F",
+ "initial": "\uFCB0",
+ "medial": "\uFCE7"
+ },
+ "\u0635\u062D": {
+ "isolated": "\uFC20",
+ "initial": "\uFCB1"
+ },
+ "\u0635\u0645": {
+ "isolated": "\uFC21",
+ "initial": "\uFCB3"
+ },
+ "\u0636\u062C": {
+ "isolated": "\uFC22",
+ "initial": "\uFCB4"
+ },
+ "\u0636\u062D": {
+ "isolated": "\uFC23",
+ "initial": "\uFCB5"
+ },
+ "\u0636\u062E": {
+ "isolated": "\uFC24",
+ "initial": "\uFCB6"
+ },
+ "\u0636\u0645": {
+ "isolated": "\uFC25",
+ "initial": "\uFCB7"
+ },
+ "\u0637\u062D": {
+ "isolated": "\uFC26",
+ "initial": "\uFCB8"
+ },
+ "\u0637\u0645": {
+ "isolated": "\uFC27",
+ "initial": "\uFD33",
+ "medial": "\uFD3A"
+ },
+ "\u0638\u0645": {
+ "isolated": "\uFC28",
+ "initial": "\uFCB9",
+ "medial": "\uFD3B"
+ },
+ "\u0639\u062C": {
+ "isolated": "\uFC29",
+ "initial": "\uFCBA"
+ },
+ "\u0639\u0645": {
+ "isolated": "\uFC2A",
+ "initial": "\uFCBB"
+ },
+ "\u063A\u062C": {
+ "isolated": "\uFC2B",
+ "initial": "\uFCBC"
+ },
+ "\u063A\u0645": {
+ "isolated": "\uFC2C",
+ "initial": "\uFCBD"
+ },
+ "\u0641\u062C": {
+ "isolated": "\uFC2D",
+ "initial": "\uFCBE"
+ },
+ "\u0641\u062D": {
+ "isolated": "\uFC2E",
+ "initial": "\uFCBF"
+ },
+ "\u0641\u062E": {
+ "isolated": "\uFC2F",
+ "initial": "\uFCC0"
+ },
+ "\u0641\u0645": {
+ "isolated": "\uFC30",
+ "initial": "\uFCC1"
+ },
+ "\u0641\u0649": {
+ "isolated": "\uFC31",
+ "final": "\uFC7C"
+ },
+ "\u0641\u064A": {
+ "isolated": "\uFC32",
+ "final": "\uFC7D"
+ },
+ "\u0642\u062D": {
+ "isolated": "\uFC33",
+ "initial": "\uFCC2"
+ },
+ "\u0642\u0645": {
+ "isolated": "\uFC34",
+ "initial": "\uFCC3"
+ },
+ "\u0642\u0649": {
+ "isolated": "\uFC35",
+ "final": "\uFC7E"
+ },
+ "\u0642\u064A": {
+ "isolated": "\uFC36",
+ "final": "\uFC7F"
+ },
+ "\u0643\u0627": {
+ "isolated": "\uFC37",
+ "final": "\uFC80"
+ },
+ "\u0643\u062C": {
+ "isolated": "\uFC38",
+ "initial": "\uFCC4"
+ },
+ "\u0643\u062D": {
+ "isolated": "\uFC39",
+ "initial": "\uFCC5"
+ },
+ "\u0643\u062E": {
+ "isolated": "\uFC3A",
+ "initial": "\uFCC6"
+ },
+ "\u0643\u0644": {
+ "isolated": "\uFC3B",
+ "final": "\uFC81",
+ "initial": "\uFCC7",
+ "medial": "\uFCEB"
+ },
+ "\u0643\u0645": {
+ "isolated": "\uFC3C",
+ "final": "\uFC82",
+ "initial": "\uFCC8",
+ "medial": "\uFCEC"
+ },
+ "\u0643\u0649": {
+ "isolated": "\uFC3D",
+ "final": "\uFC83"
+ },
+ "\u0643\u064A": {
+ "isolated": "\uFC3E",
+ "final": "\uFC84"
+ },
+ "\u0644\u062C": {
+ "isolated": "\uFC3F",
+ "initial": "\uFCC9"
+ },
+ "\u0644\u062D": {
+ "isolated": "\uFC40",
+ "initial": "\uFCCA"
+ },
+ "\u0644\u062E": {
+ "isolated": "\uFC41",
+ "initial": "\uFCCB"
+ },
+ "\u0644\u0645": {
+ "isolated": "\uFC42",
+ "final": "\uFC85",
+ "initial": "\uFCCC",
+ "medial": "\uFCED"
+ },
+ "\u0644\u0649": {
+ "isolated": "\uFC43",
+ "final": "\uFC86"
+ },
+ "\u0644\u064A": {
+ "isolated": "\uFC44",
+ "final": "\uFC87"
+ },
+ "\u0645\u062C": {
+ "isolated": "\uFC45",
+ "initial": "\uFCCE"
+ },
+ "\u0645\u062D": {
+ "isolated": "\uFC46",
+ "initial": "\uFCCF"
+ },
+ "\u0645\u062E": {
+ "isolated": "\uFC47",
+ "initial": "\uFCD0"
+ },
+ "\u0645\u0645": {
+ "isolated": "\uFC48",
+ "final": "\uFC89",
+ "initial": "\uFCD1"
+ },
+ "\u0645\u0649": {
+ "isolated": "\uFC49"
+ },
+ "\u0645\u064A": {
+ "isolated": "\uFC4A"
+ },
+ "\u0646\u062C": {
+ "isolated": "\uFC4B",
+ "initial": "\uFCD2"
+ },
+ "\u0646\u062D": {
+ "isolated": "\uFC4C",
+ "initial": "\uFCD3"
+ },
+ "\u0646\u062E": {
+ "isolated": "\uFC4D",
+ "initial": "\uFCD4"
+ },
+ "\u0646\u0645": {
+ "isolated": "\uFC4E",
+ "final": "\uFC8C",
+ "initial": "\uFCD5",
+ "medial": "\uFCEE"
+ },
+ "\u0646\u0649": {
+ "isolated": "\uFC4F",
+ "final": "\uFC8E"
+ },
+ "\u0646\u064A": {
+ "isolated": "\uFC50",
+ "final": "\uFC8F"
+ },
+ "\u0647\u062C": {
+ "isolated": "\uFC51",
+ "initial": "\uFCD7"
+ },
+ "\u0647\u0645": {
+ "isolated": "\uFC52",
+ "initial": "\uFCD8"
+ },
+ "\u0647\u0649": {
+ "isolated": "\uFC53"
+ },
+ "\u0647\u064A": {
+ "isolated": "\uFC54"
+ },
+ "\u064A\u062C": {
+ "isolated": "\uFC55",
+ "initial": "\uFCDA"
+ },
+ "\u064A\u062D": {
+ "isolated": "\uFC56",
+ "initial": "\uFCDB"
+ },
+ "\u064A\u062E": {
+ "isolated": "\uFC57",
+ "initial": "\uFCDC"
+ },
+ "\u064A\u0645": {
+ "isolated": "\uFC58",
+ "final": "\uFC93",
+ "initial": "\uFCDD",
+ "medial": "\uFCF0"
+ },
+ "\u064A\u0649": {
+ "isolated": "\uFC59",
+ "final": "\uFC95"
+ },
+ "\u064A\u064A": {
+ "isolated": "\uFC5A",
+ "final": "\uFC96"
+ },
+ "\u0630\u0670": {
+ "isolated": "\uFC5B"
+ },
+ "\u0631\u0670": {
+ "isolated": "\uFC5C"
+ },
+ "\u0649\u0670": {
+ "isolated": "\uFC5D",
+ "final": "\uFC90"
+ },
+ "\u064C\u0651": {
+ "isolated": "\uFC5E"
+ },
+ "\u064D\u0651": {
+ "isolated": "\uFC5F"
+ },
+ "\u064E\u0651": {
+ "isolated": "\uFC60"
+ },
+ "\u064F\u0651": {
+ "isolated": "\uFC61"
+ },
+ "\u0650\u0651": {
+ "isolated": "\uFC62"
+ },
+ "\u0651\u0670": {
+ "isolated": "\uFC63"
+ },
+ "\u0626\u0631": {
+ "final": "\uFC64"
+ },
+ "\u0626\u0632": {
+ "final": "\uFC65"
+ },
+ "\u0626\u0646": {
+ "final": "\uFC67"
+ },
+ "\u0628\u0631": {
+ "final": "\uFC6A"
+ },
+ "\u0628\u0632": {
+ "final": "\uFC6B"
+ },
+ "\u0628\u0646": {
+ "final": "\uFC6D"
+ },
+ "\u062A\u0631": {
+ "final": "\uFC70"
+ },
+ "\u062A\u0632": {
+ "final": "\uFC71"
+ },
+ "\u062A\u0646": {
+ "final": "\uFC73"
+ },
+ "\u062B\u0631": {
+ "final": "\uFC76"
+ },
+ "\u062B\u0632": {
+ "final": "\uFC77"
+ },
+ "\u062B\u0646": {
+ "final": "\uFC79"
+ },
+ "\u062B\u064A": {
+ "final": "\uFC7B"
+ },
+ "\u0645\u0627": {
+ "final": "\uFC88"
+ },
+ "\u0646\u0631": {
+ "final": "\uFC8A"
+ },
+ "\u0646\u0632": {
+ "final": "\uFC8B"
+ },
+ "\u0646\u0646": {
+ "final": "\uFC8D"
+ },
+ "\u064A\u0631": {
+ "final": "\uFC91"
+ },
+ "\u064A\u0632": {
+ "final": "\uFC92"
+ },
+ "\u064A\u0646": {
+ "final": "\uFC94"
+ },
+ "\u0626\u062E": {
+ "initial": "\uFC99"
+ },
+ "\u0626\u0647": {
+ "initial": "\uFC9B",
+ "medial": "\uFCE0"
+ },
+ "\u0628\u0647": {
+ "initial": "\uFCA0",
+ "medial": "\uFCE2"
+ },
+ "\u062A\u0647": {
+ "initial": "\uFCA5",
+ "medial": "\uFCE4"
+ },
+ "\u0635\u062E": {
+ "initial": "\uFCB2"
+ },
+ "\u0644\u0647": {
+ "initial": "\uFCCD"
+ },
+ "\u0646\u0647": {
+ "initial": "\uFCD6",
+ "medial": "\uFCEF"
+ },
+ "\u0647\u0670": {
+ "initial": "\uFCD9"
+ },
+ "\u064A\u0647": {
+ "initial": "\uFCDE",
+ "medial": "\uFCF1"
+ },
+ "\u062B\u0647": {
+ "medial": "\uFCE6"
+ },
+ "\u0633\u0647": {
+ "medial": "\uFCE8",
+ "initial": "\uFD31"
+ },
+ "\u0634\u0645": {
+ "medial": "\uFCE9",
+ "isolated": "\uFD0C",
+ "final": "\uFD28",
+ "initial": "\uFD30"
+ },
+ "\u0634\u0647": {
+ "medial": "\uFCEA",
+ "initial": "\uFD32"
+ },
+ "\u0640\u064E\u0651": {
+ "medial": "\uFCF2"
+ },
+ "\u0640\u064F\u0651": {
+ "medial": "\uFCF3"
+ },
+ "\u0640\u0650\u0651": {
+ "medial": "\uFCF4"
+ },
+ "\u0637\u0649": {
+ "isolated": "\uFCF5",
+ "final": "\uFD11"
+ },
+ "\u0637\u064A": {
+ "isolated": "\uFCF6",
+ "final": "\uFD12"
+ },
+ "\u0639\u0649": {
+ "isolated": "\uFCF7",
+ "final": "\uFD13"
+ },
+ "\u0639\u064A": {
+ "isolated": "\uFCF8",
+ "final": "\uFD14"
+ },
+ "\u063A\u0649": {
+ "isolated": "\uFCF9",
+ "final": "\uFD15"
+ },
+ "\u063A\u064A": {
+ "isolated": "\uFCFA",
+ "final": "\uFD16"
+ },
+ "\u0633\u0649": {
+ "isolated": "\uFCFB"
+ },
+ "\u0633\u064A": {
+ "isolated": "\uFCFC",
+ "final": "\uFD18"
+ },
+ "\u0634\u0649": {
+ "isolated": "\uFCFD",
+ "final": "\uFD19"
+ },
+ "\u0634\u064A": {
+ "isolated": "\uFCFE",
+ "final": "\uFD1A"
+ },
+ "\u062D\u0649": {
+ "isolated": "\uFCFF",
+ "final": "\uFD1B"
+ },
+ "\u062D\u064A": {
+ "isolated": "\uFD00",
+ "final": "\uFD1C"
+ },
+ "\u062C\u0649": {
+ "isolated": "\uFD01",
+ "final": "\uFD1D"
+ },
+ "\u062C\u064A": {
+ "isolated": "\uFD02",
+ "final": "\uFD1E"
+ },
+ "\u062E\u0649": {
+ "isolated": "\uFD03",
+ "final": "\uFD1F"
+ },
+ "\u062E\u064A": {
+ "isolated": "\uFD04",
+ "final": "\uFD20"
+ },
+ "\u0635\u0649": {
+ "isolated": "\uFD05",
+ "final": "\uFD21"
+ },
+ "\u0635\u064A": {
+ "isolated": "\uFD06",
+ "final": "\uFD22"
+ },
+ "\u0636\u0649": {
+ "isolated": "\uFD07",
+ "final": "\uFD23"
+ },
+ "\u0636\u064A": {
+ "isolated": "\uFD08",
+ "final": "\uFD24"
+ },
+ "\u0634\u062C": {
+ "isolated": "\uFD09",
+ "final": "\uFD25",
+ "initial": "\uFD2D",
+ "medial": "\uFD37"
+ },
+ "\u0634\u062D": {
+ "isolated": "\uFD0A",
+ "final": "\uFD26",
+ "initial": "\uFD2E",
+ "medial": "\uFD38"
+ },
+ "\u0634\u062E": {
+ "isolated": "\uFD0B",
+ "final": "\uFD27",
+ "initial": "\uFD2F",
+ "medial": "\uFD39"
+ },
+ "\u0634\u0631": {
+ "isolated": "\uFD0D",
+ "final": "\uFD29"
+ },
+ "\u0633\u0631": {
+ "isolated": "\uFD0E",
+ "final": "\uFD2A"
+ },
+ "\u0635\u0631": {
+ "isolated": "\uFD0F",
+ "final": "\uFD2B"
+ },
+ "\u0636\u0631": {
+ "isolated": "\uFD10",
+ "final": "\uFD2C"
+ },
+ "\u0633\u0639": {
+ "final": "\uFD17"
+ },
+ "\u062A\u062C\u0645": {
+ "initial": "\uFD50"
+ },
+ "\u062A\u062D\u062C": {
+ "final": "\uFD51",
+ "initial": "\uFD52"
+ },
+ "\u062A\u062D\u0645": {
+ "initial": "\uFD53"
+ },
+ "\u062A\u062E\u0645": {
+ "initial": "\uFD54"
+ },
+ "\u062A\u0645\u062C": {
+ "initial": "\uFD55"
+ },
+ "\u062A\u0645\u062D": {
+ "initial": "\uFD56"
+ },
+ "\u062A\u0645\u062E": {
+ "initial": "\uFD57"
+ },
+ "\u062C\u0645\u062D": {
+ "final": "\uFD58",
+ "initial": "\uFD59"
+ },
+ "\u062D\u0645\u064A": {
+ "final": "\uFD5A"
+ },
+ "\u062D\u0645\u0649": {
+ "final": "\uFD5B"
+ },
+ "\u0633\u062D\u062C": {
+ "initial": "\uFD5C"
+ },
+ "\u0633\u062C\u062D": {
+ "initial": "\uFD5D"
+ },
+ "\u0633\u062C\u0649": {
+ "final": "\uFD5E"
+ },
+ "\u0633\u0645\u062D": {
+ "final": "\uFD5F",
+ "initial": "\uFD60"
+ },
+ "\u0633\u0645\u062C": {
+ "initial": "\uFD61"
+ },
+ "\u0633\u0645\u0645": {
+ "final": "\uFD62",
+ "initial": "\uFD63"
+ },
+ "\u0635\u062D\u062D": {
+ "final": "\uFD64",
+ "initial": "\uFD65"
+ },
+ "\u0635\u0645\u0645": {
+ "final": "\uFD66",
+ "initial": "\uFDC5"
+ },
+ "\u0634\u062D\u0645": {
+ "final": "\uFD67",
+ "initial": "\uFD68"
+ },
+ "\u0634\u062C\u064A": {
+ "final": "\uFD69"
+ },
+ "\u0634\u0645\u062E": {
+ "final": "\uFD6A",
+ "initial": "\uFD6B"
+ },
+ "\u0634\u0645\u0645": {
+ "final": "\uFD6C",
+ "initial": "\uFD6D"
+ },
+ "\u0636\u062D\u0649": {
+ "final": "\uFD6E"
+ },
+ "\u0636\u062E\u0645": {
+ "final": "\uFD6F",
+ "initial": "\uFD70"
+ },
+ "\u0636\u0645\u062D": {
+ "final": "\uFD71"
+ },
+ "\u0637\u0645\u062D": {
+ "initial": "\uFD72"
+ },
+ "\u0637\u0645\u0645": {
+ "initial": "\uFD73"
+ },
+ "\u0637\u0645\u064A": {
+ "final": "\uFD74"
+ },
+ "\u0639\u062C\u0645": {
+ "final": "\uFD75",
+ "initial": "\uFDC4"
+ },
+ "\u0639\u0645\u0645": {
+ "final": "\uFD76",
+ "initial": "\uFD77"
+ },
+ "\u0639\u0645\u0649": {
+ "final": "\uFD78"
+ },
+ "\u063A\u0645\u0645": {
+ "final": "\uFD79"
+ },
+ "\u063A\u0645\u064A": {
+ "final": "\uFD7A"
+ },
+ "\u063A\u0645\u0649": {
+ "final": "\uFD7B"
+ },
+ "\u0641\u062E\u0645": {
+ "final": "\uFD7C",
+ "initial": "\uFD7D"
+ },
+ "\u0642\u0645\u062D": {
+ "final": "\uFD7E",
+ "initial": "\uFDB4"
+ },
+ "\u0642\u0645\u0645": {
+ "final": "\uFD7F"
+ },
+ "\u0644\u062D\u0645": {
+ "final": "\uFD80",
+ "initial": "\uFDB5"
+ },
+ "\u0644\u062D\u064A": {
+ "final": "\uFD81"
+ },
+ "\u0644\u062D\u0649": {
+ "final": "\uFD82"
+ },
+ "\u0644\u062C\u062C": {
+ "initial": "\uFD83",
+ "final": "\uFD84"
+ },
+ "\u0644\u062E\u0645": {
+ "final": "\uFD85",
+ "initial": "\uFD86"
+ },
+ "\u0644\u0645\u062D": {
+ "final": "\uFD87",
+ "initial": "\uFD88"
+ },
+ "\u0645\u062D\u062C": {
+ "initial": "\uFD89"
+ },
+ "\u0645\u062D\u0645": {
+ "initial": "\uFD8A"
+ },
+ "\u0645\u062D\u064A": {
+ "final": "\uFD8B"
+ },
+ "\u0645\u062C\u062D": {
+ "initial": "\uFD8C"
+ },
+ "\u0645\u062C\u0645": {
+ "initial": "\uFD8D"
+ },
+ "\u0645\u062E\u062C": {
+ "initial": "\uFD8E"
+ },
+ "\u0645\u062E\u0645": {
+ "initial": "\uFD8F"
+ },
+ "\u0645\u062C\u062E": {
+ "initial": "\uFD92"
+ },
+ "\u0647\u0645\u062C": {
+ "initial": "\uFD93"
+ },
+ "\u0647\u0645\u0645": {
+ "initial": "\uFD94"
+ },
+ "\u0646\u062D\u0645": {
+ "initial": "\uFD95"
+ },
+ "\u0646\u062D\u0649": {
+ "final": "\uFD96"
+ },
+ "\u0646\u062C\u0645": {
+ "final": "\uFD97",
+ "initial": "\uFD98"
+ },
+ "\u0646\u062C\u0649": {
+ "final": "\uFD99"
+ },
+ "\u0646\u0645\u064A": {
+ "final": "\uFD9A"
+ },
+ "\u0646\u0645\u0649": {
+ "final": "\uFD9B"
+ },
+ "\u064A\u0645\u0645": {
+ "final": "\uFD9C",
+ "initial": "\uFD9D"
+ },
+ "\u0628\u062E\u064A": {
+ "final": "\uFD9E"
+ },
+ "\u062A\u062C\u064A": {
+ "final": "\uFD9F"
+ },
+ "\u062A\u062C\u0649": {
+ "final": "\uFDA0"
+ },
+ "\u062A\u062E\u064A": {
+ "final": "\uFDA1"
+ },
+ "\u062A\u062E\u0649": {
+ "final": "\uFDA2"
+ },
+ "\u062A\u0645\u064A": {
+ "final": "\uFDA3"
+ },
+ "\u062A\u0645\u0649": {
+ "final": "\uFDA4"
+ },
+ "\u062C\u0645\u064A": {
+ "final": "\uFDA5"
+ },
+ "\u062C\u062D\u0649": {
+ "final": "\uFDA6"
+ },
+ "\u062C\u0645\u0649": {
+ "final": "\uFDA7"
+ },
+ "\u0633\u062E\u0649": {
+ "final": "\uFDA8"
+ },
+ "\u0635\u062D\u064A": {
+ "final": "\uFDA9"
+ },
+ "\u0634\u062D\u064A": {
+ "final": "\uFDAA"
+ },
+ "\u0636\u062D\u064A": {
+ "final": "\uFDAB"
+ },
+ "\u0644\u062C\u064A": {
+ "final": "\uFDAC"
+ },
+ "\u0644\u0645\u064A": {
+ "final": "\uFDAD"
+ },
+ "\u064A\u062D\u064A": {
+ "final": "\uFDAE"
+ },
+ "\u064A\u062C\u064A": {
+ "final": "\uFDAF"
+ },
+ "\u064A\u0645\u064A": {
+ "final": "\uFDB0"
+ },
+ "\u0645\u0645\u064A": {
+ "final": "\uFDB1"
+ },
+ "\u0642\u0645\u064A": {
+ "final": "\uFDB2"
+ },
+ "\u0646\u062D\u064A": {
+ "final": "\uFDB3"
+ },
+ "\u0639\u0645\u064A": {
+ "final": "\uFDB6"
+ },
+ "\u0643\u0645\u064A": {
+ "final": "\uFDB7"
+ },
+ "\u0646\u062C\u062D": {
+ "initial": "\uFDB8",
+ "final": "\uFDBD"
+ },
+ "\u0645\u062E\u064A": {
+ "final": "\uFDB9"
+ },
+ "\u0644\u062C\u0645": {
+ "initial": "\uFDBA",
+ "final": "\uFDBC"
+ },
+ "\u0643\u0645\u0645": {
+ "final": "\uFDBB",
+ "initial": "\uFDC3"
+ },
+ "\u062C\u062D\u064A": {
+ "final": "\uFDBE"
+ },
+ "\u062D\u062C\u064A": {
+ "final": "\uFDBF"
+ },
+ "\u0645\u062C\u064A": {
+ "final": "\uFDC0"
+ },
+ "\u0641\u0645\u064A": {
+ "final": "\uFDC1"
+ },
+ "\u0628\u062D\u064A": {
+ "final": "\uFDC2"
+ },
+ "\u0633\u062E\u064A": {
+ "final": "\uFDC6"
+ },
+ "\u0646\u062C\u064A": {
+ "final": "\uFDC7"
+ },
+ "\u0644\u0622": {
+ "isolated": "\uFEF5",
+ "final": "\uFEF6"
+ },
+ "\u0644\u0623": {
+ "isolated": "\uFEF7",
+ "final": "\uFEF8"
+ },
+ "\u0644\u0625": {
+ "isolated": "\uFEF9",
+ "final": "\uFEFA"
+ },
+ "\u0644\u0627": {
+ "isolated": "\uFEFB",
+ "final": "\uFEFC"
+ },
+ "words": {
+ "\u0635\u0644\u06D2": "\uFDF0",
+ "\u0642\u0644\u06D2": "\uFDF1",
+ "\u0627\u0644\u0644\u0647": "\uFDF2",
+ "\u0627\u0643\u0628\u0631": "\uFDF3",
+ "\u0645\u062D\u0645\u062F": "\uFDF4",
+ "\u0635\u0644\u0639\u0645": "\uFDF5",
+ "\u0631\u0633\u0648\u0644": "\uFDF6",
+ "\u0639\u0644\u064A\u0647": "\uFDF7",
+ "\u0648\u0633\u0644\u0645": "\uFDF8",
+ "\u0635\u0644\u0649": "\uFDF9",
+ "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
+ "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
+ "\u0631\u06CC\u0627\u0644": "\uFDFC"
+ }
+ };
- var reference = createCommonjsModule(function (module, exports) {
+ unicodeLigatures["default"] = ligatureReference;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- var letterList = Object.keys(unicodeArabic["default"]);
- exports.letterList = letterList;
- var ligatureList = Object.keys(unicodeLigatures["default"]);
- exports.ligatureList = ligatureList;
- var ligatureWordList = Object.keys(unicodeLigatures["default"].words);
- exports.ligatureWordList = ligatureWordList;
- var lams = "\u0644\u06B5\u06B6\u06B7\u06B8";
- exports.lams = lams;
- var alefs = "\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774";
- exports.alefs = alefs; // for (var l = 1; l < lams.length; l++) {
- // console.log('-');
- // for (var a = 0; a < alefs.length; a++) {
- // console.log(a + ': ' + lams[l] + alefs[a]);
- // }
- // }
+ Object.defineProperty(reference, "__esModule", {
+ value: true
+ });
+ var unicode_arabic_1$3 = unicodeArabic;
+ var unicode_ligatures_1$2 = unicodeLigatures;
+ var letterList = Object.keys(unicode_arabic_1$3["default"]);
+ reference.letterList = letterList;
+ var ligatureList = Object.keys(unicode_ligatures_1$2["default"]);
+ reference.ligatureList = ligatureList;
+ var ligatureWordList = Object.keys(unicode_ligatures_1$2["default"].words);
+ reference.ligatureWordList = ligatureWordList;
+ var lams = "\u0644\u06B5\u06B6\u06B7\u06B8";
+ reference.lams = lams;
+ var alefs = "\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774";
+ reference.alefs = alefs; // for (var l = 1; l < lams.length; l++) {
+ // console.log('-');
+ // for (var a = 0; a < alefs.length; a++) {
+ // console.log(a + ': ' + lams[l] + alefs[a]);
+ // }
+ // }
- var tashkeel = "\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8";
- exports.tashkeel = tashkeel;
+ var tashkeel = "\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8";
+ reference.tashkeel = tashkeel;
- function addToTashkeel(start, finish) {
- for (var i = start; i <= finish; i++) {
- exports.tashkeel = tashkeel += String.fromCharCode(i);
- }
+ function addToTashkeel(start, finish) {
+ for (var i = start; i <= finish; i++) {
+ reference.tashkeel = tashkeel += String.fromCharCode(i);
}
+ }
- addToTashkeel(0x0610, 0x061A);
- addToTashkeel(0x064B, 0x065F);
- addToTashkeel(0x06D6, 0x06DC);
- addToTashkeel(0x06E0, 0x06E4);
- addToTashkeel(0x06EA, 0x06ED);
- addToTashkeel(0x08D3, 0x08E1);
- addToTashkeel(0x08E3, 0x08FF);
- addToTashkeel(0xFE70, 0xFE7F);
- var lineBreakers = "\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9";
- exports.lineBreakers = lineBreakers;
+ addToTashkeel(0x0610, 0x061A);
+ addToTashkeel(0x064B, 0x065F);
+ addToTashkeel(0x06D6, 0x06DC);
+ addToTashkeel(0x06E0, 0x06E4);
+ addToTashkeel(0x06EA, 0x06ED);
+ addToTashkeel(0x08D3, 0x08E1);
+ addToTashkeel(0x08E3, 0x08FF);
+ addToTashkeel(0xFE70, 0xFE7F);
+ var lineBreakers = "\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9";
+ reference.lineBreakers = lineBreakers;
- function addToLineBreakers(start, finish) {
- for (var i = start; i <= finish; i++) {
- exports.lineBreakers = lineBreakers += String.fromCharCode(i);
- }
+ function addToLineBreakers(start, finish) {
+ for (var i = start; i <= finish; i++) {
+ reference.lineBreakers = lineBreakers += String.fromCharCode(i);
}
+ }
- addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored
-
- addToLineBreakers(0x0621, 0x0625);
- addToLineBreakers(0x062F, 0x0632);
- addToLineBreakers(0x0660, 0x066D); // numerals, math
-
- addToLineBreakers(0x0671, 0x0677);
- addToLineBreakers(0x0688, 0x0699);
- addToLineBreakers(0x06C3, 0x06CB);
- addToLineBreakers(0x06D2, 0x06F9);
- addToLineBreakers(0x0759, 0x075B);
- addToLineBreakers(0x08AA, 0x08AE);
- addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do
- // Presentation Forms A includes diacritics but they are meant to stand alone
+ addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored
- addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do
- // numerals, math
+ addToLineBreakers(0x0621, 0x0625);
+ addToLineBreakers(0x062F, 0x0632);
+ addToLineBreakers(0x0660, 0x066D); // numerals, math
- addToLineBreakers(0x10E60, 0x10E7F);
- addToLineBreakers(0x1EC70, 0x1ECBF);
- addToLineBreakers(0x1EE00, 0x1EEFF);
- });
+ addToLineBreakers(0x0671, 0x0677);
+ addToLineBreakers(0x0688, 0x0699);
+ addToLineBreakers(0x06C3, 0x06CB);
+ addToLineBreakers(0x06D2, 0x06F9);
+ addToLineBreakers(0x0759, 0x075B);
+ addToLineBreakers(0x08AA, 0x08AE);
+ addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do
+ // Presentation Forms A includes diacritics but they are meant to stand alone
- var GlyphSplitter_1 = createCommonjsModule(function (module, exports) {
+ addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do
+ // numerals, math
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ addToLineBreakers(0x10E60, 0x10E7F);
+ addToLineBreakers(0x1EC70, 0x1ECBF);
+ addToLineBreakers(0x1EE00, 0x1EEFF);
- function GlyphSplitter(word) {
- var letters = [];
- var lastLetter = '';
- word.split('').forEach(function (letter) {
- if (isArabic_1.isArabic(letter)) {
- if (reference.tashkeel.indexOf(letter) > -1) {
- letters[letters.length - 1] += letter;
- } else if (lastLetter.length && (reference.lams.indexOf(lastLetter) === 0 && reference.alefs.indexOf(letter) > -1 || reference.lams.indexOf(lastLetter) > 0 && reference.alefs.indexOf(letter) === 0)) {
- // valid LA forms
- letters[letters.length - 1] += letter;
- } else {
- letters.push(letter);
- }
+ Object.defineProperty(GlyphSplitter$1, "__esModule", {
+ value: true
+ });
+ var isArabic_1$6 = isArabic$1;
+ var reference_1$5 = reference;
+
+ function GlyphSplitter(word) {
+ var letters = [];
+ var lastLetter = '';
+ word.split('').forEach(function (letter) {
+ if (isArabic_1$6.isArabic(letter)) {
+ if (reference_1$5.tashkeel.indexOf(letter) > -1) {
+ letters[letters.length - 1] += letter;
+ } else if (lastLetter.length && (reference_1$5.lams.indexOf(lastLetter) === 0 && reference_1$5.alefs.indexOf(letter) > -1 || reference_1$5.lams.indexOf(lastLetter) > 0 && reference_1$5.alefs.indexOf(letter) === 0)) {
+ // valid LA forms
+ letters[letters.length - 1] += letter;
} else {
letters.push(letter);
}
+ } else {
+ letters.push(letter);
+ }
- if (reference.tashkeel.indexOf(letter) === -1) {
- lastLetter = letter;
- }
- });
- return letters;
- }
-
- exports.GlyphSplitter = GlyphSplitter;
- });
+ if (reference_1$5.tashkeel.indexOf(letter) === -1) {
+ lastLetter = letter;
+ }
+ });
+ return letters;
+ }
- var BaselineSplitter_1 = createCommonjsModule(function (module, exports) {
+ GlyphSplitter$1.GlyphSplitter = GlyphSplitter;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ var BaselineSplitter$1 = {};
- function BaselineSplitter(word) {
- var letters = [];
- var lastLetter = '';
- word.split('').forEach(function (letter) {
- if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) {
- if (lastLetter.length && reference.tashkeel.indexOf(letter) > -1) {
- letters[letters.length - 1] += letter;
- } else if (reference.lineBreakers.indexOf(lastLetter) > -1) {
- letters.push(letter);
- } else {
- letters[letters.length - 1] += letter;
- }
- } else {
+ Object.defineProperty(BaselineSplitter$1, "__esModule", {
+ value: true
+ });
+ var isArabic_1$5 = isArabic$1;
+ var reference_1$4 = reference;
+
+ function BaselineSplitter(word) {
+ var letters = [];
+ var lastLetter = '';
+ word.split('').forEach(function (letter) {
+ if (isArabic_1$5.isArabic(letter) && isArabic_1$5.isArabic(lastLetter)) {
+ if (lastLetter.length && reference_1$4.tashkeel.indexOf(letter) > -1) {
+ letters[letters.length - 1] += letter;
+ } else if (reference_1$4.lineBreakers.indexOf(lastLetter) > -1) {
letters.push(letter);
+ } else {
+ letters[letters.length - 1] += letter;
}
+ } else {
+ letters.push(letter);
+ }
- if (reference.tashkeel.indexOf(letter) === -1) {
- // don't allow tashkeel to hide line break
- lastLetter = letter;
- }
- });
- return letters;
- }
+ if (reference_1$4.tashkeel.indexOf(letter) === -1) {
+ // don't allow tashkeel to hide line break
+ lastLetter = letter;
+ }
+ });
+ return letters;
+ }
- exports.BaselineSplitter = BaselineSplitter;
- });
+ BaselineSplitter$1.BaselineSplitter = BaselineSplitter;
- var Normalization = createCommonjsModule(function (module, exports) {
+ var Normalization = {};
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ Object.defineProperty(Normalization, "__esModule", {
+ value: true
+ });
+ var unicode_arabic_1$2 = unicodeArabic;
+ var unicode_ligatures_1$1 = unicodeLigatures;
+ var isArabic_1$4 = isArabic$1;
+ var reference_1$3 = reference;
- function Normal(word, breakPresentationForm) {
- // default is to turn initial/isolated/medial/final presentation form to generic
- if (typeof breakPresentationForm === 'undefined') {
- breakPresentationForm = true;
- }
+ function Normal(word, breakPresentationForm) {
+ // default is to turn initial/isolated/medial/final presentation form to generic
+ if (typeof breakPresentationForm === 'undefined') {
+ breakPresentationForm = true;
+ }
- var returnable = '';
- word.split('').forEach(function (letter) {
- if (!isArabic_1.isArabic(letter)) {
- returnable += letter;
- return;
- }
+ var returnable = '';
+ word.split('').forEach(function (letter) {
+ if (!isArabic_1$4.isArabic(letter)) {
+ returnable += letter;
+ return;
+ }
- for (var w = 0; w < reference.letterList.length; w++) {
- // ok so we are checking this potential lettertron
- var letterForms = unicodeArabic["default"][reference.letterList[w]];
- var versions = Object.keys(letterForms);
+ for (var w = 0; w < reference_1$3.letterList.length; w++) {
+ // ok so we are checking this potential lettertron
+ var letterForms = unicode_arabic_1$2["default"][reference_1$3.letterList[w]];
+ var versions = Object.keys(letterForms);
- for (var v = 0; v < versions.length; v++) {
- var localVersion = letterForms[versions[v]];
+ for (var v = 0; v < versions.length; v++) {
+ var localVersion = letterForms[versions[v]];
- if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
- // look at this embedded object
- var embeddedForms = Object.keys(localVersion);
+ if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
+ // look at this embedded object
+ var embeddedForms = Object.keys(localVersion);
- for (var ef = 0; ef < embeddedForms.length; ef++) {
- var form = localVersion[embeddedForms[ef]];
+ for (var ef = 0; ef < embeddedForms.length; ef++) {
+ var form = localVersion[embeddedForms[ef]];
- if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
- // match
- // console.log('embedded match');
- if (form === letter) {
- // match exact
- if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) {
- // replace presentation form
- // console.log('keeping normal form of the letter');
- if (_typeof(localVersion['normal']) === 'object') {
- returnable += localVersion['normal'][0];
- } else {
- returnable += localVersion['normal'];
- }
+ if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
+ // match
+ // console.log('embedded match');
+ if (form === letter) {
+ // match exact
+ if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) {
+ // replace presentation form
+ // console.log('keeping normal form of the letter');
+ if (_typeof(localVersion['normal']) === 'object') {
+ returnable += localVersion['normal'][0];
+ } else {
+ returnable += localVersion['normal'];
+ }
- return;
- } // console.log('keeping this letter');
+ return;
+ } // console.log('keeping this letter');
- returnable += letter;
- return;
- } else if (_typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
- // match
- returnable += form[0]; // console.log('added the first letter from the same array');
+ returnable += letter;
+ return;
+ } else if (_typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
+ // match
+ returnable += form[0]; // console.log('added the first letter from the same array');
- return;
- }
+ return;
}
}
- } else if (localVersion === letter) {
- // match exact
- if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) {
- // replace presentation form
- // console.log('keeping normal form of the letter');
- if (_typeof(letterForms['normal']) === 'object') {
- returnable += letterForms['normal'][0];
- } else {
- returnable += letterForms['normal'];
- }
+ }
+ } else if (localVersion === letter) {
+ // match exact
+ if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) {
+ // replace presentation form
+ // console.log('keeping normal form of the letter');
+ if (_typeof(letterForms['normal']) === 'object') {
+ returnable += letterForms['normal'][0];
+ } else {
+ returnable += letterForms['normal'];
+ }
- return;
- } // console.log('keeping this letter');
+ return;
+ } // console.log('keeping this letter');
- returnable += letter;
- return;
- } else if (_typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
- // match
- returnable += localVersion[0]; // console.log('added the first letter from the same array');
+ returnable += letter;
+ return;
+ } else if (_typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+ // match
+ returnable += localVersion[0]; // console.log('added the first letter from the same array');
- return;
- }
+ return;
}
- } // try ligatures
+ }
+ } // try ligatures
- for (var v2 = 0; v2 < reference.ligatureList.length; v2++) {
- var normalForm = reference.ligatureList[v2];
+ for (var v2 = 0; v2 < reference_1$3.ligatureList.length; v2++) {
+ var normalForm = reference_1$3.ligatureList[v2];
- if (normalForm !== 'words') {
- var ligForms = Object.keys(unicodeLigatures["default"][normalForm]);
+ if (normalForm !== 'words') {
+ var ligForms = Object.keys(unicode_ligatures_1$1["default"][normalForm]);
- for (var f = 0; f < ligForms.length; f++) {
- if (unicodeLigatures["default"][normalForm][ligForms[f]] === letter) {
- returnable += normalForm;
- return;
- }
+ for (var f = 0; f < ligForms.length; f++) {
+ if (unicode_ligatures_1$1["default"][normalForm][ligForms[f]] === letter) {
+ returnable += normalForm;
+ return;
}
}
- } // try words ligatures
+ }
+ } // try words ligatures
- for (var v3 = 0; v3 < reference.ligatureWordList.length; v3++) {
- var _normalForm = reference.ligatureWordList[v3];
+ for (var v3 = 0; v3 < reference_1$3.ligatureWordList.length; v3++) {
+ var _normalForm = reference_1$3.ligatureWordList[v3];
- if (unicodeLigatures["default"].words[_normalForm] === letter) {
- returnable += _normalForm;
- return;
- }
+ if (unicode_ligatures_1$1["default"].words[_normalForm] === letter) {
+ returnable += _normalForm;
+ return;
}
+ }
- returnable += letter; // console.log('kept the letter')
- });
- return returnable;
- }
+ returnable += letter; // console.log('kept the letter')
+ });
+ return returnable;
+ }
- exports.Normal = Normal;
- });
+ Normalization.Normal = Normal;
- var CharShaper_1 = createCommonjsModule(function (module, exports) {
+ var CharShaper$1 = {};
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ Object.defineProperty(CharShaper$1, "__esModule", {
+ value: true
+ });
+ var unicode_arabic_1$1 = unicodeArabic;
+ var isArabic_1$3 = isArabic$1;
+ var reference_1$2 = reference;
- function CharShaper(letter, form) {
- if (!isArabic_1.isArabic(letter)) {
- // fail not Arabic
- throw new Error('Not Arabic');
- }
+ function CharShaper(letter, form) {
+ if (!isArabic_1$3.isArabic(letter)) {
+ // fail not Arabic
+ throw new Error('Not Arabic');
+ }
- if (letter === "\u0621") {
- // hamza alone
- return "\u0621";
- }
+ if (letter === "\u0621") {
+ // hamza alone
+ return "\u0621";
+ }
- for (var w = 0; w < reference.letterList.length; w++) {
- // ok so we are checking this potential lettertron
- var letterForms = unicodeArabic["default"][reference.letterList[w]];
- var versions = Object.keys(letterForms);
+ for (var w = 0; w < reference_1$2.letterList.length; w++) {
+ // ok so we are checking this potential lettertron
+ var letterForms = unicode_arabic_1$1["default"][reference_1$2.letterList[w]];
+ var versions = Object.keys(letterForms);
- for (var v = 0; v < versions.length; v++) {
- var localVersion = letterForms[versions[v]];
+ for (var v = 0; v < versions.length; v++) {
+ var localVersion = letterForms[versions[v]];
- if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
- if (versions.indexOf(form) > -1) {
- return letterForms[form];
- }
- } else if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
- // check embedded
- var embeddedVersions = Object.keys(localVersion);
+ if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+ if (versions.indexOf(form) > -1) {
+ return letterForms[form];
+ }
+ } else if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
+ // check embedded
+ var embeddedVersions = Object.keys(localVersion);
- for (var ev = 0; ev < embeddedVersions.length; ev++) {
- if (localVersion[embeddedVersions[ev]] === letter || _typeof(localVersion[embeddedVersions[ev]]) === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1) {
- if (embeddedVersions.indexOf(form) > -1) {
- return localVersion[form];
- }
+ for (var ev = 0; ev < embeddedVersions.length; ev++) {
+ if (localVersion[embeddedVersions[ev]] === letter || _typeof(localVersion[embeddedVersions[ev]]) === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1) {
+ if (embeddedVersions.indexOf(form) > -1) {
+ return localVersion[form];
}
}
}
}
}
}
+ }
- exports.CharShaper = CharShaper;
- });
-
- var WordShaper_1 = createCommonjsModule(function (module, exports) {
+ CharShaper$1.CharShaper = CharShaper;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ var WordShaper$2 = {};
- function WordShaper(word) {
- var state = 'initial';
- var output = '';
+ Object.defineProperty(WordShaper$2, "__esModule", {
+ value: true
+ });
+ var isArabic_1$2 = isArabic$1;
+ var reference_1$1 = reference;
+ var CharShaper_1$1 = CharShaper$1;
+ var unicode_ligatures_1 = unicodeLigatures;
- for (var w = 0; w < word.length; w++) {
- var nextLetter = ' ';
+ function WordShaper$1(word) {
+ var state = 'initial';
+ var output = '';
- for (var nxw = w + 1; nxw < word.length; nxw++) {
- if (!isArabic_1.isArabic(word[nxw])) {
- break;
- }
+ for (var w = 0; w < word.length; w++) {
+ var nextLetter = ' ';
- if (reference.tashkeel.indexOf(word[nxw]) === -1) {
- nextLetter = word[nxw];
- break;
- }
+ for (var nxw = w + 1; nxw < word.length; nxw++) {
+ if (!isArabic_1$2.isArabic(word[nxw])) {
+ break;
}
- if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) {
- // space or other non-Arabic
- output += word[w];
- state = 'initial';
- } else if (reference.tashkeel.indexOf(word[w]) > -1) {
- // tashkeel - add without changing state
- output += word[w];
- } else if (nextLetter === ' ' || // last Arabic letter in this word
- reference.lineBreakers.indexOf(word[w]) > -1) {
- // the current letter is known to break lines
- output += CharShaper_1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final');
- state = 'initial';
- } else if (reference.lams.indexOf(word[w]) > -1 && reference.alefs.indexOf(nextLetter) > -1) {
- // LA letters - advance an additional letter after this
- output += unicodeLigatures["default"][word[w] + nextLetter][state === 'initial' ? 'isolated' : 'final'];
+ if (reference_1$1.tashkeel.indexOf(word[nxw]) === -1) {
+ nextLetter = word[nxw];
+ break;
+ }
+ }
- while (word[w] !== nextLetter) {
- w++;
- }
+ if (!isArabic_1$2.isArabic(word[w]) || isArabic_1$2.isMath(word[w])) {
+ // space or other non-Arabic
+ output += word[w];
+ state = 'initial';
+ } else if (reference_1$1.tashkeel.indexOf(word[w]) > -1) {
+ // tashkeel - add without changing state
+ output += word[w];
+ } else if (nextLetter === ' ' // last Arabic letter in this word
+ || reference_1$1.lineBreakers.indexOf(word[w]) > -1) {
+ // the current letter is known to break lines
+ output += CharShaper_1$1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final');
+ state = 'initial';
+ } else if (reference_1$1.lams.indexOf(word[w]) > -1 && reference_1$1.alefs.indexOf(nextLetter) > -1) {
+ // LA letters - advance an additional letter after this
+ output += unicode_ligatures_1["default"][word[w] + nextLetter][state === 'initial' ? 'isolated' : 'final'];
- state = 'initial';
- } else {
- output += CharShaper_1.CharShaper(word[w], state);
- state = 'medial';
+ while (word[w] !== nextLetter) {
+ w++;
}
- }
- return output;
+ state = 'initial';
+ } else {
+ output += CharShaper_1$1.CharShaper(word[w], state);
+ state = 'medial';
+ }
}
- exports.WordShaper = WordShaper;
- });
+ return output;
+ }
- var ParentLetter_1 = createCommonjsModule(function (module, exports) {
+ WordShaper$2.WordShaper = WordShaper$1;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ var ParentLetter$1 = {};
- function ParentLetter(letter) {
- if (!isArabic_1.isArabic(letter)) {
- throw new Error('Not an Arabic letter');
- }
+ Object.defineProperty(ParentLetter$1, "__esModule", {
+ value: true
+ });
+ var unicode_arabic_1 = unicodeArabic;
+ var isArabic_1$1 = isArabic$1;
+ var reference_1 = reference;
- for (var w = 0; w < reference.letterList.length; w++) {
- // ok so we are checking this potential lettertron
- var letterForms = unicodeArabic["default"][reference.letterList[w]];
- var versions = Object.keys(letterForms);
+ function ParentLetter(letter) {
+ if (!isArabic_1$1.isArabic(letter)) {
+ throw new Error('Not an Arabic letter');
+ }
- for (var v = 0; v < versions.length; v++) {
- var localVersion = letterForms[versions[v]];
+ for (var w = 0; w < reference_1.letterList.length; w++) {
+ // ok so we are checking this potential lettertron
+ var letterForms = unicode_arabic_1["default"][reference_1.letterList[w]];
+ var versions = Object.keys(letterForms);
- if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
- // look at this embedded object
- var embeddedForms = Object.keys(localVersion);
+ for (var v = 0; v < versions.length; v++) {
+ var localVersion = letterForms[versions[v]];
- for (var ef = 0; ef < embeddedForms.length; ef++) {
- var form = localVersion[embeddedForms[ef]];
+ if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
+ // look at this embedded object
+ var embeddedForms = Object.keys(localVersion);
- if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
- // match
- return localVersion;
- }
+ for (var ef = 0; ef < embeddedForms.length; ef++) {
+ var form = localVersion[embeddedForms[ef]];
+
+ if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
+ // match
+ return localVersion;
}
- } else if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
- // match
- return letterForms;
}
+ } else if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+ // match
+ return letterForms;
}
-
- return null;
}
+
+ return null;
}
+ }
- exports.ParentLetter = ParentLetter;
+ ParentLetter$1.ParentLetter = ParentLetter;
- function GrandparentLetter(letter) {
- if (!isArabic_1.isArabic(letter)) {
- throw new Error('Not an Arabic letter');
- }
+ function GrandparentLetter(letter) {
+ if (!isArabic_1$1.isArabic(letter)) {
+ throw new Error('Not an Arabic letter');
+ }
- for (var w = 0; w < reference.letterList.length; w++) {
- // ok so we are checking this potential lettertron
- var letterForms = unicodeArabic["default"][reference.letterList[w]];
- var versions = Object.keys(letterForms);
+ for (var w = 0; w < reference_1.letterList.length; w++) {
+ // ok so we are checking this potential lettertron
+ var letterForms = unicode_arabic_1["default"][reference_1.letterList[w]];
+ var versions = Object.keys(letterForms);
- for (var v = 0; v < versions.length; v++) {
- var localVersion = letterForms[versions[v]];
+ for (var v = 0; v < versions.length; v++) {
+ var localVersion = letterForms[versions[v]];
- if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
- // look at this embedded object
- var embeddedForms = Object.keys(localVersion);
+ if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
+ // look at this embedded object
+ var embeddedForms = Object.keys(localVersion);
- for (var ef = 0; ef < embeddedForms.length; ef++) {
- var form = localVersion[embeddedForms[ef]];
+ for (var ef = 0; ef < embeddedForms.length; ef++) {
+ var form = localVersion[embeddedForms[ef]];
- if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
- // match
- return letterForms;
- }
+ if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
+ // match
+ return letterForms;
}
- } else if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
- // match
- return letterForms;
}
+ } else if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+ // match
+ return letterForms;
}
-
- return null;
}
- }
- exports.GrandparentLetter = GrandparentLetter;
- });
+ return null;
+ }
+ }
- var lib = createCommonjsModule(function (module, exports) {
+ ParentLetter$1.GrandparentLetter = GrandparentLetter;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.isArabic = isArabic_1.isArabic;
- exports.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
- exports.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
- exports.Normal = Normalization.Normal;
- exports.CharShaper = CharShaper_1.CharShaper;
- exports.WordShaper = WordShaper_1.WordShaper;
- exports.ParentLetter = ParentLetter_1.ParentLetter;
- exports.GrandparentLetter = ParentLetter_1.GrandparentLetter;
+ Object.defineProperty(lib, "__esModule", {
+ value: true
});
+ var isArabic_1 = isArabic$1;
+ lib.isArabic = isArabic_1.isArabic;
+ var GlyphSplitter_1 = GlyphSplitter$1;
+ lib.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
+ var BaselineSplitter_1 = BaselineSplitter$1;
+ lib.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
+ var Normalization_1 = Normalization;
+ lib.Normal = Normalization_1.Normal;
+ var CharShaper_1 = CharShaper$1;
+ lib.CharShaper = CharShaper_1.CharShaper;
+ var WordShaper_1 = WordShaper$2;
+ var WordShaper = lib.WordShaper = WordShaper_1.WordShaper;
+ var ParentLetter_1 = ParentLetter$1;
+ lib.ParentLetter = ParentLetter_1.ParentLetter;
+ lib.GrandparentLetter = ParentLetter_1.GrandparentLetter;
var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0750-\u07BF\u08A0â\u08BF]/;
function fixRTLTextForSvg(inputText) {
@@ -19704,7 +20563,7 @@
var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/; // Arabic word shaping
if (arabicRegex.test(inputText)) {
- inputText = lib.WordShaper(inputText);
+ inputText = WordShaper(inputText);
}
for (var n = 0; n < inputText.length; n++) {
@@ -19740,10 +20599,17 @@
return ret;
}
- var propertyIsEnumerable = objectPropertyIsEnumerable.f;
+ var DESCRIPTORS$2 = descriptors;
+ var uncurryThis$b = functionUncurryThis;
+ var objectKeys = objectKeys$4;
+ var toIndexedObject = toIndexedObject$d;
+ var $propertyIsEnumerable = objectPropertyIsEnumerable.f;
+
+ var propertyIsEnumerable = uncurryThis$b($propertyIsEnumerable);
+ var push$2 = uncurryThis$b([].push);
// `Object.{ entries, values }` methods implementation
- var createMethod$5 = function (TO_ENTRIES) {
+ var createMethod$1 = function (TO_ENTRIES) {
return function (it) {
var O = toIndexedObject(it);
var keys = objectKeys(O);
@@ -19753,8 +20619,8 @@
var key;
while (length > i) {
key = keys[i++];
- if (!descriptors || propertyIsEnumerable.call(O, key)) {
- result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
+ if (!DESCRIPTORS$2 || propertyIsEnumerable(O, key)) {
+ push$2(result, TO_ENTRIES ? [key, O[key]] : O[key]);
}
}
return result;
@@ -19764,17 +20630,18 @@
var objectToArray = {
// `Object.entries` method
// https://tc39.es/ecma262/#sec-object.entries
- entries: createMethod$5(true),
+ entries: createMethod$1(true),
// `Object.values` method
// https://tc39.es/ecma262/#sec-object.values
- values: createMethod$5(false)
+ values: createMethod$1(false)
};
+ var $$r = _export;
var $values = objectToArray.values;
// `Object.values` method
// https://tc39.es/ecma262/#sec-object.values
- _export({ target: 'Object', stat: true }, {
+ $$r({ target: 'Object', stat: true }, {
values: function values(O) {
return $values(O);
}
@@ -19802,15 +20669,30 @@
return delete s[k];
}
};
- }(); //
+ }();
+
+ var _listeners = {}; //
// corePreferences is an interface for persisting basic key-value strings
// within and between iD sessions on the same site.
//
+ /**
+ * @param {string} k
+ * @param {string?} v
+ * @returns {boolean} true if the action succeeded
+ */
function corePreferences(k, v) {
try {
- if (arguments.length === 1) return _storage.getItem(k);else if (v === null) _storage.removeItem(k);else _storage.setItem(k, v);
+ if (v === undefined) return _storage.getItem(k);else if (v === null) _storage.removeItem(k);else _storage.setItem(k, v);
+
+ if (_listeners[k]) {
+ _listeners[k].forEach(function (handler) {
+ return handler(v);
+ });
+ }
+
+ return true;
} catch (e) {
/* eslint-disable no-console */
if (typeof console !== 'undefined') {
@@ -19818,63 +20700,121 @@
}
/* eslint-enable no-console */
+
+ return false;
}
- }
+ } // adds an event listener which is triggered whenever
- function responseText(response) {
- if (!response.ok) throw new Error(response.status + " " + response.statusText);
- return response.text();
- }
- function d3_text (input, init) {
- return fetch(input, init).then(responseText);
- }
+ corePreferences.onChange = function (k, handler) {
+ _listeners[k] = _listeners[k] || [];
- function responseJson(response) {
- if (!response.ok) throw new Error(response.status + " " + response.statusText);
- if (response.status === 204 || response.status === 205) return;
- return response.json();
- }
+ _listeners[k].push(handler);
+ };
- function d3_json (input, init) {
- return fetch(input, init).then(responseJson);
- }
+ var vparse = {exports: {}};
- function parser(type) {
- return function (input, init) {
- return d3_text(input, init).then(function (text) {
- return new DOMParser().parseFromString(text, type);
- });
- };
- }
+ (function (module) {
+ (function (window) {
- var d3_xml = parser("application/xml");
- var svg = parser("image/svg+xml");
+ function parseVersion(v) {
+ var m = v.replace(/[^0-9.]/g, '').match(/[0-9]*\.|[0-9]+/g) || [];
+ v = {
+ major: +m[0] || 0,
+ minor: +m[1] || 0,
+ patch: +m[2] || 0,
+ build: +m[3] || 0
+ };
+ v.isEmpty = !v.major && !v.minor && !v.patch && !v.build;
+ v.parsed = [v.major, v.minor, v.patch, v.build];
+ v.text = v.parsed.join('.');
+ v.compare = compare;
+ return v;
+ }
+
+ function compare(v) {
+ if (typeof v === 'string') {
+ v = parseVersion(v);
+ }
+
+ for (var i = 0; i < 4; i++) {
+ if (this.parsed[i] !== v.parsed[i]) {
+ return this.parsed[i] > v.parsed[i] ? 1 : -1;
+ }
+ }
+
+ return 0;
+ }
+ /* istanbul ignore next */
+
+
+ if (module && 'object' === 'object') {
+ module.exports = parseVersion;
+ } else {
+ window.parseVersion = parseVersion;
+ }
+ })(commonjsGlobal);
+ })(vparse);
+
+ var parseVersion = vparse.exports;
+
+ var name = "iD";
+ var version = "2.20.4";
+ var description = "A friendly editor for OpenStreetMap";
+ var main = "dist/iD.min.js";
+ var repository = "github:openstreetmap/iD";
+ var homepage = "https://github.com/openstreetmap/iD";
+ var bugs = "https://github.com/openstreetmap/iD/issues";
+ var keywords = ["editor","openstreetmap"];
+ var license = "ISC";
+ var scripts = {all:"npm-run-all -s clean build build:legacy dist",build:"npm-run-all -s build:css build:data build:dev","build:css":"node scripts/build_css.js","build:data":"shx mkdir -p dist/data && node scripts/build_data.js","build:dev":"rollup --config config/rollup.config.dev.js","build:legacy":"rollup --config config/rollup.config.legacy.js","build:stats":"rollup --config config/rollup.config.stats.js",clean:"shx rm -f dist/*.js dist/*.map dist/*.css dist/img/*.svg",dist:"npm-run-all -p dist:**","dist:mapillary":"shx mkdir -p dist/mapillary-js && shx cp -R node_modules/mapillary-js/dist/* dist/mapillary-js/","dist:pannellum":"shx mkdir -p dist/pannellum-streetside && shx cp -R node_modules/pannellum/build/* dist/pannellum-streetside/","dist:min:iD":"uglifyjs dist/iD.legacy.js --compress --mangle --output dist/iD.min.js","dist:svg:iD":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"iD-%s\" --symbol-sprite dist/img/iD-sprite.svg \"svg/iD-sprite/**/*.svg\"","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","dist:svg:fa":"svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/fa-sprite.svg svg/fontawesome/*.svg","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","dist:svg:mapillary:signs":"svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-sprite.svg node_modules/mapillary_sprite_source/package_signs/*.svg","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","dist:svg:temaki":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"temaki-%s\" --symbol-sprite dist/img/temaki-sprite.svg node_modules/@ideditor/temaki/icons/*.svg",imagery:"node scripts/update_imagery.js",lint:"eslint scripts test/spec modules","lint:fix":"eslint scripts test/spec modules --fix",start:"npm-run-all -s build start:server",quickstart:"npm-run-all -s build:dev start:server","start:server":"node scripts/server.js",test:"npm-run-all -s lint build test:spec","test:spec":"karma start karma.conf.js",translations:"node scripts/update_locales.js"};
+ var dependencies = {"@ideditor/country-coder":"~5.0.3","@ideditor/location-conflation":"~1.0.2","@mapbox/geojson-area":"^0.2.2","@mapbox/sexagesimal":"1.2.0","@mapbox/vector-tile":"^1.3.1","@tmcw/togeojson":"^4.5.0","@turf/bbox-clip":"^6.0.0","abortcontroller-polyfill":"^1.4.0","aes-js":"^3.1.2","alif-toolkit":"^1.2.9","core-js":"^3.6.5",diacritics:"1.3.0","fast-deep-equal":"~3.1.1","fast-json-stable-stringify":"2.1.0","lodash-es":"~4.17.15",marked:"~2.0.0","node-diff3":"2.1.0","osm-auth":"1.1.0",pannellum:"2.5.6",pbf:"^3.2.1","polygon-clipping":"~0.15.1",rbush:"3.0.1","whatwg-fetch":"^3.4.1","which-polygon":"2.2.0"};
+ var devDependencies = {"@babel/core":"^7.11.6","@babel/preset-env":"^7.11.5","@fortawesome/fontawesome-svg-core":"^1.2.32","@fortawesome/free-brands-svg-icons":"~5.15.1","@fortawesome/free-regular-svg-icons":"~5.15.1","@fortawesome/free-solid-svg-icons":"~5.15.1","@ideditor/temaki":"~5.0.0","@mapbox/maki":"^6.0.0","@rollup/plugin-babel":"^5.2.1","@rollup/plugin-commonjs":"^21.0.0","@rollup/plugin-json":"^4.0.1","@rollup/plugin-node-resolve":"~13.0.5",autoprefixer:"^10.0.1",btoa:"^1.2.1",chai:"^4.3.4","cldr-core":"37.0.0","cldr-localenames-full":"37.0.0",chalk:"^4.1.2","concat-files":"^0.1.1",d3:"~6.6.0","editor-layer-index":"github:osmlab/editor-layer-index#gh-pages",eslint:"^7.1.0","fetch-mock":"^9.11.0",gaze:"^1.1.3",glob:"^7.1.0",happen:"^0.3.2","js-yaml":"^4.0.0","json-stringify-pretty-compact":"^3.0.0",karma:"^6.3.5","karma-chrome-launcher":"^3.1.0","karma-coverage":"^2.0.3","karma-mocha":"^2.0.1","karma-remap-istanbul":"^0.6.0",mapillary_sprite_source:"^1.8.0","mapillary-js":"4.0.0",minimist:"^1.2.3",mocha:"^8.4.0","name-suggestion-index":"~6.0","node-fetch":"^2.6.1","npm-run-all":"^4.0.0","object-inspect":"1.10.3","osm-community-index":"~5.1.0",postcss:"^8.1.1","postcss-selector-prepend":"^0.5.0",rollup:"~2.52.8","rollup-plugin-includepaths":"~0.2.3","rollup-plugin-progress":"^1.1.1","rollup-plugin-visualizer":"~4.2.0",shelljs:"^0.8.0",shx:"^0.3.0",sinon:"^11.1.2","sinon-chai":"^3.7.0",smash:"0.0","static-server":"^2.2.1","svg-sprite":"1.5.1","uglify-js":"~3.13.0",vparse:"~1.1.0"};
+ var engines = {node:">=10"};
+ var browserslist = ["> 0.2%, last 6 major versions, Firefox ESR, IE 11, maintained node versions"];
+ var packageJSON = {
+ name: name,
+ version: version,
+ description: description,
+ main: main,
+ repository: repository,
+ homepage: homepage,
+ bugs: bugs,
+ keywords: keywords,
+ license: license,
+ scripts: scripts,
+ dependencies: dependencies,
+ devDependencies: devDependencies,
+ engines: engines,
+ browserslist: browserslist
+ };
var _mainFileFetcher = coreFileFetcher(); // singleton
// coreFileFetcher asynchronously fetches data from JSON files
//
function coreFileFetcher() {
+ var ociVersion = packageJSON.devDependencies['osm-community-index'];
+ var v = parseVersion(ociVersion);
+ var vMinor = "".concat(v.major, ".").concat(v.minor);
var _this = {};
var _inflight = {};
var _fileMap = {
'address_formats': 'data/address_formats.min.json',
- 'deprecated': 'data/deprecated.min.json',
- 'discarded': 'data/discarded.min.json',
+ 'deprecated': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/deprecated.min.json',
+ 'discarded': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/discarded.min.json',
'imagery': 'data/imagery.min.json',
'intro_graph': 'data/intro_graph.min.json',
'keepRight': 'data/keepRight.min.json',
'languages': 'data/languages.min.json',
- 'locales': 'data/locales.min.json',
- 'nsi_brands': 'https://cdn.jsdelivr.net/npm/name-suggestion-index@4/dist/brands.min.json',
- 'nsi_filters': 'https://cdn.jsdelivr.net/npm/name-suggestion-index@4/dist/filters.min.json',
- 'oci_features': 'https://cdn.jsdelivr.net/npm/osm-community-index@2/dist/features.min.json',
- 'oci_resources': 'https://cdn.jsdelivr.net/npm/osm-community-index@2/dist/resources.min.json',
- 'preset_categories': 'data/preset_categories.min.json',
- 'preset_defaults': 'data/preset_defaults.min.json',
- 'preset_fields': 'data/preset_fields.min.json',
- 'preset_presets': 'data/preset_presets.min.json',
+ 'locales': 'locales/index.min.json',
+ 'oci_defaults': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/defaults.min.json"),
+ 'oci_features': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/featureCollection.min.json"),
+ 'oci_resources': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/resources.min.json"),
+ 'preset_categories': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_categories.min.json',
+ 'preset_defaults': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_defaults.min.json',
+ 'preset_fields': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/fields.min.json',
+ 'preset_presets': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/presets.min.json',
'phone_formats': 'data/phone_formats.min.json',
'qa_data': 'data/qa_data.min.json',
'shortcuts': 'data/shortcuts.min.json',
@@ -19905,7 +20845,16 @@
var prom = _inflight[url];
if (!prom) {
- _inflight[url] = prom = d3_json(url).then(function (result) {
+ _inflight[url] = prom = fetch(url).then(function (response) {
+ // fetch in PhantomJS tests may return ok=false and status=0 even if it's okay
+ if (!response.ok && response.status !== 0 || !response.json) {
+ throw new Error(response.status + ' ' + response.statusText);
+ }
+
+ if (response.status === 204 || response.status === 205) return; // No Content, Reset Content
+
+ return response.json();
+ }).then(function (result) {
delete _inflight[url];
if (!result) {
@@ -19955,4013 +20904,19495 @@
return _this;
}
- var $findIndex$1 = arrayIteration.findIndex;
-
+ var global$9 = global$1o;
+ var toIntegerOrInfinity$1 = toIntegerOrInfinity$b;
+ var toString$7 = toString$k;
+ var requireObjectCoercible$6 = requireObjectCoercible$e;
- var FIND_INDEX = 'findIndex';
- var SKIPS_HOLES$1 = true;
-
- // Shouldn't skip holes
- if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES$1 = false; });
+ var RangeError$5 = global$9.RangeError;
- // `Array.prototype.findIndex` method
- // https://tc39.es/ecma262/#sec-array.prototype.findindex
- _export({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 }, {
- findIndex: function findIndex(callbackfn /* , that = undefined */) {
- return $findIndex$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- }
- });
+ // `String.prototype.repeat` method implementation
+ // https://tc39.es/ecma262/#sec-string.prototype.repeat
+ var stringRepeat = function repeat(count) {
+ var str = toString$7(requireObjectCoercible$6(this));
+ var result = '';
+ var n = toIntegerOrInfinity$1(count);
+ if (n < 0 || n == Infinity) throw RangeError$5('Wrong number of repetitions');
+ for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;
+ return result;
+ };
- // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
- addToUnscopables(FIND_INDEX);
+ var $$q = _export;
+ var global$8 = global$1o;
+ var uncurryThis$a = functionUncurryThis;
+ var toIntegerOrInfinity = toIntegerOrInfinity$b;
+ var thisNumberValue$1 = thisNumberValue$3;
+ var $repeat$1 = stringRepeat;
+ var fails$7 = fails$V;
- var $includes$1 = arrayIncludes.includes;
+ var RangeError$4 = global$8.RangeError;
+ var String$1 = global$8.String;
+ var floor$2 = Math.floor;
+ var repeat$2 = uncurryThis$a($repeat$1);
+ var stringSlice$3 = uncurryThis$a(''.slice);
+ var un$ToFixed = uncurryThis$a(1.0.toFixed);
+ var pow$1 = function (x, n, acc) {
+ return n === 0 ? acc : n % 2 === 1 ? pow$1(x, n - 1, acc * x) : pow$1(x * x, n / 2, acc);
+ };
- // `Array.prototype.includes` method
- // https://tc39.es/ecma262/#sec-array.prototype.includes
- _export({ target: 'Array', proto: true }, {
- includes: function includes(el /* , fromIndex = 0 */) {
- return $includes$1(this, el, arguments.length > 1 ? arguments[1] : undefined);
+ var log = function (x) {
+ var n = 0;
+ var x2 = x;
+ while (x2 >= 4096) {
+ n += 12;
+ x2 /= 4096;
}
- });
-
- // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
- addToUnscopables('includes');
-
- var notARegexp = function (it) {
- if (isRegexp(it)) {
- throw TypeError("The method doesn't accept regular expressions");
- } return it;
+ while (x2 >= 2) {
+ n += 1;
+ x2 /= 2;
+ } return n;
};
- var MATCH$2 = wellKnownSymbol('match');
-
- var correctIsRegexpLogic = function (METHOD_NAME) {
- var regexp = /./;
- try {
- '/./'[METHOD_NAME](regexp);
- } catch (error1) {
- try {
- regexp[MATCH$2] = false;
- return '/./'[METHOD_NAME](regexp);
- } catch (error2) { /* empty */ }
- } return false;
+ var multiply = function (data, n, c) {
+ var index = -1;
+ var c2 = c;
+ while (++index < 6) {
+ c2 += n * data[index];
+ data[index] = c2 % 1e7;
+ c2 = floor$2(c2 / 1e7);
+ }
};
- // `String.prototype.includes` method
- // https://tc39.es/ecma262/#sec-string.prototype.includes
- _export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {
- includes: function includes(searchString /* , position = 0 */) {
- return !!~String(requireObjectCoercible(this))
- .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);
+ var divide = function (data, n) {
+ var index = 6;
+ var c = 0;
+ while (--index >= 0) {
+ c += data[index];
+ data[index] = floor$2(c / n);
+ c = (c % n) * 1e7;
}
- });
-
- var _detected;
-
- function utilDetect(refresh) {
- if (_detected && !refresh) return _detected;
- _detected = {};
- var ua = navigator.userAgent;
- var m = null;
- /* Browser */
+ };
- m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge
+ var dataToString = function (data) {
+ var index = 6;
+ var s = '';
+ while (--index >= 0) {
+ if (s !== '' || index === 0 || data[index] !== 0) {
+ var t = String$1(data[index]);
+ s = s === '' ? t : s + repeat$2('0', 7 - t.length) + t;
+ }
+ } return s;
+ };
- if (m !== null) {
- _detected.browser = m[1];
- _detected.version = m[2];
- }
+ var FORCED$6 = fails$7(function () {
+ return un$ToFixed(0.00008, 3) !== '0.000' ||
+ un$ToFixed(0.9, 0) !== '1' ||
+ un$ToFixed(1.255, 2) !== '1.25' ||
+ un$ToFixed(1000000000000000128.0, 0) !== '1000000000000000128';
+ }) || !fails$7(function () {
+ // V8 ~ Android 4.3-
+ un$ToFixed({});
+ });
- if (!_detected.browser) {
- m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11
+ // `Number.prototype.toFixed` method
+ // https://tc39.es/ecma262/#sec-number.prototype.tofixed
+ $$q({ target: 'Number', proto: true, forced: FORCED$6 }, {
+ toFixed: function toFixed(fractionDigits) {
+ var number = thisNumberValue$1(this);
+ var fractDigits = toIntegerOrInfinity(fractionDigits);
+ var data = [0, 0, 0, 0, 0, 0];
+ var sign = '';
+ var result = '0';
+ var e, z, j, k;
- if (m !== null) {
- _detected.browser = 'msie';
- _detected.version = m[1];
+ // TODO: ES2018 increased the maximum number of fraction digits to 100, need to improve the implementation
+ if (fractDigits < 0 || fractDigits > 20) throw RangeError$4('Incorrect fraction digits');
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (number != number) return 'NaN';
+ if (number <= -1e21 || number >= 1e21) return String$1(number);
+ if (number < 0) {
+ sign = '-';
+ number = -number;
}
- }
-
- if (!_detected.browser) {
- m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+
-
- if (m !== null) {
- _detected.browser = 'Opera';
- _detected.version = m[2];
+ if (number > 1e-21) {
+ e = log(number * pow$1(2, 69, 1)) - 69;
+ z = e < 0 ? number * pow$1(2, -e, 1) : number / pow$1(2, e, 1);
+ z *= 0x10000000000000;
+ e = 52 - e;
+ if (e > 0) {
+ multiply(data, 0, z);
+ j = fractDigits;
+ while (j >= 7) {
+ multiply(data, 1e7, 0);
+ j -= 7;
+ }
+ multiply(data, pow$1(10, j, 1), 0);
+ j = e - 1;
+ while (j >= 23) {
+ divide(data, 1 << 23);
+ j -= 23;
+ }
+ divide(data, 1 << j);
+ multiply(data, 1, 1);
+ divide(data, 2);
+ result = dataToString(data);
+ } else {
+ multiply(data, 0, z);
+ multiply(data, 1 << -e, 0);
+ result = dataToString(data) + repeat$2('0', fractDigits);
+ }
}
+ if (fractDigits > 0) {
+ k = result.length;
+ result = sign + (k <= fractDigits
+ ? '0.' + repeat$2('0', fractDigits - k) + result
+ : stringSlice$3(result, 0, k - fractDigits) + '.' + stringSlice$3(result, k - fractDigits));
+ } else {
+ result = sign + result;
+ } return result;
}
+ });
- if (!_detected.browser) {
- m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
+ var global$7 = global$1o;
- if (m !== null) {
- _detected.browser = m[1];
- _detected.version = m[2];
- m = ua.match(/version\/([\.\d]+)/i);
- if (m !== null) _detected.version = m[1];
- }
- }
+ var globalIsFinite = global$7.isFinite;
- if (!_detected.browser) {
- _detected.browser = navigator.appName;
- _detected.version = navigator.appVersion;
- } // keep major.minor version only..
+ // `Number.isFinite` method
+ // https://tc39.es/ecma262/#sec-number.isfinite
+ // eslint-disable-next-line es/no-number-isfinite -- safe
+ var numberIsFinite$1 = Number.isFinite || function isFinite(it) {
+ return typeof it == 'number' && globalIsFinite(it);
+ };
+ var $$p = _export;
+ var numberIsFinite = numberIsFinite$1;
- _detected.version = _detected.version.split(/\W/).slice(0, 2).join('.'); // detect other browser capabilities
- // Legacy Opera has incomplete svg style support. See #715
+ // `Number.isFinite` method
+ // https://tc39.es/ecma262/#sec-number.isfinite
+ $$p({ target: 'Number', stat: true }, { isFinite: numberIsFinite });
- _detected.opera = _detected.browser.toLowerCase() === 'opera' && parseFloat(_detected.version) < 15;
+ var $$o = _export;
+ var global$6 = global$1o;
+ var uncurryThis$9 = functionUncurryThis;
+ var toAbsoluteIndex = toAbsoluteIndex$9;
- if (_detected.browser.toLowerCase() === 'msie') {
- _detected.ie = true;
- _detected.browser = 'Internet Explorer';
- _detected.support = parseFloat(_detected.version) >= 11;
- } else {
- _detected.ie = false;
- _detected.support = true;
- }
+ var RangeError$3 = global$6.RangeError;
+ var fromCharCode$1 = String.fromCharCode;
+ // eslint-disable-next-line es/no-string-fromcodepoint -- required for testing
+ var $fromCodePoint = String.fromCodePoint;
+ var join$2 = uncurryThis$9([].join);
- _detected.filedrop = window.FileReader && 'ondrop' in window;
- _detected.download = !(_detected.ie || _detected.browser.toLowerCase() === 'edge');
- _detected.cssfilters = !(_detected.ie || _detected.browser.toLowerCase() === 'edge');
- /* Platform */
+ // length should be 1, old FF problem
+ var INCORRECT_LENGTH = !!$fromCodePoint && $fromCodePoint.length != 1;
- if (/Win/.test(ua)) {
- _detected.os = 'win';
- _detected.platform = 'Windows';
- } else if (/Mac/.test(ua)) {
- _detected.os = 'mac';
- _detected.platform = 'Macintosh';
- } else if (/X11/.test(ua) || /Linux/.test(ua)) {
- _detected.os = 'linux';
- _detected.platform = 'Linux';
- } else {
- _detected.os = 'win';
- _detected.platform = 'Unknown';
+ // `String.fromCodePoint` method
+ // https://tc39.es/ecma262/#sec-string.fromcodepoint
+ $$o({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ fromCodePoint: function fromCodePoint(x) {
+ var elements = [];
+ var length = arguments.length;
+ var i = 0;
+ var code;
+ while (length > i) {
+ code = +arguments[i++];
+ if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError$3(code + ' is not a valid code point');
+ elements[i] = code < 0x10000
+ ? fromCharCode$1(code)
+ : fromCharCode$1(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00);
+ } return join$2(elements, '');
}
+ });
- _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || // HACK: iPadOS 13+ requests desktop sites by default by using a Mac user agent,
- // so assume any "mac" with multitouch is actually iOS
- navigator.platform === 'MacIntel' && 'maxTouchPoints' in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream;
- /* Locale */
- // An array of locales requested by the browser in priority order.
-
- _detected.browserLocales = Array.from(new Set( // remove duplicates
- [navigator.language].concat(navigator.languages || []).concat([// old property for backwards compatibility
- navigator.userLanguage]) // remove any undefined values
- .filter(Boolean)));
- /* Host */
-
- var loc = window.top.location;
- var origin = loc.origin;
+ var call$1 = functionCall;
+ var fixRegExpWellKnownSymbolLogic = fixRegexpWellKnownSymbolLogic;
+ var anObject = anObject$n;
+ var requireObjectCoercible$5 = requireObjectCoercible$e;
+ var sameValue = sameValue$1;
+ var toString$6 = toString$k;
+ var getMethod = getMethod$7;
+ var regExpExec = regexpExecAbstract;
- if (!origin) {
- // for unpatched IE11
- origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port : '');
- }
+ // @@search logic
+ fixRegExpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCallNative) {
+ return [
+ // `String.prototype.search` method
+ // https://tc39.es/ecma262/#sec-string.prototype.search
+ function search(regexp) {
+ var O = requireObjectCoercible$5(this);
+ var searcher = regexp == undefined ? undefined : getMethod(regexp, SEARCH);
+ return searcher ? call$1(searcher, regexp, O) : new RegExp(regexp)[SEARCH](toString$6(O));
+ },
+ // `RegExp.prototype[@@search]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@search
+ function (string) {
+ var rx = anObject(this);
+ var S = toString$6(string);
+ var res = maybeCallNative(nativeSearch, rx, S);
- _detected.host = origin + loc.pathname;
- return _detected;
- }
+ if (res.done) return res.value;
- // `Number.MAX_SAFE_INTEGER` constant
- // https://tc39.es/ecma262/#sec-number.max_safe_integer
- _export({ target: 'Number', stat: true }, {
- MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF
+ var previousLastIndex = rx.lastIndex;
+ if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;
+ var result = regExpExec(rx, S);
+ if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;
+ return result === null ? -1 : result.index;
+ }
+ ];
});
- var getOwnPropertyNames$2 = objectGetOwnPropertyNames.f;
- var getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;
- var defineProperty$9 = objectDefineProperty.f;
- var trim$2 = stringTrim.trim;
+ var rbush$2 = {exports: {}};
- var NUMBER = 'Number';
- var NativeNumber = global_1[NUMBER];
- var NumberPrototype = NativeNumber.prototype;
+ var quickselect$2 = {exports: {}};
- // Opera ~12 has broken Object#toString
- var BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;
+ (function (module, exports) {
+ (function (global, factory) {
+ module.exports = factory() ;
+ })(commonjsGlobal, function () {
- // `ToNumber` abstract operation
- // https://tc39.es/ecma262/#sec-tonumber
- var toNumber = function (argument) {
- var it = toPrimitive(argument, false);
- var first, third, radix, maxCode, digits, length, index, code;
- if (typeof it == 'string' && it.length > 2) {
- it = trim$2(it);
- first = it.charCodeAt(0);
- if (first === 43 || first === 45) {
- third = it.charCodeAt(2);
- if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
- } else if (first === 48) {
- switch (it.charCodeAt(1)) {
- case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i
- case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i
- default: return +it;
- }
- digits = it.slice(2);
- length = digits.length;
- for (index = 0; index < length; index++) {
- code = digits.charCodeAt(index);
- // parseInt parses a string to a first unavailable symbol
- // but ToNumber should return NaN if a string contains unavailable symbols
- if (code < 48 || code > maxCode) return NaN;
- } return parseInt(digits, radix);
+ function quickselect(arr, k, left, right, compare) {
+ quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare);
}
- } return +it;
- };
- // `Number` constructor
- // https://tc39.es/ecma262/#sec-number-constructor
- if (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {
- var NumberWrapper = function Number(value) {
- var it = arguments.length < 1 ? 0 : value;
- var dummy = this;
- return dummy instanceof NumberWrapper
- // check on 1..constructor(foo) case
- && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)
- ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);
- };
- for (var keys$3 = descriptors ? getOwnPropertyNames$2(NativeNumber) : (
- // ES3:
- 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
- // ES2015 (in case, if modules with ES2015 Number statics required before):
- 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
- 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,' +
- // ESNext
- 'fromString,range'
- ).split(','), j$2 = 0, key$1; keys$3.length > j$2; j$2++) {
- if (has(NativeNumber, key$1 = keys$3[j$2]) && !has(NumberWrapper, key$1)) {
- defineProperty$9(NumberWrapper, key$1, getOwnPropertyDescriptor$3(NativeNumber, key$1));
- }
- }
- NumberWrapper.prototype = NumberPrototype;
- NumberPrototype.constructor = NumberWrapper;
- redefine(global_1, NUMBER, NumberWrapper);
- }
+ function quickselectStep(arr, k, left, right, compare) {
+ while (right > left) {
+ if (right - left > 600) {
+ var n = right - left + 1;
+ var m = k - left + 1;
+ var z = Math.log(n);
+ var s = 0.5 * Math.exp(2 * z / 3);
+ var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
+ var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
+ var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
+ quickselectStep(arr, k, newLeft, newRight, compare);
+ }
- var aesJs = createCommonjsModule(function (module, exports) {
- /*! MIT License. Copyright 2015-2018 Richard Moore . See LICENSE.txt. */
- (function (root) {
+ var t = arr[k];
+ var i = left;
+ var j = right;
+ swap(arr, left, k);
+ if (compare(arr[right], t) > 0) swap(arr, left, right);
- function checkInt(value) {
- return parseInt(value) === value;
- }
+ while (i < j) {
+ swap(arr, i, j);
+ i++;
+ j--;
- function checkInts(arrayish) {
- if (!checkInt(arrayish.length)) {
- return false;
- }
+ while (compare(arr[i], t) < 0) {
+ i++;
+ }
- for (var i = 0; i < arrayish.length; i++) {
- if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {
- return false;
+ while (compare(arr[j], t) > 0) {
+ j--;
+ }
}
+
+ if (compare(arr[left], t) === 0) swap(arr, left, j);else {
+ j++;
+ swap(arr, j, right);
+ }
+ if (j <= k) left = j + 1;
+ if (k <= j) right = j - 1;
}
+ }
- return true;
+ function swap(arr, i, j) {
+ var tmp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = tmp;
}
- function coerceArray(arg, copy) {
- // ArrayBuffer view
- if (arg.buffer && arg.name === 'Uint8Array') {
- if (copy) {
- if (arg.slice) {
- arg = arg.slice();
- } else {
- arg = Array.prototype.slice.call(arg);
- }
- }
+ function defaultCompare(a, b) {
+ return a < b ? -1 : a > b ? 1 : 0;
+ }
- return arg;
- } // It's an array; check it is a valid representation of a byte
+ return quickselect;
+ });
+ })(quickselect$2);
+ rbush$2.exports = rbush$1;
- if (Array.isArray(arg)) {
- if (!checkInts(arg)) {
- throw new Error('Array contains invalid value: ' + arg);
- }
+ rbush$2.exports["default"] = rbush$1;
- return new Uint8Array(arg);
- } // Something else, but behaves like an array (maybe a Buffer? Arguments?)
+ var quickselect$1 = quickselect$2.exports;
+ function rbush$1(maxEntries, format) {
+ if (!(this instanceof rbush$1)) return new rbush$1(maxEntries, format); // max entries in a node is 9 by default; min node fill is 40% for best performance
- if (checkInt(arg.length) && checkInts(arg)) {
- return new Uint8Array(arg);
- }
+ this._maxEntries = Math.max(4, maxEntries || 9);
+ this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
- throw new Error('unsupported array-like object');
- }
+ if (format) {
+ this._initFormat(format);
+ }
- function createArray(length) {
- return new Uint8Array(length);
- }
+ this.clear();
+ }
- function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {
- if (sourceStart != null || sourceEnd != null) {
- if (sourceArray.slice) {
- sourceArray = sourceArray.slice(sourceStart, sourceEnd);
- } else {
- sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);
+ rbush$1.prototype = {
+ all: function all() {
+ return this._all(this.data, []);
+ },
+ search: function search(bbox) {
+ var node = this.data,
+ result = [],
+ toBBox = this.toBBox;
+ if (!intersects$1(bbox, node)) return result;
+ var nodesToSearch = [],
+ i,
+ len,
+ child,
+ childBBox;
+
+ while (node) {
+ for (i = 0, len = node.children.length; i < len; i++) {
+ child = node.children[i];
+ childBBox = node.leaf ? toBBox(child) : child;
+
+ if (intersects$1(bbox, childBBox)) {
+ if (node.leaf) result.push(child);else if (contains$1(bbox, childBBox)) this._all(child, result);else nodesToSearch.push(child);
}
}
- targetArray.set(sourceArray, targetStart);
+ node = nodesToSearch.pop();
}
- var convertUtf8 = function () {
- function toBytes(text) {
- var result = [],
- i = 0;
- text = encodeURI(text);
+ return result;
+ },
+ collides: function collides(bbox) {
+ var node = this.data,
+ toBBox = this.toBBox;
+ if (!intersects$1(bbox, node)) return false;
+ var nodesToSearch = [],
+ i,
+ len,
+ child,
+ childBBox;
- while (i < text.length) {
- var c = text.charCodeAt(i++); // if it is a % sign, encode the following 2 bytes as a hex value
+ while (node) {
+ for (i = 0, len = node.children.length; i < len; i++) {
+ child = node.children[i];
+ childBBox = node.leaf ? toBBox(child) : child;
- if (c === 37) {
- result.push(parseInt(text.substr(i, 2), 16));
- i += 2; // otherwise, just the actual byte
- } else {
- result.push(c);
- }
+ if (intersects$1(bbox, childBBox)) {
+ if (node.leaf || contains$1(bbox, childBBox)) return true;
+ nodesToSearch.push(child);
}
-
- return coerceArray(result);
}
- function fromBytes(bytes) {
- var result = [],
- i = 0;
-
- while (i < bytes.length) {
- var c = bytes[i];
+ node = nodesToSearch.pop();
+ }
- if (c < 128) {
- result.push(String.fromCharCode(c));
- i++;
- } else if (c > 191 && c < 224) {
- result.push(String.fromCharCode((c & 0x1f) << 6 | bytes[i + 1] & 0x3f));
- i += 2;
- } else {
- result.push(String.fromCharCode((c & 0x0f) << 12 | (bytes[i + 1] & 0x3f) << 6 | bytes[i + 2] & 0x3f));
- i += 3;
- }
- }
+ return false;
+ },
+ load: function load(data) {
+ if (!(data && data.length)) return this;
- return result.join('');
+ if (data.length < this._minEntries) {
+ for (var i = 0, len = data.length; i < len; i++) {
+ this.insert(data[i]);
}
- return {
- toBytes: toBytes,
- fromBytes: fromBytes
- };
- }();
-
- var convertHex = function () {
- function toBytes(text) {
- var result = [];
+ return this;
+ } // recursively build the tree with the given data from scratch using OMT algorithm
- for (var i = 0; i < text.length; i += 2) {
- result.push(parseInt(text.substr(i, 2), 16));
- }
- return result;
- } // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html
+ var node = this._build(data.slice(), 0, data.length - 1, 0);
+ if (!this.data.children.length) {
+ // save as is if tree is empty
+ this.data = node;
+ } else if (this.data.height === node.height) {
+ // split root if trees have the same height
+ this._splitRoot(this.data, node);
+ } else {
+ if (this.data.height < node.height) {
+ // swap trees if inserted one is bigger
+ var tmpNode = this.data;
+ this.data = node;
+ node = tmpNode;
+ } // insert the small tree into the large tree at appropriate level
- var Hex = '0123456789abcdef';
- function fromBytes(bytes) {
- var result = [];
+ this._insert(node, this.data.height - node.height - 1, true);
+ }
- for (var i = 0; i < bytes.length; i++) {
- var v = bytes[i];
- result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]);
- }
+ return this;
+ },
+ insert: function insert(item) {
+ if (item) this._insert(item, this.data.height - 1);
+ return this;
+ },
+ clear: function clear() {
+ this.data = createNode$1([]);
+ return this;
+ },
+ remove: function remove(item, equalsFn) {
+ if (!item) return this;
+ var node = this.data,
+ bbox = this.toBBox(item),
+ path = [],
+ indexes = [],
+ i,
+ parent,
+ index,
+ goingUp; // depth-first iterative tree traversal
- return result.join('');
+ while (node || path.length) {
+ if (!node) {
+ // go up
+ node = path.pop();
+ parent = path[path.length - 1];
+ i = indexes.pop();
+ goingUp = true;
}
- return {
- toBytes: toBytes,
- fromBytes: fromBytes
- };
- }(); // Number of rounds by keysize
-
+ if (node.leaf) {
+ // check current node
+ index = findItem$1(item, node.children, equalsFn);
- var numberOfRounds = {
- 16: 10,
- 24: 12,
- 32: 14
- }; // Round constant words
+ if (index !== -1) {
+ // item found, remove the item and condense tree upwards
+ node.children.splice(index, 1);
+ path.push(node);
- var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; // S-box and Inverse S-box (S is for Substitution)
+ this._condense(path);
- var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];
- var Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; // Transformations for encryption
+ return this;
+ }
+ }
- var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a];
- var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616];
- var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16];
- var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; // Transformations for decryption
+ if (!goingUp && !node.leaf && contains$1(node, bbox)) {
+ // go down
+ path.push(node);
+ indexes.push(i);
+ i = 0;
+ parent = node;
+ node = node.children[0];
+ } else if (parent) {
+ // go right
+ i++;
+ node = parent.children[i];
+ goingUp = false;
+ } else node = null; // nothing found
- var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742];
- var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857];
- var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8];
- var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; // Transformations for decryption key expansion
+ }
- var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3];
- var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697];
- var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46];
- var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d];
+ return this;
+ },
+ toBBox: function toBBox(item) {
+ return item;
+ },
+ compareMinX: compareNodeMinX$1,
+ compareMinY: compareNodeMinY$1,
+ toJSON: function toJSON() {
+ return this.data;
+ },
+ fromJSON: function fromJSON(data) {
+ this.data = data;
+ return this;
+ },
+ _all: function _all(node, result) {
+ var nodesToSearch = [];
- function convertToInt32(bytes) {
- var result = [];
+ while (node) {
+ if (node.leaf) result.push.apply(result, node.children);else nodesToSearch.push.apply(nodesToSearch, node.children);
+ node = nodesToSearch.pop();
+ }
- for (var i = 0; i < bytes.length; i += 4) {
- result.push(bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]);
- }
+ return result;
+ },
+ _build: function _build(items, left, right, height) {
+ var N = right - left + 1,
+ M = this._maxEntries,
+ node;
- return result;
+ if (N <= M) {
+ // reached leaf level; return leaf
+ node = createNode$1(items.slice(left, right + 1));
+ calcBBox$1(node, this.toBBox);
+ return node;
}
- var AES = function AES(key) {
- if (!(this instanceof AES)) {
- throw Error('AES must be instanitated with `new`');
- }
-
- Object.defineProperty(this, 'key', {
- value: coerceArray(key, true)
- });
+ if (!height) {
+ // target height of the bulk-loaded tree
+ height = Math.ceil(Math.log(N) / Math.log(M)); // target number of root entries to maximize storage utilization
- this._prepare();
- };
+ M = Math.ceil(N / Math.pow(M, height - 1));
+ }
- AES.prototype._prepare = function () {
- var rounds = numberOfRounds[this.key.length];
+ node = createNode$1([]);
+ node.leaf = false;
+ node.height = height; // split the items into M mostly square tiles
- if (rounds == null) {
- throw new Error('invalid key size (must be 16, 24 or 32 bytes)');
- } // encryption round keys
+ var N2 = Math.ceil(N / M),
+ N1 = N2 * Math.ceil(Math.sqrt(M)),
+ i,
+ j,
+ right2,
+ right3;
+ multiSelect$1(items, left, right, N1, this.compareMinX);
+ for (i = left; i <= right; i += N1) {
+ right2 = Math.min(i + N1 - 1, right);
+ multiSelect$1(items, i, right2, N2, this.compareMinY);
- this._Ke = []; // decryption round keys
+ for (j = i; j <= right2; j += N2) {
+ right3 = Math.min(j + N2 - 1, right2); // pack each entry recursively
- this._Kd = [];
+ node.children.push(this._build(items, j, right3, height - 1));
+ }
+ }
- for (var i = 0; i <= rounds; i++) {
- this._Ke.push([0, 0, 0, 0]);
+ calcBBox$1(node, this.toBBox);
+ return node;
+ },
+ _chooseSubtree: function _chooseSubtree(bbox, node, level, path) {
+ var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
- this._Kd.push([0, 0, 0, 0]);
- }
+ while (true) {
+ path.push(node);
+ if (node.leaf || path.length - 1 === level) break;
+ minArea = minEnlargement = Infinity;
- var roundKeyCount = (rounds + 1) * 4;
- var KC = this.key.length / 4; // convert the key into ints
+ for (i = 0, len = node.children.length; i < len; i++) {
+ child = node.children[i];
+ area = bboxArea$1(child);
+ enlargement = enlargedArea$1(bbox, child) - area; // choose entry with the least area enlargement
- var tk = convertToInt32(this.key); // copy values into round key arrays
+ if (enlargement < minEnlargement) {
+ minEnlargement = enlargement;
+ minArea = area < minArea ? area : minArea;
+ targetNode = child;
+ } else if (enlargement === minEnlargement) {
+ // otherwise choose one with the smallest area
+ if (area < minArea) {
+ minArea = area;
+ targetNode = child;
+ }
+ }
+ }
- var index;
+ node = targetNode || node.children[0];
+ }
- for (var i = 0; i < KC; i++) {
- index = i >> 2;
- this._Ke[index][i % 4] = tk[i];
- this._Kd[rounds - index][i % 4] = tk[i];
- } // key expansion (fips-197 section 5.2)
+ return node;
+ },
+ _insert: function _insert(item, level, isNode) {
+ var toBBox = this.toBBox,
+ bbox = isNode ? item : toBBox(item),
+ insertPath = []; // find the best node for accommodating the item, saving all nodes along the path too
+ var node = this._chooseSubtree(bbox, this.data, level, insertPath); // put the item into the node
- var rconpointer = 0;
- var t = KC,
- tt;
- while (t < roundKeyCount) {
- tt = tk[KC - 1];
- tk[0] ^= S[tt >> 16 & 0xFF] << 24 ^ S[tt >> 8 & 0xFF] << 16 ^ S[tt & 0xFF] << 8 ^ S[tt >> 24 & 0xFF] ^ rcon[rconpointer] << 24;
- rconpointer += 1; // key expansion (for non-256 bit)
+ node.children.push(item);
+ extend$2(node, bbox); // split on node overflow; propagate upwards if necessary
- if (KC != 8) {
- for (var i = 1; i < KC; i++) {
- tk[i] ^= tk[i - 1];
- } // key expansion for 256-bit keys is "slightly different" (fips-197)
+ while (level >= 0) {
+ if (insertPath[level].children.length > this._maxEntries) {
+ this._split(insertPath, level);
- } else {
- for (var i = 1; i < KC / 2; i++) {
- tk[i] ^= tk[i - 1];
- }
+ level--;
+ } else break;
+ } // adjust bboxes along the insertion path
- tt = tk[KC / 2 - 1];
- tk[KC / 2] ^= S[tt & 0xFF] ^ S[tt >> 8 & 0xFF] << 8 ^ S[tt >> 16 & 0xFF] << 16 ^ S[tt >> 24 & 0xFF] << 24;
- for (var i = KC / 2 + 1; i < KC; i++) {
- tk[i] ^= tk[i - 1];
- }
- } // copy values into round key arrays
+ this._adjustParentBBoxes(bbox, insertPath, level);
+ },
+ // split overflowed node into two
+ _split: function _split(insertPath, level) {
+ var node = insertPath[level],
+ M = node.children.length,
+ m = this._minEntries;
+ this._chooseSplitAxis(node, m, M);
- var i = 0,
- r,
- c;
+ var splitIndex = this._chooseSplitIndex(node, m, M);
- while (i < KC && t < roundKeyCount) {
- r = t >> 2;
- c = t % 4;
- this._Ke[r][c] = tk[i];
- this._Kd[rounds - r][c] = tk[i++];
- t++;
- }
- } // inverse-cipher-ify the decryption round key (fips-197 section 5.3)
+ var newNode = createNode$1(node.children.splice(splitIndex, node.children.length - splitIndex));
+ newNode.height = node.height;
+ newNode.leaf = node.leaf;
+ calcBBox$1(node, this.toBBox);
+ calcBBox$1(newNode, this.toBBox);
+ if (level) insertPath[level - 1].children.push(newNode);else this._splitRoot(node, newNode);
+ },
+ _splitRoot: function _splitRoot(node, newNode) {
+ // split root node
+ this.data = createNode$1([node, newNode]);
+ this.data.height = node.height + 1;
+ this.data.leaf = false;
+ calcBBox$1(this.data, this.toBBox);
+ },
+ _chooseSplitIndex: function _chooseSplitIndex(node, m, M) {
+ var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
+ minOverlap = minArea = Infinity;
+ for (i = m; i <= M - m; i++) {
+ bbox1 = distBBox$1(node, 0, i, this.toBBox);
+ bbox2 = distBBox$1(node, i, M, this.toBBox);
+ overlap = intersectionArea$1(bbox1, bbox2);
+ area = bboxArea$1(bbox1) + bboxArea$1(bbox2); // choose distribution with minimum overlap
- for (var r = 1; r < rounds; r++) {
- for (var c = 0; c < 4; c++) {
- tt = this._Kd[r][c];
- this._Kd[r][c] = U1[tt >> 24 & 0xFF] ^ U2[tt >> 16 & 0xFF] ^ U3[tt >> 8 & 0xFF] ^ U4[tt & 0xFF];
+ if (overlap < minOverlap) {
+ minOverlap = overlap;
+ index = i;
+ minArea = area < minArea ? area : minArea;
+ } else if (overlap === minOverlap) {
+ // otherwise choose distribution with minimum area
+ if (area < minArea) {
+ minArea = area;
+ index = i;
}
}
- };
+ }
- AES.prototype.encrypt = function (plaintext) {
- if (plaintext.length != 16) {
- throw new Error('invalid plaintext size (must be 16 bytes)');
- }
+ return index;
+ },
+ // sorts node children by the best axis for split
+ _chooseSplitAxis: function _chooseSplitAxis(node, m, M) {
+ var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX$1,
+ compareMinY = node.leaf ? this.compareMinY : compareNodeMinY$1,
+ xMargin = this._allDistMargin(node, m, M, compareMinX),
+ yMargin = this._allDistMargin(node, m, M, compareMinY); // if total distributions margin value is minimal for x, sort by minX,
+ // otherwise it's already sorted by minY
- var rounds = this._Ke.length - 1;
- var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key)
- var t = convertToInt32(plaintext);
+ if (xMargin < yMargin) node.children.sort(compareMinX);
+ },
+ // total margin of all possible split distributions where each node is at least m full
+ _allDistMargin: function _allDistMargin(node, m, M, compare) {
+ node.children.sort(compare);
+ var toBBox = this.toBBox,
+ leftBBox = distBBox$1(node, 0, m, toBBox),
+ rightBBox = distBBox$1(node, M - m, M, toBBox),
+ margin = bboxMargin$1(leftBBox) + bboxMargin$1(rightBBox),
+ i,
+ child;
- for (var i = 0; i < 4; i++) {
- t[i] ^= this._Ke[0][i];
- } // apply round transforms
+ for (i = m; i < M - m; i++) {
+ child = node.children[i];
+ extend$2(leftBBox, node.leaf ? toBBox(child) : child);
+ margin += bboxMargin$1(leftBBox);
+ }
+ for (i = M - m - 1; i >= m; i--) {
+ child = node.children[i];
+ extend$2(rightBBox, node.leaf ? toBBox(child) : child);
+ margin += bboxMargin$1(rightBBox);
+ }
- for (var r = 1; r < rounds; r++) {
- for (var i = 0; i < 4; i++) {
- a[i] = T1[t[i] >> 24 & 0xff] ^ T2[t[(i + 1) % 4] >> 16 & 0xff] ^ T3[t[(i + 2) % 4] >> 8 & 0xff] ^ T4[t[(i + 3) % 4] & 0xff] ^ this._Ke[r][i];
- }
+ return margin;
+ },
+ _adjustParentBBoxes: function _adjustParentBBoxes(bbox, path, level) {
+ // adjust bboxes along the given tree path
+ for (var i = level; i >= 0; i--) {
+ extend$2(path[i], bbox);
+ }
+ },
+ _condense: function _condense(path) {
+ // go through the path, removing empty nodes and updating bboxes
+ for (var i = path.length - 1, siblings; i >= 0; i--) {
+ if (path[i].children.length === 0) {
+ if (i > 0) {
+ siblings = path[i - 1].children;
+ siblings.splice(siblings.indexOf(path[i]), 1);
+ } else this.clear();
+ } else calcBBox$1(path[i], this.toBBox);
+ }
+ },
+ _initFormat: function _initFormat(format) {
+ // data format (minX, minY, maxX, maxY accessors)
+ // uses eval-type function compilation instead of just accepting a toBBox function
+ // because the algorithms are very sensitive to sorting functions performance,
+ // so they should be dead simple and without inner calls
+ var compareArr = ['return a', ' - b', ';'];
+ this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
+ this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
+ this.toBBox = new Function('a', 'return {minX: a' + format[0] + ', minY: a' + format[1] + ', maxX: a' + format[2] + ', maxY: a' + format[3] + '};');
+ }
+ };
- t = a.slice();
- } // the last round is special
+ function findItem$1(item, items, equalsFn) {
+ if (!equalsFn) return items.indexOf(item);
+ for (var i = 0; i < items.length; i++) {
+ if (equalsFn(item, items[i])) return i;
+ }
- var result = createArray(16),
- tt;
+ return -1;
+ } // calculate node's bbox from bboxes of its children
- for (var i = 0; i < 4; i++) {
- tt = this._Ke[rounds][i];
- result[4 * i] = (S[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff;
- result[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff;
- result[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff;
- result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff;
- }
- return result;
- };
+ function calcBBox$1(node, toBBox) {
+ distBBox$1(node, 0, node.children.length, toBBox, node);
+ } // min bounding rectangle of node children from k to p-1
- AES.prototype.decrypt = function (ciphertext) {
- if (ciphertext.length != 16) {
- throw new Error('invalid ciphertext size (must be 16 bytes)');
- }
- var rounds = this._Kd.length - 1;
- var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key)
+ function distBBox$1(node, k, p, toBBox, destNode) {
+ if (!destNode) destNode = createNode$1(null);
+ destNode.minX = Infinity;
+ destNode.minY = Infinity;
+ destNode.maxX = -Infinity;
+ destNode.maxY = -Infinity;
- var t = convertToInt32(ciphertext);
+ for (var i = k, child; i < p; i++) {
+ child = node.children[i];
+ extend$2(destNode, node.leaf ? toBBox(child) : child);
+ }
- for (var i = 0; i < 4; i++) {
- t[i] ^= this._Kd[0][i];
- } // apply round transforms
+ return destNode;
+ }
+ function extend$2(a, b) {
+ a.minX = Math.min(a.minX, b.minX);
+ a.minY = Math.min(a.minY, b.minY);
+ a.maxX = Math.max(a.maxX, b.maxX);
+ a.maxY = Math.max(a.maxY, b.maxY);
+ return a;
+ }
- for (var r = 1; r < rounds; r++) {
- for (var i = 0; i < 4; i++) {
- a[i] = T5[t[i] >> 24 & 0xff] ^ T6[t[(i + 3) % 4] >> 16 & 0xff] ^ T7[t[(i + 2) % 4] >> 8 & 0xff] ^ T8[t[(i + 1) % 4] & 0xff] ^ this._Kd[r][i];
- }
+ function compareNodeMinX$1(a, b) {
+ return a.minX - b.minX;
+ }
- t = a.slice();
- } // the last round is special
+ function compareNodeMinY$1(a, b) {
+ return a.minY - b.minY;
+ }
+ function bboxArea$1(a) {
+ return (a.maxX - a.minX) * (a.maxY - a.minY);
+ }
- var result = createArray(16),
- tt;
+ function bboxMargin$1(a) {
+ return a.maxX - a.minX + (a.maxY - a.minY);
+ }
- for (var i = 0; i < 4; i++) {
- tt = this._Kd[rounds][i];
- result[4 * i] = (Si[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff;
- result[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff;
- result[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff;
- result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff;
- }
+ function enlargedArea$1(a, b) {
+ 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));
+ }
- return result;
- };
- /**
- * Mode Of Operation - Electonic Codebook (ECB)
- */
+ function intersectionArea$1(a, b) {
+ 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);
+ return Math.max(0, maxX - minX) * Math.max(0, maxY - minY);
+ }
+ function contains$1(a, b) {
+ return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY;
+ }
- var ModeOfOperationECB = function ModeOfOperationECB(key) {
- if (!(this instanceof ModeOfOperationECB)) {
- throw Error('AES must be instanitated with `new`');
- }
+ function intersects$1(a, b) {
+ return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY;
+ }
- this.description = "Electronic Code Block";
- this.name = "ecb";
- this._aes = new AES(key);
- };
+ function createNode$1(children) {
+ return {
+ children: children,
+ height: 1,
+ leaf: true,
+ minX: Infinity,
+ minY: Infinity,
+ maxX: -Infinity,
+ maxY: -Infinity
+ };
+ } // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
+ // combines selection algorithm with binary divide & conquer approach
- ModeOfOperationECB.prototype.encrypt = function (plaintext) {
- plaintext = coerceArray(plaintext);
-
- if (plaintext.length % 16 !== 0) {
- throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
- }
-
- var ciphertext = createArray(plaintext.length);
- var block = createArray(16);
-
- for (var i = 0; i < plaintext.length; i += 16) {
- copyArray(plaintext, block, 0, i, i + 16);
- block = this._aes.encrypt(block);
- copyArray(block, ciphertext, i);
- }
-
- return ciphertext;
- };
-
- ModeOfOperationECB.prototype.decrypt = function (ciphertext) {
- ciphertext = coerceArray(ciphertext);
-
- if (ciphertext.length % 16 !== 0) {
- throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
- }
-
- var plaintext = createArray(ciphertext.length);
- var block = createArray(16);
-
- for (var i = 0; i < ciphertext.length; i += 16) {
- copyArray(ciphertext, block, 0, i, i + 16);
- block = this._aes.decrypt(block);
- copyArray(block, plaintext, i);
- }
-
- return plaintext;
- };
- /**
- * Mode Of Operation - Cipher Block Chaining (CBC)
- */
-
-
- var ModeOfOperationCBC = function ModeOfOperationCBC(key, iv) {
- if (!(this instanceof ModeOfOperationCBC)) {
- throw Error('AES must be instanitated with `new`');
- }
-
- this.description = "Cipher Block Chaining";
- this.name = "cbc";
-
- if (!iv) {
- iv = createArray(16);
- } else if (iv.length != 16) {
- throw new Error('invalid initialation vector size (must be 16 bytes)');
- }
-
- this._lastCipherblock = coerceArray(iv, true);
- this._aes = new AES(key);
- };
-
- ModeOfOperationCBC.prototype.encrypt = function (plaintext) {
- plaintext = coerceArray(plaintext);
-
- if (plaintext.length % 16 !== 0) {
- throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
- }
-
- var ciphertext = createArray(plaintext.length);
- var block = createArray(16);
-
- for (var i = 0; i < plaintext.length; i += 16) {
- copyArray(plaintext, block, 0, i, i + 16);
- for (var j = 0; j < 16; j++) {
- block[j] ^= this._lastCipherblock[j];
- }
+ function multiSelect$1(arr, left, right, n, compare) {
+ var stack = [left, right],
+ mid;
- this._lastCipherblock = this._aes.encrypt(block);
- copyArray(this._lastCipherblock, ciphertext, i);
- }
+ while (stack.length) {
+ right = stack.pop();
+ left = stack.pop();
+ if (right - left <= n) continue;
+ mid = left + Math.ceil((right - left) / n / 2) * n;
+ quickselect$1(arr, mid, left, right, compare);
+ stack.push(left, mid, mid, right);
+ }
+ }
- return ciphertext;
- };
+ var lineclip_1 = lineclip$2;
+ lineclip$2.polyline = lineclip$2;
+ lineclip$2.polygon = polygonclip$1; // Cohen-Sutherland line clippign algorithm, adapted to efficiently
+ // handle polylines rather than just segments
- ModeOfOperationCBC.prototype.decrypt = function (ciphertext) {
- ciphertext = coerceArray(ciphertext);
+ function lineclip$2(points, bbox, result) {
+ var len = points.length,
+ codeA = bitCode$1(points[0], bbox),
+ part = [],
+ i,
+ a,
+ b,
+ codeB,
+ lastCode;
+ if (!result) result = [];
- if (ciphertext.length % 16 !== 0) {
- throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
- }
+ for (i = 1; i < len; i++) {
+ a = points[i - 1];
+ b = points[i];
+ codeB = lastCode = bitCode$1(b, bbox);
- var plaintext = createArray(ciphertext.length);
- var block = createArray(16);
+ while (true) {
+ if (!(codeA | codeB)) {
+ // accept
+ part.push(a);
- for (var i = 0; i < ciphertext.length; i += 16) {
- copyArray(ciphertext, block, 0, i, i + 16);
- block = this._aes.decrypt(block);
+ if (codeB !== lastCode) {
+ // segment went outside
+ part.push(b);
- for (var j = 0; j < 16; j++) {
- plaintext[i + j] = block[j] ^ this._lastCipherblock[j];
+ if (i < len - 1) {
+ // start a new line
+ result.push(part);
+ part = [];
+ }
+ } else if (i === len - 1) {
+ part.push(b);
}
- copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);
- }
-
- return plaintext;
- };
- /**
- * Mode Of Operation - Cipher Feedback (CFB)
- */
-
-
- var ModeOfOperationCFB = function ModeOfOperationCFB(key, iv, segmentSize) {
- if (!(this instanceof ModeOfOperationCFB)) {
- throw Error('AES must be instanitated with `new`');
- }
-
- this.description = "Cipher Feedback";
- this.name = "cfb";
-
- if (!iv) {
- iv = createArray(16);
- } else if (iv.length != 16) {
- throw new Error('invalid initialation vector size (must be 16 size)');
- }
-
- if (!segmentSize) {
- segmentSize = 1;
- }
-
- this.segmentSize = segmentSize;
- this._shiftRegister = coerceArray(iv, true);
- this._aes = new AES(key);
- };
-
- ModeOfOperationCFB.prototype.encrypt = function (plaintext) {
- if (plaintext.length % this.segmentSize != 0) {
- throw new Error('invalid plaintext size (must be segmentSize bytes)');
- }
-
- var encrypted = coerceArray(plaintext, true);
- var xorSegment;
-
- for (var i = 0; i < encrypted.length; i += this.segmentSize) {
- xorSegment = this._aes.encrypt(this._shiftRegister);
-
- for (var j = 0; j < this.segmentSize; j++) {
- encrypted[i + j] ^= xorSegment[j];
- } // Shift the register
-
-
- copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
- copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
- }
-
- return encrypted;
- };
-
- ModeOfOperationCFB.prototype.decrypt = function (ciphertext) {
- if (ciphertext.length % this.segmentSize != 0) {
- throw new Error('invalid ciphertext size (must be segmentSize bytes)');
- }
-
- var plaintext = coerceArray(ciphertext, true);
- var xorSegment;
-
- for (var i = 0; i < plaintext.length; i += this.segmentSize) {
- xorSegment = this._aes.encrypt(this._shiftRegister);
-
- for (var j = 0; j < this.segmentSize; j++) {
- plaintext[i + j] ^= xorSegment[j];
- } // Shift the register
-
-
- copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
- copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
+ break;
+ } else if (codeA & codeB) {
+ // trivial reject
+ break;
+ } else if (codeA) {
+ // a outside, intersect with clip edge
+ a = intersect$1(a, b, codeA, bbox);
+ codeA = bitCode$1(a, bbox);
+ } else {
+ // b outside
+ b = intersect$1(a, b, codeB, bbox);
+ codeB = bitCode$1(b, bbox);
}
+ }
- return plaintext;
- };
- /**
- * Mode Of Operation - Output Feedback (OFB)
- */
+ codeA = lastCode;
+ }
+ if (part.length) result.push(part);
+ return result;
+ } // Sutherland-Hodgeman polygon clipping algorithm
- var ModeOfOperationOFB = function ModeOfOperationOFB(key, iv) {
- if (!(this instanceof ModeOfOperationOFB)) {
- throw Error('AES must be instanitated with `new`');
- }
- this.description = "Output Feedback";
- this.name = "ofb";
+ function polygonclip$1(points, bbox) {
+ var result, edge, prev, prevInside, i, p, inside; // clip against each side of the clip rectangle
- if (!iv) {
- iv = createArray(16);
- } else if (iv.length != 16) {
- throw new Error('invalid initialation vector size (must be 16 bytes)');
- }
+ for (edge = 1; edge <= 8; edge *= 2) {
+ result = [];
+ prev = points[points.length - 1];
+ prevInside = !(bitCode$1(prev, bbox) & edge);
- this._lastPrecipher = coerceArray(iv, true);
- this._lastPrecipherIndex = 16;
- this._aes = new AES(key);
- };
+ for (i = 0; i < points.length; i++) {
+ p = points[i];
+ inside = !(bitCode$1(p, bbox) & edge); // if segment goes through the clip window, add an intersection
- ModeOfOperationOFB.prototype.encrypt = function (plaintext) {
- var encrypted = coerceArray(plaintext, true);
+ if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
+ if (inside) result.push(p); // add a point if it's inside
- for (var i = 0; i < encrypted.length; i++) {
- if (this._lastPrecipherIndex === 16) {
- this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);
- this._lastPrecipherIndex = 0;
- }
+ prev = p;
+ prevInside = inside;
+ }
- encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];
- }
+ points = result;
+ if (!points.length) break;
+ }
- return encrypted;
- }; // Decryption is symetric
+ return result;
+ } // intersect a segment against one of the 4 lines that make up the bbox
- ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;
- /**
- * Counter object for CTR common mode of operation
- */
+ function intersect$1(a, b, edge, bbox) {
+ return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
+ edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
+ edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
+ edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
+ null;
+ } // bit code reflects the point position relative to the bbox:
+ // left mid right
+ // top 1001 1000 1010
+ // mid 0001 0000 0010
+ // bottom 0101 0100 0110
- var Counter = function Counter(initialValue) {
- if (!(this instanceof Counter)) {
- throw Error('Counter must be instanitated with `new`');
- } // We allow 0, but anything false-ish uses the default 1
+ function bitCode$1(p, bbox) {
+ var code = 0;
+ if (p[0] < bbox[0]) code |= 1; // left
+ else if (p[0] > bbox[2]) code |= 2; // right
- if (initialValue !== 0 && !initialValue) {
- initialValue = 1;
- }
+ if (p[1] < bbox[1]) code |= 4; // bottom
+ else if (p[1] > bbox[3]) code |= 8; // top
- if (typeof initialValue === 'number') {
- this._counter = createArray(16);
- this.setValue(initialValue);
- } else {
- this.setBytes(initialValue);
- }
- };
+ return code;
+ }
- Counter.prototype.setValue = function (value) {
- if (typeof value !== 'number' || parseInt(value) != value) {
- throw new Error('invalid counter value (must be an integer)');
- } // We cannot safely handle numbers beyond the safe range for integers
+ var rbush = rbush$2.exports;
+ var lineclip$1 = lineclip_1;
+ var whichPolygon_1 = whichPolygon;
+ function whichPolygon(data) {
+ var bboxes = [];
- if (value > Number.MAX_SAFE_INTEGER) {
- throw new Error('integer value out of safe range');
- }
+ for (var i = 0; i < data.features.length; i++) {
+ var feature = data.features[i];
+ var coords = feature.geometry.coordinates;
- for (var index = 15; index >= 0; --index) {
- this._counter[index] = value % 256;
- value = parseInt(value / 256);
+ if (feature.geometry.type === 'Polygon') {
+ bboxes.push(treeItem(coords, feature.properties));
+ } else if (feature.geometry.type === 'MultiPolygon') {
+ for (var j = 0; j < coords.length; j++) {
+ bboxes.push(treeItem(coords[j], feature.properties));
}
- };
-
- Counter.prototype.setBytes = function (bytes) {
- bytes = coerceArray(bytes, true);
+ }
+ }
- if (bytes.length != 16) {
- throw new Error('invalid counter bytes size (must be 16 bytes)');
- }
+ var tree = rbush().load(bboxes);
- this._counter = bytes;
- };
+ function query(p, multi) {
+ var output = [],
+ result = tree.search({
+ minX: p[0],
+ minY: p[1],
+ maxX: p[0],
+ maxY: p[1]
+ });
- Counter.prototype.increment = function () {
- for (var i = 15; i >= 0; i--) {
- if (this._counter[i] === 255) {
- this._counter[i] = 0;
- } else {
- this._counter[i]++;
- break;
- }
+ for (var i = 0; i < result.length; i++) {
+ if (insidePolygon(result[i].coords, p)) {
+ if (multi) output.push(result[i].props);else return result[i].props;
}
- };
- /**
- * Mode Of Operation - Counter (CTR)
- */
+ }
+ return multi && output.length ? output : null;
+ }
- var ModeOfOperationCTR = function ModeOfOperationCTR(key, counter) {
- if (!(this instanceof ModeOfOperationCTR)) {
- throw Error('AES must be instanitated with `new`');
- }
+ query.tree = tree;
- this.description = "Counter";
- this.name = "ctr";
+ query.bbox = function queryBBox(bbox) {
+ var output = [];
+ var result = tree.search({
+ minX: bbox[0],
+ minY: bbox[1],
+ maxX: bbox[2],
+ maxY: bbox[3]
+ });
- if (!(counter instanceof Counter)) {
- counter = new Counter(counter);
+ for (var i = 0; i < result.length; i++) {
+ if (polygonIntersectsBBox(result[i].coords, bbox)) {
+ output.push(result[i].props);
}
+ }
- this._counter = counter;
- this._remainingCounter = null;
- this._remainingCounterIndex = 16;
- this._aes = new AES(key);
- };
-
- ModeOfOperationCTR.prototype.encrypt = function (plaintext) {
- var encrypted = coerceArray(plaintext, true);
-
- for (var i = 0; i < encrypted.length; i++) {
- if (this._remainingCounterIndex === 16) {
- this._remainingCounter = this._aes.encrypt(this._counter._counter);
- this._remainingCounterIndex = 0;
+ return output;
+ };
- this._counter.increment();
- }
+ return query;
+ }
- encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];
- }
+ function polygonIntersectsBBox(polygon, bbox) {
+ var bboxCenter = [(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2];
+ if (insidePolygon(polygon, bboxCenter)) return true;
- return encrypted;
- }; // Decryption is symetric
+ for (var i = 0; i < polygon.length; i++) {
+ if (lineclip$1(polygon[i], bbox).length > 0) return true;
+ }
+ return false;
+ } // ray casting algorithm for detecting if point is in polygon
- ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; ///////////////////////
- // Padding
- // See:https://tools.ietf.org/html/rfc2315
- function pkcs7pad(data) {
- data = coerceArray(data, true);
- var padder = 16 - data.length % 16;
- var result = createArray(data.length + padder);
- copyArray(data, result);
+ function insidePolygon(rings, p) {
+ var inside = false;
- for (var i = data.length; i < result.length; i++) {
- result[i] = padder;
- }
+ for (var i = 0, len = rings.length; i < len; i++) {
+ var ring = rings[i];
- return result;
+ for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
+ if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
}
+ }
- function pkcs7strip(data) {
- data = coerceArray(data, true);
-
- if (data.length < 16) {
- throw new Error('PKCS#7 invalid length');
- }
-
- var padder = data[data.length - 1];
-
- if (padder > 16) {
- throw new Error('PKCS#7 padding byte out of range');
- }
+ return inside;
+ }
- var length = data.length - padder;
+ function rayIntersect(p, p1, p2) {
+ 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];
+ }
- for (var i = 0; i < padder; i++) {
- if (data[length + i] !== padder) {
- throw new Error('PKCS#7 invalid padding byte');
- }
- }
+ function treeItem(coords, props) {
+ var item = {
+ minX: Infinity,
+ minY: Infinity,
+ maxX: -Infinity,
+ maxY: -Infinity,
+ coords: coords,
+ props: props
+ };
- var result = createArray(length);
- copyArray(data, result, 0, 0, length);
- return result;
- } ///////////////////////
- // Exporting
- // The block cipher
+ for (var i = 0; i < coords[0].length; i++) {
+ var p = coords[0][i];
+ item.minX = Math.min(item.minX, p[0]);
+ item.minY = Math.min(item.minY, p[1]);
+ item.maxX = Math.max(item.maxX, p[0]);
+ item.maxY = Math.max(item.maxY, p[1]);
+ }
+ return item;
+ }
- var aesjs = {
- AES: AES,
- Counter: Counter,
- ModeOfOperation: {
- ecb: ModeOfOperationECB,
- cbc: ModeOfOperationCBC,
- cfb: ModeOfOperationCFB,
- ofb: ModeOfOperationOFB,
- ctr: ModeOfOperationCTR
- },
- utils: {
- hex: convertHex,
- utf8: convertUtf8
- },
- padding: {
- pkcs7: {
- pad: pkcs7pad,
- strip: pkcs7strip
- }
- },
- _arrayTest: {
- coerceArray: coerceArray,
- createArray: createArray,
- copyArray: copyArray
- }
- }; // node.js
+ var type = "FeatureCollection";
+ var features = [{
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q12837",
+ nameEn: "Iberia",
+ level: "sharedLandform"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q22890",
+ nameEn: "Ireland",
+ level: "sharedLandform"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q23666",
+ nameEn: "Great Britain",
+ country: "GB",
+ level: "sharedLandform"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q35657",
+ nameEn: "US States",
+ country: "US",
+ level: "subcountryGroup"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q36117",
+ nameEn: "Borneo",
+ level: "sharedLandform"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q37362",
+ nameEn: "Akrotiri and Dhekelia",
+ aliases: ["SBA"],
+ country: "GB"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q46395",
+ nameEn: "British Overseas Territories",
+ aliases: ["BOTS", "UKOTS"],
+ country: "GB",
+ level: "subcountryGroup"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q46772",
+ nameEn: "Kerguelen Islands",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q105472",
+ nameEn: "Macaronesia",
+ level: "sharedLandform"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q153732",
+ nameEn: "Mariana Islands",
+ level: "sharedLandform"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q185086",
+ nameEn: "Crown Dependencies",
+ country: "GB",
+ level: "subcountryGroup"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q190571",
+ nameEn: "Scattered Islands",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q191011",
+ nameEn: "Plazas de soberan\xEDa",
+ country: "ES"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q201698",
+ nameEn: "Crozet Islands",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q644636",
+ nameEn: "Cyprus",
+ level: "sharedLandform"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q851132",
+ nameEn: "New Zealand Outlying Islands",
+ country: "NZ",
+ level: "subcountryGroup"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q1352230",
+ nameEn: "US Territories",
+ country: "US",
+ level: "subcountryGroup"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q1451600",
+ nameEn: "Overseas Countries and Territories of the EU",
+ aliases: ["OCT"],
+ level: "subunion"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q1681727",
+ nameEn: "Saint-Paul and Amsterdam",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q2914565",
+ nameEn: "Autonomous Regions of Portugal",
+ country: "PT",
+ level: "subcountryGroup"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q3320166",
+ nameEn: "Outermost Regions of the EU",
+ aliases: ["OMR"],
+ level: "subunion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ wikidata: "Q3336843",
+ nameEn: "Countries of the United Kingdom",
+ country: "GB",
+ level: "subcountryGroup"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "001",
+ wikidata: "Q2",
+ nameEn: "World",
+ aliases: ["Earth", "Planet"],
+ level: "world"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "002",
+ wikidata: "Q15",
+ nameEn: "Africa",
+ level: "region"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "003",
+ wikidata: "Q49",
+ nameEn: "North America",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "005",
+ wikidata: "Q18",
+ nameEn: "South America",
+ level: "intermediateRegion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "009",
+ wikidata: "Q538",
+ nameEn: "Oceania",
+ level: "region"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "011",
+ wikidata: "Q4412",
+ nameEn: "Western Africa",
+ level: "intermediateRegion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "013",
+ wikidata: "Q27611",
+ nameEn: "Central America",
+ level: "intermediateRegion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "014",
+ wikidata: "Q27407",
+ nameEn: "Eastern Africa",
+ level: "intermediateRegion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "015",
+ wikidata: "Q27381",
+ nameEn: "Northern Africa",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "017",
+ wikidata: "Q27433",
+ nameEn: "Middle Africa",
+ level: "intermediateRegion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "018",
+ wikidata: "Q27394",
+ nameEn: "Southern Africa",
+ level: "intermediateRegion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "019",
+ wikidata: "Q828",
+ nameEn: "Americas",
+ level: "region"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "021",
+ wikidata: "Q2017699",
+ nameEn: "Northern America",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "029",
+ wikidata: "Q664609",
+ nameEn: "Caribbean",
+ level: "intermediateRegion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "030",
+ wikidata: "Q27231",
+ nameEn: "Eastern Asia",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "034",
+ wikidata: "Q771405",
+ nameEn: "Southern Asia",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "035",
+ wikidata: "Q11708",
+ nameEn: "South-eastern Asia",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "039",
+ wikidata: "Q27449",
+ nameEn: "Southern Europe",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "053",
+ wikidata: "Q45256",
+ nameEn: "Australia and New Zealand",
+ aliases: ["Australasia"],
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "054",
+ wikidata: "Q37394",
+ nameEn: "Melanesia",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "057",
+ wikidata: "Q3359409",
+ nameEn: "Micronesia",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "061",
+ wikidata: "Q35942",
+ nameEn: "Polynesia",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "142",
+ wikidata: "Q48",
+ nameEn: "Asia",
+ level: "region"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "143",
+ wikidata: "Q27275",
+ nameEn: "Central Asia",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "145",
+ wikidata: "Q27293",
+ nameEn: "Western Asia",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "150",
+ wikidata: "Q46",
+ nameEn: "Europe",
+ level: "region"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "151",
+ wikidata: "Q27468",
+ nameEn: "Eastern Europe",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "154",
+ wikidata: "Q27479",
+ nameEn: "Northern Europe",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "155",
+ wikidata: "Q27496",
+ nameEn: "Western Europe",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "202",
+ wikidata: "Q132959",
+ nameEn: "Sub-Saharan Africa",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "419",
+ wikidata: "Q72829598",
+ nameEn: "Latin America and the Caribbean",
+ level: "subregion"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ m49: "830",
+ wikidata: "Q42314",
+ nameEn: "Channel Islands",
+ level: "intermediateRegion"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "AU",
+ iso1A3: "AUS",
+ iso1N3: "036",
+ wikidata: "Q408",
+ nameEn: "Australia"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "BL",
+ iso1A3: "BLM",
+ iso1N3: "652",
+ wikidata: "Q25362",
+ nameEn: "Saint-Barth\xE9lemy",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "BQ",
+ iso1A3: "BES",
+ iso1N3: "535",
+ wikidata: "Q27561",
+ nameEn: "Caribbean Netherlands",
+ country: "NL"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "CH",
+ iso1A3: "CHE",
+ iso1N3: "756",
+ wikidata: "Q39",
+ nameEn: "Switzerland",
+ groups: ["155", "150", "UN"],
+ callingCodes: ["41"]
+ },
+ 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.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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "CN",
+ iso1A3: "CHN",
+ iso1N3: "156",
+ wikidata: "Q148",
+ nameEn: "People's Republic of China"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "CP",
+ iso1A3: "CPT",
+ wikidata: "Q161258",
+ nameEn: "Clipperton Island",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "DK",
+ iso1A3: "DNK",
+ iso1N3: "208",
+ wikidata: "Q756617",
+ nameEn: "Kingdom of Denmark"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "EA",
+ wikidata: "Q28868874",
+ nameEn: "Ceuta, Melilla",
+ country: "ES",
+ level: "territory",
+ isoStatus: "excRes"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "EC",
+ iso1A3: "ECU",
+ iso1N3: "218",
+ wikidata: "Q736",
+ nameEn: "Ecuador"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "ES",
+ iso1A3: "ESP",
+ iso1N3: "724",
+ wikidata: "Q29",
+ nameEn: "Spain"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "EU",
+ iso1A3: "EUE",
+ wikidata: "Q458",
+ nameEn: "European Union",
+ level: "union",
+ isoStatus: "excRes"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "FI",
+ iso1A3: "FIN",
+ iso1N3: "246",
+ wikidata: "Q33",
+ nameEn: "Finland",
+ aliases: ["SF"]
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "FR",
+ iso1A3: "FRA",
+ iso1N3: "250",
+ wikidata: "Q142",
+ nameEn: "France"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "GB",
+ iso1A3: "GBR",
+ iso1N3: "826",
+ wikidata: "Q145",
+ ccTLD: ".uk",
+ nameEn: "United Kingdom",
+ aliases: ["UK"]
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "GG",
+ iso1A3: "GGY",
+ iso1N3: "831",
+ wikidata: "Q25230",
+ nameEn: "Bailiwick of Guernsey",
+ country: "GB"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "ID",
+ iso1A3: "IDN",
+ iso1N3: "360",
+ wikidata: "Q252",
+ nameEn: "Indonesia",
+ aliases: ["RI"]
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "IE",
+ iso1A3: "IRL",
+ iso1N3: "372",
+ wikidata: "Q27",
+ nameEn: "Republic of Ireland",
+ groups: ["EU", "Q22890", "154", "150", "UN"],
+ driveSide: "left",
+ callingCodes: ["353"]
+ },
+ 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], [-22.01468, 48.19557], [-6.03913, 51.13217], [-5.37267, 53.63269], [-6.26218, 54.09785]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "IN",
+ iso1A3: "IND",
+ iso1N3: "356",
+ wikidata: "Q668",
+ nameEn: "India"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "IO",
+ iso1A3: "IOT",
+ iso1N3: "086",
+ wikidata: "Q43448",
+ nameEn: "British Indian Ocean Territory",
+ country: "GB"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "MY",
+ iso1A3: "MYS",
+ iso1N3: "458",
+ wikidata: "Q833",
+ nameEn: "Malaysia"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "NC",
+ iso1A3: "NCL",
+ iso1N3: "540",
+ wikidata: "Q33788",
+ nameEn: "New Caledonia",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "NL",
+ iso1A3: "NLD",
+ iso1N3: "528",
+ wikidata: "Q29999",
+ nameEn: "Kingdom of the Netherlands"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "NO",
+ iso1A3: "NOR",
+ iso1N3: "578",
+ wikidata: "Q20",
+ nameEn: "Norway"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "NZ",
+ iso1A3: "NZL",
+ iso1N3: "554",
+ wikidata: "Q664",
+ nameEn: "New Zealand"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "PF",
+ iso1A3: "PYF",
+ iso1N3: "258",
+ wikidata: "Q30971",
+ nameEn: "French Polynesia",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "PM",
+ iso1A3: "SPM",
+ iso1N3: "666",
+ wikidata: "Q34617",
+ nameEn: "Saint Pierre and Miquelon",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "PS",
+ iso1A3: "PSE",
+ iso1N3: "275",
+ wikidata: "Q219060",
+ nameEn: "Palestine"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "PT",
+ iso1A3: "PRT",
+ iso1N3: "620",
+ wikidata: "Q45",
+ nameEn: "Portugal"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "RU",
+ iso1A3: "RUS",
+ iso1N3: "643",
+ wikidata: "Q159",
+ nameEn: "Russia"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "SH",
+ iso1A3: "SHN",
+ iso1N3: "654",
+ wikidata: "Q192184",
+ nameEn: "Saint Helena, Ascension and Tristan da Cunha",
+ country: "GB"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "SJ",
+ iso1A3: "SJM",
+ iso1N3: "744",
+ wikidata: "Q842829",
+ nameEn: "Svalbard and Jan Mayen",
+ country: "NO"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "TF",
+ iso1A3: "ATF",
+ iso1N3: "260",
+ wikidata: "Q129003",
+ nameEn: "French Southern Territories",
+ country: "FR"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "UM",
+ iso1A3: "UMI",
+ iso1N3: "581",
+ wikidata: "Q16645",
+ nameEn: "United States Minor Outlying Islands",
+ country: "US"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "UN",
+ wikidata: "Q1065",
+ nameEn: "United Nations",
+ level: "unitedNations",
+ isoStatus: "excRes"
+ },
+ geometry: null
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "US",
+ iso1A3: "USA",
+ iso1N3: "840",
+ wikidata: "Q30",
+ nameEn: "United States of America"
+ },
+ geometry: null
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ type: "Feature",
+ properties: {
+ iso1A2: "WF",
+ iso1A3: "WLF",
+ iso1N3: "876",
+ wikidata: "Q35555",
+ nameEn: "Wallis and Futuna",
+ country: "FR",
+ groups: ["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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }, {
+ 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]]]]
+ }
+ }];
+ var borders_default = {
+ type: type,
+ features: features
+ }; // src/country-coder.ts
+
+ var borders = borders_default;
+ var whichPolygonGetter = {};
+ var featuresByCode = {};
+ var idFilterRegex = /(?=(?!^(and|the|of|el|la|de)$))(\b(and|the|of|el|la|de)\b)|[-_ .,'()&[\]/]/gi;
+
+ function canonicalID(id) {
+ var s = id || "";
+
+ if (s.charAt(0) === ".") {
+ return s.toUpperCase();
+ } else {
+ return s.replace(idFilterRegex, "").toUpperCase();
+ }
+ }
+
+ var levels = ["subterritory", "territory", "subcountryGroup", "country", "sharedLandform", "intermediateRegion", "subregion", "region", "subunion", "union", "unitedNations", "world"];
+ loadDerivedDataAndCaches(borders);
+
+ function loadDerivedDataAndCaches(borders2) {
+ var identifierProps = ["iso1A2", "iso1A3", "m49", "wikidata", "emojiFlag", "ccTLD", "nameEn"];
+ var geometryFeatures = [];
+
+ for (var i in borders2.features) {
+ var feature2 = borders2.features[i];
+ feature2.properties.id = feature2.properties.iso1A2 || feature2.properties.m49 || feature2.properties.wikidata;
+ loadM49(feature2);
+ loadTLD(feature2);
+ loadIsoStatus(feature2);
+ loadLevel(feature2);
+ loadGroups(feature2);
+ loadFlag(feature2);
+ cacheFeatureByIDs(feature2);
+ if (feature2.geometry) geometryFeatures.push(feature2);
+ }
+
+ for (var _i in borders2.features) {
+ var _feature = borders2.features[_i];
+ _feature.properties.groups = _feature.properties.groups.map(function (groupID) {
+ return featuresByCode[groupID].properties.id;
+ });
+ loadMembersForGroupsOf(_feature);
+ }
+
+ for (var _i2 in borders2.features) {
+ var _feature2 = borders2.features[_i2];
+ loadRoadSpeedUnit(_feature2);
+ loadRoadHeightUnit(_feature2);
+ loadDriveSide(_feature2);
+ loadCallingCodes(_feature2);
+ loadGroupGroups(_feature2);
+ }
+
+ for (var _i3 in borders2.features) {
+ var _feature3 = borders2.features[_i3];
+
+ _feature3.properties.groups.sort(function (groupID1, groupID2) {
+ return levels.indexOf(featuresByCode[groupID1].properties.level) - levels.indexOf(featuresByCode[groupID2].properties.level);
+ });
+
+ if (_feature3.properties.members) _feature3.properties.members.sort(function (id1, id2) {
+ var diff = levels.indexOf(featuresByCode[id1].properties.level) - levels.indexOf(featuresByCode[id2].properties.level);
+
+ if (diff === 0) {
+ return borders2.features.indexOf(featuresByCode[id1]) - borders2.features.indexOf(featuresByCode[id2]);
+ }
+
+ return diff;
+ });
+ }
+
+ var geometryOnlyCollection = {
+ type: "FeatureCollection",
+ features: geometryFeatures
+ };
+ whichPolygonGetter = whichPolygon_1(geometryOnlyCollection);
+
+ function loadGroups(feature2) {
+ var props = feature2.properties;
+
+ if (!props.groups) {
+ props.groups = [];
+ }
+
+ if (feature2.geometry && props.country) {
+ props.groups.push(props.country);
+ }
+
+ if (props.m49 !== "001") {
+ props.groups.push("001");
+ }
+ }
+
+ function loadM49(feature2) {
+ var props = feature2.properties;
+
+ if (!props.m49 && props.iso1N3) {
+ props.m49 = props.iso1N3;
+ }
+ }
+
+ function loadTLD(feature2) {
+ var props = feature2.properties;
+ if (props.level === "unitedNations") return;
+
+ if (!props.ccTLD && props.iso1A2) {
+ props.ccTLD = "." + props.iso1A2.toLowerCase();
+ }
+ }
+
+ function loadIsoStatus(feature2) {
+ var props = feature2.properties;
+
+ if (!props.isoStatus && props.iso1A2) {
+ props.isoStatus = "official";
+ }
+ }
+
+ function loadLevel(feature2) {
+ var props = feature2.properties;
+ if (props.level) return;
+
+ if (!props.country) {
+ props.level = "country";
+ } else if (!props.iso1A2 || props.isoStatus === "official") {
+ props.level = "territory";
+ } else {
+ props.level = "subterritory";
+ }
+ }
+
+ function loadGroupGroups(feature2) {
+ var props = feature2.properties;
+ if (feature2.geometry || !props.members) return;
+ var featureLevelIndex = levels.indexOf(props.level);
+ var sharedGroups = [];
+
+ var _loop = function _loop(_i4) {
+ var memberID = props.members[_i4];
+ var member = featuresByCode[memberID];
+ var memberGroups = member.properties.groups.filter(function (groupID) {
+ return groupID !== feature2.properties.id && featureLevelIndex < levels.indexOf(featuresByCode[groupID].properties.level);
+ });
+
+ if (_i4 === "0") {
+ sharedGroups = memberGroups;
+ } else {
+ sharedGroups = sharedGroups.filter(function (groupID) {
+ return memberGroups.indexOf(groupID) !== -1;
+ });
+ }
+ };
+
+ for (var _i4 in props.members) {
+ _loop(_i4);
+ }
+
+ props.groups = props.groups.concat(sharedGroups.filter(function (groupID) {
+ return props.groups.indexOf(groupID) === -1;
+ }));
+
+ for (var j in sharedGroups) {
+ var groupFeature = featuresByCode[sharedGroups[j]];
+
+ if (groupFeature.properties.members.indexOf(props.id) === -1) {
+ groupFeature.properties.members.push(props.id);
+ }
+ }
+ }
+
+ function loadRoadSpeedUnit(feature2) {
+ var props = feature2.properties;
+
+ if (feature2.geometry) {
+ if (!props.roadSpeedUnit) props.roadSpeedUnit = "km/h";
+ } else if (props.members) {
+ var vals = Array.from(new Set(props.members.map(function (id) {
+ var member = featuresByCode[id];
+ if (member.geometry) return member.properties.roadSpeedUnit || "km/h";
+ }).filter(Boolean)));
+ if (vals.length === 1) props.roadSpeedUnit = vals[0];
+ }
+ }
+
+ function loadRoadHeightUnit(feature2) {
+ var props = feature2.properties;
+
+ if (feature2.geometry) {
+ if (!props.roadHeightUnit) props.roadHeightUnit = "m";
+ } else if (props.members) {
+ var vals = Array.from(new Set(props.members.map(function (id) {
+ var member = featuresByCode[id];
+ if (member.geometry) return member.properties.roadHeightUnit || "m";
+ }).filter(Boolean)));
+ if (vals.length === 1) props.roadHeightUnit = vals[0];
+ }
+ }
+
+ function loadDriveSide(feature2) {
+ var props = feature2.properties;
+
+ if (feature2.geometry) {
+ if (!props.driveSide) props.driveSide = "right";
+ } else if (props.members) {
+ var vals = Array.from(new Set(props.members.map(function (id) {
+ var member = featuresByCode[id];
+ if (member.geometry) return member.properties.driveSide || "right";
+ }).filter(Boolean)));
+ if (vals.length === 1) props.driveSide = vals[0];
+ }
+ }
+
+ function loadCallingCodes(feature2) {
+ var props = feature2.properties;
+
+ if (!feature2.geometry && props.members) {
+ props.callingCodes = Array.from(new Set(props.members.reduce(function (array, id) {
+ var member = featuresByCode[id];
+ if (member.geometry && member.properties.callingCodes) return array.concat(member.properties.callingCodes);
+ return array;
+ }, [])));
+ }
+ }
+
+ function loadFlag(feature2) {
+ if (!feature2.properties.iso1A2) return;
+ var flag = feature2.properties.iso1A2.replace(/./g, function (_char) {
+ return String.fromCodePoint(_char.charCodeAt(0) + 127397);
+ });
+ feature2.properties.emojiFlag = flag;
+ }
+
+ function loadMembersForGroupsOf(feature2) {
+ for (var j in feature2.properties.groups) {
+ var groupID = feature2.properties.groups[j];
+ var groupFeature = featuresByCode[groupID];
+ if (!groupFeature.properties.members) groupFeature.properties.members = [];
+ groupFeature.properties.members.push(feature2.properties.id);
+ }
+ }
+
+ function cacheFeatureByIDs(feature2) {
+ var ids = [];
+
+ for (var k in identifierProps) {
+ var prop = identifierProps[k];
+ var id = feature2.properties[prop];
+ if (id) ids.push(id);
+ }
+
+ if (feature2.properties.aliases) {
+ for (var j in feature2.properties.aliases) {
+ ids.push(feature2.properties.aliases[j]);
+ }
+ }
+
+ for (var _i5 in ids) {
+ var _id = canonicalID(ids[_i5]);
+
+ featuresByCode[_id] = feature2;
+ }
+ }
+ }
+
+ function locArray(loc) {
+ if (Array.isArray(loc)) {
+ return loc;
+ } else if (loc.coordinates) {
+ return loc.coordinates;
+ }
+
+ return loc.geometry.coordinates;
+ }
+
+ function smallestFeature(loc) {
+ var query = locArray(loc);
+ var featureProperties = whichPolygonGetter(query);
+ if (!featureProperties) return null;
+ return featuresByCode[featureProperties.id];
+ }
+
+ function countryFeature(loc) {
+ var feature2 = smallestFeature(loc);
+ if (!feature2) return null;
+ var countryCode = feature2.properties.country || feature2.properties.iso1A2;
+ return featuresByCode[countryCode] || null;
+ }
+
+ var defaultOpts = {
+ level: void 0,
+ maxLevel: void 0,
+ withProp: void 0
+ };
+
+ function featureForLoc(loc, opts) {
+ var targetLevel = opts.level || "country";
+ var maxLevel = opts.maxLevel || "world";
+ var withProp = opts.withProp;
+ var targetLevelIndex = levels.indexOf(targetLevel);
+ if (targetLevelIndex === -1) return null;
+ var maxLevelIndex = levels.indexOf(maxLevel);
+ if (maxLevelIndex === -1) return null;
+ if (maxLevelIndex < targetLevelIndex) return null;
+
+ if (targetLevel === "country") {
+ var fastFeature = countryFeature(loc);
+
+ if (fastFeature) {
+ if (!withProp || fastFeature.properties[withProp]) {
+ return fastFeature;
+ }
+ }
+ }
+
+ var features2 = featuresContaining(loc);
+
+ for (var i in features2) {
+ var feature2 = features2[i];
+ var levelIndex = levels.indexOf(feature2.properties.level);
+
+ if (feature2.properties.level === targetLevel || levelIndex > targetLevelIndex && levelIndex <= maxLevelIndex) {
+ if (!withProp || feature2.properties[withProp]) {
+ return feature2;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ function featureForID(id) {
+ var stringID;
+
+ if (typeof id === "number") {
+ stringID = id.toString();
+
+ if (stringID.length === 1) {
+ stringID = "00" + stringID;
+ } else if (stringID.length === 2) {
+ stringID = "0" + stringID;
+ }
+ } else {
+ stringID = canonicalID(id);
+ }
+
+ return featuresByCode[stringID] || null;
+ }
+
+ function smallestFeaturesForBbox(bbox) {
+ return whichPolygonGetter.bbox(bbox).map(function (props) {
+ return featuresByCode[props.id];
+ });
+ }
+
+ function smallestOrMatchingFeature(query) {
+ if (_typeof(query) === "object") {
+ return smallestFeature(query);
+ }
+
+ return featureForID(query);
+ }
+
+ function feature$1(query) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOpts;
+
+ if (_typeof(query) === "object") {
+ return featureForLoc(query, opts);
+ }
+
+ return featureForID(query);
+ }
+
+ function iso1A2Code(query) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOpts;
+ opts.withProp = "iso1A2";
+ var match = feature$1(query, opts);
+ if (!match) return null;
+ return match.properties.iso1A2 || null;
+ }
+
+ function featuresContaining(query, strict) {
+ var matchingFeatures;
+
+ if (Array.isArray(query) && query.length === 4) {
+ matchingFeatures = smallestFeaturesForBbox(query);
+ } else {
+ var smallestOrMatching = smallestOrMatchingFeature(query);
+ matchingFeatures = smallestOrMatching ? [smallestOrMatching] : [];
+ }
+
+ if (!matchingFeatures.length) return [];
+ var returnFeatures;
+
+ if (!strict || _typeof(query) === "object") {
+ returnFeatures = matchingFeatures.slice();
+ } else {
+ returnFeatures = [];
+ }
+
+ for (var j in matchingFeatures) {
+ var properties = matchingFeatures[j].properties;
+
+ for (var i in properties.groups) {
+ var groupID = properties.groups[i];
+ var groupFeature = featuresByCode[groupID];
+
+ if (returnFeatures.indexOf(groupFeature) === -1) {
+ returnFeatures.push(groupFeature);
+ }
+ }
+ }
+
+ return returnFeatures;
+ }
+
+ function featuresIn(id, strict) {
+ var feature2 = featureForID(id);
+ if (!feature2) return [];
+ var features2 = [];
+
+ if (!strict) {
+ features2.push(feature2);
+ }
+
+ var properties = feature2.properties;
+
+ if (properties.members) {
+ for (var i in properties.members) {
+ var memberID = properties.members[i];
+ features2.push(featuresByCode[memberID]);
+ }
+ }
+
+ return features2;
+ }
+
+ function aggregateFeature(id) {
+ var features2 = featuresIn(id, false);
+ if (features2.length === 0) return null;
+ var aggregateCoordinates = [];
+
+ for (var i in features2) {
+ var feature2 = features2[i];
+
+ if (feature2.geometry && feature2.geometry.type === "MultiPolygon" && feature2.geometry.coordinates) {
+ aggregateCoordinates = aggregateCoordinates.concat(feature2.geometry.coordinates);
+ }
+ }
+
+ return {
+ type: "Feature",
+ properties: features2[0].properties,
+ geometry: {
+ type: "MultiPolygon",
+ coordinates: aggregateCoordinates
+ }
+ };
+ }
+
+ function roadSpeedUnit(query) {
+ var feature2 = smallestOrMatchingFeature(query);
+ return feature2 && feature2.properties.roadSpeedUnit || null;
+ }
+
+ function roadHeightUnit(query) {
+ var feature2 = smallestOrMatchingFeature(query);
+ return feature2 && feature2.properties.roadHeightUnit || null;
+ }
+
+ var geojsonArea = {};
+
+ var wgs84$1 = {};
+
+ wgs84$1.RADIUS = 6378137;
+ wgs84$1.FLATTENING = 1 / 298.257223563;
+ wgs84$1.POLAR_RADIUS = 6356752.3142;
+
+ var wgs84 = wgs84$1;
+ geojsonArea.geometry = geometry;
+ geojsonArea.ring = ringArea;
+
+ function geometry(_) {
+ var area = 0,
+ i;
+
+ switch (_.type) {
+ case 'Polygon':
+ return polygonArea(_.coordinates);
+
+ case 'MultiPolygon':
+ for (i = 0; i < _.coordinates.length; i++) {
+ area += polygonArea(_.coordinates[i]);
+ }
+
+ return area;
+
+ case 'Point':
+ case 'MultiPoint':
+ case 'LineString':
+ case 'MultiLineString':
+ return 0;
+
+ case 'GeometryCollection':
+ for (i = 0; i < _.geometries.length; i++) {
+ area += geometry(_.geometries[i]);
+ }
+
+ return area;
+ }
+ }
+
+ function polygonArea(coords) {
+ var area = 0;
+
+ if (coords && coords.length > 0) {
+ area += Math.abs(ringArea(coords[0]));
+
+ for (var i = 1; i < coords.length; i++) {
+ area -= Math.abs(ringArea(coords[i]));
+ }
+ }
+
+ return area;
+ }
+ /**
+ * Calculate the approximate area of the polygon were it projected onto
+ * the earth. Note that this area will be positive if ring is oriented
+ * clockwise, otherwise it will be negative.
+ *
+ * Reference:
+ * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
+ * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
+ * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
+ *
+ * Returns:
+ * {float} The approximate signed geodesic area of the polygon in square
+ * meters.
+ */
+
+
+ function ringArea(coords) {
+ var p1,
+ p2,
+ p3,
+ lowerIndex,
+ middleIndex,
+ upperIndex,
+ i,
+ area = 0,
+ coordsLength = coords.length;
+
+ if (coordsLength > 2) {
+ for (i = 0; i < coordsLength; i++) {
+ if (i === coordsLength - 2) {
+ // i = N-2
+ lowerIndex = coordsLength - 2;
+ middleIndex = coordsLength - 1;
+ upperIndex = 0;
+ } else if (i === coordsLength - 1) {
+ // i = N-1
+ lowerIndex = coordsLength - 1;
+ middleIndex = 0;
+ upperIndex = 1;
+ } else {
+ // i = 0 to N-3
+ lowerIndex = i;
+ middleIndex = i + 1;
+ upperIndex = i + 2;
+ }
+
+ p1 = coords[lowerIndex];
+ p2 = coords[middleIndex];
+ p3 = coords[upperIndex];
+ area += (rad(p3[0]) - rad(p1[0])) * Math.sin(rad(p2[1]));
+ }
+
+ area = area * wgs84.RADIUS * wgs84.RADIUS / 2;
+ }
+
+ return area;
+ }
+
+ function rad(_) {
+ return _ * Math.PI / 180;
+ }
+
+ var inputValidation = {};
+
+ var $$n = _export;
+ var $includes = arrayIncludes.includes;
+ var addToUnscopables$2 = addToUnscopables$6;
+
+ // `Array.prototype.includes` method
+ // https://tc39.es/ecma262/#sec-array.prototype.includes
+ $$n({ target: 'Array', proto: true }, {
+ includes: function includes(el /* , fromIndex = 0 */) {
+ return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+ addToUnscopables$2('includes');
+
+ var validateCenter$1 = {};
+
+ validateCenter$1.validateCenter = function validateCenter(center) {
+ var validCenterLengths = [2, 3];
+
+ if (!Array.isArray(center) || !validCenterLengths.includes(center.length)) {
+ throw new Error("ERROR! Center has to be an array of length two or three");
+ }
+
+ var _center = _slicedToArray(center, 2),
+ lng = _center[0],
+ lat = _center[1];
+
+ if (typeof lng !== "number" || typeof lat !== "number") {
+ throw new Error("ERROR! Longitude and Latitude has to be numbers but where ".concat(_typeof(lng), " and ").concat(_typeof(lat)));
+ }
+
+ if (lng > 180 || lng < -180) {
+ throw new Error("ERROR! Longitude has to be between -180 and 180 but was ".concat(lng));
+ }
+
+ if (lat > 90 || lat < -90) {
+ throw new Error("ERROR! Latitude has to be between -90 and 90 but was ".concat(lat));
+ }
+ };
+
+ var validateRadius$1 = {};
+
+ validateRadius$1.validateRadius = function validateRadius(radius) {
+ if (typeof radius !== "number") {
+ throw new Error("ERROR! Radius has to be a positive number but was: ".concat(_typeof(radius)));
+ }
+
+ if (radius <= 0) {
+ throw new Error("ERROR! Radius has to be a positive number but was: ".concat(radius));
+ }
+ };
+
+ var validateNumberOfEdges$1 = {};
+
+ validateNumberOfEdges$1.validateNumberOfEdges = function validateNumberOfEdges(numberOfEdges) {
+ if (typeof numberOfEdges !== "number") {
+ var ARGUMENT_TYPE = Array.isArray(numberOfEdges) ? "array" : _typeof(numberOfEdges);
+ throw new Error("ERROR! Number of edges has to be a number but was: ".concat(ARGUMENT_TYPE));
+ }
+
+ if (numberOfEdges < 3) {
+ throw new Error("ERROR! Number of edges has to be at least 3 but was: ".concat(numberOfEdges));
+ }
+ };
+
+ var validateEarthRadius$1 = {};
+
+ validateEarthRadius$1.validateEarthRadius = function validateEarthRadius(earthRadius) {
+ if (typeof earthRadius !== "number") {
+ var ARGUMENT_TYPE = Array.isArray(earthRadius) ? "array" : _typeof(earthRadius);
+ throw new Error("ERROR! Earth radius has to be a number but was: ".concat(ARGUMENT_TYPE));
+ }
+
+ if (earthRadius <= 0) {
+ throw new Error("ERROR! Earth radius has to be a positive number but was: ".concat(earthRadius));
+ }
+ };
+
+ var validateBearing$1 = {};
+
+ validateBearing$1.validateBearing = function validateBearing(bearing) {
+ if (typeof bearing !== "number") {
+ var ARGUMENT_TYPE = Array.isArray(bearing) ? "array" : _typeof(bearing);
+ throw new Error("ERROR! Bearing has to be a number but was: ".concat(ARGUMENT_TYPE));
+ }
+ };
+
+ var validateCenter = validateCenter$1.validateCenter;
+ var validateRadius = validateRadius$1.validateRadius;
+ var validateNumberOfEdges = validateNumberOfEdges$1.validateNumberOfEdges;
+ var validateEarthRadius = validateEarthRadius$1.validateEarthRadius;
+ var validateBearing = validateBearing$1.validateBearing;
+
+ function validateInput$1(_ref) {
+ var center = _ref.center,
+ radius = _ref.radius,
+ numberOfEdges = _ref.numberOfEdges,
+ earthRadius = _ref.earthRadius,
+ bearing = _ref.bearing;
+ validateCenter(center);
+ validateRadius(radius);
+ validateNumberOfEdges(numberOfEdges);
+ validateEarthRadius(earthRadius);
+ validateBearing(bearing);
+ }
+
+ inputValidation.validateCenter = validateCenter;
+ inputValidation.validateRadius = validateRadius;
+ inputValidation.validateNumberOfEdges = validateNumberOfEdges;
+ inputValidation.validateEarthRadius = validateEarthRadius;
+ inputValidation.validateBearing = validateBearing;
+ inputValidation.validateInput = validateInput$1;
+
+ var validateInput = inputValidation.validateInput;
+ var defaultEarthRadius = 6378137; // equatorial Earth radius
+
+ function toRadians(angleInDegrees) {
+ return angleInDegrees * Math.PI / 180;
+ }
+
+ function toDegrees(angleInRadians) {
+ return angleInRadians * 180 / Math.PI;
+ }
+
+ function offset(c1, distance, earthRadius, bearing) {
+ var lat1 = toRadians(c1[1]);
+ var lon1 = toRadians(c1[0]);
+ var dByR = distance / earthRadius;
+ var lat = Math.asin(Math.sin(lat1) * Math.cos(dByR) + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing));
+ var lon = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat));
+ return [toDegrees(lon), toDegrees(lat)];
+ }
+
+ var circleToPolygon = function circleToPolygon(center, radius, options) {
+ var n = getNumberOfEdges(options);
+ var earthRadius = getEarthRadius(options);
+ var bearing = getBearing(options);
+ var direction = getDirection(options); // validateInput() throws error on invalid input and do nothing on valid input
+
+ validateInput({
+ center: center,
+ radius: radius,
+ numberOfEdges: n,
+ earthRadius: earthRadius,
+ bearing: bearing
+ });
+ var start = toRadians(bearing);
+ var coordinates = [];
+
+ for (var i = 0; i < n; ++i) {
+ coordinates.push(offset(center, radius, earthRadius, start + direction * 2 * Math.PI * -i / n));
+ }
+
+ coordinates.push(coordinates[0]);
+ return {
+ type: "Polygon",
+ coordinates: [coordinates]
+ };
+ };
+
+ function getNumberOfEdges(options) {
+ if (isUndefinedOrNull(options)) {
+ return 32;
+ } else if (isObjectNotArray(options)) {
+ var numberOfEdges = options.numberOfEdges;
+ return numberOfEdges === undefined ? 32 : numberOfEdges;
+ }
+
+ return options;
+ }
+
+ function getEarthRadius(options) {
+ if (isUndefinedOrNull(options)) {
+ return defaultEarthRadius;
+ } else if (isObjectNotArray(options)) {
+ var earthRadius = options.earthRadius;
+ return earthRadius === undefined ? defaultEarthRadius : earthRadius;
+ }
+
+ return defaultEarthRadius;
+ }
+
+ function getDirection(options) {
+ if (isObjectNotArray(options) && options.rightHandRule) {
+ return -1;
+ }
+
+ return 1;
+ }
+
+ function getBearing(options) {
+ if (isUndefinedOrNull(options)) {
+ return 0;
+ } else if (isObjectNotArray(options)) {
+ var bearing = options.bearing;
+ return bearing === undefined ? 0 : bearing;
+ }
+
+ return 0;
+ }
+
+ function isObjectNotArray(argument) {
+ return argument !== null && _typeof(argument) === "object" && !Array.isArray(argument);
+ }
+
+ function isUndefinedOrNull(argument) {
+ return argument === null || argument === undefined;
+ }
+
+ var $$m = _export;
+
+ // `Number.EPSILON` constant
+ // https://tc39.es/ecma262/#sec-number.epsilon
+ $$m({ target: 'Number', stat: true }, {
+ EPSILON: Math.pow(2, -52)
+ });
+
+ var uncurryThis$8 = functionUncurryThis;
+ var requireObjectCoercible$4 = requireObjectCoercible$e;
+ var toString$5 = toString$k;
+
+ var quot = /"/g;
+ var replace$2 = uncurryThis$8(''.replace);
+
+ // `CreateHTML` abstract operation
+ // https://tc39.es/ecma262/#sec-createhtml
+ var createHtml = function (string, tag, attribute, value) {
+ var S = toString$5(requireObjectCoercible$4(string));
+ var p1 = '<' + tag;
+ if (attribute !== '') p1 += ' ' + attribute + '="' + replace$2(toString$5(value), quot, '"') + '"';
+ return p1 + '>' + S + '' + tag + '>';
+ };
+
+ var fails$6 = fails$V;
+
+ // check the existence of a method, lowercase
+ // of a tag and escaping quotes in arguments
+ var stringHtmlForced = function (METHOD_NAME) {
+ return fails$6(function () {
+ var test = ''[METHOD_NAME]('"');
+ return test !== test.toLowerCase() || test.split('"').length > 3;
+ });
+ };
+
+ var $$l = _export;
+ var createHTML = createHtml;
+ var forcedStringHTMLMethod = stringHtmlForced;
+
+ // `String.prototype.link` method
+ // https://tc39.es/ecma262/#sec-string.prototype.link
+ $$l({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, {
+ link: function link(url) {
+ return createHTML(this, 'a', 'href', url);
+ }
+ });
+
+ /**
+ * splaytree v3.1.0
+ * Fast Splay tree for Node and browser
+ *
+ * @author Alexander Milevski
+ * @license MIT
+ * @preserve
+ */
+ var Node =
+ /** @class */
+ function () {
+ function Node(key, data) {
+ this.next = null;
+ this.key = key;
+ this.data = data;
+ this.left = null;
+ this.right = null;
+ }
+
+ return Node;
+ }();
+ /* follows "An implementation of top-down splaying"
+ * by D. Sleator March 1992
+ */
+
+
+ function DEFAULT_COMPARE(a, b) {
+ return a > b ? 1 : a < b ? -1 : 0;
+ }
+ /**
+ * Simple top down splay, not requiring i to be in the tree t.
+ */
+
+
+ function splay(i, t, comparator) {
+ var N = new Node(null, null);
+ var l = N;
+ var r = N;
+
+ while (true) {
+ var cmp = comparator(i, t.key); //if (i < t.key) {
+
+ if (cmp < 0) {
+ if (t.left === null) break; //if (i < t.left.key) {
+
+ if (comparator(i, t.left.key) < 0) {
+ var y = t.left;
+ /* rotate right */
+
+ t.left = y.right;
+ y.right = t;
+ t = y;
+ if (t.left === null) break;
+ }
+
+ r.left = t;
+ /* link right */
+
+ r = t;
+ t = t.left; //} else if (i > t.key) {
+ } else if (cmp > 0) {
+ if (t.right === null) break; //if (i > t.right.key) {
+
+ if (comparator(i, t.right.key) > 0) {
+ var y = t.right;
+ /* rotate left */
+
+ t.right = y.left;
+ y.left = t;
+ t = y;
+ if (t.right === null) break;
+ }
+
+ l.right = t;
+ /* link left */
+
+ l = t;
+ t = t.right;
+ } else break;
+ }
+ /* assemble */
+
+
+ l.right = t.left;
+ r.left = t.right;
+ t.left = N.right;
+ t.right = N.left;
+ return t;
+ }
+
+ function insert(i, data, t, comparator) {
+ var node = new Node(i, data);
+
+ if (t === null) {
+ node.left = node.right = null;
+ return node;
+ }
+
+ t = splay(i, t, comparator);
+ var cmp = comparator(i, t.key);
+
+ if (cmp < 0) {
+ node.left = t.left;
+ node.right = t;
+ t.left = null;
+ } else if (cmp >= 0) {
+ node.right = t.right;
+ node.left = t;
+ t.right = null;
+ }
+
+ return node;
+ }
+
+ function split$2(key, v, comparator) {
+ var left = null;
+ var right = null;
+
+ if (v) {
+ v = splay(key, v, comparator);
+ var cmp = comparator(v.key, key);
+
+ if (cmp === 0) {
+ left = v.left;
+ right = v.right;
+ } else if (cmp < 0) {
+ right = v.right;
+ v.right = null;
+ left = v;
+ } else {
+ left = v.left;
+ v.left = null;
+ right = v;
+ }
+ }
+
+ return {
+ left: left,
+ right: right
+ };
+ }
+
+ function merge$3(left, right, comparator) {
+ if (right === null) return left;
+ if (left === null) return right;
+ right = splay(left.key, right, comparator);
+ right.left = left;
+ return right;
+ }
+ /**
+ * Prints level of the tree
+ */
+
+
+ function printRow(root, prefix, isTail, out, printNode) {
+ if (root) {
+ out("" + prefix + (isTail ? 'âââ ' : 'âââ ') + printNode(root) + "\n");
+ var indent = prefix + (isTail ? ' ' : 'â ');
+ if (root.left) printRow(root.left, indent, false, out, printNode);
+ if (root.right) printRow(root.right, indent, true, out, printNode);
+ }
+ }
+
+ var Tree =
+ /** @class */
+ function () {
+ function Tree(comparator) {
+ if (comparator === void 0) {
+ comparator = DEFAULT_COMPARE;
+ }
+
+ this._root = null;
+ this._size = 0;
+ this._comparator = comparator;
+ }
+ /**
+ * Inserts a key, allows duplicates
+ */
+
+
+ Tree.prototype.insert = function (key, data) {
+ this._size++;
+ return this._root = insert(key, data, this._root, this._comparator);
+ };
+ /**
+ * Adds a key, if it is not present in the tree
+ */
+
+
+ Tree.prototype.add = function (key, data) {
+ var node = new Node(key, data);
+
+ if (this._root === null) {
+ node.left = node.right = null;
+ this._size++;
+ this._root = node;
+ }
+
+ var comparator = this._comparator;
+ var t = splay(key, this._root, comparator);
+ var cmp = comparator(key, t.key);
+ if (cmp === 0) this._root = t;else {
+ if (cmp < 0) {
+ node.left = t.left;
+ node.right = t;
+ t.left = null;
+ } else if (cmp > 0) {
+ node.right = t.right;
+ node.left = t;
+ t.right = null;
+ }
+
+ this._size++;
+ this._root = node;
+ }
+ return this._root;
+ };
+ /**
+ * @param {Key} key
+ * @return {Node|null}
+ */
+
+
+ Tree.prototype.remove = function (key) {
+ this._root = this._remove(key, this._root, this._comparator);
+ };
+ /**
+ * Deletes i from the tree if it's there
+ */
+
+
+ Tree.prototype._remove = function (i, t, comparator) {
+ var x;
+ if (t === null) return null;
+ t = splay(i, t, comparator);
+ var cmp = comparator(i, t.key);
+
+ if (cmp === 0) {
+ /* found it */
+ if (t.left === null) {
+ x = t.right;
+ } else {
+ x = splay(i, t.left, comparator);
+ x.right = t.right;
+ }
+
+ this._size--;
+ return x;
+ }
+
+ return t;
+ /* It wasn't there */
+ };
+ /**
+ * Removes and returns the node with smallest key
+ */
+
+
+ Tree.prototype.pop = function () {
+ var node = this._root;
+
+ if (node) {
+ while (node.left) {
+ node = node.left;
+ }
+
+ this._root = splay(node.key, this._root, this._comparator);
+ this._root = this._remove(node.key, this._root, this._comparator);
+ return {
+ key: node.key,
+ data: node.data
+ };
+ }
+
+ return null;
+ };
+ /**
+ * Find without splaying
+ */
+
+
+ Tree.prototype.findStatic = function (key) {
+ var current = this._root;
+ var compare = this._comparator;
+
+ while (current) {
+ var cmp = compare(key, current.key);
+ if (cmp === 0) return current;else if (cmp < 0) current = current.left;else current = current.right;
+ }
+
+ return null;
+ };
+
+ Tree.prototype.find = function (key) {
+ if (this._root) {
+ this._root = splay(key, this._root, this._comparator);
+ if (this._comparator(key, this._root.key) !== 0) return null;
+ }
+
+ return this._root;
+ };
+
+ Tree.prototype.contains = function (key) {
+ var current = this._root;
+ var compare = this._comparator;
+
+ while (current) {
+ var cmp = compare(key, current.key);
+ if (cmp === 0) return true;else if (cmp < 0) current = current.left;else current = current.right;
+ }
+
+ return false;
+ };
+
+ Tree.prototype.forEach = function (visitor, ctx) {
+ var current = this._root;
+ var Q = [];
+ /* Initialize stack s */
+
+ var done = false;
+
+ while (!done) {
+ if (current !== null) {
+ Q.push(current);
+ current = current.left;
+ } else {
+ if (Q.length !== 0) {
+ current = Q.pop();
+ visitor.call(ctx, current);
+ current = current.right;
+ } else done = true;
+ }
+ }
+
+ return this;
+ };
+ /**
+ * Walk key range from `low` to `high`. Stops if `fn` returns a value.
+ */
+
+
+ Tree.prototype.range = function (low, high, fn, ctx) {
+ var Q = [];
+ var compare = this._comparator;
+ var node = this._root;
+ var cmp;
+
+ while (Q.length !== 0 || node) {
+ if (node) {
+ Q.push(node);
+ node = node.left;
+ } else {
+ node = Q.pop();
+ cmp = compare(node.key, high);
+
+ if (cmp > 0) {
+ break;
+ } else if (compare(node.key, low) >= 0) {
+ if (fn.call(ctx, node)) return this; // stop if smth is returned
+ }
+
+ node = node.right;
+ }
+ }
+
+ return this;
+ };
+ /**
+ * Returns array of keys
+ */
+
+
+ Tree.prototype.keys = function () {
+ var keys = [];
+ this.forEach(function (_a) {
+ var key = _a.key;
+ return keys.push(key);
+ });
+ return keys;
+ };
+ /**
+ * Returns array of all the data in the nodes
+ */
+
+
+ Tree.prototype.values = function () {
+ var values = [];
+ this.forEach(function (_a) {
+ var data = _a.data;
+ return values.push(data);
+ });
+ return values;
+ };
+
+ Tree.prototype.min = function () {
+ if (this._root) return this.minNode(this._root).key;
+ return null;
+ };
+
+ Tree.prototype.max = function () {
+ if (this._root) return this.maxNode(this._root).key;
+ return null;
+ };
+
+ Tree.prototype.minNode = function (t) {
+ if (t === void 0) {
+ t = this._root;
+ }
+
+ if (t) while (t.left) {
+ t = t.left;
+ }
+ return t;
+ };
+
+ Tree.prototype.maxNode = function (t) {
+ if (t === void 0) {
+ t = this._root;
+ }
+
+ if (t) while (t.right) {
+ t = t.right;
+ }
+ return t;
+ };
+ /**
+ * Returns node at given index
+ */
+
+
+ Tree.prototype.at = function (index) {
+ var current = this._root;
+ var done = false;
+ var i = 0;
+ var Q = [];
+
+ while (!done) {
+ if (current) {
+ Q.push(current);
+ current = current.left;
+ } else {
+ if (Q.length > 0) {
+ current = Q.pop();
+ if (i === index) return current;
+ i++;
+ current = current.right;
+ } else done = true;
+ }
+ }
+
+ return null;
+ };
+
+ Tree.prototype.next = function (d) {
+ var root = this._root;
+ var successor = null;
+
+ if (d.right) {
+ successor = d.right;
+
+ while (successor.left) {
+ successor = successor.left;
+ }
+
+ return successor;
+ }
+
+ var comparator = this._comparator;
+
+ while (root) {
+ var cmp = comparator(d.key, root.key);
+ if (cmp === 0) break;else if (cmp < 0) {
+ successor = root;
+ root = root.left;
+ } else root = root.right;
+ }
+
+ return successor;
+ };
+
+ Tree.prototype.prev = function (d) {
+ var root = this._root;
+ var predecessor = null;
+
+ if (d.left !== null) {
+ predecessor = d.left;
+
+ while (predecessor.right) {
+ predecessor = predecessor.right;
+ }
+
+ return predecessor;
+ }
+
+ var comparator = this._comparator;
+
+ while (root) {
+ var cmp = comparator(d.key, root.key);
+ if (cmp === 0) break;else if (cmp < 0) root = root.left;else {
+ predecessor = root;
+ root = root.right;
+ }
+ }
+
+ return predecessor;
+ };
+
+ Tree.prototype.clear = function () {
+ this._root = null;
+ this._size = 0;
+ return this;
+ };
+
+ Tree.prototype.toList = function () {
+ return toList(this._root);
+ };
+ /**
+ * Bulk-load items. Both array have to be same size
+ */
+
+
+ Tree.prototype.load = function (keys, values, presort) {
+ if (values === void 0) {
+ values = [];
+ }
+
+ if (presort === void 0) {
+ presort = false;
+ }
+
+ var size = keys.length;
+ var comparator = this._comparator; // sort if needed
+
+ if (presort) sort(keys, values, 0, size - 1, comparator);
+
+ if (this._root === null) {
+ // empty tree
+ this._root = loadRecursive(keys, values, 0, size);
+ this._size = size;
+ } else {
+ // that re-builds the whole tree from two in-order traversals
+ var mergedList = mergeLists(this.toList(), createList(keys, values), comparator);
+ size = this._size + size;
+ this._root = sortedListToBST({
+ head: mergedList
+ }, 0, size);
+ }
+
+ return this;
+ };
+
+ Tree.prototype.isEmpty = function () {
+ return this._root === null;
+ };
+
+ Object.defineProperty(Tree.prototype, "size", {
+ get: function get() {
+ return this._size;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Tree.prototype, "root", {
+ get: function get() {
+ return this._root;
+ },
+ enumerable: true,
+ configurable: true
+ });
+
+ Tree.prototype.toString = function (printNode) {
+ if (printNode === void 0) {
+ printNode = function printNode(n) {
+ return String(n.key);
+ };
+ }
+
+ var out = [];
+ printRow(this._root, '', true, function (v) {
+ return out.push(v);
+ }, printNode);
+ return out.join('');
+ };
+
+ Tree.prototype.update = function (key, newKey, newData) {
+ var comparator = this._comparator;
+
+ var _a = split$2(key, this._root, comparator),
+ left = _a.left,
+ right = _a.right;
+
+ if (comparator(key, newKey) < 0) {
+ right = insert(newKey, newData, right, comparator);
+ } else {
+ left = insert(newKey, newData, left, comparator);
+ }
+
+ this._root = merge$3(left, right, comparator);
+ };
+
+ Tree.prototype.split = function (key) {
+ return split$2(key, this._root, this._comparator);
+ };
+
+ return Tree;
+ }();
+
+ function loadRecursive(keys, values, start, end) {
+ var size = end - start;
+
+ if (size > 0) {
+ var middle = start + Math.floor(size / 2);
+ var key = keys[middle];
+ var data = values[middle];
+ var node = new Node(key, data);
+ node.left = loadRecursive(keys, values, start, middle);
+ node.right = loadRecursive(keys, values, middle + 1, end);
+ return node;
+ }
+
+ return null;
+ }
+
+ function createList(keys, values) {
+ var head = new Node(null, null);
+ var p = head;
+
+ for (var i = 0; i < keys.length; i++) {
+ p = p.next = new Node(keys[i], values[i]);
+ }
+
+ p.next = null;
+ return head.next;
+ }
+
+ function toList(root) {
+ var current = root;
+ var Q = [];
+ var done = false;
+ var head = new Node(null, null);
+ var p = head;
+
+ while (!done) {
+ if (current) {
+ Q.push(current);
+ current = current.left;
+ } else {
+ if (Q.length > 0) {
+ current = p = p.next = Q.pop();
+ current = current.right;
+ } else done = true;
+ }
+ }
+
+ p.next = null; // that'll work even if the tree was empty
+
+ return head.next;
+ }
+
+ function sortedListToBST(list, start, end) {
+ var size = end - start;
+
+ if (size > 0) {
+ var middle = start + Math.floor(size / 2);
+ var left = sortedListToBST(list, start, middle);
+ var root = list.head;
+ root.left = left;
+ list.head = list.head.next;
+ root.right = sortedListToBST(list, middle + 1, end);
+ return root;
+ }
+
+ return null;
+ }
+
+ function mergeLists(l1, l2, compare) {
+ var head = new Node(null, null); // dummy
+
+ var p = head;
+ var p1 = l1;
+ var p2 = l2;
+
+ while (p1 !== null && p2 !== null) {
+ if (compare(p1.key, p2.key) < 0) {
+ p.next = p1;
+ p1 = p1.next;
+ } else {
+ p.next = p2;
+ p2 = p2.next;
+ }
+
+ p = p.next;
+ }
+
+ if (p1 !== null) {
+ p.next = p1;
+ } else if (p2 !== null) {
+ p.next = p2;
+ }
+
+ return head.next;
+ }
+
+ function sort(keys, values, left, right, compare) {
+ if (left >= right) return;
+ var pivot = keys[left + right >> 1];
+ var i = left - 1;
+ var j = right + 1;
+
+ while (true) {
+ do {
+ i++;
+ } while (compare(keys[i], pivot) < 0);
+
+ do {
+ j--;
+ } while (compare(keys[j], pivot) > 0);
+
+ if (i >= j) break;
+ var tmp = keys[i];
+ keys[i] = keys[j];
+ keys[j] = tmp;
+ tmp = values[i];
+ values[i] = values[j];
+ values[j] = tmp;
+ }
+
+ sort(keys, values, left, j, compare);
+ sort(keys, values, j + 1, right, compare);
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+ /**
+ * A bounding box has the format:
+ *
+ * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }
+ *
+ */
+
+
+ var isInBbox = function isInBbox(bbox, point) {
+ return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y;
+ };
+ /* Returns either null, or a bbox (aka an ordered pair of points)
+ * If there is only one point of overlap, a bbox with identical points
+ * will be returned */
+
+
+ var getBboxOverlap = function getBboxOverlap(b1, b2) {
+ // check if the bboxes overlap at all
+ 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) return null; // find the middle two X values
+
+ var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;
+ var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x; // find the middle two Y values
+
+ var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;
+ var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y; // put those middle values together to get the overlap
+
+ return {
+ ll: {
+ x: lowerX,
+ y: lowerY
+ },
+ ur: {
+ x: upperX,
+ y: upperY
+ }
+ };
+ };
+ /* Javascript doesn't do integer math. Everything is
+ * floating point with percision Number.EPSILON.
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON
+ */
+
+
+ var epsilon = Number.EPSILON; // IE Polyfill
+
+ if (epsilon === undefined) epsilon = Math.pow(2, -52);
+ var EPSILON_SQ = epsilon * epsilon;
+ /* FLP comparator */
+
+ var cmp = function cmp(a, b) {
+ // check if they're both 0
+ if (-epsilon < a && a < epsilon) {
+ if (-epsilon < b && b < epsilon) {
+ return 0;
+ }
+ } // check if they're flp equal
+
+
+ var ab = a - b;
+
+ if (ab * ab < EPSILON_SQ * a * b) {
+ return 0;
+ } // normal comparison
+
+
+ return a < b ? -1 : 1;
+ };
+ /**
+ * This class rounds incoming values sufficiently so that
+ * floating points problems are, for the most part, avoided.
+ *
+ * Incoming points are have their x & y values tested against
+ * all previously seen x & y values. If either is 'too close'
+ * to a previously seen value, it's value is 'snapped' to the
+ * previously seen value.
+ *
+ * All points should be rounded by this class before being
+ * stored in any data structures in the rest of this algorithm.
+ */
+
+
+ var PtRounder = /*#__PURE__*/function () {
+ function PtRounder() {
+ _classCallCheck(this, PtRounder);
+
+ this.reset();
+ }
+
+ _createClass(PtRounder, [{
+ key: "reset",
+ value: function reset() {
+ this.xRounder = new CoordRounder();
+ this.yRounder = new CoordRounder();
+ }
+ }, {
+ key: "round",
+ value: function round(x, y) {
+ return {
+ x: this.xRounder.round(x),
+ y: this.yRounder.round(y)
+ };
+ }
+ }]);
+
+ return PtRounder;
+ }();
+
+ var CoordRounder = /*#__PURE__*/function () {
+ function CoordRounder() {
+ _classCallCheck(this, CoordRounder);
+
+ this.tree = new Tree(); // preseed with 0 so we don't end up with values < Number.EPSILON
+
+ this.round(0);
+ } // Note: this can rounds input values backwards or forwards.
+ // You might ask, why not restrict this to just rounding
+ // forwards? Wouldn't that allow left endpoints to always
+ // remain left endpoints during splitting (never change to
+ // right). No - it wouldn't, because we snap intersections
+ // to endpoints (to establish independence from the segment
+ // angle for t-intersections).
+
+
+ _createClass(CoordRounder, [{
+ key: "round",
+ value: function round(coord) {
+ var node = this.tree.add(coord);
+ var prevNode = this.tree.prev(node);
+
+ if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {
+ this.tree.remove(coord);
+ return prevNode.key;
+ }
+
+ var nextNode = this.tree.next(node);
+
+ if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {
+ this.tree.remove(coord);
+ return nextNode.key;
+ }
+
+ return coord;
+ }
+ }]);
+
+ return CoordRounder;
+ }(); // singleton available by import
+
+
+ var rounder = new PtRounder();
+ /* Cross Product of two vectors with first point at origin */
+
+ var crossProduct = function crossProduct(a, b) {
+ return a.x * b.y - a.y * b.x;
+ };
+ /* Dot Product of two vectors with first point at origin */
+
+
+ var dotProduct = function dotProduct(a, b) {
+ return a.x * b.x + a.y * b.y;
+ };
+ /* Comparator for two vectors with same starting point */
+
+
+ var compareVectorAngles = function compareVectorAngles(basePt, endPt1, endPt2) {
+ var v1 = {
+ x: endPt1.x - basePt.x,
+ y: endPt1.y - basePt.y
+ };
+ var v2 = {
+ x: endPt2.x - basePt.x,
+ y: endPt2.y - basePt.y
+ };
+ var kross = crossProduct(v1, v2);
+ return cmp(kross, 0);
+ };
+
+ var length = function length(v) {
+ return Math.sqrt(dotProduct(v, v));
+ };
+ /* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */
+
+
+ var sineOfAngle = function sineOfAngle(pShared, pBase, pAngle) {
+ var vBase = {
+ x: pBase.x - pShared.x,
+ y: pBase.y - pShared.y
+ };
+ var vAngle = {
+ x: pAngle.x - pShared.x,
+ y: pAngle.y - pShared.y
+ };
+ return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);
+ };
+ /* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */
+
+
+ var cosineOfAngle = function cosineOfAngle(pShared, pBase, pAngle) {
+ var vBase = {
+ x: pBase.x - pShared.x,
+ y: pBase.y - pShared.y
+ };
+ var vAngle = {
+ x: pAngle.x - pShared.x,
+ y: pAngle.y - pShared.y
+ };
+ return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);
+ };
+ /* Get the x coordinate where the given line (defined by a point and vector)
+ * crosses the horizontal line with the given y coordiante.
+ * In the case of parrallel lines (including overlapping ones) returns null. */
+
+
+ var horizontalIntersection = function horizontalIntersection(pt, v, y) {
+ if (v.y === 0) return null;
+ return {
+ x: pt.x + v.x / v.y * (y - pt.y),
+ y: y
+ };
+ };
+ /* Get the y coordinate where the given line (defined by a point and vector)
+ * crosses the vertical line with the given x coordiante.
+ * In the case of parrallel lines (including overlapping ones) returns null. */
+
+
+ var verticalIntersection = function verticalIntersection(pt, v, x) {
+ if (v.x === 0) return null;
+ return {
+ x: x,
+ y: pt.y + v.y / v.x * (x - pt.x)
+ };
+ };
+ /* Get the intersection of two lines, each defined by a base point and a vector.
+ * In the case of parrallel lines (including overlapping ones) returns null. */
+
+
+ var intersection = function intersection(pt1, v1, pt2, v2) {
+ // take some shortcuts for vertical and horizontal lines
+ // this also ensures we don't calculate an intersection and then discover
+ // it's actually outside the bounding box of the line
+ if (v1.x === 0) return verticalIntersection(pt2, v2, pt1.x);
+ if (v2.x === 0) return verticalIntersection(pt1, v1, pt2.x);
+ if (v1.y === 0) return horizontalIntersection(pt2, v2, pt1.y);
+ if (v2.y === 0) return horizontalIntersection(pt1, v1, pt2.y); // General case for non-overlapping segments.
+ // This algorithm is based on Schneider and Eberly.
+ // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244
+
+ var kross = crossProduct(v1, v2);
+ if (kross == 0) return null;
+ var ve = {
+ x: pt2.x - pt1.x,
+ y: pt2.y - pt1.y
+ };
+ var d1 = crossProduct(ve, v1) / kross;
+ var d2 = crossProduct(ve, v2) / kross; // take the average of the two calculations to minimize rounding error
+
+ var x1 = pt1.x + d2 * v1.x,
+ x2 = pt2.x + d1 * v2.x;
+ var y1 = pt1.y + d2 * v1.y,
+ y2 = pt2.y + d1 * v2.y;
+ var x = (x1 + x2) / 2;
+ var y = (y1 + y2) / 2;
+ return {
+ x: x,
+ y: y
+ };
+ };
+
+ var SweepEvent = /*#__PURE__*/function () {
+ _createClass(SweepEvent, null, [{
+ key: "compare",
+ // for ordering sweep events in the sweep event queue
+ value: function compare(a, b) {
+ // favor event with a point that the sweep line hits first
+ var ptCmp = SweepEvent.comparePoints(a.point, b.point);
+ if (ptCmp !== 0) return ptCmp; // the points are the same, so link them if needed
+
+ if (a.point !== b.point) a.link(b); // favor right events over left
+
+ if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1; // we have two matching left or right endpoints
+ // ordering of this case is the same as for their segments
+
+ return Segment.compare(a.segment, b.segment);
+ } // for ordering points in sweep line order
+
+ }, {
+ key: "comparePoints",
+ value: function comparePoints(aPt, bPt) {
+ if (aPt.x < bPt.x) return -1;
+ if (aPt.x > bPt.x) return 1;
+ if (aPt.y < bPt.y) return -1;
+ if (aPt.y > bPt.y) return 1;
+ return 0;
+ } // Warning: 'point' input will be modified and re-used (for performance)
+
+ }]);
+
+ function SweepEvent(point, isLeft) {
+ _classCallCheck(this, SweepEvent);
+
+ if (point.events === undefined) point.events = [this];else point.events.push(this);
+ this.point = point;
+ this.isLeft = isLeft; // this.segment, this.otherSE set by factory
+ }
+
+ _createClass(SweepEvent, [{
+ key: "link",
+ value: function link(other) {
+ if (other.point === this.point) {
+ throw new Error('Tried to link already linked events');
+ }
+
+ var otherEvents = other.point.events;
+
+ for (var i = 0, iMax = otherEvents.length; i < iMax; i++) {
+ var evt = otherEvents[i];
+ this.point.events.push(evt);
+ evt.point = this.point;
+ }
+
+ this.checkForConsuming();
+ }
+ /* Do a pass over our linked events and check to see if any pair
+ * of segments match, and should be consumed. */
+
+ }, {
+ key: "checkForConsuming",
+ value: function checkForConsuming() {
+ // FIXME: The loops in this method run O(n^2) => no good.
+ // Maintain little ordered sweep event trees?
+ // Can we maintaining an ordering that avoids the need
+ // for the re-sorting with getLeftmostComparator in geom-out?
+ // Compare each pair of events to see if other events also match
+ var numEvents = this.point.events.length;
+
+ for (var i = 0; i < numEvents; i++) {
+ var evt1 = this.point.events[i];
+ if (evt1.segment.consumedBy !== undefined) continue;
+
+ for (var j = i + 1; j < numEvents; j++) {
+ var evt2 = this.point.events[j];
+ if (evt2.consumedBy !== undefined) continue;
+ if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue;
+ evt1.segment.consume(evt2.segment);
+ }
+ }
+ }
+ }, {
+ key: "getAvailableLinkedEvents",
+ value: function getAvailableLinkedEvents() {
+ // point.events is always of length 2 or greater
+ var events = [];
+
+ for (var i = 0, iMax = this.point.events.length; i < iMax; i++) {
+ var evt = this.point.events[i];
+
+ if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {
+ events.push(evt);
+ }
+ }
+
+ return events;
+ }
+ /**
+ * Returns a comparator function for sorting linked events that will
+ * favor the event that will give us the smallest left-side angle.
+ * All ring construction starts as low as possible heading to the right,
+ * so by always turning left as sharp as possible we'll get polygons
+ * without uncessary loops & holes.
+ *
+ * The comparator function has a compute cache such that it avoids
+ * re-computing already-computed values.
+ */
+
+ }, {
+ key: "getLeftmostComparator",
+ value: function getLeftmostComparator(baseEvent) {
+ var _this = this;
+
+ var cache = new Map();
+
+ var fillCache = function fillCache(linkedEvent) {
+ var nextEvent = linkedEvent.otherSE;
+ cache.set(linkedEvent, {
+ sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),
+ cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)
+ });
+ };
+
+ return function (a, b) {
+ if (!cache.has(a)) fillCache(a);
+ if (!cache.has(b)) fillCache(b);
+
+ var _cache$get = cache.get(a),
+ asine = _cache$get.sine,
+ acosine = _cache$get.cosine;
+
+ var _cache$get2 = cache.get(b),
+ bsine = _cache$get2.sine,
+ bcosine = _cache$get2.cosine; // both on or above x-axis
+
+
+ if (asine >= 0 && bsine >= 0) {
+ if (acosine < bcosine) return 1;
+ if (acosine > bcosine) return -1;
+ return 0;
+ } // both below x-axis
+
+
+ if (asine < 0 && bsine < 0) {
+ if (acosine < bcosine) return -1;
+ if (acosine > bcosine) return 1;
+ return 0;
+ } // one above x-axis, one below
+
+
+ if (bsine < asine) return -1;
+ if (bsine > asine) return 1;
+ return 0;
+ };
+ }
+ }]);
+
+ return SweepEvent;
+ }(); // segments and sweep events when all else is identical
+
+
+ var segmentId = 0;
+
+ var Segment = /*#__PURE__*/function () {
+ _createClass(Segment, null, [{
+ key: "compare",
+
+ /* This compare() function is for ordering segments in the sweep
+ * line tree, and does so according to the following criteria:
+ *
+ * Consider the vertical line that lies an infinestimal step to the
+ * right of the right-more of the two left endpoints of the input
+ * segments. Imagine slowly moving a point up from negative infinity
+ * in the increasing y direction. Which of the two segments will that
+ * point intersect first? That segment comes 'before' the other one.
+ *
+ * If neither segment would be intersected by such a line, (if one
+ * or more of the segments are vertical) then the line to be considered
+ * is directly on the right-more of the two left inputs.
+ */
+ value: function compare(a, b) {
+ var alx = a.leftSE.point.x;
+ var blx = b.leftSE.point.x;
+ var arx = a.rightSE.point.x;
+ var brx = b.rightSE.point.x; // check if they're even in the same vertical plane
+
+ if (brx < alx) return 1;
+ if (arx < blx) return -1;
+ var aly = a.leftSE.point.y;
+ var bly = b.leftSE.point.y;
+ var ary = a.rightSE.point.y;
+ var bry = b.rightSE.point.y; // is left endpoint of segment B the right-more?
+
+ if (alx < blx) {
+ // are the two segments in the same horizontal plane?
+ if (bly < aly && bly < ary) return 1;
+ if (bly > aly && bly > ary) return -1; // is the B left endpoint colinear to segment A?
+
+ var aCmpBLeft = a.comparePoint(b.leftSE.point);
+ if (aCmpBLeft < 0) return 1;
+ if (aCmpBLeft > 0) return -1; // is the A right endpoint colinear to segment B ?
+
+ var bCmpARight = b.comparePoint(a.rightSE.point);
+ if (bCmpARight !== 0) return bCmpARight; // colinear segments, consider the one with left-more
+ // left endpoint to be first (arbitrary?)
+
+ return -1;
+ } // is left endpoint of segment A the right-more?
+
+
+ if (alx > blx) {
+ if (aly < bly && aly < bry) return -1;
+ if (aly > bly && aly > bry) return 1; // is the A left endpoint colinear to segment B?
+
+ var bCmpALeft = b.comparePoint(a.leftSE.point);
+ if (bCmpALeft !== 0) return bCmpALeft; // is the B right endpoint colinear to segment A?
+
+ var aCmpBRight = a.comparePoint(b.rightSE.point);
+ if (aCmpBRight < 0) return 1;
+ if (aCmpBRight > 0) return -1; // colinear segments, consider the one with left-more
+ // left endpoint to be first (arbitrary?)
+
+ return 1;
+ } // if we get here, the two left endpoints are in the same
+ // vertical plane, ie alx === blx
+ // consider the lower left-endpoint to come first
+
+
+ if (aly < bly) return -1;
+ if (aly > bly) return 1; // left endpoints are identical
+ // check for colinearity by using the left-more right endpoint
+ // is the A right endpoint more left-more?
+
+ if (arx < brx) {
+ var _bCmpARight = b.comparePoint(a.rightSE.point);
+
+ if (_bCmpARight !== 0) return _bCmpARight;
+ } // is the B right endpoint more left-more?
+
+
+ if (arx > brx) {
+ var _aCmpBRight = a.comparePoint(b.rightSE.point);
+
+ if (_aCmpBRight < 0) return 1;
+ if (_aCmpBRight > 0) return -1;
+ }
+
+ if (arx !== brx) {
+ // are these two [almost] vertical segments with opposite orientation?
+ // if so, the one with the lower right endpoint comes first
+ var ay = ary - aly;
+ var ax = arx - alx;
+ var by = bry - bly;
+ var bx = brx - blx;
+ if (ay > ax && by < bx) return 1;
+ if (ay < ax && by > bx) return -1;
+ } // we have colinear segments with matching orientation
+ // consider the one with more left-more right endpoint to be first
+
+
+ if (arx > brx) return 1;
+ if (arx < brx) return -1; // if we get here, two two right endpoints are in the same
+ // vertical plane, ie arx === brx
+ // consider the lower right-endpoint to come first
+
+ if (ary < bry) return -1;
+ if (ary > bry) return 1; // right endpoints identical as well, so the segments are idential
+ // fall back on creation order as consistent tie-breaker
+
+ if (a.id < b.id) return -1;
+ if (a.id > b.id) return 1; // identical segment, ie a === b
+
+ return 0;
+ }
+ /* Warning: a reference to ringWindings input will be stored,
+ * and possibly will be later modified */
+
+ }]);
+
+ function Segment(leftSE, rightSE, rings, windings) {
+ _classCallCheck(this, Segment);
+
+ this.id = ++segmentId;
+ this.leftSE = leftSE;
+ leftSE.segment = this;
+ leftSE.otherSE = rightSE;
+ this.rightSE = rightSE;
+ rightSE.segment = this;
+ rightSE.otherSE = leftSE;
+ this.rings = rings;
+ this.windings = windings; // left unset for performance, set later in algorithm
+ // this.ringOut, this.consumedBy, this.prev
+ }
+
+ _createClass(Segment, [{
+ key: "replaceRightSE",
+
+ /* When a segment is split, the rightSE is replaced with a new sweep event */
+ value: function replaceRightSE(newRightSE) {
+ this.rightSE = newRightSE;
+ this.rightSE.segment = this;
+ this.rightSE.otherSE = this.leftSE;
+ this.leftSE.otherSE = this.rightSE;
+ }
+ }, {
+ key: "bbox",
+ value: function bbox() {
+ var y1 = this.leftSE.point.y;
+ var y2 = this.rightSE.point.y;
+ return {
+ ll: {
+ x: this.leftSE.point.x,
+ y: y1 < y2 ? y1 : y2
+ },
+ ur: {
+ x: this.rightSE.point.x,
+ y: y1 > y2 ? y1 : y2
+ }
+ };
+ }
+ /* A vector from the left point to the right */
+
+ }, {
+ key: "vector",
+ value: function vector() {
+ return {
+ x: this.rightSE.point.x - this.leftSE.point.x,
+ y: this.rightSE.point.y - this.leftSE.point.y
+ };
+ }
+ }, {
+ key: "isAnEndpoint",
+ value: function isAnEndpoint(pt) {
+ 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;
+ }
+ /* Compare this segment with a point.
+ *
+ * A point P is considered to be colinear to a segment if there
+ * exists a distance D such that if we travel along the segment
+ * from one * endpoint towards the other a distance D, we find
+ * ourselves at point P.
+ *
+ * Return value indicates:
+ *
+ * 1: point lies above the segment (to the left of vertical)
+ * 0: point is colinear to segment
+ * -1: point lies below the segment (to the right of vertical)
+ */
+
+ }, {
+ key: "comparePoint",
+ value: function comparePoint(point) {
+ if (this.isAnEndpoint(point)) return 0;
+ var lPt = this.leftSE.point;
+ var rPt = this.rightSE.point;
+ var v = this.vector(); // Exactly vertical segments.
+
+ if (lPt.x === rPt.x) {
+ if (point.x === lPt.x) return 0;
+ return point.x < lPt.x ? 1 : -1;
+ } // Nearly vertical segments with an intersection.
+ // Check to see where a point on the line with matching Y coordinate is.
+
+
+ var yDist = (point.y - lPt.y) / v.y;
+ var xFromYDist = lPt.x + yDist * v.x;
+ if (point.x === xFromYDist) return 0; // General case.
+ // Check to see where a point on the line with matching X coordinate is.
+
+ var xDist = (point.x - lPt.x) / v.x;
+ var yFromXDist = lPt.y + xDist * v.y;
+ if (point.y === yFromXDist) return 0;
+ return point.y < yFromXDist ? -1 : 1;
+ }
+ /**
+ * Given another segment, returns the first non-trivial intersection
+ * between the two segments (in terms of sweep line ordering), if it exists.
+ *
+ * A 'non-trivial' intersection is one that will cause one or both of the
+ * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:
+ *
+ * * endpoint of segA with endpoint of segB --> trivial
+ * * endpoint of segA with point along segB --> non-trivial
+ * * endpoint of segB with point along segA --> non-trivial
+ * * point along segA with point along segB --> non-trivial
+ *
+ * If no non-trivial intersection exists, return null
+ * Else, return null.
+ */
+
+ }, {
+ key: "getIntersection",
+ value: function getIntersection(other) {
+ // If bboxes don't overlap, there can't be any intersections
+ var tBbox = this.bbox();
+ var oBbox = other.bbox();
+ var bboxOverlap = getBboxOverlap(tBbox, oBbox);
+ if (bboxOverlap === null) return null; // We first check to see if the endpoints can be considered intersections.
+ // This will 'snap' intersections to endpoints if possible, and will
+ // handle cases of colinearity.
+
+ var tlp = this.leftSE.point;
+ var trp = this.rightSE.point;
+ var olp = other.leftSE.point;
+ var orp = other.rightSE.point; // does each endpoint touch the other segment?
+ // note that we restrict the 'touching' definition to only allow segments
+ // to touch endpoints that lie forward from where we are in the sweep line pass
+
+ var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;
+ var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;
+ var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;
+ var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0; // do left endpoints match?
+
+ if (touchesThisLSE && touchesOtherLSE) {
+ // these two cases are for colinear segments with matching left
+ // endpoints, and one segment being longer than the other
+ if (touchesThisRSE && !touchesOtherRSE) return trp;
+ if (!touchesThisRSE && touchesOtherRSE) return orp; // either the two segments match exactly (two trival intersections)
+ // or just on their left endpoint (one trivial intersection
+
+ return null;
+ } // does this left endpoint matches (other doesn't)
+
+
+ if (touchesThisLSE) {
+ // check for segments that just intersect on opposing endpoints
+ if (touchesOtherRSE) {
+ if (tlp.x === orp.x && tlp.y === orp.y) return null;
+ } // t-intersection on left endpoint
+
+
+ return tlp;
+ } // does other left endpoint matches (this doesn't)
+
+
+ if (touchesOtherLSE) {
+ // check for segments that just intersect on opposing endpoints
+ if (touchesThisRSE) {
+ if (trp.x === olp.x && trp.y === olp.y) return null;
+ } // t-intersection on left endpoint
+
+
+ return olp;
+ } // trivial intersection on right endpoints
+
+
+ if (touchesThisRSE && touchesOtherRSE) return null; // t-intersections on just one right endpoint
+
+ if (touchesThisRSE) return trp;
+ if (touchesOtherRSE) return orp; // None of our endpoints intersect. Look for a general intersection between
+ // infinite lines laid over the segments
+
+ var pt = intersection(tlp, this.vector(), olp, other.vector()); // are the segments parrallel? Note that if they were colinear with overlap,
+ // they would have an endpoint intersection and that case was already handled above
+
+ if (pt === null) return null; // is the intersection found between the lines not on the segments?
+
+ if (!isInBbox(bboxOverlap, pt)) return null; // round the the computed point if needed
+
+ return rounder.round(pt.x, pt.y);
+ }
+ /**
+ * Split the given segment into multiple segments on the given points.
+ * * Each existing segment will retain its leftSE and a new rightSE will be
+ * generated for it.
+ * * A new segment will be generated which will adopt the original segment's
+ * rightSE, and a new leftSE will be generated for it.
+ * * If there are more than two points given to split on, new segments
+ * in the middle will be generated with new leftSE and rightSE's.
+ * * An array of the newly generated SweepEvents will be returned.
+ *
+ * Warning: input array of points is modified
+ */
+
+ }, {
+ key: "split",
+ value: function split(point) {
+ var newEvents = [];
+ var alreadyLinked = point.events !== undefined;
+ var newLeftSE = new SweepEvent(point, true);
+ var newRightSE = new SweepEvent(point, false);
+ var oldRightSE = this.rightSE;
+ this.replaceRightSE(newRightSE);
+ newEvents.push(newRightSE);
+ newEvents.push(newLeftSE);
+ var newSeg = new Segment(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice()); // when splitting a nearly vertical downward-facing segment,
+ // sometimes one of the resulting new segments is vertical, in which
+ // case its left and right events may need to be swapped
+
+ if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {
+ newSeg.swapEvents();
+ }
+
+ if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {
+ this.swapEvents();
+ } // in the point we just used to create new sweep events with was already
+ // linked to other events, we need to check if either of the affected
+ // segments should be consumed
+
+
+ if (alreadyLinked) {
+ newLeftSE.checkForConsuming();
+ newRightSE.checkForConsuming();
+ }
+
+ return newEvents;
+ }
+ /* Swap which event is left and right */
+
+ }, {
+ key: "swapEvents",
+ value: function swapEvents() {
+ var tmpEvt = this.rightSE;
+ this.rightSE = this.leftSE;
+ this.leftSE = tmpEvt;
+ this.leftSE.isLeft = true;
+ this.rightSE.isLeft = false;
+
+ for (var i = 0, iMax = this.windings.length; i < iMax; i++) {
+ this.windings[i] *= -1;
+ }
+ }
+ /* Consume another segment. We take their rings under our wing
+ * and mark them as consumed. Use for perfectly overlapping segments */
+
+ }, {
+ key: "consume",
+ value: function consume(other) {
+ var consumer = this;
+ var consumee = other;
+
+ while (consumer.consumedBy) {
+ consumer = consumer.consumedBy;
+ }
+
+ while (consumee.consumedBy) {
+ consumee = consumee.consumedBy;
+ }
+
+ var cmp = Segment.compare(consumer, consumee);
+ if (cmp === 0) return; // already consumed
+ // the winner of the consumption is the earlier segment
+ // according to sweep line ordering
+
+ if (cmp > 0) {
+ var tmp = consumer;
+ consumer = consumee;
+ consumee = tmp;
+ } // make sure a segment doesn't consume it's prev
+
+
+ if (consumer.prev === consumee) {
+ var _tmp = consumer;
+ consumer = consumee;
+ consumee = _tmp;
+ }
+
+ for (var i = 0, iMax = consumee.rings.length; i < iMax; i++) {
+ var ring = consumee.rings[i];
+ var winding = consumee.windings[i];
+ var index = consumer.rings.indexOf(ring);
+
+ if (index === -1) {
+ consumer.rings.push(ring);
+ consumer.windings.push(winding);
+ } else consumer.windings[index] += winding;
+ }
+
+ consumee.rings = null;
+ consumee.windings = null;
+ consumee.consumedBy = consumer; // mark sweep events consumed as to maintain ordering in sweep event queue
+
+ consumee.leftSE.consumedBy = consumer.leftSE;
+ consumee.rightSE.consumedBy = consumer.rightSE;
+ }
+ /* The first segment previous segment chain that is in the result */
+
+ }, {
+ key: "prevInResult",
+ value: function prevInResult() {
+ if (this._prevInResult !== undefined) return this._prevInResult;
+ if (!this.prev) this._prevInResult = null;else if (this.prev.isInResult()) this._prevInResult = this.prev;else this._prevInResult = this.prev.prevInResult();
+ return this._prevInResult;
+ }
+ }, {
+ key: "beforeState",
+ value: function beforeState() {
+ if (this._beforeState !== undefined) return this._beforeState;
+ if (!this.prev) this._beforeState = {
+ rings: [],
+ windings: [],
+ multiPolys: []
+ };else {
+ var seg = this.prev.consumedBy || this.prev;
+ this._beforeState = seg.afterState();
+ }
+ return this._beforeState;
+ }
+ }, {
+ key: "afterState",
+ value: function afterState() {
+ if (this._afterState !== undefined) return this._afterState;
+ var beforeState = this.beforeState();
+ this._afterState = {
+ rings: beforeState.rings.slice(0),
+ windings: beforeState.windings.slice(0),
+ multiPolys: []
+ };
+ var ringsAfter = this._afterState.rings;
+ var windingsAfter = this._afterState.windings;
+ var mpsAfter = this._afterState.multiPolys; // calculate ringsAfter, windingsAfter
+
+ for (var i = 0, iMax = this.rings.length; i < iMax; i++) {
+ var ring = this.rings[i];
+ var winding = this.windings[i];
+ var index = ringsAfter.indexOf(ring);
+
+ if (index === -1) {
+ ringsAfter.push(ring);
+ windingsAfter.push(winding);
+ } else windingsAfter[index] += winding;
+ } // calcualte polysAfter
+
+
+ var polysAfter = [];
+ var polysExclude = [];
+
+ for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {
+ if (windingsAfter[_i] === 0) continue; // non-zero rule
+
+ var _ring = ringsAfter[_i];
+ var poly = _ring.poly;
+ if (polysExclude.indexOf(poly) !== -1) continue;
+ if (_ring.isExterior) polysAfter.push(poly);else {
+ if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly);
+
+ var _index = polysAfter.indexOf(_ring.poly);
+
+ if (_index !== -1) polysAfter.splice(_index, 1);
+ }
+ } // calculate multiPolysAfter
+
+
+ for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {
+ var mp = polysAfter[_i2].multiPoly;
+ if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp);
+ }
+
+ return this._afterState;
+ }
+ /* Is this segment part of the final result? */
+
+ }, {
+ key: "isInResult",
+ value: function isInResult() {
+ // if we've been consumed, we're not in the result
+ if (this.consumedBy) return false;
+ if (this._isInResult !== undefined) return this._isInResult;
+ var mpsBefore = this.beforeState().multiPolys;
+ var mpsAfter = this.afterState().multiPolys;
+
+ switch (operation.type) {
+ case 'union':
+ {
+ // UNION - included iff:
+ // * On one side of us there is 0 poly interiors AND
+ // * On the other side there is 1 or more.
+ var noBefores = mpsBefore.length === 0;
+ var noAfters = mpsAfter.length === 0;
+ this._isInResult = noBefores !== noAfters;
+ break;
+ }
+
+ case 'intersection':
+ {
+ // INTERSECTION - included iff:
+ // * on one side of us all multipolys are rep. with poly interiors AND
+ // * on the other side of us, not all multipolys are repsented
+ // with poly interiors
+ var least;
+ var most;
+
+ if (mpsBefore.length < mpsAfter.length) {
+ least = mpsBefore.length;
+ most = mpsAfter.length;
+ } else {
+ least = mpsAfter.length;
+ most = mpsBefore.length;
+ }
+
+ this._isInResult = most === operation.numMultiPolys && least < most;
+ break;
+ }
+
+ case 'xor':
+ {
+ // XOR - included iff:
+ // * the difference between the number of multipolys represented
+ // with poly interiors on our two sides is an odd number
+ var diff = Math.abs(mpsBefore.length - mpsAfter.length);
+ this._isInResult = diff % 2 === 1;
+ break;
+ }
+
+ case 'difference':
+ {
+ // DIFFERENCE included iff:
+ // * on exactly one side, we have just the subject
+ var isJustSubject = function isJustSubject(mps) {
+ return mps.length === 1 && mps[0].isSubject;
+ };
+
+ this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);
+ break;
+ }
+
+ default:
+ throw new Error("Unrecognized operation type found ".concat(operation.type));
+ }
+
+ return this._isInResult;
+ }
+ }], [{
+ key: "fromRing",
+ value: function fromRing(pt1, pt2, ring) {
+ var leftPt, rightPt, winding; // ordering the two points according to sweep line ordering
+
+ var cmpPts = SweepEvent.comparePoints(pt1, pt2);
+
+ if (cmpPts < 0) {
+ leftPt = pt1;
+ rightPt = pt2;
+ winding = 1;
+ } else if (cmpPts > 0) {
+ leftPt = pt2;
+ rightPt = pt1;
+ winding = -1;
+ } else throw new Error("Tried to create degenerate segment at [".concat(pt1.x, ", ").concat(pt1.y, "]"));
+
+ var leftSE = new SweepEvent(leftPt, true);
+ var rightSE = new SweepEvent(rightPt, false);
+ return new Segment(leftSE, rightSE, [ring], [winding]);
+ }
+ }]);
+
+ return Segment;
+ }();
+
+ var RingIn = /*#__PURE__*/function () {
+ function RingIn(geomRing, poly, isExterior) {
+ _classCallCheck(this, RingIn);
+
+ if (!Array.isArray(geomRing) || geomRing.length === 0) {
+ throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+ }
+
+ this.poly = poly;
+ this.isExterior = isExterior;
+ this.segments = [];
+
+ if (typeof geomRing[0][0] !== 'number' || typeof geomRing[0][1] !== 'number') {
+ throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+ }
+
+ var firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]);
+ this.bbox = {
+ ll: {
+ x: firstPoint.x,
+ y: firstPoint.y
+ },
+ ur: {
+ x: firstPoint.x,
+ y: firstPoint.y
+ }
+ };
+ var prevPoint = firstPoint;
+
+ for (var i = 1, iMax = geomRing.length; i < iMax; i++) {
+ if (typeof geomRing[i][0] !== 'number' || typeof geomRing[i][1] !== 'number') {
+ throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+ }
+
+ var point = rounder.round(geomRing[i][0], geomRing[i][1]); // skip repeated points
+
+ if (point.x === prevPoint.x && point.y === prevPoint.y) continue;
+ this.segments.push(Segment.fromRing(prevPoint, point, this));
+ if (point.x < this.bbox.ll.x) this.bbox.ll.x = point.x;
+ if (point.y < this.bbox.ll.y) this.bbox.ll.y = point.y;
+ if (point.x > this.bbox.ur.x) this.bbox.ur.x = point.x;
+ if (point.y > this.bbox.ur.y) this.bbox.ur.y = point.y;
+ prevPoint = point;
+ } // add segment from last to first if last is not the same as first
+
+
+ if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) {
+ this.segments.push(Segment.fromRing(prevPoint, firstPoint, this));
+ }
+ }
+
+ _createClass(RingIn, [{
+ key: "getSweepEvents",
+ value: function getSweepEvents() {
+ var sweepEvents = [];
+
+ for (var i = 0, iMax = this.segments.length; i < iMax; i++) {
+ var segment = this.segments[i];
+ sweepEvents.push(segment.leftSE);
+ sweepEvents.push(segment.rightSE);
+ }
+
+ return sweepEvents;
+ }
+ }]);
+
+ return RingIn;
+ }();
+
+ var PolyIn = /*#__PURE__*/function () {
+ function PolyIn(geomPoly, multiPoly) {
+ _classCallCheck(this, PolyIn);
+
+ if (!Array.isArray(geomPoly)) {
+ throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+ }
+
+ this.exteriorRing = new RingIn(geomPoly[0], this, true); // copy by value
+
+ this.bbox = {
+ ll: {
+ x: this.exteriorRing.bbox.ll.x,
+ y: this.exteriorRing.bbox.ll.y
+ },
+ ur: {
+ x: this.exteriorRing.bbox.ur.x,
+ y: this.exteriorRing.bbox.ur.y
+ }
+ };
+ this.interiorRings = [];
+
+ for (var i = 1, iMax = geomPoly.length; i < iMax; i++) {
+ var ring = new RingIn(geomPoly[i], this, false);
+ if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x;
+ if (ring.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = ring.bbox.ll.y;
+ if (ring.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = ring.bbox.ur.x;
+ if (ring.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = ring.bbox.ur.y;
+ this.interiorRings.push(ring);
+ }
+
+ this.multiPoly = multiPoly;
+ }
+
+ _createClass(PolyIn, [{
+ key: "getSweepEvents",
+ value: function getSweepEvents() {
+ var sweepEvents = this.exteriorRing.getSweepEvents();
+
+ for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {
+ var ringSweepEvents = this.interiorRings[i].getSweepEvents();
+
+ for (var j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {
+ sweepEvents.push(ringSweepEvents[j]);
+ }
+ }
+
+ return sweepEvents;
+ }
+ }]);
+
+ return PolyIn;
+ }();
+
+ var MultiPolyIn = /*#__PURE__*/function () {
+ function MultiPolyIn(geom, isSubject) {
+ _classCallCheck(this, MultiPolyIn);
+
+ if (!Array.isArray(geom)) {
+ throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+ }
+
+ try {
+ // if the input looks like a polygon, convert it to a multipolygon
+ if (typeof geom[0][0][0] === 'number') geom = [geom];
+ } catch (ex) {// The input is either malformed or has empty arrays.
+ // In either case, it will be handled later on.
+ }
+
+ this.polys = [];
+ this.bbox = {
+ ll: {
+ x: Number.POSITIVE_INFINITY,
+ y: Number.POSITIVE_INFINITY
+ },
+ ur: {
+ x: Number.NEGATIVE_INFINITY,
+ y: Number.NEGATIVE_INFINITY
+ }
+ };
+
+ for (var i = 0, iMax = geom.length; i < iMax; i++) {
+ var poly = new PolyIn(geom[i], this);
+ if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x;
+ if (poly.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = poly.bbox.ll.y;
+ if (poly.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = poly.bbox.ur.x;
+ if (poly.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = poly.bbox.ur.y;
+ this.polys.push(poly);
+ }
+
+ this.isSubject = isSubject;
+ }
+
+ _createClass(MultiPolyIn, [{
+ key: "getSweepEvents",
+ value: function getSweepEvents() {
+ var sweepEvents = [];
+
+ for (var i = 0, iMax = this.polys.length; i < iMax; i++) {
+ var polySweepEvents = this.polys[i].getSweepEvents();
+
+ for (var j = 0, jMax = polySweepEvents.length; j < jMax; j++) {
+ sweepEvents.push(polySweepEvents[j]);
+ }
+ }
+
+ return sweepEvents;
+ }
+ }]);
+
+ return MultiPolyIn;
+ }();
+
+ var RingOut = /*#__PURE__*/function () {
+ _createClass(RingOut, null, [{
+ key: "factory",
+
+ /* Given the segments from the sweep line pass, compute & return a series
+ * of closed rings from all the segments marked to be part of the result */
+ value: function factory(allSegments) {
+ var ringsOut = [];
+
+ for (var i = 0, iMax = allSegments.length; i < iMax; i++) {
+ var segment = allSegments[i];
+ if (!segment.isInResult() || segment.ringOut) continue;
+ var prevEvent = null;
+ var event = segment.leftSE;
+ var nextEvent = segment.rightSE;
+ var events = [event];
+ var startingPoint = event.point;
+ var intersectionLEs = [];
+ /* Walk the chain of linked events to form a closed ring */
+
+ while (true) {
+ prevEvent = event;
+ event = nextEvent;
+ events.push(event);
+ /* Is the ring complete? */
+
+ if (event.point === startingPoint) break;
+
+ while (true) {
+ var availableLEs = event.getAvailableLinkedEvents();
+ /* Did we hit a dead end? This shouldn't happen. Indicates some earlier
+ * part of the algorithm malfunctioned... please file a bug report. */
+
+ if (availableLEs.length === 0) {
+ var firstPt = events[0].point;
+ var lastPt = events[events.length - 1].point;
+ 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, "]."));
+ }
+ /* Only one way to go, so cotinue on the path */
+
+
+ if (availableLEs.length === 1) {
+ nextEvent = availableLEs[0].otherSE;
+ break;
+ }
+ /* We must have an intersection. Check for a completed loop */
+
+
+ var indexLE = null;
+
+ for (var j = 0, jMax = intersectionLEs.length; j < jMax; j++) {
+ if (intersectionLEs[j].point === event.point) {
+ indexLE = j;
+ break;
+ }
+ }
+ /* Found a completed loop. Cut that off and make a ring */
+
+
+ if (indexLE !== null) {
+ var intersectionLE = intersectionLEs.splice(indexLE)[0];
+ var ringEvents = events.splice(intersectionLE.index);
+ ringEvents.unshift(ringEvents[0].otherSE);
+ ringsOut.push(new RingOut(ringEvents.reverse()));
+ continue;
+ }
+ /* register the intersection */
+
+
+ intersectionLEs.push({
+ index: events.length,
+ point: event.point
+ });
+ /* Choose the left-most option to continue the walk */
+
+ var comparator = event.getLeftmostComparator(prevEvent);
+ nextEvent = availableLEs.sort(comparator)[0].otherSE;
+ break;
+ }
+ }
+
+ ringsOut.push(new RingOut(events));
+ }
+
+ return ringsOut;
+ }
+ }]);
+
+ function RingOut(events) {
+ _classCallCheck(this, RingOut);
+
+ this.events = events;
+
+ for (var i = 0, iMax = events.length; i < iMax; i++) {
+ events[i].segment.ringOut = this;
+ }
+
+ this.poly = null;
+ }
+
+ _createClass(RingOut, [{
+ key: "getGeom",
+ value: function getGeom() {
+ // Remove superfluous points (ie extra points along a straight line),
+ var prevPt = this.events[0].point;
+ var points = [prevPt];
+
+ for (var i = 1, iMax = this.events.length - 1; i < iMax; i++) {
+ var _pt = this.events[i].point;
+ var _nextPt = this.events[i + 1].point;
+ if (compareVectorAngles(_pt, prevPt, _nextPt) === 0) continue;
+ points.push(_pt);
+ prevPt = _pt;
+ } // ring was all (within rounding error of angle calc) colinear points
+
+
+ if (points.length === 1) return null; // check if the starting point is necessary
+
+ var pt = points[0];
+ var nextPt = points[1];
+ if (compareVectorAngles(pt, prevPt, nextPt) === 0) points.shift();
+ points.push(points[0]);
+ var step = this.isExteriorRing() ? 1 : -1;
+ var iStart = this.isExteriorRing() ? 0 : points.length - 1;
+ var iEnd = this.isExteriorRing() ? points.length : -1;
+ var orderedPoints = [];
+
+ for (var _i = iStart; _i != iEnd; _i += step) {
+ orderedPoints.push([points[_i].x, points[_i].y]);
+ }
+
+ return orderedPoints;
+ }
+ }, {
+ key: "isExteriorRing",
+ value: function isExteriorRing() {
+ if (this._isExteriorRing === undefined) {
+ var enclosing = this.enclosingRing();
+ this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;
+ }
+
+ return this._isExteriorRing;
+ }
+ }, {
+ key: "enclosingRing",
+ value: function enclosingRing() {
+ if (this._enclosingRing === undefined) {
+ this._enclosingRing = this._calcEnclosingRing();
+ }
+
+ return this._enclosingRing;
+ }
+ /* Returns the ring that encloses this one, if any */
+
+ }, {
+ key: "_calcEnclosingRing",
+ value: function _calcEnclosingRing() {
+ // start with the ealier sweep line event so that the prevSeg
+ // chain doesn't lead us inside of a loop of ours
+ var leftMostEvt = this.events[0];
+
+ for (var i = 1, iMax = this.events.length; i < iMax; i++) {
+ var evt = this.events[i];
+ if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt;
+ }
+
+ var prevSeg = leftMostEvt.segment.prevInResult();
+ var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
+
+ while (true) {
+ // no segment found, thus no ring can enclose us
+ if (!prevSeg) return null; // no segments below prev segment found, thus the ring of the prev
+ // segment must loop back around and enclose us
+
+ if (!prevPrevSeg) return prevSeg.ringOut; // if the two segments are of different rings, the ring of the prev
+ // segment must either loop around us or the ring of the prev prev
+ // seg, which would make us and the ring of the prev peers
+
+ if (prevPrevSeg.ringOut !== prevSeg.ringOut) {
+ if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {
+ return prevSeg.ringOut;
+ } else return prevSeg.ringOut.enclosingRing();
+ } // two segments are from the same ring, so this was a penisula
+ // of that ring. iterate downward, keep searching
+
+
+ prevSeg = prevPrevSeg.prevInResult();
+ prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
+ }
+ }
+ }]);
+
+ return RingOut;
+ }();
+
+ var PolyOut = /*#__PURE__*/function () {
+ function PolyOut(exteriorRing) {
+ _classCallCheck(this, PolyOut);
+
+ this.exteriorRing = exteriorRing;
+ exteriorRing.poly = this;
+ this.interiorRings = [];
+ }
+
+ _createClass(PolyOut, [{
+ key: "addInterior",
+ value: function addInterior(ring) {
+ this.interiorRings.push(ring);
+ ring.poly = this;
+ }
+ }, {
+ key: "getGeom",
+ value: function getGeom() {
+ var geom = [this.exteriorRing.getGeom()]; // exterior ring was all (within rounding error of angle calc) colinear points
+
+ if (geom[0] === null) return null;
+
+ for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {
+ var ringGeom = this.interiorRings[i].getGeom(); // interior ring was all (within rounding error of angle calc) colinear points
+
+ if (ringGeom === null) continue;
+ geom.push(ringGeom);
+ }
+
+ return geom;
+ }
+ }]);
+
+ return PolyOut;
+ }();
+
+ var MultiPolyOut = /*#__PURE__*/function () {
+ function MultiPolyOut(rings) {
+ _classCallCheck(this, MultiPolyOut);
+
+ this.rings = rings;
+ this.polys = this._composePolys(rings);
+ }
+
+ _createClass(MultiPolyOut, [{
+ key: "getGeom",
+ value: function getGeom() {
+ var geom = [];
+
+ for (var i = 0, iMax = this.polys.length; i < iMax; i++) {
+ var polyGeom = this.polys[i].getGeom(); // exterior ring was all (within rounding error of angle calc) colinear points
+
+ if (polyGeom === null) continue;
+ geom.push(polyGeom);
+ }
+
+ return geom;
+ }
+ }, {
+ key: "_composePolys",
+ value: function _composePolys(rings) {
+ var polys = [];
+
+ for (var i = 0, iMax = rings.length; i < iMax; i++) {
+ var ring = rings[i];
+ if (ring.poly) continue;
+ if (ring.isExteriorRing()) polys.push(new PolyOut(ring));else {
+ var enclosingRing = ring.enclosingRing();
+ if (!enclosingRing.poly) polys.push(new PolyOut(enclosingRing));
+ enclosingRing.poly.addInterior(ring);
+ }
+ }
+
+ return polys;
+ }
+ }]);
+
+ return MultiPolyOut;
+ }();
+ /**
+ * NOTE: We must be careful not to change any segments while
+ * they are in the SplayTree. AFAIK, there's no way to tell
+ * the tree to rebalance itself - thus before splitting
+ * a segment that's in the tree, we remove it from the tree,
+ * do the split, then re-insert it. (Even though splitting a
+ * segment *shouldn't* change its correct position in the
+ * sweep line tree, the reality is because of rounding errors,
+ * it sometimes does.)
+ */
+
+
+ var SweepLine = /*#__PURE__*/function () {
+ function SweepLine(queue) {
+ var comparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Segment.compare;
+
+ _classCallCheck(this, SweepLine);
+
+ this.queue = queue;
+ this.tree = new Tree(comparator);
+ this.segments = [];
+ }
+
+ _createClass(SweepLine, [{
+ key: "process",
+ value: function process(event) {
+ var segment = event.segment;
+ var newEvents = []; // if we've already been consumed by another segment,
+ // clean up our body parts and get out
+
+ if (event.consumedBy) {
+ if (event.isLeft) this.queue.remove(event.otherSE);else this.tree.remove(segment);
+ return newEvents;
+ }
+
+ var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);
+ if (!node) 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.');
+ var prevNode = node;
+ var nextNode = node;
+ var prevSeg = undefined;
+ var nextSeg = undefined; // skip consumed segments still in tree
+
+ while (prevSeg === undefined) {
+ prevNode = this.tree.prev(prevNode);
+ if (prevNode === null) prevSeg = null;else if (prevNode.key.consumedBy === undefined) prevSeg = prevNode.key;
+ } // skip consumed segments still in tree
+
+
+ while (nextSeg === undefined) {
+ nextNode = this.tree.next(nextNode);
+ if (nextNode === null) nextSeg = null;else if (nextNode.key.consumedBy === undefined) nextSeg = nextNode.key;
+ }
+
+ if (event.isLeft) {
+ // Check for intersections against the previous segment in the sweep line
+ var prevMySplitter = null;
+
+ if (prevSeg) {
+ var prevInter = prevSeg.getIntersection(segment);
+
+ if (prevInter !== null) {
+ if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter;
+
+ if (!prevSeg.isAnEndpoint(prevInter)) {
+ var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);
+
+ for (var i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {
+ newEvents.push(newEventsFromSplit[i]);
+ }
+ }
+ }
+ } // Check for intersections against the next segment in the sweep line
+
+
+ var nextMySplitter = null;
+
+ if (nextSeg) {
+ var nextInter = nextSeg.getIntersection(segment);
+
+ if (nextInter !== null) {
+ if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter;
+
+ if (!nextSeg.isAnEndpoint(nextInter)) {
+ var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);
+
+ for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {
+ newEvents.push(_newEventsFromSplit[_i]);
+ }
+ }
+ }
+ } // For simplicity, even if we find more than one intersection we only
+ // spilt on the 'earliest' (sweep-line style) of the intersections.
+ // The other intersection will be handled in a future process().
+
+
+ if (prevMySplitter !== null || nextMySplitter !== null) {
+ var mySplitter = null;
+ if (prevMySplitter === null) mySplitter = nextMySplitter;else if (nextMySplitter === null) mySplitter = prevMySplitter;else {
+ var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);
+ mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter;
+ } // Rounding errors can cause changes in ordering,
+ // so remove afected segments and right sweep events before splitting
+
+ this.queue.remove(segment.rightSE);
+ newEvents.push(segment.rightSE);
+
+ var _newEventsFromSplit2 = segment.split(mySplitter);
+
+ for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {
+ newEvents.push(_newEventsFromSplit2[_i2]);
+ }
+ }
+
+ if (newEvents.length > 0) {
+ // We found some intersections, so re-do the current event to
+ // make sure sweep line ordering is totally consistent for later
+ // use with the segment 'prev' pointers
+ this.tree.remove(segment);
+ newEvents.push(event);
+ } else {
+ // done with left event
+ this.segments.push(segment);
+ segment.prev = prevSeg;
+ }
+ } else {
+ // event.isRight
+ // since we're about to be removed from the sweep line, check for
+ // intersections between our previous and next segments
+ if (prevSeg && nextSeg) {
+ var inter = prevSeg.getIntersection(nextSeg);
+
+ if (inter !== null) {
+ if (!prevSeg.isAnEndpoint(inter)) {
+ var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);
+
+ for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {
+ newEvents.push(_newEventsFromSplit3[_i3]);
+ }
+ }
+
+ if (!nextSeg.isAnEndpoint(inter)) {
+ var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);
+
+ for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {
+ newEvents.push(_newEventsFromSplit4[_i4]);
+ }
+ }
+ }
+ }
+
+ this.tree.remove(segment);
+ }
+
+ return newEvents;
+ }
+ /* Safely split a segment that is currently in the datastructures
+ * IE - a segment other than the one that is currently being processed. */
+
+ }, {
+ key: "_splitSafely",
+ value: function _splitSafely(seg, pt) {
+ // Rounding errors can cause changes in ordering,
+ // so remove afected segments and right sweep events before splitting
+ // removeNode() doesn't work, so have re-find the seg
+ // https://github.com/w8r/splay-tree/pull/5
+ this.tree.remove(seg);
+ var rightSE = seg.rightSE;
+ this.queue.remove(rightSE);
+ var newEvents = seg.split(pt);
+ newEvents.push(rightSE); // splitting can trigger consumption
+
+ if (seg.consumedBy === undefined) this.tree.insert(seg);
+ return newEvents;
+ }
+ }]);
+
+ return SweepLine;
+ }();
+
+ var POLYGON_CLIPPING_MAX_QUEUE_SIZE = typeof process !== 'undefined' && process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE || 1000000;
+ var POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS = typeof process !== 'undefined' && process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS || 1000000;
+
+ var Operation = /*#__PURE__*/function () {
+ function Operation() {
+ _classCallCheck(this, Operation);
+ }
+
+ _createClass(Operation, [{
+ key: "run",
+ value: function run(type, geom, moreGeoms) {
+ operation.type = type;
+ rounder.reset();
+ /* Convert inputs to MultiPoly objects */
+
+ var multipolys = [new MultiPolyIn(geom, true)];
+
+ for (var i = 0, iMax = moreGeoms.length; i < iMax; i++) {
+ multipolys.push(new MultiPolyIn(moreGeoms[i], false));
+ }
+
+ operation.numMultiPolys = multipolys.length;
+ /* BBox optimization for difference operation
+ * If the bbox of a multipolygon that's part of the clipping doesn't
+ * intersect the bbox of the subject at all, we can just drop that
+ * multiploygon. */
+
+ if (operation.type === 'difference') {
+ // in place removal
+ var subject = multipolys[0];
+ var _i = 1;
+
+ while (_i < multipolys.length) {
+ if (getBboxOverlap(multipolys[_i].bbox, subject.bbox) !== null) _i++;else multipolys.splice(_i, 1);
+ }
+ }
+ /* BBox optimization for intersection operation
+ * If we can find any pair of multipolygons whose bbox does not overlap,
+ * then the result will be empty. */
+
+
+ if (operation.type === 'intersection') {
+ // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,
+ // it could be optimized to O(n * ln(n))
+ for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) {
+ var mpA = multipolys[_i2];
+
+ for (var j = _i2 + 1, jMax = multipolys.length; j < jMax; j++) {
+ if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return [];
+ }
+ }
+ }
+ /* Put segment endpoints in a priority queue */
+
+
+ var queue = new Tree(SweepEvent.compare);
+
+ for (var _i3 = 0, _iMax2 = multipolys.length; _i3 < _iMax2; _i3++) {
+ var sweepEvents = multipolys[_i3].getSweepEvents();
+
+ for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {
+ queue.insert(sweepEvents[_j]);
+
+ if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
+ // prevents an infinite loop, an otherwise common manifestation of bugs
+ throw new Error('Infinite loop when putting segment endpoints in a priority queue ' + '(queue size too big). Please file a bug report.');
+ }
+ }
+ }
+ /* Pass the sweep line over those endpoints */
+
+
+ var sweepLine = new SweepLine(queue);
+ var prevQueueSize = queue.size;
+ var node = queue.pop();
+
+ while (node) {
+ var evt = node.key;
+
+ if (queue.size === prevQueueSize) {
+ // prevents an infinite loop, an otherwise common manifestation of bugs
+ var seg = evt.segment;
+ 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.');
+ }
+
+ if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
+ // prevents an infinite loop, an otherwise common manifestation of bugs
+ throw new Error('Infinite loop when passing sweep line over endpoints ' + '(queue size too big). Please file a bug report.');
+ }
+
+ if (sweepLine.segments.length > POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS) {
+ // prevents an infinite loop, an otherwise common manifestation of bugs
+ throw new Error('Infinite loop when passing sweep line over endpoints ' + '(too many sweep line segments). Please file a bug report.');
+ }
+
+ var newEvents = sweepLine.process(evt);
+
+ for (var _i4 = 0, _iMax3 = newEvents.length; _i4 < _iMax3; _i4++) {
+ var _evt = newEvents[_i4];
+ if (_evt.consumedBy === undefined) queue.insert(_evt);
+ }
+
+ prevQueueSize = queue.size;
+ node = queue.pop();
+ } // free some memory we don't need anymore
+
+
+ rounder.reset();
+ /* Collect and compile segments we're keeping into a multipolygon */
+
+ var ringsOut = RingOut.factory(sweepLine.segments);
+ var result = new MultiPolyOut(ringsOut);
+ return result.getGeom();
+ }
+ }]);
+
+ return Operation;
+ }(); // singleton available by import
+
+
+ var operation = new Operation();
+
+ var union = function union(geom) {
+ for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ moreGeoms[_key - 1] = arguments[_key];
+ }
+
+ return operation.run('union', geom, moreGeoms);
+ };
+
+ var intersection$1 = function intersection(geom) {
+ for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ moreGeoms[_key2 - 1] = arguments[_key2];
+ }
+
+ return operation.run('intersection', geom, moreGeoms);
+ };
+
+ var xor = function xor(geom) {
+ for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
+ moreGeoms[_key3 - 1] = arguments[_key3];
+ }
+
+ return operation.run('xor', geom, moreGeoms);
+ };
+
+ var difference = function difference(subjectGeom) {
+ for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
+ clippingGeoms[_key4 - 1] = arguments[_key4];
+ }
+
+ return operation.run('difference', subjectGeom, clippingGeoms);
+ };
+
+ var index = {
+ union: union,
+ intersection: intersection$1,
+ xor: xor,
+ difference: difference
+ };
+
+ var geojsonPrecision = {exports: {}};
+
+ (function () {
+ function parse(t, coordinatePrecision, extrasPrecision) {
+ function point(p) {
+ return p.map(function (e, index) {
+ if (index < 2) {
+ return 1 * e.toFixed(coordinatePrecision);
+ } else {
+ return 1 * e.toFixed(extrasPrecision);
+ }
+ });
+ }
+
+ function multi(l) {
+ return l.map(point);
+ }
+
+ function poly(p) {
+ return p.map(multi);
+ }
+
+ function multiPoly(m) {
+ return m.map(poly);
+ }
+
+ function geometry(obj) {
+ if (!obj) {
+ return {};
+ }
+
+ switch (obj.type) {
+ case "Point":
+ obj.coordinates = point(obj.coordinates);
+ return obj;
+
+ case "LineString":
+ case "MultiPoint":
+ obj.coordinates = multi(obj.coordinates);
+ return obj;
+
+ case "Polygon":
+ case "MultiLineString":
+ obj.coordinates = poly(obj.coordinates);
+ return obj;
+
+ case "MultiPolygon":
+ obj.coordinates = multiPoly(obj.coordinates);
+ return obj;
+
+ case "GeometryCollection":
+ obj.geometries = obj.geometries.map(geometry);
+ return obj;
+
+ default:
+ return {};
+ }
+ }
+
+ function feature(obj) {
+ obj.geometry = geometry(obj.geometry);
+ return obj;
+ }
+
+ function featureCollection(f) {
+ f.features = f.features.map(feature);
+ return f;
+ }
+
+ function geometryCollection(g) {
+ g.geometries = g.geometries.map(geometry);
+ return g;
+ }
+
+ if (!t) {
+ return t;
+ }
+
+ switch (t.type) {
+ case "Feature":
+ return feature(t);
+
+ case "GeometryCollection":
+ return geometryCollection(t);
+
+ case "FeatureCollection":
+ return featureCollection(t);
+
+ case "Point":
+ case "LineString":
+ case "Polygon":
+ case "MultiPoint":
+ case "MultiPolygon":
+ case "MultiLineString":
+ return geometry(t);
+
+ default:
+ return t;
+ }
+ }
+
+ geojsonPrecision.exports = parse;
+ geojsonPrecision.exports.parse = parse;
+ })();
+
+ var precision = geojsonPrecision.exports;
+
+ var $$k = _export;
+ var fails$5 = fails$V;
+ var toObject$1 = toObject$i;
+ var toPrimitive = toPrimitive$3;
+
+ var FORCED$5 = fails$5(function () {
+ return new Date(NaN).toJSON() !== null
+ || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;
+ });
+
+ // `Date.prototype.toJSON` method
+ // https://tc39.es/ecma262/#sec-date.prototype.tojson
+ $$k({ target: 'Date', proto: true, forced: FORCED$5 }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ toJSON: function toJSON(key) {
+ var O = toObject$1(this);
+ var pv = toPrimitive(O, 'number');
+ return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
+ }
+ });
+
+ var $$j = _export;
+ var call = functionCall;
+
+ // `URL.prototype.toJSON` method
+ // https://url.spec.whatwg.org/#dom-url-tojson
+ $$j({ target: 'URL', proto: true, enumerable: true }, {
+ toJSON: function toJSON() {
+ return call(URL.prototype.toString, this);
+ }
+ });
+
+ function isObject$3(obj) {
+ return _typeof(obj) === 'object' && obj !== null;
+ }
+
+ function forEach(obj, cb) {
+ if (Array.isArray(obj)) {
+ obj.forEach(cb);
+ } else if (isObject$3(obj)) {
+ Object.keys(obj).forEach(function (key) {
+ var val = obj[key];
+ cb(val, key);
+ });
+ }
+ }
+
+ function getTreeDepth(obj) {
+ var depth = 0;
+
+ if (Array.isArray(obj) || isObject$3(obj)) {
+ forEach(obj, function (val) {
+ if (Array.isArray(val) || isObject$3(val)) {
+ var tmpDepth = getTreeDepth(val);
+
+ if (tmpDepth > depth) {
+ depth = tmpDepth;
+ }
+ }
+ });
+ return depth + 1;
+ }
+
+ return depth;
+ }
+
+ function stringify(obj, options) {
+ options = options || {};
+ var indent = JSON.stringify([1], null, get(options, 'indent', 2)).slice(2, -3);
+ var addMargin = get(options, 'margins', false);
+ var addArrayMargin = get(options, 'arrayMargins', false);
+ var addObjectMargin = get(options, 'objectMargins', false);
+ var maxLength = indent === '' ? Infinity : get(options, 'maxLength', 80);
+ var maxNesting = get(options, 'maxNesting', Infinity);
+ return function _stringify(obj, currentIndent, reserved) {
+ if (obj && typeof obj.toJSON === 'function') {
+ obj = obj.toJSON();
+ }
+
+ var string = JSON.stringify(obj);
+
+ if (string === undefined) {
+ return string;
+ }
+
+ var length = maxLength - currentIndent.length - reserved;
+ var treeDepth = getTreeDepth(obj);
+
+ if (treeDepth <= maxNesting && string.length <= length) {
+ var prettified = prettify(string, {
+ addMargin: addMargin,
+ addArrayMargin: addArrayMargin,
+ addObjectMargin: addObjectMargin
+ });
+
+ if (prettified.length <= length) {
+ return prettified;
+ }
+ }
+
+ if (isObject$3(obj)) {
+ var nextIndent = currentIndent + indent;
+ var items = [];
+ var delimiters;
+
+ var comma = function comma(array, index) {
+ return index === array.length - 1 ? 0 : 1;
+ };
+
+ if (Array.isArray(obj)) {
+ for (var index = 0; index < obj.length; index++) {
+ items.push(_stringify(obj[index], nextIndent, comma(obj, index)) || 'null');
+ }
+
+ delimiters = '[]';
+ } else {
+ Object.keys(obj).forEach(function (key, index, array) {
+ var keyPart = JSON.stringify(key) + ': ';
+
+ var value = _stringify(obj[key], nextIndent, keyPart.length + comma(array, index));
+
+ if (value !== undefined) {
+ items.push(keyPart + value);
+ }
+ });
+ delimiters = '{}';
+ }
+
+ if (items.length > 0) {
+ return [delimiters[0], indent + items.join(',\n' + nextIndent), delimiters[1]].join('\n' + currentIndent);
+ }
+ }
+
+ return string;
+ }(obj, '', 0);
+ } // Note: This regex matches even invalid JSON strings, but since weâre
+ // working on the output of `JSON.stringify` we know that only valid strings
+ // are present (unless the user supplied a weird `options.indent` but in
+ // that case we donât care since the output would be invalid anyway).
+
+
+ var stringOrChar = /("(?:[^\\"]|\\.)*")|[:,\][}{]/g;
+
+ function prettify(string, options) {
+ options = options || {};
+ var tokens = {
+ '{': '{',
+ '}': '}',
+ '[': '[',
+ ']': ']',
+ ',': ', ',
+ ':': ': '
+ };
+
+ if (options.addMargin || options.addObjectMargin) {
+ tokens['{'] = '{ ';
+ tokens['}'] = ' }';
+ }
+
+ if (options.addMargin || options.addArrayMargin) {
+ tokens['['] = '[ ';
+ tokens[']'] = ' ]';
+ }
+
+ return string.replace(stringOrChar, function (match, string) {
+ return string ? match : tokens[match];
+ });
+ }
+
+ function get(options, name, defaultValue) {
+ return name in options ? options[name] : defaultValue;
+ }
+
+ var jsonStringifyPrettyCompact = stringify;
+
+ var _default = /*#__PURE__*/function () {
+ // constructor
+ //
+ // `fc` Optional FeatureCollection of known features
+ //
+ // Optionally pass a GeoJSON FeatureCollection of known features which we can refer to later.
+ // Each feature must have a filename-like `id`, for example: `something.geojson`
+ //
+ // {
+ // "type": "FeatureCollection"
+ // "features": [
+ // {
+ // "type": "Feature",
+ // "id": "philly_metro.geojson",
+ // "properties": { ⦠},
+ // "geometry": { ⦠}
+ // }
+ // ]
+ // }
+ function _default(fc) {
+ var _this = this;
+
+ _classCallCheck$1(this, _default);
+
+ // The _cache retains resolved features, so if you ask for the same thing multiple times
+ // we don't repeat the expensive resolving/clipping operations.
+ //
+ // Each feature has a stable identifier that is used as the cache key.
+ // The identifiers look like:
+ // - for point locations, the stringified point: e.g. '[8.67039,49.41882]'
+ // - for geojson locations, the geojson id: e.g. 'de-hamburg.geojson'
+ // - for countrycoder locations, feature.id property: e.g. 'Q2' (countrycoder uses Wikidata identifiers)
+ // - for aggregated locationSets, +[include]-[exclude]: e.g '+[Q2]-[Q18,Q27611]'
+ this._cache = {}; // When strict mode = true, throw on invalid locations or locationSets.
+ // When strict mode = false, return `null` for invalid locations or locationSets.
+
+ this._strict = true; // process input FeatureCollection
+
+ if (fc && fc.type === 'FeatureCollection' && Array.isArray(fc.features)) {
+ fc.features.forEach(function (feature) {
+ feature.properties = feature.properties || {};
+ var props = feature.properties; // Get `id` from either `id` or `properties`
+
+ var id = feature.id || props.id;
+ if (!id || !/^\S+\.geojson$/i.test(id)) return; // Ensure `id` exists and is lowercase
+
+ id = id.toLowerCase();
+ feature.id = id;
+ props.id = id; // Ensure `area` property exists
+
+ if (!props.area) {
+ var area = geojsonArea.geometry(feature.geometry) / 1e6; // m² to km²
+
+ props.area = Number(area.toFixed(2));
+ }
+
+ _this._cache[id] = feature;
+ });
+ } // Replace CountryCoder world geometry to be a polygon covering the world.
+
+
+ var world = _cloneDeep(feature$1('Q2'));
+
+ world.geometry = {
+ type: 'Polygon',
+ coordinates: [[[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]]]
+ };
+ world.id = 'Q2';
+ world.properties.id = 'Q2';
+ world.properties.area = geojsonArea.geometry(world.geometry) / 1e6; // m² to km²
+
+ this._cache.Q2 = world;
+ } // validateLocation
+ // `location` The location to validate
+ //
+ // Pass a `location` value to validate
+ //
+ // Returns a result like:
+ // {
+ // type: 'point', 'geojson', or 'countrycoder'
+ // location: the queried location
+ // id: the stable identifier for the feature
+ // }
+ // or `null` if the location is invalid
+ //
+
+
+ _createClass$1(_default, [{
+ key: "validateLocation",
+ value: function validateLocation(location) {
+ if (Array.isArray(location) && (location.length === 2 || location.length === 3)) {
+ // [lon, lat] or [lon, lat, radius] point?
+ var lon = location[0];
+ var lat = location[1];
+ var radius = location[2];
+
+ if (Number.isFinite(lon) && lon >= -180 && lon <= 180 && Number.isFinite(lat) && lat >= -90 && lat <= 90 && (location.length === 2 || Number.isFinite(radius) && radius > 0)) {
+ var id = '[' + location.toString() + ']';
+ return {
+ type: 'point',
+ location: location,
+ id: id
+ };
+ }
+ } else if (typeof location === 'string' && /^\S+\.geojson$/i.test(location)) {
+ // a .geojson filename?
+ var _id = location.toLowerCase();
+
+ if (this._cache[_id]) {
+ return {
+ type: 'geojson',
+ location: location,
+ id: _id
+ };
+ }
+ } else if (typeof location === 'string' || typeof location === 'number') {
+ // a country-coder value?
+ var feature = feature$1(location);
+
+ if (feature) {
+ // Use wikidata QID as the identifier, since that seems to be the one
+ // property that everything in CountryCoder is guaranteed to have.
+ var _id2 = feature.properties.wikidata;
+ return {
+ type: 'countrycoder',
+ location: location,
+ id: _id2
+ };
+ }
+ }
+
+ if (this._strict) {
+ throw new Error("validateLocation: Invalid location: \"".concat(location, "\"."));
+ } else {
+ return null;
+ }
+ } // resolveLocation
+ // `location` The location to resolve
+ //
+ // Pass a `location` value to resolve
+ //
+ // Returns a result like:
+ // {
+ // type: 'point', 'geojson', or 'countrycoder'
+ // location: the queried location
+ // id: a stable identifier for the feature
+ // feature: the resolved GeoJSON feature
+ // }
+ // or `null` if the location is invalid
+ //
+
+ }, {
+ key: "resolveLocation",
+ value: function resolveLocation(location) {
+ var valid = this.validateLocation(location);
+ if (!valid) return null;
+ var id = valid.id; // Return a result from cache if we can
+
+ if (this._cache[id]) {
+ return Object.assign(valid, {
+ feature: this._cache[id]
+ });
+ } // A [lon,lat] coordinate pair?
+
+
+ if (valid.type === 'point') {
+ var lon = location[0];
+ var lat = location[1];
+ var radius = location[2] || 25; // km
+
+ var EDGES = 10;
+ var PRECISION = 3;
+ var area = Math.PI * radius * radius;
+ var feature = this._cache[id] = precision({
+ type: 'Feature',
+ id: id,
+ properties: {
+ id: id,
+ area: Number(area.toFixed(2))
+ },
+ geometry: circleToPolygon([lon, lat], radius * 1000, EDGES) // km to m
+
+ }, PRECISION);
+ return Object.assign(valid, {
+ feature: feature
+ }); // A .geojson filename?
+ } else if (valid.type === 'geojson') ; else if (valid.type === 'countrycoder') {
+ var _feature = _cloneDeep(feature$1(id));
+
+ var props = _feature.properties; // -> This block of code is weird and requires some explanation. <-
+ // CountryCoder includes higher level features which are made up of members.
+ // These features don't have their own geometry, but CountryCoder provides an
+ // `aggregateFeature` method to combine these members into a MultiPolygon.
+ // In the past, Turf/JSTS/martinez could not handle the aggregated features,
+ // so we'd iteratively union them all together. (this was slow)
+ // But now mfogel/polygon-clipping handles these MultiPolygons like a boss.
+ // This approach also has the benefit of removing all the internal boaders and
+ // simplifying the regional polygons a lot.
+
+ if (Array.isArray(props.members)) {
+ var aggregate = aggregateFeature(id);
+ aggregate.geometry.coordinates = _clip([aggregate], 'UNION').geometry.coordinates;
+ _feature.geometry = aggregate.geometry;
+ } // Ensure `area` property exists
+
+
+ if (!props.area) {
+ var _area = geojsonArea.geometry(_feature.geometry) / 1e6; // m² to km²
+
+
+ props.area = Number(_area.toFixed(2));
+ } // Ensure `id` property exists
+
+
+ _feature.id = id;
+ props.id = id;
+ this._cache[id] = _feature;
+ return Object.assign(valid, {
+ feature: _feature
+ });
+ }
+
+ if (this._strict) {
+ throw new Error("resolveLocation: Couldn't resolve location \"".concat(location, "\"."));
+ } else {
+ return null;
+ }
+ } // validateLocationSet
+ // `locationSet` the locationSet to validate
+ //
+ // Pass a locationSet Object to validate like:
+ // {
+ // include: [ Array of locations ],
+ // exclude: [ Array of locations ]
+ // }
+ //
+ // Returns a result like:
+ // {
+ // type: 'locationset'
+ // locationSet: the queried locationSet
+ // id: the stable identifier for the feature
+ // }
+ // or `null` if the locationSet is invalid
+ //
+
+ }, {
+ key: "validateLocationSet",
+ value: function validateLocationSet(locationSet) {
+ locationSet = locationSet || {};
+ var validator = this.validateLocation.bind(this);
+ var include = (locationSet.include || []).map(validator).filter(Boolean);
+ var exclude = (locationSet.exclude || []).map(validator).filter(Boolean);
+
+ if (!include.length) {
+ if (this._strict) {
+ throw new Error("validateLocationSet: LocationSet includes nothing.");
+ } else {
+ // non-strict mode, replace an empty locationSet with one that includes "the world"
+ locationSet.include = ['Q2'];
+ include = [{
+ type: 'countrycoder',
+ location: 'Q2',
+ id: 'Q2'
+ }];
+ }
+ } // Generate stable identifier
+
+
+ include.sort(_sortLocations);
+ var id = '+[' + include.map(function (d) {
+ return d.id;
+ }).join(',') + ']';
+
+ if (exclude.length) {
+ exclude.sort(_sortLocations);
+ id += '-[' + exclude.map(function (d) {
+ return d.id;
+ }).join(',') + ']';
+ }
+
+ return {
+ type: 'locationset',
+ locationSet: locationSet,
+ id: id
+ };
+ } // resolveLocationSet
+ // `locationSet` the locationSet to resolve
+ //
+ // Pass a locationSet Object to validate like:
+ // {
+ // include: [ Array of locations ],
+ // exclude: [ Array of locations ]
+ // }
+ //
+ // Returns a result like:
+ // {
+ // type: 'locationset'
+ // locationSet: the queried locationSet
+ // id: the stable identifier for the feature
+ // feature: the resolved GeoJSON feature
+ // }
+ // or `null` if the locationSet is invalid
+ //
+
+ }, {
+ key: "resolveLocationSet",
+ value: function resolveLocationSet(locationSet) {
+ locationSet = locationSet || {};
+ var valid = this.validateLocationSet(locationSet);
+ if (!valid) return null;
+ var id = valid.id; // Return a result from cache if we can
+
+ if (this._cache[id]) {
+ return Object.assign(valid, {
+ feature: this._cache[id]
+ });
+ }
+
+ var resolver = this.resolveLocation.bind(this);
+ var includes = (locationSet.include || []).map(resolver).filter(Boolean);
+ var excludes = (locationSet.exclude || []).map(resolver).filter(Boolean); // Return quickly if it's a single included location..
+
+ if (includes.length === 1 && excludes.length === 0) {
+ return Object.assign(valid, {
+ feature: includes[0].feature
+ });
+ } // Calculate unions
+
+
+ var includeGeoJSON = _clip(includes.map(function (d) {
+ return d.feature;
+ }), 'UNION');
+
+ var excludeGeoJSON = _clip(excludes.map(function (d) {
+ return d.feature;
+ }), 'UNION'); // Calculate difference, update `area` and return result
+
+
+ var resultGeoJSON = excludeGeoJSON ? _clip([includeGeoJSON, excludeGeoJSON], 'DIFFERENCE') : includeGeoJSON;
+ var area = geojsonArea.geometry(resultGeoJSON.geometry) / 1e6; // m² to km²
+
+ resultGeoJSON.id = id;
+ resultGeoJSON.properties = {
+ id: id,
+ area: Number(area.toFixed(2))
+ };
+ this._cache[id] = resultGeoJSON;
+ return Object.assign(valid, {
+ feature: resultGeoJSON
+ });
+ } // strict
+ //
+
+ }, {
+ key: "strict",
+ value: function strict(val) {
+ if (val === undefined) {
+ // get
+ return this._strict;
+ } else {
+ // set
+ this._strict = val;
+ return this;
+ }
+ } // cache
+ // convenience method to access the internal cache
+
+ }, {
+ key: "cache",
+ value: function cache() {
+ return this._cache;
+ } // stringify
+ // convenience method to prettyStringify the given object
+
+ }, {
+ key: "stringify",
+ value: function stringify(obj, options) {
+ return jsonStringifyPrettyCompact(obj, options);
+ }
+ }]);
+
+ return _default;
+ }(); // Wrap the mfogel/polygon-clipping library and return a GeoJSON feature.
+
+ function _clip(features, which) {
+ if (!Array.isArray(features) || !features.length) return null;
+ var fn = {
+ UNION: index.union,
+ DIFFERENCE: index.difference
+ }[which];
+ var args = features.map(function (feature) {
+ return feature.geometry.coordinates;
+ });
+ var coords = fn.apply(null, args);
+ return {
+ type: 'Feature',
+ properties: {},
+ geometry: {
+ type: whichType(coords),
+ coordinates: coords
+ }
+ }; // is this a Polygon or a MultiPolygon?
+
+ function whichType(coords) {
+ var a = Array.isArray(coords);
+ var b = a && Array.isArray(coords[0]);
+ var c = b && Array.isArray(coords[0][0]);
+ var d = c && Array.isArray(coords[0][0][0]);
+ return d ? 'MultiPolygon' : 'Polygon';
+ }
+ }
+
+ function _cloneDeep(obj) {
+ return JSON.parse(JSON.stringify(obj));
+ } // Sorting the location lists is ok because they end up unioned together.
+ // This sorting makes it possible to generate a deterministic id.
+
+
+ function _sortLocations(a, b) {
+ var rank = {
+ countrycoder: 1,
+ geojson: 2,
+ point: 3
+ };
+ var aRank = rank[a.type];
+ var bRank = rank[b.type];
+ return aRank > bRank ? 1 : aRank < bRank ? -1 : a.id.localeCompare(b.id);
+ }
+
+ var $$i = _export;
+
+ // `Number.MAX_SAFE_INTEGER` constant
+ // https://tc39.es/ecma262/#sec-number.max_safe_integer
+ $$i({ target: 'Number', stat: true }, {
+ MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF
+ });
+
+ var aesJs = {exports: {}};
+
+ (function (module, exports) {
+ (function (root) {
+
+ function checkInt(value) {
+ return parseInt(value) === value;
+ }
+
+ function checkInts(arrayish) {
+ if (!checkInt(arrayish.length)) {
+ return false;
+ }
+
+ for (var i = 0; i < arrayish.length; i++) {
+ if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function coerceArray(arg, copy) {
+ // ArrayBuffer view
+ if (arg.buffer && arg.name === 'Uint8Array') {
+ if (copy) {
+ if (arg.slice) {
+ arg = arg.slice();
+ } else {
+ arg = Array.prototype.slice.call(arg);
+ }
+ }
+
+ return arg;
+ } // It's an array; check it is a valid representation of a byte
+
+
+ if (Array.isArray(arg)) {
+ if (!checkInts(arg)) {
+ throw new Error('Array contains invalid value: ' + arg);
+ }
+
+ return new Uint8Array(arg);
+ } // Something else, but behaves like an array (maybe a Buffer? Arguments?)
+
+
+ if (checkInt(arg.length) && checkInts(arg)) {
+ return new Uint8Array(arg);
+ }
+
+ throw new Error('unsupported array-like object');
+ }
+
+ function createArray(length) {
+ return new Uint8Array(length);
+ }
+
+ function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {
+ if (sourceStart != null || sourceEnd != null) {
+ if (sourceArray.slice) {
+ sourceArray = sourceArray.slice(sourceStart, sourceEnd);
+ } else {
+ sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);
+ }
+ }
+
+ targetArray.set(sourceArray, targetStart);
+ }
+
+ var convertUtf8 = function () {
+ function toBytes(text) {
+ var result = [],
+ i = 0;
+ text = encodeURI(text);
+
+ while (i < text.length) {
+ var c = text.charCodeAt(i++); // if it is a % sign, encode the following 2 bytes as a hex value
+
+ if (c === 37) {
+ result.push(parseInt(text.substr(i, 2), 16));
+ i += 2; // otherwise, just the actual byte
+ } else {
+ result.push(c);
+ }
+ }
+
+ return coerceArray(result);
+ }
+
+ function fromBytes(bytes) {
+ var result = [],
+ i = 0;
+
+ while (i < bytes.length) {
+ var c = bytes[i];
+
+ if (c < 128) {
+ result.push(String.fromCharCode(c));
+ i++;
+ } else if (c > 191 && c < 224) {
+ result.push(String.fromCharCode((c & 0x1f) << 6 | bytes[i + 1] & 0x3f));
+ i += 2;
+ } else {
+ result.push(String.fromCharCode((c & 0x0f) << 12 | (bytes[i + 1] & 0x3f) << 6 | bytes[i + 2] & 0x3f));
+ i += 3;
+ }
+ }
+
+ return result.join('');
+ }
+
+ return {
+ toBytes: toBytes,
+ fromBytes: fromBytes
+ };
+ }();
+
+ var convertHex = function () {
+ function toBytes(text) {
+ var result = [];
+
+ for (var i = 0; i < text.length; i += 2) {
+ result.push(parseInt(text.substr(i, 2), 16));
+ }
+
+ return result;
+ } // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html
+
+
+ var Hex = '0123456789abcdef';
+
+ function fromBytes(bytes) {
+ var result = [];
+
+ for (var i = 0; i < bytes.length; i++) {
+ var v = bytes[i];
+ result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]);
+ }
+
+ return result.join('');
+ }
+
+ return {
+ toBytes: toBytes,
+ fromBytes: fromBytes
+ };
+ }(); // Number of rounds by keysize
+
+
+ var numberOfRounds = {
+ 16: 10,
+ 24: 12,
+ 32: 14
+ }; // Round constant words
+
+ var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; // S-box and Inverse S-box (S is for Substitution)
+
+ var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];
+ var Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; // Transformations for encryption
+
+ var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a];
+ var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616];
+ var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16];
+ var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; // Transformations for decryption
+
+ var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742];
+ var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857];
+ var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8];
+ var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; // Transformations for decryption key expansion
+
+ var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3];
+ var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697];
+ var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46];
+ var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d];
+
+ function convertToInt32(bytes) {
+ var result = [];
+
+ for (var i = 0; i < bytes.length; i += 4) {
+ result.push(bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]);
+ }
+
+ return result;
+ }
+
+ var AES = function AES(key) {
+ if (!(this instanceof AES)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ Object.defineProperty(this, 'key', {
+ value: coerceArray(key, true)
+ });
+
+ this._prepare();
+ };
+
+ AES.prototype._prepare = function () {
+ var rounds = numberOfRounds[this.key.length];
+
+ if (rounds == null) {
+ throw new Error('invalid key size (must be 16, 24 or 32 bytes)');
+ } // encryption round keys
+
+
+ this._Ke = []; // decryption round keys
+
+ this._Kd = [];
+
+ for (var i = 0; i <= rounds; i++) {
+ this._Ke.push([0, 0, 0, 0]);
+
+ this._Kd.push([0, 0, 0, 0]);
+ }
+
+ var roundKeyCount = (rounds + 1) * 4;
+ var KC = this.key.length / 4; // convert the key into ints
+
+ var tk = convertToInt32(this.key); // copy values into round key arrays
+
+ var index;
+
+ for (var i = 0; i < KC; i++) {
+ index = i >> 2;
+ this._Ke[index][i % 4] = tk[i];
+ this._Kd[rounds - index][i % 4] = tk[i];
+ } // key expansion (fips-197 section 5.2)
+
+
+ var rconpointer = 0;
+ var t = KC,
+ tt;
+
+ while (t < roundKeyCount) {
+ tt = tk[KC - 1];
+ tk[0] ^= S[tt >> 16 & 0xFF] << 24 ^ S[tt >> 8 & 0xFF] << 16 ^ S[tt & 0xFF] << 8 ^ S[tt >> 24 & 0xFF] ^ rcon[rconpointer] << 24;
+ rconpointer += 1; // key expansion (for non-256 bit)
+
+ if (KC != 8) {
+ for (var i = 1; i < KC; i++) {
+ tk[i] ^= tk[i - 1];
+ } // key expansion for 256-bit keys is "slightly different" (fips-197)
+
+ } else {
+ for (var i = 1; i < KC / 2; i++) {
+ tk[i] ^= tk[i - 1];
+ }
+
+ tt = tk[KC / 2 - 1];
+ tk[KC / 2] ^= S[tt & 0xFF] ^ S[tt >> 8 & 0xFF] << 8 ^ S[tt >> 16 & 0xFF] << 16 ^ S[tt >> 24 & 0xFF] << 24;
+
+ for (var i = KC / 2 + 1; i < KC; i++) {
+ tk[i] ^= tk[i - 1];
+ }
+ } // copy values into round key arrays
+
+
+ var i = 0,
+ r,
+ c;
+
+ while (i < KC && t < roundKeyCount) {
+ r = t >> 2;
+ c = t % 4;
+ this._Ke[r][c] = tk[i];
+ this._Kd[rounds - r][c] = tk[i++];
+ t++;
+ }
+ } // inverse-cipher-ify the decryption round key (fips-197 section 5.3)
+
+
+ for (var r = 1; r < rounds; r++) {
+ for (var c = 0; c < 4; c++) {
+ tt = this._Kd[r][c];
+ this._Kd[r][c] = U1[tt >> 24 & 0xFF] ^ U2[tt >> 16 & 0xFF] ^ U3[tt >> 8 & 0xFF] ^ U4[tt & 0xFF];
+ }
+ }
+ };
+
+ AES.prototype.encrypt = function (plaintext) {
+ if (plaintext.length != 16) {
+ throw new Error('invalid plaintext size (must be 16 bytes)');
+ }
+
+ var rounds = this._Ke.length - 1;
+ var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key)
+
+ var t = convertToInt32(plaintext);
+
+ for (var i = 0; i < 4; i++) {
+ t[i] ^= this._Ke[0][i];
+ } // apply round transforms
+
+
+ for (var r = 1; r < rounds; r++) {
+ for (var i = 0; i < 4; i++) {
+ a[i] = T1[t[i] >> 24 & 0xff] ^ T2[t[(i + 1) % 4] >> 16 & 0xff] ^ T3[t[(i + 2) % 4] >> 8 & 0xff] ^ T4[t[(i + 3) % 4] & 0xff] ^ this._Ke[r][i];
+ }
+
+ t = a.slice();
+ } // the last round is special
+
+
+ var result = createArray(16),
+ tt;
+
+ for (var i = 0; i < 4; i++) {
+ tt = this._Ke[rounds][i];
+ result[4 * i] = (S[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff;
+ result[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff;
+ result[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff;
+ result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff;
+ }
+
+ return result;
+ };
+
+ AES.prototype.decrypt = function (ciphertext) {
+ if (ciphertext.length != 16) {
+ throw new Error('invalid ciphertext size (must be 16 bytes)');
+ }
+
+ var rounds = this._Kd.length - 1;
+ var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key)
+
+ var t = convertToInt32(ciphertext);
+
+ for (var i = 0; i < 4; i++) {
+ t[i] ^= this._Kd[0][i];
+ } // apply round transforms
+
+
+ for (var r = 1; r < rounds; r++) {
+ for (var i = 0; i < 4; i++) {
+ a[i] = T5[t[i] >> 24 & 0xff] ^ T6[t[(i + 3) % 4] >> 16 & 0xff] ^ T7[t[(i + 2) % 4] >> 8 & 0xff] ^ T8[t[(i + 1) % 4] & 0xff] ^ this._Kd[r][i];
+ }
+
+ t = a.slice();
+ } // the last round is special
+
+
+ var result = createArray(16),
+ tt;
+
+ for (var i = 0; i < 4; i++) {
+ tt = this._Kd[rounds][i];
+ result[4 * i] = (Si[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff;
+ result[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff;
+ result[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff;
+ result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff;
+ }
+
+ return result;
+ };
+ /**
+ * Mode Of Operation - Electonic Codebook (ECB)
+ */
+
+
+ var ModeOfOperationECB = function ModeOfOperationECB(key) {
+ if (!(this instanceof ModeOfOperationECB)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Electronic Code Block";
+ this.name = "ecb";
+ this._aes = new AES(key);
+ };
+
+ ModeOfOperationECB.prototype.encrypt = function (plaintext) {
+ plaintext = coerceArray(plaintext);
+
+ if (plaintext.length % 16 !== 0) {
+ throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
+ }
+
+ var ciphertext = createArray(plaintext.length);
+ var block = createArray(16);
+
+ for (var i = 0; i < plaintext.length; i += 16) {
+ copyArray(plaintext, block, 0, i, i + 16);
+ block = this._aes.encrypt(block);
+ copyArray(block, ciphertext, i);
+ }
+
+ return ciphertext;
+ };
+
+ ModeOfOperationECB.prototype.decrypt = function (ciphertext) {
+ ciphertext = coerceArray(ciphertext);
+
+ if (ciphertext.length % 16 !== 0) {
+ throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
+ }
+
+ var plaintext = createArray(ciphertext.length);
+ var block = createArray(16);
+
+ for (var i = 0; i < ciphertext.length; i += 16) {
+ copyArray(ciphertext, block, 0, i, i + 16);
+ block = this._aes.decrypt(block);
+ copyArray(block, plaintext, i);
+ }
+
+ return plaintext;
+ };
+ /**
+ * Mode Of Operation - Cipher Block Chaining (CBC)
+ */
+
+
+ var ModeOfOperationCBC = function ModeOfOperationCBC(key, iv) {
+ if (!(this instanceof ModeOfOperationCBC)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Cipher Block Chaining";
+ this.name = "cbc";
+
+ if (!iv) {
+ iv = createArray(16);
+ } else if (iv.length != 16) {
+ throw new Error('invalid initialation vector size (must be 16 bytes)');
+ }
+
+ this._lastCipherblock = coerceArray(iv, true);
+ this._aes = new AES(key);
+ };
+
+ ModeOfOperationCBC.prototype.encrypt = function (plaintext) {
+ plaintext = coerceArray(plaintext);
+
+ if (plaintext.length % 16 !== 0) {
+ throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
+ }
+
+ var ciphertext = createArray(plaintext.length);
+ var block = createArray(16);
+
+ for (var i = 0; i < plaintext.length; i += 16) {
+ copyArray(plaintext, block, 0, i, i + 16);
+
+ for (var j = 0; j < 16; j++) {
+ block[j] ^= this._lastCipherblock[j];
+ }
+
+ this._lastCipherblock = this._aes.encrypt(block);
+ copyArray(this._lastCipherblock, ciphertext, i);
+ }
+
+ return ciphertext;
+ };
+
+ ModeOfOperationCBC.prototype.decrypt = function (ciphertext) {
+ ciphertext = coerceArray(ciphertext);
+
+ if (ciphertext.length % 16 !== 0) {
+ throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
+ }
+
+ var plaintext = createArray(ciphertext.length);
+ var block = createArray(16);
+
+ for (var i = 0; i < ciphertext.length; i += 16) {
+ copyArray(ciphertext, block, 0, i, i + 16);
+ block = this._aes.decrypt(block);
+
+ for (var j = 0; j < 16; j++) {
+ plaintext[i + j] = block[j] ^ this._lastCipherblock[j];
+ }
+
+ copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);
+ }
+
+ return plaintext;
+ };
+ /**
+ * Mode Of Operation - Cipher Feedback (CFB)
+ */
+
+
+ var ModeOfOperationCFB = function ModeOfOperationCFB(key, iv, segmentSize) {
+ if (!(this instanceof ModeOfOperationCFB)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Cipher Feedback";
+ this.name = "cfb";
+
+ if (!iv) {
+ iv = createArray(16);
+ } else if (iv.length != 16) {
+ throw new Error('invalid initialation vector size (must be 16 size)');
+ }
+
+ if (!segmentSize) {
+ segmentSize = 1;
+ }
+
+ this.segmentSize = segmentSize;
+ this._shiftRegister = coerceArray(iv, true);
+ this._aes = new AES(key);
+ };
+
+ ModeOfOperationCFB.prototype.encrypt = function (plaintext) {
+ if (plaintext.length % this.segmentSize != 0) {
+ throw new Error('invalid plaintext size (must be segmentSize bytes)');
+ }
+
+ var encrypted = coerceArray(plaintext, true);
+ var xorSegment;
+
+ for (var i = 0; i < encrypted.length; i += this.segmentSize) {
+ xorSegment = this._aes.encrypt(this._shiftRegister);
+
+ for (var j = 0; j < this.segmentSize; j++) {
+ encrypted[i + j] ^= xorSegment[j];
+ } // Shift the register
+
+
+ copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
+ copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
+ }
+
+ return encrypted;
+ };
+
+ ModeOfOperationCFB.prototype.decrypt = function (ciphertext) {
+ if (ciphertext.length % this.segmentSize != 0) {
+ throw new Error('invalid ciphertext size (must be segmentSize bytes)');
+ }
+
+ var plaintext = coerceArray(ciphertext, true);
+ var xorSegment;
+
+ for (var i = 0; i < plaintext.length; i += this.segmentSize) {
+ xorSegment = this._aes.encrypt(this._shiftRegister);
+
+ for (var j = 0; j < this.segmentSize; j++) {
+ plaintext[i + j] ^= xorSegment[j];
+ } // Shift the register
+
+
+ copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
+ copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
+ }
+
+ return plaintext;
+ };
+ /**
+ * Mode Of Operation - Output Feedback (OFB)
+ */
+
+
+ var ModeOfOperationOFB = function ModeOfOperationOFB(key, iv) {
+ if (!(this instanceof ModeOfOperationOFB)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Output Feedback";
+ this.name = "ofb";
+
+ if (!iv) {
+ iv = createArray(16);
+ } else if (iv.length != 16) {
+ throw new Error('invalid initialation vector size (must be 16 bytes)');
+ }
+
+ this._lastPrecipher = coerceArray(iv, true);
+ this._lastPrecipherIndex = 16;
+ this._aes = new AES(key);
+ };
+
+ ModeOfOperationOFB.prototype.encrypt = function (plaintext) {
+ var encrypted = coerceArray(plaintext, true);
+
+ for (var i = 0; i < encrypted.length; i++) {
+ if (this._lastPrecipherIndex === 16) {
+ this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);
+ this._lastPrecipherIndex = 0;
+ }
+
+ encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];
+ }
+
+ return encrypted;
+ }; // Decryption is symetric
+
+
+ ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;
+ /**
+ * Counter object for CTR common mode of operation
+ */
+
+ var Counter = function Counter(initialValue) {
+ if (!(this instanceof Counter)) {
+ throw Error('Counter must be instanitated with `new`');
+ } // We allow 0, but anything false-ish uses the default 1
+
+
+ if (initialValue !== 0 && !initialValue) {
+ initialValue = 1;
+ }
+
+ if (typeof initialValue === 'number') {
+ this._counter = createArray(16);
+ this.setValue(initialValue);
+ } else {
+ this.setBytes(initialValue);
+ }
+ };
+
+ Counter.prototype.setValue = function (value) {
+ if (typeof value !== 'number' || parseInt(value) != value) {
+ throw new Error('invalid counter value (must be an integer)');
+ } // We cannot safely handle numbers beyond the safe range for integers
+
+
+ if (value > Number.MAX_SAFE_INTEGER) {
+ throw new Error('integer value out of safe range');
+ }
+
+ for (var index = 15; index >= 0; --index) {
+ this._counter[index] = value % 256;
+ value = parseInt(value / 256);
+ }
+ };
+
+ Counter.prototype.setBytes = function (bytes) {
+ bytes = coerceArray(bytes, true);
+
+ if (bytes.length != 16) {
+ throw new Error('invalid counter bytes size (must be 16 bytes)');
+ }
+
+ this._counter = bytes;
+ };
+
+ Counter.prototype.increment = function () {
+ for (var i = 15; i >= 0; i--) {
+ if (this._counter[i] === 255) {
+ this._counter[i] = 0;
+ } else {
+ this._counter[i]++;
+ break;
+ }
+ }
+ };
+ /**
+ * Mode Of Operation - Counter (CTR)
+ */
+
+
+ var ModeOfOperationCTR = function ModeOfOperationCTR(key, counter) {
+ if (!(this instanceof ModeOfOperationCTR)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Counter";
+ this.name = "ctr";
+
+ if (!(counter instanceof Counter)) {
+ counter = new Counter(counter);
+ }
+
+ this._counter = counter;
+ this._remainingCounter = null;
+ this._remainingCounterIndex = 16;
+ this._aes = new AES(key);
+ };
+
+ ModeOfOperationCTR.prototype.encrypt = function (plaintext) {
+ var encrypted = coerceArray(plaintext, true);
+
+ for (var i = 0; i < encrypted.length; i++) {
+ if (this._remainingCounterIndex === 16) {
+ this._remainingCounter = this._aes.encrypt(this._counter._counter);
+ this._remainingCounterIndex = 0;
+
+ this._counter.increment();
+ }
+
+ encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];
+ }
+
+ return encrypted;
+ }; // Decryption is symetric
+
+
+ ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; ///////////////////////
+ // Padding
+ // See:https://tools.ietf.org/html/rfc2315
+
+ function pkcs7pad(data) {
+ data = coerceArray(data, true);
+ var padder = 16 - data.length % 16;
+ var result = createArray(data.length + padder);
+ copyArray(data, result);
+
+ for (var i = data.length; i < result.length; i++) {
+ result[i] = padder;
+ }
+
+ return result;
+ }
+
+ function pkcs7strip(data) {
+ data = coerceArray(data, true);
+
+ if (data.length < 16) {
+ throw new Error('PKCS#7 invalid length');
+ }
+
+ var padder = data[data.length - 1];
+
+ if (padder > 16) {
+ throw new Error('PKCS#7 padding byte out of range');
+ }
+
+ var length = data.length - padder;
+
+ for (var i = 0; i < padder; i++) {
+ if (data[length + i] !== padder) {
+ throw new Error('PKCS#7 invalid padding byte');
+ }
+ }
+
+ var result = createArray(length);
+ copyArray(data, result, 0, 0, length);
+ return result;
+ } ///////////////////////
+ // Exporting
+ // The block cipher
+
+
+ var aesjs = {
+ AES: AES,
+ Counter: Counter,
+ ModeOfOperation: {
+ ecb: ModeOfOperationECB,
+ cbc: ModeOfOperationCBC,
+ cfb: ModeOfOperationCFB,
+ ofb: ModeOfOperationOFB,
+ ctr: ModeOfOperationCTR
+ },
+ utils: {
+ hex: convertHex,
+ utf8: convertUtf8
+ },
+ padding: {
+ pkcs7: {
+ pad: pkcs7pad,
+ strip: pkcs7strip
+ }
+ },
+ _arrayTest: {
+ coerceArray: coerceArray,
+ createArray: createArray,
+ copyArray: copyArray
+ }
+ }; // node.js
+
+ {
+ module.exports = aesjs; // RequireJS/AMD
+ // http://www.requirejs.org/docs/api.html
+ // https://github.com/amdjs/amdjs-api/wiki/AMD
+ }
+ })();
+ })(aesJs);
+
+ var aesjs = aesJs.exports;
+
+ // We can use keys that are 128 bits (16 bytes), 192 bits (24 bytes) or 256 bits (32 bytes).
+ // To generate a random key: window.crypto.getRandomValues(new Uint8Array(16));
+ // This default signing key is built into iD and can be used to mask/unmask sensitive values.
+
+ var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208];
+ function utilAesEncrypt(text, key) {
+ key = key || DEFAULT_128;
+ var textBytes = aesjs.utils.utf8.toBytes(text);
+ var aesCtr = new aesjs.ModeOfOperation.ctr(key);
+ var encryptedBytes = aesCtr.encrypt(textBytes);
+ var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);
+ return encryptedHex;
+ }
+ function utilAesDecrypt(encryptedHex, key) {
+ key = key || DEFAULT_128;
+ var encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex);
+ var aesCtr = new aesjs.ModeOfOperation.ctr(key);
+ var decryptedBytes = aesCtr.decrypt(encryptedBytes);
+ var text = aesjs.utils.utf8.fromBytes(decryptedBytes);
+ return text;
+ }
+
+ function utilCleanTags(tags) {
+ var out = {};
+
+ for (var k in tags) {
+ if (!k) continue;
+ var v = tags[k];
+
+ if (v !== undefined) {
+ out[k] = cleanValue(k, v);
+ }
+ }
+
+ return out;
+
+ function cleanValue(k, v) {
+ function keepSpaces(k) {
+ return /_hours|_times|:conditional$/.test(k);
+ }
+
+ function skip(k) {
+ return /^(description|note|fixme)$/.test(k);
+ }
+
+ if (skip(k)) return v;
+ var cleaned = v.split(';').map(function (s) {
+ return s.trim();
+ }).join(keepSpaces(k) ? '; ' : ';'); // The code below is not intended to validate websites and emails.
+ // It is only intended to prevent obvious copy-paste errors. (#2323)
+ // clean website- and email-like tags
+
+ if (k.indexOf('website') !== -1 || k.indexOf('email') !== -1 || cleaned.indexOf('http') === 0) {
+ cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars
+ }
+
+ return cleaned;
+ }
+ }
+
+ var _detected;
+
+ function utilDetect(refresh) {
+ if (_detected && !refresh) return _detected;
+ _detected = {};
+ var ua = navigator.userAgent;
+ var m = null;
+ /* Browser */
+
+ m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge
+
+ if (m !== null) {
+ _detected.browser = m[1];
+ _detected.version = m[2];
+ }
+
+ if (!_detected.browser) {
+ m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11
+
+ if (m !== null) {
+ _detected.browser = 'msie';
+ _detected.version = m[1];
+ }
+ }
+
+ if (!_detected.browser) {
+ m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+
+
+ if (m !== null) {
+ _detected.browser = 'Opera';
+ _detected.version = m[2];
+ }
+ }
+
+ if (!_detected.browser) {
+ m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
+
+ if (m !== null) {
+ _detected.browser = m[1];
+ _detected.version = m[2];
+ m = ua.match(/version\/([\.\d]+)/i);
+ if (m !== null) _detected.version = m[1];
+ }
+ }
+
+ if (!_detected.browser) {
+ _detected.browser = navigator.appName;
+ _detected.version = navigator.appVersion;
+ } // keep major.minor version only..
+
+
+ _detected.version = _detected.version.split(/\W/).slice(0, 2).join('.'); // detect other browser capabilities
+ // Legacy Opera has incomplete svg style support. See #715
+
+ _detected.opera = _detected.browser.toLowerCase() === 'opera' && parseFloat(_detected.version) < 15;
+
+ if (_detected.browser.toLowerCase() === 'msie') {
+ _detected.ie = true;
+ _detected.browser = 'Internet Explorer';
+ _detected.support = parseFloat(_detected.version) >= 11;
+ } else {
+ _detected.ie = false;
+ _detected.support = true;
+ }
+
+ _detected.filedrop = window.FileReader && 'ondrop' in window;
+ _detected.download = !(_detected.ie || _detected.browser.toLowerCase() === 'edge');
+ _detected.cssfilters = !(_detected.ie || _detected.browser.toLowerCase() === 'edge');
+ /* Platform */
+
+ if (/Win/.test(ua)) {
+ _detected.os = 'win';
+ _detected.platform = 'Windows';
+ } else if (/Mac/.test(ua)) {
+ _detected.os = 'mac';
+ _detected.platform = 'Macintosh';
+ } else if (/X11/.test(ua) || /Linux/.test(ua)) {
+ _detected.os = 'linux';
+ _detected.platform = 'Linux';
+ } else {
+ _detected.os = 'win';
+ _detected.platform = 'Unknown';
+ }
+
+ _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || // HACK: iPadOS 13+ requests desktop sites by default by using a Mac user agent,
+ // so assume any "mac" with multitouch is actually iOS
+ navigator.platform === 'MacIntel' && 'maxTouchPoints' in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream;
+ /* Locale */
+ // An array of locales requested by the browser in priority order.
+
+ _detected.browserLocales = Array.from(new Set( // remove duplicates
+ [navigator.language].concat(navigator.languages || []).concat([// old property for backwards compatibility
+ navigator.userLanguage]) // remove any undefined values
+ .filter(Boolean)));
+ /* Host */
+
+ var loc = window.top.location;
+ var origin = loc.origin;
+
+ if (!origin) {
+ // for unpatched IE11
+ origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port : '');
+ }
+
+ _detected.host = origin + loc.pathname;
+ return _detected;
+ }
+
+ // Like selection.property('value', ...), but avoids no-op value sets,
+ // which can result in layout/repaint thrashing in some situations.
+
+ /** @returns {string} */
+ function utilGetSetValue(selection, value) {
+ function d3_selection_value(value) {
+ function valueNull() {
+ delete this.value;
+ }
+
+ function valueConstant() {
+ if (this.value !== value) {
+ this.value = value;
+ }
+ }
+
+ function valueFunction() {
+ var x = value.apply(this, arguments);
+
+ if (x === null || x === undefined) {
+ delete this.value;
+ } else if (this.value !== x) {
+ this.value = x;
+ }
+ }
+
+ return value === null || value === undefined ? valueNull : typeof value === 'function' ? valueFunction : valueConstant;
+ }
+
+ if (arguments.length === 1) {
+ return selection.property('value');
+ }
+
+ return selection.each(d3_selection_value(value));
+ }
+
+ function utilKeybinding(namespace) {
+ var _keybindings = {};
+
+ function testBindings(d3_event, isCapturing) {
+ var didMatch = false;
+ var bindings = Object.keys(_keybindings).map(function (id) {
+ return _keybindings[id];
+ });
+ var i, binding; // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
+ // so we don't strictly match on the shift key, but we prioritize
+ // shifted keybindings first, and fallback to unshifted only if no match.
+ // (This lets us differentiate between 'â'/'â§â' or 'âZ'/'ââ§Z')
+ // priority match shifted keybindings first
+
+ for (i = 0; i < bindings.length; i++) {
+ binding = bindings[i];
+ if (!binding.event.modifiers.shiftKey) continue; // no shift
+
+ if (!!binding.capture !== isCapturing) continue;
+
+ if (matches(d3_event, binding, true)) {
+ binding.callback(d3_event);
+ didMatch = true; // match a max of one binding per event
+
+ break;
+ }
+ }
+
+ if (didMatch) return; // then unshifted keybindings
+
+ for (i = 0; i < bindings.length; i++) {
+ binding = bindings[i];
+ if (binding.event.modifiers.shiftKey) continue; // shift
+
+ if (!!binding.capture !== isCapturing) continue;
+
+ if (matches(d3_event, binding, false)) {
+ binding.callback(d3_event);
+ break;
+ }
+ }
+
+ function matches(d3_event, binding, testShift) {
+ var event = d3_event;
+ var isMatch = false;
+ var tryKeyCode = true; // Prefer a match on `KeyboardEvent.key`
+
+ if (event.key !== undefined) {
+ tryKeyCode = event.key.charCodeAt(0) > 255; // outside ISO-Latin-1
+
+ isMatch = true;
+
+ if (binding.event.key === undefined) {
+ isMatch = false;
+ } else if (Array.isArray(binding.event.key)) {
+ if (binding.event.key.map(function (s) {
+ return s.toLowerCase();
+ }).indexOf(event.key.toLowerCase()) === -1) {
+ isMatch = false;
+ }
+ } else {
+ if (event.key.toLowerCase() !== binding.event.key.toLowerCase()) {
+ isMatch = false;
+ }
+ }
+ } // Fallback match on `KeyboardEvent.keyCode`, can happen if:
+ // - browser doesn't support `KeyboardEvent.key`
+ // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
+
+
+ if (!isMatch && tryKeyCode) {
+ isMatch = event.keyCode === binding.event.keyCode;
+ }
+
+ if (!isMatch) return false; // test modifier keys
+
+ if (!(event.ctrlKey && event.altKey)) {
+ // if both are set, assume AltGr and skip it - #4096
+ if (event.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
+ if (event.altKey !== binding.event.modifiers.altKey) return false;
+ }
+
+ if (event.metaKey !== binding.event.modifiers.metaKey) return false;
+ if (testShift && event.shiftKey !== binding.event.modifiers.shiftKey) return false;
+ return true;
+ }
+ }
+
+ function capture(d3_event) {
+ testBindings(d3_event, true);
+ }
+
+ function bubble(d3_event) {
+ var tagName = select(d3_event.target).node().tagName;
+
+ if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
+ return;
+ }
+
+ testBindings(d3_event, false);
+ }
+
+ function keybinding(selection) {
+ selection = selection || select(document);
+ selection.on('keydown.capture.' + namespace, capture, true);
+ selection.on('keydown.bubble.' + namespace, bubble, false);
+ return keybinding;
+ } // was: keybinding.off()
+
+
+ keybinding.unbind = function (selection) {
+ _keybindings = [];
+ selection = selection || select(document);
+ selection.on('keydown.capture.' + namespace, null);
+ selection.on('keydown.bubble.' + namespace, null);
+ return keybinding;
+ };
+
+ keybinding.clear = function () {
+ _keybindings = {};
+ return keybinding;
+ }; // Remove one or more keycode bindings.
+
+
+ keybinding.off = function (codes, capture) {
+ var arr = utilArrayUniq([].concat(codes));
+
+ for (var i = 0; i < arr.length; i++) {
+ var id = arr[i] + (capture ? '-capture' : '-bubble');
+ delete _keybindings[id];
+ }
+
+ return keybinding;
+ }; // Add one or more keycode bindings.
+
+
+ keybinding.on = function (codes, callback, capture) {
+ if (typeof callback !== 'function') {
+ return keybinding.off(codes, capture);
+ }
+
+ var arr = utilArrayUniq([].concat(codes));
+
+ for (var i = 0; i < arr.length; i++) {
+ var id = arr[i] + (capture ? '-capture' : '-bubble');
+ var binding = {
+ id: id,
+ capture: capture,
+ callback: callback,
+ event: {
+ key: undefined,
+ // preferred
+ keyCode: 0,
+ // fallback
+ modifiers: {
+ shiftKey: false,
+ ctrlKey: false,
+ altKey: false,
+ metaKey: false
+ }
+ }
+ };
+
+ if (_keybindings[id]) {
+ console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
+ }
+
+ _keybindings[id] = binding;
+ var matches = arr[i].toLowerCase().match(/(?:(?:[^+â§ââ¥â])+|[â§ââ¥â]|\+\+|^\+$)/g);
+
+ for (var j = 0; j < matches.length; j++) {
+ // Normalise matching errors
+ if (matches[j] === '++') matches[j] = '+';
+
+ if (matches[j] in utilKeybinding.modifierCodes) {
+ var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
+ binding.event.modifiers[prop] = true;
+ } else {
+ binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
+
+ if (matches[j] in utilKeybinding.keyCodes) {
+ binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
+ }
+ }
+ }
+ }
+
+ return keybinding;
+ };
+
+ return keybinding;
+ }
+ /*
+ * See https://github.com/keithamus/jwerty
+ */
+
+ utilKeybinding.modifierCodes = {
+ // Shift key, â§
+ 'â§': 16,
+ shift: 16,
+ // CTRL key, on Mac: â
+ 'â': 17,
+ ctrl: 17,
+ // ALT key, on Mac: ⥠(Alt)
+ 'â¥': 18,
+ alt: 18,
+ option: 18,
+ // META, on Mac: â (CMD), on Windows (Win), on Linux (Super)
+ 'â': 91,
+ meta: 91,
+ cmd: 91,
+ 'super': 91,
+ win: 91
+ };
+ utilKeybinding.modifierProperties = {
+ 16: 'shiftKey',
+ 17: 'ctrlKey',
+ 18: 'altKey',
+ 91: 'metaKey'
+ };
+ utilKeybinding.plusKeys = ['plus', 'ffplus', '=', 'ffequals', 'â ', '±'];
+ utilKeybinding.minusKeys = ['_', '-', 'ffminus', 'dash', 'â', 'â'];
+ utilKeybinding.keys = {
+ // Backspace key, on Mac: â« (Backspace)
+ 'â«': 'Backspace',
+ backspace: 'Backspace',
+ // Tab Key, on Mac: ⥠(Tab), on Windows â¥â¥
+ 'â¥': 'Tab',
+ 'â': 'Tab',
+ tab: 'Tab',
+ // Return key, â©
+ 'â©': 'Enter',
+ 'âµ': 'Enter',
+ 'â': 'Enter',
+ 'return': 'Enter',
+ enter: 'Enter',
+ 'â
': 'Enter',
+ // Pause/Break key
+ 'pause': 'Pause',
+ 'pause-break': 'Pause',
+ // Caps Lock key, âª
+ 'âª': 'CapsLock',
+ caps: 'CapsLock',
+ 'caps-lock': 'CapsLock',
+ // Escape key, on Mac: â, on Windows: Esc
+ 'â': ['Escape', 'Esc'],
+ escape: ['Escape', 'Esc'],
+ esc: ['Escape', 'Esc'],
+ // Space key
+ space: [' ', 'Spacebar'],
+ // Page-Up key, or pgup, on Mac: â
+ 'â': 'PageUp',
+ pgup: 'PageUp',
+ 'page-up': 'PageUp',
+ // Page-Down key, or pgdown, on Mac: â
+ 'â': 'PageDown',
+ pgdown: 'PageDown',
+ 'page-down': 'PageDown',
+ // END key, on Mac: â
+ 'â': 'End',
+ end: 'End',
+ // HOME key, on Mac: â
+ 'â': 'Home',
+ home: 'Home',
+ // Insert key, or ins
+ ins: 'Insert',
+ insert: 'Insert',
+ // Delete key, on Mac: ⦠(Delete)
+ 'â¦': ['Delete', 'Del'],
+ del: ['Delete', 'Del'],
+ 'delete': ['Delete', 'Del'],
+ // Left Arrow Key, or â
+ 'â': ['ArrowLeft', 'Left'],
+ left: ['ArrowLeft', 'Left'],
+ 'arrow-left': ['ArrowLeft', 'Left'],
+ // Up Arrow Key, or â
+ 'â': ['ArrowUp', 'Up'],
+ up: ['ArrowUp', 'Up'],
+ 'arrow-up': ['ArrowUp', 'Up'],
+ // Right Arrow Key, or â
+ 'â': ['ArrowRight', 'Right'],
+ right: ['ArrowRight', 'Right'],
+ 'arrow-right': ['ArrowRight', 'Right'],
+ // Up Arrow Key, or â
+ 'â': ['ArrowDown', 'Down'],
+ down: ['ArrowDown', 'Down'],
+ 'arrow-down': ['ArrowDown', 'Down'],
+ // odities, stuff for backward compatibility (browsers and code):
+ // Num-Multiply, or *
+ '*': ['*', 'Multiply'],
+ star: ['*', 'Multiply'],
+ asterisk: ['*', 'Multiply'],
+ multiply: ['*', 'Multiply'],
+ // Num-Plus or +
+ '+': ['+', 'Add'],
+ 'plus': ['+', 'Add'],
+ // Num-Subtract, or -
+ '-': ['-', 'Subtract'],
+ subtract: ['-', 'Subtract'],
+ 'dash': ['-', 'Subtract'],
+ // Semicolon
+ semicolon: ';',
+ // = or equals
+ equals: '=',
+ // Comma, or ,
+ comma: ',',
+ // Period, or ., or full-stop
+ period: '.',
+ 'full-stop': '.',
+ // Slash, or /, or forward-slash
+ slash: '/',
+ 'forward-slash': '/',
+ // Tick, or `, or back-quote
+ tick: '`',
+ 'back-quote': '`',
+ // Open bracket, or [
+ 'open-bracket': '[',
+ // Back slash, or \
+ 'back-slash': '\\',
+ // Close backet, or ]
+ 'close-bracket': ']',
+ // Apostrophe, or Quote, or '
+ quote: '\'',
+ apostrophe: '\'',
+ // NUMPAD 0-9
+ 'num-0': '0',
+ 'num-1': '1',
+ 'num-2': '2',
+ 'num-3': '3',
+ 'num-4': '4',
+ 'num-5': '5',
+ 'num-6': '6',
+ 'num-7': '7',
+ 'num-8': '8',
+ 'num-9': '9',
+ // F1-F25
+ f1: 'F1',
+ f2: 'F2',
+ f3: 'F3',
+ f4: 'F4',
+ f5: 'F5',
+ f6: 'F6',
+ f7: 'F7',
+ f8: 'F8',
+ f9: 'F9',
+ f10: 'F10',
+ f11: 'F11',
+ f12: 'F12',
+ f13: 'F13',
+ f14: 'F14',
+ f15: 'F15',
+ f16: 'F16',
+ f17: 'F17',
+ f18: 'F18',
+ f19: 'F19',
+ f20: 'F20',
+ f21: 'F21',
+ f22: 'F22',
+ f23: 'F23',
+ f24: 'F24',
+ f25: 'F25'
+ };
+ utilKeybinding.keyCodes = {
+ // Backspace key, on Mac: â« (Backspace)
+ 'â«': 8,
+ backspace: 8,
+ // Tab Key, on Mac: ⥠(Tab), on Windows â¥â¥
+ 'â¥': 9,
+ 'â': 9,
+ tab: 9,
+ // Return key, â©
+ 'â©': 13,
+ 'âµ': 13,
+ 'â': 13,
+ 'return': 13,
+ enter: 13,
+ 'â
': 13,
+ // Pause/Break key
+ 'pause': 19,
+ 'pause-break': 19,
+ // Caps Lock key, âª
+ 'âª': 20,
+ caps: 20,
+ 'caps-lock': 20,
+ // Escape key, on Mac: â, on Windows: Esc
+ 'â': 27,
+ escape: 27,
+ esc: 27,
+ // Space key
+ space: 32,
+ // Page-Up key, or pgup, on Mac: â
+ 'â': 33,
+ pgup: 33,
+ 'page-up': 33,
+ // Page-Down key, or pgdown, on Mac: â
+ 'â': 34,
+ pgdown: 34,
+ 'page-down': 34,
+ // END key, on Mac: â
+ 'â': 35,
+ end: 35,
+ // HOME key, on Mac: â
+ 'â': 36,
+ home: 36,
+ // Insert key, or ins
+ ins: 45,
+ insert: 45,
+ // Delete key, on Mac: ⦠(Delete)
+ 'â¦': 46,
+ del: 46,
+ 'delete': 46,
+ // Left Arrow Key, or â
+ 'â': 37,
+ left: 37,
+ 'arrow-left': 37,
+ // Up Arrow Key, or â
+ 'â': 38,
+ up: 38,
+ 'arrow-up': 38,
+ // Right Arrow Key, or â
+ 'â': 39,
+ right: 39,
+ 'arrow-right': 39,
+ // Up Arrow Key, or â
+ 'â': 40,
+ down: 40,
+ 'arrow-down': 40,
+ // odities, printing characters that come out wrong:
+ // Firefox Equals
+ 'ffequals': 61,
+ // Num-Multiply, or *
+ '*': 106,
+ star: 106,
+ asterisk: 106,
+ multiply: 106,
+ // Num-Plus or +
+ '+': 107,
+ 'plus': 107,
+ // Num-Subtract, or -
+ '-': 109,
+ subtract: 109,
+ // Vertical Bar / Pipe
+ '|': 124,
+ // Firefox Plus
+ 'ffplus': 171,
+ // Firefox Minus
+ 'ffminus': 173,
+ // Semicolon
+ ';': 186,
+ semicolon: 186,
+ // = or equals
+ '=': 187,
+ 'equals': 187,
+ // Comma, or ,
+ ',': 188,
+ comma: 188,
+ // Dash / Underscore key
+ 'dash': 189,
+ // Period, or ., or full-stop
+ '.': 190,
+ period: 190,
+ 'full-stop': 190,
+ // Slash, or /, or forward-slash
+ '/': 191,
+ slash: 191,
+ 'forward-slash': 191,
+ // Tick, or `, or back-quote
+ '`': 192,
+ tick: 192,
+ 'back-quote': 192,
+ // Open bracket, or [
+ '[': 219,
+ 'open-bracket': 219,
+ // Back slash, or \
+ '\\': 220,
+ 'back-slash': 220,
+ // Close backet, or ]
+ ']': 221,
+ 'close-bracket': 221,
+ // Apostrophe, or Quote, or '
+ '\'': 222,
+ quote: 222,
+ apostrophe: 222
+ }; // NUMPAD 0-9
+
+ var i = 95,
+ n = 0;
+
+ while (++i < 106) {
+ utilKeybinding.keyCodes['num-' + n] = i;
+ ++n;
+ } // 0-9
+
+
+ i = 47;
+ n = 0;
+
+ while (++i < 58) {
+ utilKeybinding.keyCodes[n] = i;
+ ++n;
+ } // F1-F25
+
+
+ i = 111;
+ n = 1;
+
+ while (++i < 136) {
+ utilKeybinding.keyCodes['f' + n] = i;
+ ++n;
+ } // a-z
+
+
+ i = 64;
+
+ while (++i < 91) {
+ utilKeybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i;
+ }
+
+ function utilObjectOmit(obj, omitKeys) {
+ return Object.keys(obj).reduce(function (result, key) {
+ if (omitKeys.indexOf(key) === -1) {
+ result[key] = obj[key]; // keep
+ }
+
+ return result;
+ }, {});
+ }
+
+ // Copies a variable number of methods from source to target.
+ function utilRebind(target, source) {
+ var i = 1,
+ n = arguments.length,
+ method;
+
+ while (++i < n) {
+ target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+ }
+
+ return target;
+ } // Method is assumed to be a standard D3 getter-setter:
+ // If passed with no arguments, gets the value.
+ // If passed with arguments, sets the value and returns the target.
+
+ function d3_rebind(target, source, method) {
+ return function () {
+ var value = method.apply(source, arguments);
+ return value === source ? target : value;
+ };
+ }
+
+ // A per-domain session mutex backed by a cookie and dead man's
+ // switch. If the session crashes, the mutex will auto-release
+ // after 5 seconds.
+ // This accepts a string and returns an object that complies with utilSessionMutexType
+ function utilSessionMutex(name) {
+ var mutex = {};
+ var intervalID;
+
+ function renew() {
+ var expires = new Date();
+ expires.setSeconds(expires.getSeconds() + 5);
+ document.cookie = name + '=1; expires=' + expires.toUTCString() + '; sameSite=strict';
+ }
+
+ mutex.lock = function () {
+ if (intervalID) return true;
+ var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
+ if (cookie) return false;
+ renew();
+ intervalID = window.setInterval(renew, 4000);
+ return true;
+ };
+
+ mutex.unlock = function () {
+ if (!intervalID) return;
+ document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict';
+ clearInterval(intervalID);
+ intervalID = null;
+ };
+
+ mutex.locked = function () {
+ return !!intervalID;
+ };
+
+ return mutex;
+ }
+
+ function utilTiler() {
+ var _size = [256, 256];
+ var _scale = 256;
+ var _tileSize = 256;
+ var _zoomExtent = [0, 20];
+ var _translate = [_size[0] / 2, _size[1] / 2];
+ var _margin = 0;
+ var _skipNullIsland = false;
+
+ function clamp(num, min, max) {
+ return Math.max(min, Math.min(num, max));
+ }
+
+ function nearNullIsland(tile) {
+ var x = tile[0];
+ var y = tile[1];
+ var z = tile[2];
+
+ if (z >= 7) {
+ var center = Math.pow(2, z - 1);
+ var width = Math.pow(2, z - 6);
+ var min = center - width / 2;
+ var max = center + width / 2 - 1;
+ return x >= min && x <= max && y >= min && y <= max;
+ }
+
+ return false;
+ }
+
+ function tiler() {
+ var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
+ var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
+ var tileMin = 0;
+ var tileMax = Math.pow(2, z0) - 1;
+ var log2ts = Math.log(_tileSize) * Math.LOG2E;
+ var k = Math.pow(2, z - z0 + log2ts);
+ var origin = [(_translate[0] - _scale / 2) / k, (_translate[1] - _scale / 2) / k];
+ var cols = range$1(clamp(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1), clamp(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1));
+ var rows = range$1(clamp(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1), clamp(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1));
+ var tiles = [];
+
+ for (var i = 0; i < rows.length; i++) {
+ var y = rows[i];
+
+ for (var j = 0; j < cols.length; j++) {
+ var x = cols[j];
+
+ if (i >= _margin && i <= rows.length - _margin && j >= _margin && j <= cols.length - _margin) {
+ tiles.unshift([x, y, z0]); // tiles in view at beginning
+ } else {
+ tiles.push([x, y, z0]); // tiles in margin at the end
+ }
+ }
+ }
+
+ tiles.translate = origin;
+ tiles.scale = k;
+ return tiles;
+ }
+ /**
+ * getTiles() returns an array of tiles that cover the map view
+ */
+
+
+ tiler.getTiles = function (projection) {
+ var origin = [projection.scale() * Math.PI - projection.translate()[0], projection.scale() * Math.PI - projection.translate()[1]];
+ this.size(projection.clipExtent()[1]).scale(projection.scale() * 2 * Math.PI).translate(projection.translate());
+ var tiles = tiler();
+ var ts = tiles.scale;
+ return tiles.map(function (tile) {
+ if (_skipNullIsland && nearNullIsland(tile)) {
+ return false;
+ }
+
+ var x = tile[0] * ts - origin[0];
+ var y = tile[1] * ts - origin[1];
+ return {
+ id: tile.toString(),
+ xyz: tile,
+ extent: geoExtent(projection.invert([x, y + ts]), projection.invert([x + ts, y]))
+ };
+ }).filter(Boolean);
+ };
+ /**
+ * getGeoJSON() returns a FeatureCollection for debugging tiles
+ */
+
+
+ tiler.getGeoJSON = function (projection) {
+ var features = tiler.getTiles(projection).map(function (tile) {
+ return {
+ type: 'Feature',
+ properties: {
+ id: tile.id,
+ name: tile.id
+ },
+ geometry: {
+ type: 'Polygon',
+ coordinates: [tile.extent.polygon()]
+ }
+ };
+ });
+ return {
+ type: 'FeatureCollection',
+ features: features
+ };
+ };
+
+ tiler.tileSize = function (val) {
+ if (!arguments.length) return _tileSize;
+ _tileSize = val;
+ return tiler;
+ };
+
+ tiler.zoomExtent = function (val) {
+ if (!arguments.length) return _zoomExtent;
+ _zoomExtent = val;
+ return tiler;
+ };
+
+ tiler.size = function (val) {
+ if (!arguments.length) return _size;
+ _size = val;
+ return tiler;
+ };
+
+ tiler.scale = function (val) {
+ if (!arguments.length) return _scale;
+ _scale = val;
+ return tiler;
+ };
+
+ tiler.translate = function (val) {
+ if (!arguments.length) return _translate;
+ _translate = val;
+ return tiler;
+ }; // number to extend the rows/columns beyond those covering the viewport
+
+
+ tiler.margin = function (val) {
+ if (!arguments.length) return _margin;
+ _margin = +val;
+ return tiler;
+ };
+
+ tiler.skipNullIsland = function (val) {
+ if (!arguments.length) return _skipNullIsland;
+ _skipNullIsland = val;
+ return tiler;
+ };
+
+ return tiler;
+ }
+
+ function utilTriggerEvent(target, type) {
+ target.each(function () {
+ var evt = document.createEvent('HTMLEvents');
+ evt.initEvent(type, true, true);
+ this.dispatchEvent(evt);
+ });
+ }
+
+ var _mainLocations = coreLocations(); // singleton
+ // `coreLocations` maintains an internal index of all the boundaries/geofences used by iD.
+ // It's used by presets, community index, background imagery, to know where in the world these things are valid.
+ // These geofences should be defined by `locationSet` objects:
+ //
+ // let locationSet = {
+ // include: [ Array of locations ],
+ // exclude: [ Array of locations ]
+ // };
+ //
+ // For more info see the location-conflation and country-coder projects, see:
+ // https://github.com/ideditor/location-conflation
+ // https://github.com/ideditor/country-coder
+ //
+
+ function coreLocations() {
+ var _this = {};
+ var _resolvedFeatures = {}; // cache of *resolved* locationSet features
+
+ var _loco = new _default(); // instance of a location-conflation resolver
+
+
+ var _wp; // instance of a which-polygon index
+ // pre-resolve the worldwide locationSet
+
+
+ var world = {
+ locationSet: {
+ include: ['Q2']
+ }
+ };
+ resolveLocationSet(world);
+ rebuildIndex();
+ var _queue = [];
+
+ var _deferred = new Set();
+
+ var _inProcess; // Returns a Promise to process the queue
+
+
+ function processQueue() {
+ if (!_queue.length) return Promise.resolve(); // console.log(`queue length ${_queue.length}`);
+
+ var chunk = _queue.pop();
+
+ return new Promise(function (resolvePromise) {
+ var handle = window.requestIdleCallback(function () {
+ _deferred["delete"](handle); // const t0 = performance.now();
+
+
+ chunk.forEach(resolveLocationSet); // const t1 = performance.now();
+ // console.log('chunk processed in ' + (t1 - t0) + ' ms');
+
+ resolvePromise();
+ });
+
+ _deferred.add(handle);
+ }).then(function () {
+ return processQueue();
+ });
+ } // Pass an Object with a `locationSet` property,
+ // Performs the locationSet resolution, caches the result, and sets a `locationSetID` property on the object.
+
+
+ function resolveLocationSet(obj) {
+ if (obj.locationSetID) return; // work was done already
+
+ try {
+ var locationSet = obj.locationSet;
+
+ if (!locationSet) {
+ throw new Error('object missing locationSet property');
+ }
+
+ if (!locationSet.include) {
+ // missing `include`, default to worldwide include
+ locationSet.include = ['Q2']; // https://github.com/openstreetmap/iD/pull/8305#discussion_r662344647
+ }
+
+ var resolved = _loco.resolveLocationSet(locationSet);
+
+ var locationSetID = resolved.id;
+ obj.locationSetID = locationSetID;
+
+ if (!resolved.feature.geometry.coordinates.length || !resolved.feature.properties.area) {
+ throw new Error("locationSet ".concat(locationSetID, " resolves to an empty feature."));
+ }
+
+ if (!_resolvedFeatures[locationSetID]) {
+ // First time seeing this locationSet feature
+ var feature = JSON.parse(JSON.stringify(resolved.feature)); // deep clone
+
+ feature.id = locationSetID; // Important: always use the locationSet `id` (`+[Q30]`), not the feature `id` (`Q30`)
+
+ feature.properties.id = locationSetID;
+ _resolvedFeatures[locationSetID] = feature; // insert into cache
+ }
+ } catch (err) {
+ obj.locationSet = {
+ include: ['Q2']
+ }; // default worldwide
+
+ obj.locationSetID = '+[Q2]';
+ }
+ } // Rebuilds the whichPolygon index with whatever features have been resolved.
+
+
+ function rebuildIndex() {
+ _wp = whichPolygon_1({
+ features: Object.values(_resolvedFeatures)
+ });
+ } //
+ // `mergeCustomGeoJSON`
+ // Accepts an FeatureCollection-like object containing custom locations
+ // Each feature must have a filename-like `id`, for example: `something.geojson`
+ //
+ // {
+ // "type": "FeatureCollection"
+ // "features": [
+ // {
+ // "type": "Feature",
+ // "id": "philly_metro.geojson",
+ // "properties": { ⦠},
+ // "geometry": { ⦠}
+ // }
+ // ]
+ // }
+ //
+
+
+ _this.mergeCustomGeoJSON = function (fc) {
+ if (fc && fc.type === 'FeatureCollection' && Array.isArray(fc.features)) {
+ fc.features.forEach(function (feature) {
+ feature.properties = feature.properties || {};
+ var props = feature.properties; // Get `id` from either `id` or `properties`
+
+ var id = feature.id || props.id;
+ if (!id || !/^\S+\.geojson$/i.test(id)) return; // Ensure `id` exists and is lowercase
+
+ id = id.toLowerCase();
+ feature.id = id;
+ props.id = id; // Ensure `area` property exists
+
+ if (!props.area) {
+ var area = geojsonArea.geometry(feature.geometry) / 1e6; // m² to km²
+
+ props.area = Number(area.toFixed(2));
+ }
+
+ _loco._cache[id] = feature;
+ });
+ }
+ }; //
+ // `mergeLocationSets`
+ // Accepts an Array of Objects containing `locationSet` properties.
+ // The locationSets will be resolved and indexed in the background.
+ // [
+ // { id: 'preset1', locationSet: {â¦} },
+ // { id: 'preset2', locationSet: {â¦} },
+ // { id: 'preset3', locationSet: {â¦} },
+ // â¦
+ // ]
+ // After resolving and indexing, the Objects will be decorated with a
+ // `locationSetID` property.
+ // [
+ // { id: 'preset1', locationSet: {â¦}, locationSetID: '+[Q2]' },
+ // { id: 'preset2', locationSet: {â¦}, locationSetID: '+[Q30]' },
+ // { id: 'preset3', locationSet: {â¦}, locationSetID: '+[Q2]' },
+ // â¦
+ // ]
+ //
+ // Returns a Promise fulfilled when the resolving/indexing has been completed
+ // This will take some seconds but happen in the background during browser idle time.
+ //
+
+
+ _this.mergeLocationSets = function (objects) {
+ if (!Array.isArray(objects)) return Promise.reject('nothing to do'); // Resolve all locationSets -> geojson, processing data in chunks
+ //
+ // Because this will happen during idle callbacks, we want to choose a chunk size
+ // that won't make the browser stutter too badly. LocationSets that are a simple
+ // country coder include will resolve instantly, but ones that involve complex
+ // include/exclude operations will take some milliseconds longer.
+ //
+ // Some discussion and performance results on these tickets:
+ // https://github.com/ideditor/location-conflation/issues/26
+ // https://github.com/osmlab/name-suggestion-index/issues/4784#issuecomment-742003434
+
+ _queue = _queue.concat(utilArrayChunk(objects, 200));
+
+ if (!_inProcess) {
+ _inProcess = processQueue().then(function () {
+ rebuildIndex();
+ _inProcess = null;
+ return objects;
+ });
+ }
+
+ return _inProcess;
+ }; //
+ // `locationSetID`
+ // Returns a locationSetID for a given locationSet (fallback to `+[Q2]`, world)
+ // (The locationset doesn't necessarily need to be resolved to compute its `id`)
+ //
+ // Arguments
+ // `locationSet`: A locationSet, e.g. `{ include: ['us'] }`
+ // Returns
+ // The locationSetID, e.g. `+[Q30]`
+ //
+
+
+ _this.locationSetID = function (locationSet) {
+ var locationSetID;
+
+ try {
+ locationSetID = _loco.validateLocationSet(locationSet).id;
+ } catch (err) {
+ locationSetID = '+[Q2]'; // the world
+ }
+
+ return locationSetID;
+ }; //
+ // `feature`
+ // Returns the resolved GeoJSON feature for a given locationSetID (fallback to 'world')
+ //
+ // Arguments
+ // `locationSetID`: id of the form like `+[Q30]` (United States)
+ // Returns
+ // A GeoJSON feature:
+ // {
+ // type: 'Feature',
+ // id: '+[Q30]',
+ // properties: { id: '+[Q30]', area: 21817019.17, ⦠},
+ // geometry: { ⦠}
+ // }
+
+
+ _this.feature = function (locationSetID) {
+ return _resolvedFeatures[locationSetID] || _resolvedFeatures['+[Q2]'];
+ }; //
+ // `locationsAt`
+ // Find all the resolved locationSets valid at the given location.
+ // Results include the area (in km²) to facilitate sorting.
+ //
+ // Arguments
+ // `loc`: the [lon,lat] location to query, e.g. `[-74.4813, 40.7967]`
+ // Returns
+ // Object of locationSetIDs to areas (in km²)
+ // {
+ // "+[Q2]": 511207893.3958111,
+ // "+[Q30]": 21817019.17,
+ // "+[new_jersey.geojson]": 22390.77,
+ // â¦
+ // }
+ //
+
+
+ _this.locationsAt = function (loc) {
+ var result = {};
+ (_wp(loc, true) || []).forEach(function (prop) {
+ return result[prop.id] = prop.area;
+ });
+ return result;
+ }; //
+ // `query`
+ // Execute a query directly against which-polygon
+ // https://github.com/mapbox/which-polygon
+ //
+ // Arguments
+ // `loc`: the [lon,lat] location to query,
+ // `multi`: `true` to return all results, `false` to return first result
+ // Returns
+ // Array of GeoJSON *properties* for the locationSet features that exist at `loc`
+ //
+
+
+ _this.query = function (loc, multi) {
+ return _wp(loc, multi);
+ }; // Direct access to the location-conflation resolver
+
+
+ _this.loco = function () {
+ return _loco;
+ }; // Direct access to the which-polygon index
+
+
+ _this.wp = function () {
+ return _wp;
+ };
+
+ return _this;
+ }
+
+ var $$h = _export;
+ var $findIndex = arrayIteration.findIndex;
+ var addToUnscopables$1 = addToUnscopables$6;
+
+ var FIND_INDEX = 'findIndex';
+ var SKIPS_HOLES = true;
+
+ // Shouldn't skip holes
+ if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });
+
+ // `Array.prototype.findIndex` method
+ // https://tc39.es/ecma262/#sec-array.prototype.findindex
+ $$h({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
+ findIndex: function findIndex(callbackfn /* , that = undefined */) {
+ return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+ addToUnscopables$1(FIND_INDEX);
+
+ var global$5 = global$1o;
+ var isRegExp = isRegexp;
+
+ var TypeError$3 = global$5.TypeError;
+
+ var notARegexp = function (it) {
+ if (isRegExp(it)) {
+ throw TypeError$3("The method doesn't accept regular expressions");
+ } return it;
+ };
+
+ var wellKnownSymbol = wellKnownSymbol$t;
+
+ var MATCH = wellKnownSymbol('match');
+
+ var correctIsRegexpLogic = function (METHOD_NAME) {
+ var regexp = /./;
+ try {
+ '/./'[METHOD_NAME](regexp);
+ } catch (error1) {
+ try {
+ regexp[MATCH] = false;
+ return '/./'[METHOD_NAME](regexp);
+ } catch (error2) { /* empty */ }
+ } return false;
+ };
+
+ var $$g = _export;
+ var uncurryThis$7 = functionUncurryThis;
+ var notARegExp$2 = notARegexp;
+ var requireObjectCoercible$3 = requireObjectCoercible$e;
+ var toString$4 = toString$k;
+ var correctIsRegExpLogic$2 = correctIsRegexpLogic;
+
+ var stringIndexOf = uncurryThis$7(''.indexOf);
+
+ // `String.prototype.includes` method
+ // https://tc39.es/ecma262/#sec-string.prototype.includes
+ $$g({ target: 'String', proto: true, forced: !correctIsRegExpLogic$2('includes') }, {
+ includes: function includes(searchString /* , position = 0 */) {
+ return !!~stringIndexOf(
+ toString$4(requireObjectCoercible$3(this)),
+ toString$4(notARegExp$2(searchString)),
+ arguments.length > 1 ? arguments[1] : undefined
+ );
+ }
+ });
+
+ /** Detect free variable `global` from Node.js. */
+ var freeGlobal = (typeof global === "undefined" ? "undefined" : _typeof(global)) == 'object' && global && global.Object === Object && global;
+
+ /** Detect free variable `self`. */
+
+ var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self;
+ /** Used as a reference to the global object. */
+
+ var root = freeGlobal || freeSelf || Function('return this')();
+
+ /** Built-in value references. */
+
+ var _Symbol = root.Symbol;
+
+ /** Used for built-in method references. */
+
+ var objectProto$1 = Object.prototype;
+ /** Used to check objects for own properties. */
+
+ var hasOwnProperty$2 = objectProto$1.hasOwnProperty;
+ /**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+
+ var nativeObjectToString$1 = objectProto$1.toString;
+ /** Built-in value references. */
+
+ var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined;
+ /**
+ * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the raw `toStringTag`.
+ */
+
+ function getRawTag(value) {
+ var isOwn = hasOwnProperty$2.call(value, symToStringTag$1),
+ tag = value[symToStringTag$1];
+
+ try {
+ value[symToStringTag$1] = undefined;
+ var unmasked = true;
+ } catch (e) {}
+
+ var result = nativeObjectToString$1.call(value);
+
+ if (unmasked) {
+ if (isOwn) {
+ value[symToStringTag$1] = tag;
+ } else {
+ delete value[symToStringTag$1];
+ }
+ }
+
+ return result;
+ }
+
+ /** Used for built-in method references. */
+ var objectProto = Object.prototype;
+ /**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+
+ var nativeObjectToString = objectProto.toString;
+ /**
+ * Converts `value` to a string using `Object.prototype.toString`.
+ *
+ * @private
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ */
+
+ function objectToString(value) {
+ return nativeObjectToString.call(value);
+ }
+
+ /** `Object#toString` result references. */
+
+ var nullTag = '[object Null]',
+ undefinedTag = '[object Undefined]';
+ /** Built-in value references. */
+
+ var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;
+ /**
+ * The base implementation of `getTag` without fallbacks for buggy environments.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+
+ function baseGetTag(value) {
+ if (value == null) {
+ return value === undefined ? undefinedTag : nullTag;
+ }
+
+ return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
+ }
+
+ /**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+ function isObjectLike(value) {
+ return value != null && _typeof(value) == 'object';
+ }
+
+ /** `Object#toString` result references. */
+
+ var symbolTag = '[object Symbol]';
+ /**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */
+
+ function isSymbol(value) {
+ return _typeof(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag;
+ }
+
+ /**
+ * A specialized version of `_.map` for arrays without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+ function arrayMap(array, iteratee) {
+ var index = -1,
+ length = array == null ? 0 : array.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = iteratee(array[index], index, array);
+ }
+
+ return result;
+ }
+
+ /**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(document.body.children);
+ * // => false
+ *
+ * _.isArray('abc');
+ * // => false
+ *
+ * _.isArray(_.noop);
+ * // => false
+ */
+ var isArray$1 = Array.isArray;
+
+ /** Used as references for various `Number` constants. */
+
+ var INFINITY = 1 / 0;
+ /** Used to convert symbols to primitives and strings. */
+
+ var symbolProto = _Symbol ? _Symbol.prototype : undefined,
+ symbolToString = symbolProto ? symbolProto.toString : undefined;
+ /**
+ * The base implementation of `_.toString` which doesn't convert nullish
+ * values to empty strings.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ */
+
+ function baseToString(value) {
+ // Exit early for strings to avoid a performance hit in some environments.
+ if (typeof value == 'string') {
+ return value;
+ }
+
+ if (isArray$1(value)) {
+ // Recursively convert values (susceptible to call stack limits).
+ return arrayMap(value, baseToString) + '';
+ }
+
+ if (isSymbol(value)) {
+ return symbolToString ? symbolToString.call(value) : '';
+ }
+
+ var result = value + '';
+ return result == '0' && 1 / value == -INFINITY ? '-0' : result;
+ }
+
+ /** Used to match a single whitespace character. */
+ var reWhitespace = /\s/;
+ /**
+ * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
+ * character of `string`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {number} Returns the index of the last non-whitespace character.
+ */
+
+ function trimmedEndIndex(string) {
+ var index = string.length;
+
+ while (index-- && reWhitespace.test(string.charAt(index))) {}
+
+ return index;
+ }
+
+ /** Used to match leading whitespace. */
+
+ var reTrimStart = /^\s+/;
+ /**
+ * The base implementation of `_.trim`.
+ *
+ * @private
+ * @param {string} string The string to trim.
+ * @returns {string} Returns the trimmed string.
+ */
+
+ function baseTrim(string) {
+ return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') : string;
+ }
+
+ /**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+ function isObject$2(value) {
+ var type = _typeof(value);
+
+ return value != null && (type == 'object' || type == 'function');
+ }
+
+ /** Used as references for various `Number` constants. */
+
+ var NAN = 0 / 0;
+ /** Used to detect bad signed hexadecimal string values. */
+
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+ /** Used to detect binary string values. */
+
+ var reIsBinary = /^0b[01]+$/i;
+ /** Used to detect octal string values. */
+
+ var reIsOctal = /^0o[0-7]+$/i;
+ /** Built-in method references without a dependency on `root`. */
+
+ var freeParseInt = parseInt;
+ /**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */
+
+ function toNumber(value) {
+ if (typeof value == 'number') {
+ return value;
+ }
+
+ if (isSymbol(value)) {
+ return NAN;
+ }
+
+ if (isObject$2(value)) {
+ var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+ value = isObject$2(other) ? other + '' : other;
+ }
+
+ if (typeof value != 'string') {
+ return value === 0 ? value : +value;
+ }
+
+ value = baseTrim(value);
+ var isBinary = reIsBinary.test(value);
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
+ }
+
+ /**
+ * Converts `value` to a string. An empty string is returned for `null`
+ * and `undefined` values. The sign of `-0` is preserved.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ * @example
+ *
+ * _.toString(null);
+ * // => ''
+ *
+ * _.toString(-0);
+ * // => '-0'
+ *
+ * _.toString([1, 2, 3]);
+ * // => '1,2,3'
+ */
+
+ function toString$3(value) {
+ return value == null ? '' : baseToString(value);
+ }
+
+ /**
+ * The base implementation of `_.propertyOf` without support for deep paths.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Function} Returns the new accessor function.
+ */
+ function basePropertyOf(object) {
+ return function (key) {
+ return object == null ? undefined : object[key];
+ };
+ }
+
+ /**
+ * Gets the timestamp of the number of milliseconds that have elapsed since
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Date
+ * @returns {number} Returns the timestamp.
+ * @example
+ *
+ * _.defer(function(stamp) {
+ * console.log(_.now() - stamp);
+ * }, _.now());
+ * // => Logs the number of milliseconds it took for the deferred invocation.
+ */
+
+ var now = function now() {
+ return root.Date.now();
+ };
+
+ /** Error message constants. */
+
+ var FUNC_ERROR_TEXT$1 = 'Expected a function';
+ /* Built-in method references for those with the same name as other `lodash` methods. */
+
+ var nativeMax = Math.max,
+ nativeMin = Math.min;
+ /**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
+ * Provide `options` to indicate whether `func` should be invoked on the
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+ * with the last arguments provided to the debounced function. Subsequent
+ * calls to the debounced function return the result of the last `func`
+ * invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ * The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }));
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', debounced);
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel);
+ */
+
+ function debounce(func, wait, options) {
+ var lastArgs,
+ lastThis,
+ maxWait,
+ result,
+ timerId,
+ lastCallTime,
+ lastInvokeTime = 0,
+ leading = false,
+ maxing = false,
+ trailing = true;
+
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT$1);
+ }
+
+ wait = toNumber(wait) || 0;
+
+ if (isObject$2(options)) {
+ leading = !!options.leading;
+ maxing = 'maxWait' in options;
+ maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
+ }
+
+ function invokeFunc(time) {
+ var args = lastArgs,
+ thisArg = lastThis;
+ lastArgs = lastThis = undefined;
+ lastInvokeTime = time;
+ result = func.apply(thisArg, args);
+ return result;
+ }
+
+ function leadingEdge(time) {
+ // Reset any `maxWait` timer.
+ lastInvokeTime = time; // Start the timer for the trailing edge.
+
+ timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.
+
+ return leading ? invokeFunc(time) : result;
+ }
+
+ function remainingWait(time) {
+ var timeSinceLastCall = time - lastCallTime,
+ timeSinceLastInvoke = time - lastInvokeTime,
+ timeWaiting = wait - timeSinceLastCall;
+ return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
+ }
+
+ function shouldInvoke(time) {
+ var timeSinceLastCall = time - lastCallTime,
+ timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
+ // trailing edge, the system time has gone backwards and we're treating
+ // it as the trailing edge, or we've hit the `maxWait` limit.
+
+ return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
+ }
+
+ function timerExpired() {
+ var time = now();
+
+ if (shouldInvoke(time)) {
+ return trailingEdge(time);
+ } // Restart the timer.
+
+
+ timerId = setTimeout(timerExpired, remainingWait(time));
+ }
+
+ function trailingEdge(time) {
+ timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been
+ // debounced at least once.
+
+ if (trailing && lastArgs) {
+ return invokeFunc(time);
+ }
+
+ lastArgs = lastThis = undefined;
+ return result;
+ }
+
+ function cancel() {
+ if (timerId !== undefined) {
+ clearTimeout(timerId);
+ }
+
+ lastInvokeTime = 0;
+ lastArgs = lastCallTime = lastThis = timerId = undefined;
+ }
+
+ function flush() {
+ return timerId === undefined ? result : trailingEdge(now());
+ }
+
+ function debounced() {
+ var time = now(),
+ isInvoking = shouldInvoke(time);
+ lastArgs = arguments;
+ lastThis = this;
+ lastCallTime = time;
+
+ if (isInvoking) {
+ if (timerId === undefined) {
+ return leadingEdge(lastCallTime);
+ }
+
+ if (maxing) {
+ // Handle invocations in a tight loop.
+ clearTimeout(timerId);
+ timerId = setTimeout(timerExpired, wait);
+ return invokeFunc(lastCallTime);
+ }
+ }
+
+ if (timerId === undefined) {
+ timerId = setTimeout(timerExpired, wait);
+ }
+
+ return result;
+ }
+
+ debounced.cancel = cancel;
+ debounced.flush = flush;
+ return debounced;
+ }
+
+ /** Used to map characters to HTML entities. */
+
+ var htmlEscapes = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": '''
+ };
+ /**
+ * Used by `_.escape` to convert characters to HTML entities.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */
+
+ var escapeHtmlChar = basePropertyOf(htmlEscapes);
+
+ /** Used to match HTML entities and HTML characters. */
+
+ var reUnescapedHtml = /[&<>"']/g,
+ reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+ /**
+ * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
+ * corresponding HTML entities.
+ *
+ * **Note:** No other characters are escaped. To escape additional
+ * characters use a third-party library like [_he_](https://mths.be/he).
+ *
+ * Though the ">" character is escaped for symmetry, characters like
+ * ">" and "/" don't need escaping in HTML and have no special meaning
+ * unless they're part of a tag or unquoted attribute value. See
+ * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+ * (under "semi-related fun fact") for more details.
+ *
+ * When working with HTML you should always
+ * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
+ * XSS vectors.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escape('fred, barney, & pebbles');
+ * // => 'fred, barney, & pebbles'
+ */
+
+ function escape$4(string) {
+ string = toString$3(string);
+ return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string;
+ }
+
+ /** Error message constants. */
+
+ var FUNC_ERROR_TEXT = 'Expected a function';
+ /**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
+ * method to cancel delayed `func` invocations and a `flush` method to
+ * immediately invoke them. Provide `options` to indicate whether `func`
+ * should be invoked on the leading and/or trailing edge of the `wait`
+ * timeout. The `func` is invoked with the last arguments provided to the
+ * throttled function. Subsequent calls to the throttled function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the throttled function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.throttle` and `_.debounce`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=true]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // Avoid excessively updating the position while scrolling.
+ * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+ *
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+ * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
+ * jQuery(element).on('click', throttled);
+ *
+ * // Cancel the trailing throttled invocation.
+ * jQuery(window).on('popstate', throttled.cancel);
+ */
+
+ function throttle(func, wait, options) {
+ var leading = true,
+ trailing = true;
+
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+
+ if (isObject$2(options)) {
+ leading = 'leading' in options ? !!options.leading : leading;
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
+ }
+
+ return debounce(func, wait, {
+ 'leading': leading,
+ 'maxWait': wait,
+ 'trailing': trailing
+ });
+ }
+
+ var $$f = _export;
+ var lastIndexOf = arrayLastIndexOf;
+
+ // `Array.prototype.lastIndexOf` method
+ // https://tc39.es/ecma262/#sec-array.prototype.lastindexof
+ // eslint-disable-next-line es/no-array-prototype-lastindexof -- required for testing
+ $$f({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {
+ lastIndexOf: lastIndexOf
+ });
+
+ /** Used to map HTML entities to characters. */
+
+ var htmlUnescapes = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ ''': "'"
+ };
+ /**
+ * Used by `_.unescape` to convert HTML entities to characters.
+ *
+ * @private
+ * @param {string} chr The matched character to unescape.
+ * @returns {string} Returns the unescaped character.
+ */
+
+ var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
+
+ /** Used to match HTML entities and HTML characters. */
+
+ var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
+ reHasEscapedHtml = RegExp(reEscapedHtml.source);
+ /**
+ * The inverse of `_.escape`; this method converts the HTML entities
+ * `&`, `<`, `>`, `"`, and `'` in `string` to
+ * their corresponding characters.
+ *
+ * **Note:** No other HTML entities are unescaped. To unescape additional
+ * HTML entities use a third-party library like [_he_](https://mths.be/he).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.6.0
+ * @category String
+ * @param {string} [string=''] The string to unescape.
+ * @returns {string} Returns the unescaped string.
+ * @example
+ *
+ * _.unescape('fred, barney, & pebbles');
+ * // => 'fred, barney, & pebbles'
+ */
+
+ function unescape$3(string) {
+ string = toString$3(string);
+ return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string;
+ }
+
+ var global$4 = global$1o;
+ var isArray = isArray$8;
+ var lengthOfArrayLike$1 = lengthOfArrayLike$i;
+ var bind$3 = functionBindContext;
+
+ var TypeError$2 = global$4.TypeError;
+
+ // `FlattenIntoArray` abstract operation
+ // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
+ var flattenIntoArray$1 = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {
+ var targetIndex = start;
+ var sourceIndex = 0;
+ var mapFn = mapper ? bind$3(mapper, thisArg) : false;
+ var element, elementLen;
+
+ while (sourceIndex < sourceLen) {
+ if (sourceIndex in source) {
+ element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
+
+ if (depth > 0 && isArray(element)) {
+ elementLen = lengthOfArrayLike$1(element);
+ targetIndex = flattenIntoArray$1(target, original, element, elementLen, targetIndex, depth - 1) - 1;
+ } else {
+ if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError$2('Exceed the acceptable array length');
+ target[targetIndex] = element;
+ }
+
+ targetIndex++;
+ }
+ sourceIndex++;
+ }
+ return targetIndex;
+ };
+
+ var flattenIntoArray_1 = flattenIntoArray$1;
+
+ var $$e = _export;
+ var flattenIntoArray = flattenIntoArray_1;
+ var aCallable = aCallable$a;
+ var toObject = toObject$i;
+ var lengthOfArrayLike = lengthOfArrayLike$i;
+ var arraySpeciesCreate = arraySpeciesCreate$4;
+
+ // `Array.prototype.flatMap` method
+ // https://tc39.es/ecma262/#sec-array.prototype.flatmap
+ $$e({ target: 'Array', proto: true }, {
+ flatMap: function flatMap(callbackfn /* , thisArg */) {
+ var O = toObject(this);
+ var sourceLen = lengthOfArrayLike(O);
+ var A;
+ aCallable(callbackfn);
+ A = arraySpeciesCreate(O, 0);
+ A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return A;
+ }
+ });
+
+ // this method was added to unscopables after implementation
+ // in popular engines, so it's moved to a separate module
+ var addToUnscopables = addToUnscopables$6;
+
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+ addToUnscopables('flatMap');
+
+ var $$d = _export;
+ var uncurryThis$6 = functionUncurryThis;
+ var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;
+ var toLength$2 = toLength$c;
+ var toString$2 = toString$k;
+ var notARegExp$1 = notARegexp;
+ var requireObjectCoercible$2 = requireObjectCoercible$e;
+ var correctIsRegExpLogic$1 = correctIsRegexpLogic;
+
+ // eslint-disable-next-line es/no-string-prototype-endswith -- safe
+ var un$EndsWith = uncurryThis$6(''.endsWith);
+ var slice$2 = uncurryThis$6(''.slice);
+ var min$1 = Math.min;
+
+ var CORRECT_IS_REGEXP_LOGIC$1 = correctIsRegExpLogic$1('endsWith');
+ // https://github.com/zloirock/core-js/pull/702
+ var MDN_POLYFILL_BUG$1 = !CORRECT_IS_REGEXP_LOGIC$1 && !!function () {
+ var descriptor = getOwnPropertyDescriptor$1(String.prototype, 'endsWith');
+ return descriptor && !descriptor.writable;
+ }();
+
+ // `String.prototype.endsWith` method
+ // https://tc39.es/ecma262/#sec-string.prototype.endswith
+ $$d({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG$1 && !CORRECT_IS_REGEXP_LOGIC$1 }, {
+ endsWith: function endsWith(searchString /* , endPosition = @length */) {
+ var that = toString$2(requireObjectCoercible$2(this));
+ notARegExp$1(searchString);
+ var endPosition = arguments.length > 1 ? arguments[1] : undefined;
+ var len = that.length;
+ var end = endPosition === undefined ? len : min$1(toLength$2(endPosition), len);
+ var search = toString$2(searchString);
+ return un$EndsWith
+ ? un$EndsWith(that, search, end)
+ : slice$2(that, end - search.length, end) === search;
+ }
+ });
+
+ // https://github.com/tc39/proposal-string-pad-start-end
+ var uncurryThis$5 = functionUncurryThis;
+ var toLength$1 = toLength$c;
+ var toString$1 = toString$k;
+ var $repeat = stringRepeat;
+ var requireObjectCoercible$1 = requireObjectCoercible$e;
+
+ var repeat$1 = uncurryThis$5($repeat);
+ var stringSlice$2 = uncurryThis$5(''.slice);
+ var ceil = Math.ceil;
+
+ // `String.prototype.{ padStart, padEnd }` methods implementation
+ var createMethod = function (IS_END) {
+ return function ($this, maxLength, fillString) {
+ var S = toString$1(requireObjectCoercible$1($this));
+ var intMaxLength = toLength$1(maxLength);
+ var stringLength = S.length;
+ var fillStr = fillString === undefined ? ' ' : toString$1(fillString);
+ var fillLen, stringFiller;
+ if (intMaxLength <= stringLength || fillStr == '') return S;
+ fillLen = intMaxLength - stringLength;
+ stringFiller = repeat$1(fillStr, ceil(fillLen / fillStr.length));
+ if (stringFiller.length > fillLen) stringFiller = stringSlice$2(stringFiller, 0, fillLen);
+ return IS_END ? S + stringFiller : stringFiller + S;
+ };
+ };
+
+ var stringPad = {
+ // `String.prototype.padStart` method
+ // https://tc39.es/ecma262/#sec-string.prototype.padstart
+ start: createMethod(false),
+ // `String.prototype.padEnd` method
+ // https://tc39.es/ecma262/#sec-string.prototype.padend
+ end: createMethod(true)
+ };
+
+ // https://github.com/zloirock/core-js/issues/280
+ var userAgent = engineUserAgent;
+
+ var stringPadWebkitBug = /Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(userAgent);
+
+ var $$c = _export;
+ var $padEnd = stringPad.end;
+ var WEBKIT_BUG$1 = stringPadWebkitBug;
+
+ // `String.prototype.padEnd` method
+ // https://tc39.es/ecma262/#sec-string.prototype.padend
+ $$c({ target: 'String', proto: true, forced: WEBKIT_BUG$1 }, {
+ padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
+ return $padEnd(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ var $$b = _export;
+ var $padStart = stringPad.start;
+ var WEBKIT_BUG = stringPadWebkitBug;
+
+ // `String.prototype.padStart` method
+ // https://tc39.es/ecma262/#sec-string.prototype.padstart
+ $$b({ target: 'String', proto: true, forced: WEBKIT_BUG }, {
+ padStart: function padStart(maxLength /* , fillString = ' ' */) {
+ return $padStart(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ var $$a = _export;
+ var $reduceRight = arrayReduce.right;
+ var arrayMethodIsStrict = arrayMethodIsStrict$9;
+ var CHROME_VERSION = engineV8Version;
+ var IS_NODE = engineIsNode;
+
+ var STRICT_METHOD = arrayMethodIsStrict('reduceRight');
+ // Chrome 80-82 has a critical bug
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
+ var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;
+
+ // `Array.prototype.reduceRight` method
+ // https://tc39.es/ecma262/#sec-array.prototype.reduceright
+ $$a({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, {
+ reduceRight: function reduceRight(callbackfn /* , initialValue */) {
+ return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ var $$9 = _export;
+ var repeat = stringRepeat;
+
+ // `String.prototype.repeat` method
+ // https://tc39.es/ecma262/#sec-string.prototype.repeat
+ $$9({ target: 'String', proto: true }, {
+ repeat: repeat
+ });
+
+ var $$8 = _export;
+ var uncurryThis$4 = functionUncurryThis;
+ var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+ var toLength = toLength$c;
+ var toString = toString$k;
+ var notARegExp = notARegexp;
+ var requireObjectCoercible = requireObjectCoercible$e;
+ var correctIsRegExpLogic = correctIsRegexpLogic;
+
+ // eslint-disable-next-line es/no-string-prototype-startswith -- safe
+ var un$StartsWith = uncurryThis$4(''.startsWith);
+ var stringSlice$1 = uncurryThis$4(''.slice);
+ var min = Math.min;
+
+ var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');
+ // https://github.com/zloirock/core-js/pull/702
+ var MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () {
+ var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');
+ return descriptor && !descriptor.writable;
+ }();
+
+ // `String.prototype.startsWith` method
+ // https://tc39.es/ecma262/#sec-string.prototype.startswith
+ $$8({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
+ startsWith: function startsWith(searchString /* , position = 0 */) {
+ var that = toString(requireObjectCoercible(this));
+ notARegExp(searchString);
+ var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));
+ var search = toString(searchString);
+ return un$StartsWith
+ ? un$StartsWith(that, search, index)
+ : stringSlice$1(that, index, index + search.length) === search;
+ }
+ });
+
+ var $$7 = _export;
+ var $trimEnd = stringTrim.end;
+ var forcedStringTrimMethod$1 = stringTrimForced;
+
+ var FORCED$4 = forcedStringTrimMethod$1('trimEnd');
+
+ var trimEnd = FORCED$4 ? function trimEnd() {
+ return $trimEnd(this);
+ // eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe
+ } : ''.trimEnd;
+
+ // `String.prototype.{ trimEnd, trimRight }` methods
+ // https://tc39.es/ecma262/#sec-string.prototype.trimend
+ // https://tc39.es/ecma262/#String.prototype.trimright
+ $$7({ target: 'String', proto: true, name: 'trimEnd', forced: FORCED$4 }, {
+ trimEnd: trimEnd,
+ trimRight: trimEnd
+ });
+
+ var $$6 = _export;
+ var $trimStart = stringTrim.start;
+ var forcedStringTrimMethod = stringTrimForced;
+
+ var FORCED$3 = forcedStringTrimMethod('trimStart');
+
+ var trimStart = FORCED$3 ? function trimStart() {
+ return $trimStart(this);
+ // eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe
+ } : ''.trimStart;
+
+ // `String.prototype.{ trimStart, trimLeft }` methods
+ // https://tc39.es/ecma262/#sec-string.prototype.trimstart
+ // https://tc39.es/ecma262/#String.prototype.trimleft
+ $$6({ target: 'String', proto: true, name: 'trimStart', forced: FORCED$3 }, {
+ trimStart: trimStart,
+ trimLeft: trimStart
+ });
+
+ var _mainLocalizer = coreLocalizer(); // singleton
+
+
+ var _t = _mainLocalizer.t;
+ // coreLocalizer manages language and locale parameters including translated strings
+ //
+
+ function coreLocalizer() {
+ var localizer = {};
+ var _dataLanguages = {}; // `_dataLocales` is an object containing all _supported_ locale codes -> language info.
+ // * `rtl` - right-to-left or left-to-right text direction
+ // * `pct` - the percent of strings translated; 1 = 100%, full coverage
+ //
+ // {
+ // en: { rtl: false, pct: {â¦} },
+ // de: { rtl: false, pct: {â¦} },
+ // â¦
+ // }
+
+ var _dataLocales = {}; // `localeStrings` is an object containing all _loaded_ locale codes -> string data.
+ // {
+ // en: { icons: {â¦}, toolbar: {â¦}, modes: {â¦}, operations: {â¦}, ⦠},
+ // de: { icons: {â¦}, toolbar: {â¦}, modes: {â¦}, operations: {â¦}, ⦠},
+ // â¦
+ // }
+
+ var _localeStrings = {}; // the current locale
+
+ var _localeCode = 'en-US'; // `_localeCodes` must contain `_localeCode` first, optionally followed by fallbacks
+
+ var _localeCodes = ['en-US', 'en'];
+ var _languageCode = 'en';
+ var _textDirection = 'ltr';
+ var _usesMetric = false;
+ var _languageNames = {};
+ var _scriptNames = {}; // getters for the current locale parameters
+
+ localizer.localeCode = function () {
+ return _localeCode;
+ };
+
+ localizer.localeCodes = function () {
+ return _localeCodes;
+ };
+
+ localizer.languageCode = function () {
+ return _languageCode;
+ };
+
+ localizer.textDirection = function () {
+ return _textDirection;
+ };
+
+ localizer.usesMetric = function () {
+ return _usesMetric;
+ };
+
+ localizer.languageNames = function () {
+ return _languageNames;
+ };
+
+ localizer.scriptNames = function () {
+ return _scriptNames;
+ }; // The client app may want to manually set the locale, regardless of the
+ // settings provided by the browser
+
+
+ var _preferredLocaleCodes = [];
+
+ localizer.preferredLocaleCodes = function (codes) {
+ if (!arguments.length) return _preferredLocaleCodes;
+
+ if (typeof codes === 'string') {
+ // be generous and accept delimited strings as input
+ _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean);
+ } else {
+ _preferredLocaleCodes = codes;
+ }
+
+ return localizer;
+ };
+
+ var _loadPromise;
+
+ localizer.ensureLoaded = function () {
+ if (_loadPromise) return _loadPromise;
+ var filesToFetch = ['languages', // load the list of languages
+ 'locales' // load the list of supported locales
+ ];
+ var localeDirs = {
+ general: 'locales',
+ tagging: 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/translations'
+ };
+ var fileMap = _mainFileFetcher.fileMap();
+
+ for (var scopeId in localeDirs) {
+ var key = "locales_index_".concat(scopeId);
+
+ if (!fileMap[key]) {
+ fileMap[key] = localeDirs[scopeId] + '/index.min.json';
+ }
+
+ filesToFetch.push(key);
+ }
+
+ return _loadPromise = Promise.all(filesToFetch.map(function (key) {
+ return _mainFileFetcher.get(key);
+ })).then(function (results) {
+ _dataLanguages = results[0];
+ _dataLocales = results[1];
+ var indexes = results.slice(2);
+
+ var requestedLocales = (_preferredLocaleCodes || []).concat(utilDetect().browserLocales) // List of locales preferred by the browser in priority order.
+ .concat(['en']); // fallback to English since it's the only guaranteed complete language
+
+
+ _localeCodes = localesToUseFrom(requestedLocales);
+ _localeCode = _localeCodes[0]; // Run iD in the highest-priority locale; the rest are fallbacks
+
+ var loadStringsPromises = [];
+ indexes.forEach(function (index, i) {
+ // Will always return the index for `en` if nothing else
+ var fullCoverageIndex = _localeCodes.findIndex(function (locale) {
+ return index[locale] && index[locale].pct === 1;
+ }); // We only need to load locales up until we find one with full coverage
+
+
+ _localeCodes.slice(0, fullCoverageIndex + 1).forEach(function (code) {
+ var scopeId = Object.keys(localeDirs)[i];
+ var directory = Object.values(localeDirs)[i];
+ if (index[code]) loadStringsPromises.push(localizer.loadLocale(code, scopeId, directory));
+ });
+ });
+ return Promise.all(loadStringsPromises);
+ }).then(function () {
+ updateForCurrentLocale();
+ })["catch"](function (err) {
+ return console.error(err);
+ }); // eslint-disable-line
+ }; // Returns the locales from `requestedLocales` supported by iD that we should use
+
+
+ function localesToUseFrom(requestedLocales) {
+ var supportedLocales = _dataLocales;
+ var toUse = [];
+
+ for (var i in requestedLocales) {
+ var locale = requestedLocales[i];
+ if (supportedLocales[locale]) toUse.push(locale);
+
+ if (locale.includes('-')) {
+ // Full locale ('es-ES'), add fallback to the base ('es')
+ var langPart = locale.split('-')[0];
+ if (supportedLocales[langPart]) toUse.push(langPart);
+ }
+ } // remove duplicates
+
+
+ return utilArrayUniq(toUse);
+ }
+
+ function updateForCurrentLocale() {
+ if (!_localeCode) return;
+ _languageCode = _localeCode.split('-')[0];
+ var currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode];
+ var hash = utilStringQs(window.location.hash);
+
+ if (hash.rtl === 'true') {
+ _textDirection = 'rtl';
+ } else if (hash.rtl === 'false') {
+ _textDirection = 'ltr';
+ } else {
+ _textDirection = currentData && currentData.rtl ? 'rtl' : 'ltr';
+ }
+
+ var locale = _localeCode;
+ if (locale.toLowerCase() === 'en-us') locale = 'en';
+ _languageNames = _localeStrings.general[locale].languageNames;
+ _scriptNames = _localeStrings.general[locale].scriptNames;
+ _usesMetric = _localeCode.slice(-3).toLowerCase() !== '-us';
+ }
+ /* Locales */
+ // Returns a Promise to load the strings for the requested locale
+
+
+ localizer.loadLocale = function (locale, scopeId, directory) {
+ // US English is the default
+ if (locale.toLowerCase() === 'en-us') locale = 'en';
+
+ if (_localeStrings[scopeId] && _localeStrings[scopeId][locale]) {
+ // already loaded
+ return Promise.resolve(locale);
+ }
+
+ var fileMap = _mainFileFetcher.fileMap();
+ var key = "locale_".concat(scopeId, "_").concat(locale);
+
+ if (!fileMap[key]) {
+ fileMap[key] = "".concat(directory, "/").concat(locale, ".min.json");
+ }
+
+ return _mainFileFetcher.get(key).then(function (d) {
+ if (!_localeStrings[scopeId]) _localeStrings[scopeId] = {};
+ _localeStrings[scopeId][locale] = d[locale];
+ return locale;
+ });
+ };
+
+ localizer.pluralRule = function (number) {
+ return pluralRule(number, _localeCode);
+ }; // Returns the plural rule for the given `number` with the given `localeCode`.
+ // One of: `zero`, `one`, `two`, `few`, `many`, `other`
+
+
+ function pluralRule(number, localeCode) {
+ // modern browsers have this functionality built-in
+ var rules = 'Intl' in window && Intl.PluralRules && new Intl.PluralRules(localeCode);
+
+ if (rules) {
+ return rules.select(number);
+ } // fallback to basic one/other, as in English
+
+
+ if (number === 1) return 'one';
+ return 'other';
+ }
+ /**
+ * Try to find that string in `locale` or the current `_localeCode` matching
+ * the given `stringId`. If no string can be found in the requested locale,
+ * we'll recurse down all the `_localeCodes` until one is found.
+ *
+ * @param {string} stringId string identifier
+ * @param {object?} replacements token replacements and default string
+ * @param {string?} locale locale to use (defaults to currentLocale)
+ * @return {string?} localized string
+ */
+
+
+ localizer.tInfo = function (origStringId, replacements, locale) {
+ var stringId = origStringId.trim();
+ var scopeId = 'general';
+
+ if (stringId[0] === '_') {
+ var split = stringId.split('.');
+ scopeId = split[0].slice(1);
+ stringId = split.slice(1).join('.');
+ }
+
+ locale = locale || _localeCode;
+ var path = stringId.split('.').map(function (s) {
+ return s.replace(//g, '.');
+ }).reverse();
+ var stringsKey = locale; // US English is the default
+
+ if (stringsKey.toLowerCase() === 'en-us') stringsKey = 'en';
+ var result = _localeStrings && _localeStrings[scopeId] && _localeStrings[scopeId][stringsKey];
+
+ while (result !== undefined && path.length) {
+ result = result[path.pop()];
+ }
+
+ if (result !== undefined) {
+ if (replacements) {
+ if (_typeof(result) === 'object' && Object.keys(result).length) {
+ // If plural forms are provided, dig one level deeper based on the
+ // first numeric token replacement provided.
+ var number = Object.values(replacements).find(function (value) {
+ return typeof value === 'number';
+ });
+
+ if (number !== undefined) {
+ var rule = pluralRule(number, locale);
+
+ if (result[rule]) {
+ result = result[rule];
+ } else {
+ // We're pretty sure this should be a plural but no string
+ // could be found for the given rule. Just pick the first
+ // string and hope it makes sense.
+ result = Object.values(result)[0];
+ }
+ }
+ }
+
+ if (typeof result === 'string') {
+ for (var key in replacements) {
+ var value = replacements[key];
+
+ if (typeof value === 'number') {
+ if (value.toLocaleString) {
+ // format numbers for the locale
+ value = value.toLocaleString(locale, {
+ style: 'decimal',
+ useGrouping: true,
+ minimumFractionDigits: 0
+ });
+ } else {
+ value = value.toString();
+ }
+ }
+
+ var token = "{".concat(key, "}");
+ var regex = new RegExp(token, 'g');
+ result = result.replace(regex, value);
+ }
+ }
+ }
+
+ if (typeof result === 'string') {
+ // found a localized string!
+ return {
+ text: result,
+ locale: locale
+ };
+ }
+ } // no localized string found...
+ // attempt to fallback to a lower-priority language
+
+
+ var index = _localeCodes.indexOf(locale);
+
+ if (index >= 0 && index < _localeCodes.length - 1) {
+ // eventually this will be 'en' or another locale with 100% coverage
+ var fallback = _localeCodes[index + 1];
+ return localizer.tInfo(origStringId, replacements, fallback);
+ }
+
+ if (replacements && 'default' in replacements) {
+ // Fallback to a default value if one is specified in `replacements`
+ return {
+ text: replacements["default"],
+ locale: null
+ };
+ }
+
+ var missing = "Missing ".concat(locale, " translation: ").concat(origStringId);
+ if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
+
+ return {
+ text: missing,
+ locale: 'en'
+ };
+ };
+
+ localizer.hasTextForStringId = function (stringId) {
+ return !!localizer.tInfo(stringId, {
+ "default": 'nothing found'
+ }).locale;
+ }; // Returns only the localized text, discarding the locale info
+
+
+ localizer.t = function (stringId, replacements, locale) {
+ return localizer.tInfo(stringId, replacements, locale).text;
+ }; // Returns the localized text wrapped in an HTML element encoding the locale info
+
+ /**
+ * @deprecated This method is considered deprecated. Instead, use the direct DOM manipulating
+ * method `t.append`.
+ */
+
+
+ localizer.t.html = function (stringId, replacements, locale) {
+ // replacement string might be html unsafe, so we need to escape it except if it is explicitly marked as html code
+ replacements = Object.assign({}, replacements);
+
+ for (var k in replacements) {
+ if (typeof replacements[k] === 'string') {
+ replacements[k] = escape$4(replacements[k]);
+ }
+
+ if (_typeof(replacements[k]) === 'object' && typeof replacements[k].html === 'string') {
+ replacements[k] = replacements[k].html;
+ }
+ }
+
+ var info = localizer.tInfo(stringId, replacements, locale); // text may be empty or undefined if `replacements.default` is
+
+ if (info.text) {
+ return "").concat(info.text, "");
+ } else {
+ return '';
+ }
+ }; // Adds localized text wrapped as an HTML span element with locale info to the DOM
+
+
+ localizer.t.append = function (stringId, replacements, locale) {
+ return function (selection) {
+ var info = localizer.tInfo(stringId, replacements, locale);
+ return selection.append('span').attr('class', 'localized-text').attr('lang', info.locale || 'und').text((replacements && replacements.prefix || '') + info.text + (replacements && replacements.suffix || ''));
+ };
+ };
+
+ localizer.languageName = function (code, options) {
+ if (_languageNames[code]) {
+ // name in locale language
+ // e.g. "German"
+ return _languageNames[code];
+ } // sometimes we only want the local name
+
+
+ if (options && options.localOnly) return null;
+ var langInfo = _dataLanguages[code];
+
+ if (langInfo) {
+ if (langInfo.nativeName) {
+ // name in native language
+ // e.g. "Deutsch (de)"
+ return localizer.t('translate.language_and_code', {
+ language: langInfo.nativeName,
+ code: code
+ });
+ } else if (langInfo.base && langInfo.script) {
+ var base = langInfo.base; // the code of the language this is based on
+
+ if (_languageNames[base]) {
+ // base language name in locale language
+ var scriptCode = langInfo.script;
+ var script = _scriptNames[scriptCode] || scriptCode; // e.g. "Serbian (Cyrillic)"
+
+ return localizer.t('translate.language_and_code', {
+ language: _languageNames[base],
+ code: script
+ });
+ } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) {
+ // e.g. "ÑÑпÑки (sr-Cyrl)"
+ return localizer.t('translate.language_and_code', {
+ language: _dataLanguages[base].nativeName,
+ code: code
+ });
+ }
+ }
+ }
+
+ return code; // if not found, use the code
+ };
+
+ return localizer;
+ }
+
+ // `presetCollection` is a wrapper around an `Array` of presets `collection`,
+ // and decorated with some extra methods for searching and matching geometry
+ //
+
+ function presetCollection(collection) {
+ var MAXRESULTS = 50;
+ var _this = {};
+ var _memo = {};
+ _this.collection = collection;
+
+ _this.item = function (id) {
+ if (_memo[id]) return _memo[id];
+
+ var found = _this.collection.find(function (d) {
+ return d.id === id;
+ });
+
+ if (found) _memo[id] = found;
+ return found;
+ };
+
+ _this.index = function (id) {
+ return _this.collection.findIndex(function (d) {
+ return d.id === id;
+ });
+ };
+
+ _this.matchGeometry = function (geometry) {
+ return presetCollection(_this.collection.filter(function (d) {
+ return d.matchGeometry(geometry);
+ }));
+ };
+
+ _this.matchAllGeometry = function (geometries) {
+ return presetCollection(_this.collection.filter(function (d) {
+ return d && d.matchAllGeometry(geometries);
+ }));
+ };
+
+ _this.matchAnyGeometry = function (geometries) {
+ return presetCollection(_this.collection.filter(function (d) {
+ return geometries.some(function (geom) {
+ return d.matchGeometry(geom);
+ });
+ }));
+ };
+
+ _this.fallback = function (geometry) {
+ var id = geometry;
+ if (id === 'vertex') id = 'point';
+ return _this.item(id);
+ };
+
+ _this.search = function (value, geometry, loc) {
+ if (!value) return _this; // don't remove diacritical characters since we're assuming the user is being intentional
+
+ value = value.toLowerCase().trim(); // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
+
+ function leading(a) {
+ var index = a.indexOf(value);
+ return index === 0 || a[index - 1] === ' ';
+ } // match at name beginning only
+
+
+ function leadingStrict(a) {
+ var index = a.indexOf(value);
+ return index === 0;
+ }
+
+ function sortPresets(nameProp) {
+ return function sortNames(a, b) {
+ var aCompare = a[nameProp]();
+ var bCompare = b[nameProp](); // priority if search string matches preset name exactly - #4325
+
+ if (value === aCompare) return -1;
+ if (value === bCompare) return 1; // priority for higher matchScore
+
+ var i = b.originalScore - a.originalScore;
+ if (i !== 0) return i; // priority if search string appears earlier in preset name
+
+ i = aCompare.indexOf(value) - bCompare.indexOf(value);
+ if (i !== 0) return i; // priority for shorter preset names
+
+ return aCompare.length - bCompare.length;
+ };
+ }
+
+ var pool = _this.collection;
+
+ if (Array.isArray(loc)) {
+ var validLocations = _mainLocations.locationsAt(loc);
+ pool = pool.filter(function (a) {
+ return !a.locationSetID || validLocations[a.locationSetID];
+ });
+ }
+
+ var searchable = pool.filter(function (a) {
+ return a.searchable !== false && a.suggestion !== true;
+ });
+ var suggestions = pool.filter(function (a) {
+ return a.suggestion === true;
+ }); // matches value to preset.name
+
+ var leadingNames = searchable.filter(function (a) {
+ return leading(a.searchName());
+ }).sort(sortPresets('searchName')); // matches value to preset suggestion name
+
+ var leadingSuggestions = suggestions.filter(function (a) {
+ return leadingStrict(a.searchName());
+ }).sort(sortPresets('searchName'));
+ var leadingNamesStripped = searchable.filter(function (a) {
+ return leading(a.searchNameStripped());
+ }).sort(sortPresets('searchNameStripped'));
+ var leadingSuggestionsStripped = suggestions.filter(function (a) {
+ return leadingStrict(a.searchNameStripped());
+ }).sort(sortPresets('searchNameStripped')); // matches value to preset.terms values
+
+ var leadingTerms = searchable.filter(function (a) {
+ return (a.terms() || []).some(leading);
+ });
+ var leadingSuggestionTerms = suggestions.filter(function (a) {
+ return (a.terms() || []).some(leading);
+ }); // matches value to preset.tags values
+
+ var leadingTagValues = searchable.filter(function (a) {
+ return Object.values(a.tags || {}).filter(function (val) {
+ return val !== '*';
+ }).some(leading);
+ }); // finds close matches to value in preset.name
+
+ var similarName = searchable.map(function (a) {
+ return {
+ preset: a,
+ dist: utilEditDistance(value, a.searchName())
+ };
+ }).filter(function (a) {
+ return a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 3;
+ }).sort(function (a, b) {
+ return a.dist - b.dist;
+ }).map(function (a) {
+ return a.preset;
+ }); // finds close matches to value to preset suggestion name
+
+ var similarSuggestions = suggestions.map(function (a) {
+ return {
+ preset: a,
+ dist: utilEditDistance(value, a.searchName())
+ };
+ }).filter(function (a) {
+ return a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 1;
+ }).sort(function (a, b) {
+ return a.dist - b.dist;
+ }).map(function (a) {
+ return a.preset;
+ }); // finds close matches to value in preset.terms
+
+ var similarTerms = searchable.filter(function (a) {
+ return (a.terms() || []).some(function (b) {
+ return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
+ });
+ });
+ var results = leadingNames.concat(leadingSuggestions, leadingNamesStripped, leadingSuggestionsStripped, leadingTerms, leadingSuggestionTerms, leadingTagValues, similarName, similarSuggestions, similarTerms).slice(0, MAXRESULTS - 1);
+
+ if (geometry) {
+ if (typeof geometry === 'string') {
+ results.push(_this.fallback(geometry));
+ } else {
+ geometry.forEach(function (geom) {
+ return results.push(_this.fallback(geom));
+ });
+ }
+ }
+
+ return presetCollection(utilArrayUniq(results));
+ };
+
+ return _this;
+ }
+
+ // `presetCategory` builds a `presetCollection` of member presets,
+ // decorated with some extra methods for searching and matching geometry
+ //
+
+ function presetCategory(categoryID, category, allPresets) {
+ var _this = Object.assign({}, category); // shallow copy
+
+
+ var _searchName; // cache
+
+
+ var _searchNameStripped; // cache
+
+
+ _this.id = categoryID;
+ _this.members = presetCollection((category.members || []).map(function (presetID) {
+ return allPresets[presetID];
+ }).filter(Boolean));
+ _this.geometry = _this.members.collection.reduce(function (acc, preset) {
+ for (var i in preset.geometry) {
+ var geometry = preset.geometry[i];
+
+ if (acc.indexOf(geometry) === -1) {
+ acc.push(geometry);
+ }
+ }
+
+ return acc;
+ }, []);
+
+ _this.matchGeometry = function (geom) {
+ return _this.geometry.indexOf(geom) >= 0;
+ };
+
+ _this.matchAllGeometry = function (geometries) {
+ return _this.members.collection.some(function (preset) {
+ return preset.matchAllGeometry(geometries);
+ });
+ };
+
+ _this.matchScore = function () {
+ return -1;
+ };
+
+ _this.name = function () {
+ return _t("_tagging.presets.categories.".concat(categoryID, ".name"), {
+ 'default': categoryID
+ });
+ };
+
+ _this.nameLabel = function () {
+ return _t.html("_tagging.presets.categories.".concat(categoryID, ".name"), {
+ 'default': categoryID
+ });
+ };
+
+ _this.terms = function () {
+ return [];
+ };
+
+ _this.searchName = function () {
+ if (!_searchName) {
+ _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
+ }
+
+ return _searchName;
+ };
+
+ _this.searchNameStripped = function () {
+ if (!_searchNameStripped) {
+ _searchNameStripped = _this.searchName(); // split combined diacritical characters into their parts
+
+ if (_searchNameStripped.normalize) _searchNameStripped = _searchNameStripped.normalize('NFD'); // remove diacritics
+
+ _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, '');
+ }
+
+ return _searchNameStripped;
+ };
+
+ return _this;
+ }
+
+ // `presetField` decorates a given `field` Object
+ // with some extra methods for searching and matching geometry
+ //
+
+ function presetField(fieldID, field) {
+ var _this = Object.assign({}, field); // shallow copy
+
+
+ _this.id = fieldID; // for use in classes, element ids, css selectors
+
+ _this.safeid = utilSafeClassName(fieldID);
+
+ _this.matchGeometry = function (geom) {
+ return !_this.geometry || _this.geometry.indexOf(geom) !== -1;
+ };
+
+ _this.matchAllGeometry = function (geometries) {
+ return !_this.geometry || geometries.every(function (geom) {
+ return _this.geometry.indexOf(geom) !== -1;
+ });
+ };
+
+ _this.t = function (scope, options) {
+ return _t("_tagging.presets.fields.".concat(fieldID, ".").concat(scope), options);
+ };
+
+ _this.t.html = function (scope, options) {
+ return _t.html("_tagging.presets.fields.".concat(fieldID, ".").concat(scope), options);
+ };
+
+ _this.hasTextForStringId = function (scope) {
+ return _mainLocalizer.hasTextForStringId("_tagging.presets.fields.".concat(fieldID, ".").concat(scope));
+ };
+
+ _this.title = function () {
+ return _this.overrideLabel || _this.t('label', {
+ 'default': fieldID
+ });
+ };
+
+ _this.label = function () {
+ return _this.overrideLabel || _this.t.html('label', {
+ 'default': fieldID
+ });
+ };
+
+ var _placeholder = _this.placeholder;
+
+ _this.placeholder = function () {
+ return _this.t('placeholder', {
+ 'default': _placeholder
+ });
+ };
+
+ _this.originalTerms = (_this.terms || []).join();
+
+ _this.terms = function () {
+ return _this.t('terms', {
+ 'default': _this.originalTerms
+ }).toLowerCase().trim().split(/\s*,+\s*/);
+ };
+
+ _this.increment = _this.type === 'number' ? _this.increment || 1 : undefined;
+ return _this;
+ }
+
+ // `presetPreset` decorates a given `preset` Object
+ // with some extra methods for searching and matching geometry
+ //
+
+ function presetPreset(presetID, preset, addable, allFields, allPresets) {
+ allFields = allFields || {};
+ allPresets = allPresets || {};
+
+ var _this = Object.assign({}, preset); // shallow copy
+
+
+ var _addable = addable || false;
+
+ var _resolvedFields; // cache
+
+
+ var _resolvedMoreFields; // cache
+
+
+ var _searchName; // cache
+
+
+ var _searchNameStripped; // cache
+
+
+ _this.id = presetID;
+ _this.safeid = utilSafeClassName(presetID); // for use in css classes, selectors, element ids
+
+ _this.originalTerms = (_this.terms || []).join();
+ _this.originalName = _this.name || '';
+ _this.originalScore = _this.matchScore || 1;
+ _this.originalReference = _this.reference || {};
+ _this.originalFields = _this.fields || [];
+ _this.originalMoreFields = _this.moreFields || [];
+
+ _this.fields = function () {
+ return _resolvedFields || (_resolvedFields = resolve('fields'));
+ };
+
+ _this.moreFields = function () {
+ return _resolvedMoreFields || (_resolvedMoreFields = resolve('moreFields'));
+ };
+
+ _this.resetFields = function () {
+ return _resolvedFields = _resolvedMoreFields = null;
+ };
+
+ _this.tags = _this.tags || {};
+ _this.addTags = _this.addTags || _this.tags;
+ _this.removeTags = _this.removeTags || _this.addTags;
+ _this.geometry = _this.geometry || [];
+
+ _this.matchGeometry = function (geom) {
+ return _this.geometry.indexOf(geom) >= 0;
+ };
+
+ _this.matchAllGeometry = function (geoms) {
+ return geoms.every(_this.matchGeometry);
+ };
+
+ _this.matchScore = function (entityTags) {
+ var tags = _this.tags;
+ var seen = {};
+ var score = 0; // match on tags
+
+ for (var k in tags) {
+ seen[k] = true;
+
+ if (entityTags[k] === tags[k]) {
+ score += _this.originalScore;
+ } else if (tags[k] === '*' && k in entityTags) {
+ score += _this.originalScore / 2;
+ } else {
+ return -1;
+ }
+ } // boost score for additional matches in addTags - #6802
+
+
+ var addTags = _this.addTags;
+
+ for (var _k in addTags) {
+ if (!seen[_k] && entityTags[_k] === addTags[_k]) {
+ score += _this.originalScore;
+ }
+ }
+
+ return score;
+ };
+
+ _this.t = function (scope, options) {
+ var textID = "_tagging.presets.presets.".concat(presetID, ".").concat(scope);
+ return _t(textID, options);
+ };
+
+ _this.t.html = function (scope, options) {
+ var textID = "_tagging.presets.presets.".concat(presetID, ".").concat(scope);
+ return _t.html(textID, options);
+ };
+
+ _this.name = function () {
+ return _this.t('name', {
+ 'default': _this.originalName
+ });
+ };
+
+ _this.nameLabel = function () {
+ return _this.t.html('name', {
+ 'default': _this.originalName
+ });
+ };
+
+ _this.subtitle = function () {
+ if (_this.suggestion) {
+ var path = presetID.split('/');
+ path.pop(); // remove brand name
+
+ return _t('_tagging.presets.presets.' + path.join('/') + '.name');
+ }
+
+ return null;
+ };
+
+ _this.subtitleLabel = function () {
+ if (_this.suggestion) {
+ var path = presetID.split('/');
+ path.pop(); // remove brand name
+
+ return _t.html('_tagging.presets.presets.' + path.join('/') + '.name');
+ }
+
+ return null;
+ };
+
+ _this.terms = function () {
+ return _this.t('terms', {
+ 'default': _this.originalTerms
+ }).toLowerCase().trim().split(/\s*,+\s*/);
+ };
+
+ _this.searchName = function () {
+ if (!_searchName) {
+ _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
+ }
+
+ return _searchName;
+ };
+
+ _this.searchNameStripped = function () {
+ if (!_searchNameStripped) {
+ _searchNameStripped = _this.searchName(); // split combined diacritical characters into their parts
+
+ if (_searchNameStripped.normalize) _searchNameStripped = _searchNameStripped.normalize('NFD'); // remove diacritics
+
+ _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, '');
+ }
+
+ return _searchNameStripped;
+ };
+
+ _this.isFallback = function () {
+ var tagCount = Object.keys(_this.tags).length;
+ return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty('area');
+ };
+
+ _this.addable = function (val) {
+ if (!arguments.length) return _addable;
+ _addable = val;
+ return _this;
+ };
+
+ _this.reference = function () {
+ // Lookup documentation on Wikidata...
+ var qid = _this.tags.wikidata || _this.tags['flag:wikidata'] || _this.tags['brand:wikidata'] || _this.tags['network:wikidata'] || _this.tags['operator:wikidata'];
+
+ if (qid) {
+ return {
+ qid: qid
+ };
+ } // Lookup documentation on OSM Wikibase...
+
+
+ var key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, 'name'))[0];
+ var value = _this.originalReference.value || _this.tags[key];
+
+ if (value === '*') {
+ return {
+ key: key
+ };
+ } else {
+ return {
+ key: key,
+ value: value
+ };
+ }
+ };
+
+ _this.unsetTags = function (tags, geometry, ignoringKeys, skipFieldDefaults) {
+ // allow manually keeping some tags
+ var removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags;
+ tags = utilObjectOmit(tags, Object.keys(removeTags));
+
+ if (geometry && !skipFieldDefaults) {
+ _this.fields().forEach(function (field) {
+ if (field.matchGeometry(geometry) && field.key && field["default"] === tags[field.key]) {
+ delete tags[field.key];
+ }
+ });
+ }
+
+ delete tags.area;
+ return tags;
+ };
+
+ _this.setTags = function (tags, geometry, skipFieldDefaults) {
+ var addTags = _this.addTags;
+ tags = Object.assign({}, tags); // shallow copy
+
+ for (var k in addTags) {
+ if (addTags[k] === '*') {
+ // if this tag is ancillary, don't override an existing value since any value is okay
+ if (_this.tags[k] || !tags[k] || tags[k] === 'no') {
+ tags[k] = 'yes';
+ }
+ } else {
+ tags[k] = addTags[k];
+ }
+ } // Add area=yes if necessary.
+ // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
+ // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
+ // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`)
+
+
+ if (!addTags.hasOwnProperty('area')) {
+ delete tags.area;
+
+ if (geometry === 'area') {
+ var needsAreaTag = true;
+
+ if (_this.geometry.indexOf('line') === -1) {
+ for (var _k2 in addTags) {
+ if (_k2 in osmAreaKeys) {
+ needsAreaTag = false;
+ break;
+ }
+ }
+ }
+
+ if (needsAreaTag) {
+ tags.area = 'yes';
+ }
+ }
+ }
+
+ if (geometry && !skipFieldDefaults) {
+ _this.fields().forEach(function (field) {
+ if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field["default"]) {
+ tags[field.key] = field["default"];
+ }
+ });
+ }
+
+ return tags;
+ }; // For a preset without fields, use the fields of the parent preset.
+ // Replace {preset} placeholders with the fields of the specified presets.
+
+
+ function resolve(which) {
+ var fieldIDs = which === 'fields' ? _this.originalFields : _this.originalMoreFields;
+ var resolved = [];
+ fieldIDs.forEach(function (fieldID) {
+ var match = fieldID.match(/\{(.*)\}/);
+
+ if (match !== null) {
+ // a presetID wrapped in braces {}
+ resolved = resolved.concat(inheritFields(match[1], which));
+ } else if (allFields[fieldID]) {
+ // a normal fieldID
+ resolved.push(allFields[fieldID]);
+ } else {
+ console.log("Cannot resolve \"".concat(fieldID, "\" found in ").concat(_this.id, ".").concat(which)); // eslint-disable-line no-console
+ }
+ }); // no fields resolved, so use the parent's if possible
+
+ if (!resolved.length) {
+ var endIndex = _this.id.lastIndexOf('/');
+
+ var parentID = endIndex && _this.id.substring(0, endIndex);
+
+ if (parentID) {
+ resolved = inheritFields(parentID, which);
+ }
+ }
+
+ return utilArrayUniq(resolved); // returns an array of fields to inherit from the given presetID, if found
+
+ function inheritFields(presetID, which) {
+ var parent = allPresets[presetID];
+ if (!parent) return [];
+
+ if (which === 'fields') {
+ return parent.fields().filter(shouldInherit);
+ } else if (which === 'moreFields') {
+ return parent.moreFields();
+ } else {
+ return [];
+ }
+ } // Skip `fields` for the keys which define the preset.
+ // These are usually `typeCombo` fields like `shop=*`
+
+
+ function shouldInherit(f) {
+ if (f.key && _this.tags[f.key] !== undefined && // inherit anyway if multiple values are allowed or just a checkbox
+ f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'manyCombo' && f.type !== 'check') return false;
+ return true;
+ }
+ }
+
+ return _this;
+ }
+
+ var _mainPresetIndex = presetIndex(); // singleton
+ // `presetIndex` wraps a `presetCollection`
+ // with methods for loading new data and returning defaults
+ //
+
+ function presetIndex() {
+ var dispatch = dispatch$8('favoritePreset', 'recentsChange');
+ var MAXRECENTS = 30; // seed the preset lists with geometry fallbacks
+
+ var POINT = presetPreset('point', {
+ name: 'Point',
+ tags: {},
+ geometry: ['point', 'vertex'],
+ matchScore: 0.1
+ });
+ var LINE = presetPreset('line', {
+ name: 'Line',
+ tags: {},
+ geometry: ['line'],
+ matchScore: 0.1
+ });
+ var AREA = presetPreset('area', {
+ name: 'Area',
+ tags: {
+ area: 'yes'
+ },
+ geometry: ['area'],
+ matchScore: 0.1
+ });
+ var RELATION = presetPreset('relation', {
+ name: 'Relation',
+ tags: {},
+ geometry: ['relation'],
+ matchScore: 0.1
+ });
+
+ var _this = presetCollection([POINT, LINE, AREA, RELATION]);
+
+ var _presets = {
+ point: POINT,
+ line: LINE,
+ area: AREA,
+ relation: RELATION
+ };
+ var _defaults = {
+ point: presetCollection([POINT]),
+ vertex: presetCollection([POINT]),
+ line: presetCollection([LINE]),
+ area: presetCollection([AREA]),
+ relation: presetCollection([RELATION])
+ };
+ var _fields = {};
+ var _categories = {};
+ var _universal = [];
+ var _addablePresetIDs = null; // Set of preset IDs that the user can add
+
+ var _recents;
+
+ var _favorites; // Index of presets by (geometry, tag key).
+
+
+ var _geometryIndex = {
+ point: {},
+ vertex: {},
+ line: {},
+ area: {},
+ relation: {}
+ };
+
+ var _loadPromise;
+
+ _this.ensureLoaded = function () {
+ if (_loadPromise) return _loadPromise;
+ return _loadPromise = Promise.all([_mainFileFetcher.get('preset_categories'), _mainFileFetcher.get('preset_defaults'), _mainFileFetcher.get('preset_presets'), _mainFileFetcher.get('preset_fields')]).then(function (vals) {
+ _this.merge({
+ categories: vals[0],
+ defaults: vals[1],
+ presets: vals[2],
+ fields: vals[3]
+ });
+
+ osmSetAreaKeys(_this.areaKeys());
+ osmSetPointTags(_this.pointTags());
+ osmSetVertexTags(_this.vertexTags());
+ });
+ }; // `merge` accepts an object containing new preset data (all properties optional):
+ // {
+ // fields: {},
+ // presets: {},
+ // categories: {},
+ // defaults: {},
+ // featureCollection: {}
+ //}
+
+
+ _this.merge = function (d) {
+ var newLocationSets = []; // Merge Fields
+
+ if (d.fields) {
+ Object.keys(d.fields).forEach(function (fieldID) {
+ var f = d.fields[fieldID];
+
+ if (f) {
+ // add or replace
+ f = presetField(fieldID, f);
+ if (f.locationSet) newLocationSets.push(f);
+ _fields[fieldID] = f;
+ } else {
+ // remove
+ delete _fields[fieldID];
+ }
+ });
+ } // Merge Presets
+
+
+ if (d.presets) {
+ Object.keys(d.presets).forEach(function (presetID) {
+ var p = d.presets[presetID];
+
+ if (p) {
+ // add or replace
+ var isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID);
+
+ p = presetPreset(presetID, p, isAddable, _fields, _presets);
+ if (p.locationSet) newLocationSets.push(p);
+ _presets[presetID] = p;
+ } else {
+ // remove (but not if it's a fallback)
+ var existing = _presets[presetID];
+
+ if (existing && !existing.isFallback()) {
+ delete _presets[presetID];
+ }
+ }
+ });
+ } // Merge Categories
+
+
+ if (d.categories) {
+ Object.keys(d.categories).forEach(function (categoryID) {
+ var c = d.categories[categoryID];
+
+ if (c) {
+ // add or replace
+ c = presetCategory(categoryID, c, _presets);
+ if (c.locationSet) newLocationSets.push(c);
+ _categories[categoryID] = c;
+ } else {
+ // remove
+ delete _categories[categoryID];
+ }
+ });
+ } // Rebuild _this.collection after changing presets and categories
+
+
+ _this.collection = Object.values(_presets).concat(Object.values(_categories)); // Merge Defaults
+
+ if (d.defaults) {
+ Object.keys(d.defaults).forEach(function (geometry) {
+ var def = d.defaults[geometry];
+
+ if (Array.isArray(def)) {
+ // add or replace
+ _defaults[geometry] = presetCollection(def.map(function (id) {
+ return _presets[id] || _categories[id];
+ }).filter(Boolean));
+ } else {
+ // remove
+ delete _defaults[geometry];
+ }
+ });
+ } // Rebuild universal fields array
+
+
+ _universal = Object.values(_fields).filter(function (field) {
+ return field.universal;
+ }); // Reset all the preset fields - they'll need to be resolved again
+
+ Object.values(_presets).forEach(function (preset) {
+ return preset.resetFields();
+ }); // Rebuild geometry index
+
+ _geometryIndex = {
+ point: {},
+ vertex: {},
+ line: {},
+ area: {},
+ relation: {}
+ };
+
+ _this.collection.forEach(function (preset) {
+ (preset.geometry || []).forEach(function (geometry) {
+ var g = _geometryIndex[geometry];
+
+ for (var key in preset.tags) {
+ g[key] = g[key] || {};
+ var value = preset.tags[key];
+ (g[key][value] = g[key][value] || []).push(preset);
+ }
+ });
+ }); // Merge Custom Features
+
+
+ if (d.featureCollection && Array.isArray(d.featureCollection.features)) {
+ _mainLocations.mergeCustomGeoJSON(d.featureCollection);
+ } // Resolve all locationSet features.
+
+
+ if (newLocationSets.length) {
+ _mainLocations.mergeLocationSets(newLocationSets);
+ }
+
+ return _this;
+ };
+
+ _this.match = function (entity, resolver) {
+ return resolver["transient"](entity, 'presetMatch', function () {
+ var geometry = entity.geometry(resolver); // Treat entities on addr:interpolation lines as points, not vertices - #3241
+
+ if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
+ geometry = 'point';
+ }
+
+ var entityExtent = entity.extent(resolver);
+ return _this.matchTags(entity.tags, geometry, entityExtent.center());
+ });
+ };
+
+ _this.matchTags = function (tags, geometry, loc) {
+ var keyIndex = _geometryIndex[geometry];
+ var bestScore = -1;
+ var bestMatch;
+ var matchCandidates = [];
+
+ for (var k in tags) {
+ var indexMatches = [];
+ var valueIndex = keyIndex[k];
+ if (!valueIndex) continue;
+ var keyValueMatches = valueIndex[tags[k]];
+ if (keyValueMatches) indexMatches.push.apply(indexMatches, _toConsumableArray(keyValueMatches));
+ var keyStarMatches = valueIndex['*'];
+ if (keyStarMatches) indexMatches.push.apply(indexMatches, _toConsumableArray(keyStarMatches));
+ if (indexMatches.length === 0) continue;
+
+ for (var i = 0; i < indexMatches.length; i++) {
+ var candidate = indexMatches[i];
+ var score = candidate.matchScore(tags);
+
+ if (score === -1) {
+ continue;
+ }
+
+ matchCandidates.push({
+ score: score,
+ candidate: candidate
+ });
+
+ if (score > bestScore) {
+ bestScore = score;
+ bestMatch = candidate;
+ }
+ }
+ }
+
+ if (bestMatch && bestMatch.locationSetID && bestMatch.locationSetID !== '+[Q2]' && Array.isArray(loc)) {
+ var validLocations = _mainLocations.locationsAt(loc);
+
+ if (!validLocations[bestMatch.locationSetID]) {
+ matchCandidates.sort(function (a, b) {
+ return a.score < b.score ? 1 : -1;
+ });
+
+ for (var _i = 0; _i < matchCandidates.length; _i++) {
+ var candidateScore = matchCandidates[_i];
+
+ if (!candidateScore.candidate.locationSetID || validLocations[candidateScore.candidate.locationSetID]) {
+ bestMatch = candidateScore.candidate;
+ bestScore = candidateScore.score;
+ break;
+ }
+ }
+ }
+ } // If any part of an address is present, allow fallback to "Address" preset - #4353
+
+
+ if (!bestMatch || bestMatch.isFallback()) {
+ for (var _k in tags) {
+ if (/^addr:/.test(_k) && keyIndex['addr:*'] && keyIndex['addr:*']['*']) {
+ bestMatch = keyIndex['addr:*']['*'][0];
+ break;
+ }
+ }
+ }
+
+ return bestMatch || _this.fallback(geometry);
+ };
+
+ _this.allowsVertex = function (entity, resolver) {
+ if (entity.type !== 'node') return false;
+ if (Object.keys(entity.tags).length === 0) return true;
+ return resolver["transient"](entity, 'vertexMatch', function () {
+ // address lines allow vertices to act as standalone points
+ if (entity.isOnAddressLine(resolver)) return true;
+ var geometries = osmNodeGeometriesForTags(entity.tags);
+ if (geometries.vertex) return true;
+ if (geometries.point) return false; // allow vertices for unspecified points
+
+ return true;
+ });
+ }; // Because of the open nature of tagging, iD will never have a complete
+ // list of tags used in OSM, so we want it to have logic like "assume
+ // that a closed way with an amenity tag is an area, unless the amenity
+ // is one of these specific types". This function computes a structure
+ // that allows testing of such conditions, based on the presets designated
+ // as as supporting (or not supporting) the area geometry.
+ //
+ // The returned object L is a keeplist/discardlist of tags. A closed way
+ // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
+ // (see `Way#isArea()`). In other words, the keys of L form the keeplist,
+ // and the subkeys form the discardlist.
+
+
+ _this.areaKeys = function () {
+ // The ignore list is for keys that imply lines. (We always add `area=yes` for exceptions)
+ var ignore = ['barrier', 'highway', 'footway', 'railway', 'junction', 'type'];
+ var areaKeys = {}; // ignore name-suggestion-index and deprecated presets
+
+ var presets = _this.collection.filter(function (p) {
+ return !p.suggestion && !p.replacement;
+ }); // keeplist
+
+
+ presets.forEach(function (p) {
+ var keys = p.tags && Object.keys(p.tags);
+ var key = keys && keys.length && keys[0]; // pick the first tag
+
+ if (!key) return;
+ if (ignore.indexOf(key) !== -1) return;
+
+ if (p.geometry.indexOf('area') !== -1) {
+ // probably an area..
+ areaKeys[key] = areaKeys[key] || {};
+ }
+ }); // discardlist
+
+ presets.forEach(function (p) {
+ var key;
+
+ for (key in p.addTags) {
+ // examine all addTags to get a better sense of what can be tagged on lines - #6800
+ var value = p.addTags[key];
+
+ if (key in areaKeys && // probably an area...
+ p.geometry.indexOf('line') !== -1 && // but sometimes a line
+ value !== '*') {
+ areaKeys[key][value] = true;
+ }
+ }
+ });
+ return areaKeys;
+ };
+
+ _this.pointTags = function () {
+ return _this.collection.reduce(function (pointTags, d) {
+ // ignore name-suggestion-index, deprecated, and generic presets
+ if (d.suggestion || d.replacement || d.searchable === false) return pointTags; // only care about the primary tag
+
+ var keys = d.tags && Object.keys(d.tags);
+ var key = keys && keys.length && keys[0]; // pick the first tag
+
+ if (!key) return pointTags; // if this can be a point
+
+ if (d.geometry.indexOf('point') !== -1) {
+ pointTags[key] = pointTags[key] || {};
+ pointTags[key][d.tags[key]] = true;
+ }
+
+ return pointTags;
+ }, {});
+ };
+
+ _this.vertexTags = function () {
+ return _this.collection.reduce(function (vertexTags, d) {
+ // ignore name-suggestion-index, deprecated, and generic presets
+ if (d.suggestion || d.replacement || d.searchable === false) return vertexTags; // only care about the primary tag
+
+ var keys = d.tags && Object.keys(d.tags);
+ var key = keys && keys.length && keys[0]; // pick the first tag
+
+ if (!key) return vertexTags; // if this can be a vertex
+
+ if (d.geometry.indexOf('vertex') !== -1) {
+ vertexTags[key] = vertexTags[key] || {};
+ vertexTags[key][d.tags[key]] = true;
+ }
+
+ return vertexTags;
+ }, {});
+ };
+
+ _this.field = function (id) {
+ return _fields[id];
+ };
+
+ _this.universal = function () {
+ return _universal;
+ };
+
+ _this.defaults = function (geometry, n, startWithRecents, loc) {
+ var recents = [];
+
+ if (startWithRecents) {
+ recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4);
+ }
+
+ var defaults;
+
+ if (_addablePresetIDs) {
+ defaults = Array.from(_addablePresetIDs).map(function (id) {
+ var preset = _this.item(id);
+
+ if (preset && preset.matchGeometry(geometry)) return preset;
+ return null;
+ }).filter(Boolean);
+ } else {
+ defaults = _defaults[geometry].collection.concat(_this.fallback(geometry));
+ }
+
+ var result = presetCollection(utilArrayUniq(recents.concat(defaults)).slice(0, n - 1));
+
+ if (Array.isArray(loc)) {
+ var validLocations = _mainLocations.locationsAt(loc);
+ result.collection = result.collection.filter(function (a) {
+ return !a.locationSetID || validLocations[a.locationSetID];
+ });
+ }
+
+ return result;
+ }; // pass a Set of addable preset ids
+
+
+ _this.addablePresetIDs = function (val) {
+ if (!arguments.length) return _addablePresetIDs; // accept and convert arrays
+
+ if (Array.isArray(val)) val = new Set(val);
+ _addablePresetIDs = val;
+
+ if (_addablePresetIDs) {
+ // reset all presets
+ _this.collection.forEach(function (p) {
+ // categories aren't addable
+ if (p.addable) p.addable(_addablePresetIDs.has(p.id));
+ });
+ } else {
+ _this.collection.forEach(function (p) {
+ if (p.addable) p.addable(true);
+ });
+ }
+
+ return _this;
+ };
+
+ _this.recent = function () {
+ return presetCollection(utilArrayUniq(_this.getRecents().map(function (d) {
+ return d.preset;
+ })));
+ };
+
+ function RibbonItem(preset, source) {
+ var item = {};
+ item.preset = preset;
+ item.source = source;
+
+ item.isFavorite = function () {
+ return item.source === 'favorite';
+ };
+
+ item.isRecent = function () {
+ return item.source === 'recent';
+ };
+
+ item.matches = function (preset) {
+ return item.preset.id === preset.id;
+ };
+
+ item.minified = function () {
+ return {
+ pID: item.preset.id
+ };
+ };
+
+ return item;
+ }
+
+ function ribbonItemForMinified(d, source) {
+ if (d && d.pID) {
+ var preset = _this.item(d.pID);
+
+ if (!preset) return null;
+ return RibbonItem(preset, source);
+ }
+
+ return null;
+ }
+
+ _this.getGenericRibbonItems = function () {
+ return ['point', 'line', 'area'].map(function (id) {
+ return RibbonItem(_this.item(id), 'generic');
+ });
+ };
+
+ _this.getAddable = function () {
+ if (!_addablePresetIDs) return [];
+ return _addablePresetIDs.map(function (id) {
+ var preset = _this.item(id);
+
+ if (preset) return RibbonItem(preset, 'addable');
+ return null;
+ }).filter(Boolean);
+ };
+
+ function setRecents(items) {
+ _recents = items;
+ var minifiedItems = items.map(function (d) {
+ return d.minified();
+ });
+ corePreferences('preset_recents', JSON.stringify(minifiedItems));
+ dispatch.call('recentsChange');
+ }
+
+ _this.getRecents = function () {
+ if (!_recents) {
+ // fetch from local storage
+ _recents = (JSON.parse(corePreferences('preset_recents')) || []).reduce(function (acc, d) {
+ var item = ribbonItemForMinified(d, 'recent');
+ if (item && item.preset.addable()) acc.push(item);
+ return acc;
+ }, []);
+ }
+
+ return _recents;
+ };
+
+ _this.addRecent = function (preset, besidePreset, after) {
+ var recents = _this.getRecents();
+
+ var beforeItem = _this.recentMatching(besidePreset);
+
+ var toIndex = recents.indexOf(beforeItem);
+ if (after) toIndex += 1;
+ var newItem = RibbonItem(preset, 'recent');
+ recents.splice(toIndex, 0, newItem);
+ setRecents(recents);
+ };
+
+ _this.removeRecent = function (preset) {
+ var item = _this.recentMatching(preset);
+
+ if (item) {
+ var items = _this.getRecents();
+
+ items.splice(items.indexOf(item), 1);
+ setRecents(items);
+ }
+ };
+
+ _this.recentMatching = function (preset) {
+ var items = _this.getRecents();
+
+ for (var i in items) {
+ if (items[i].matches(preset)) {
+ return items[i];
+ }
+ }
+
+ return null;
+ };
+
+ _this.moveItem = function (items, fromIndex, toIndex) {
+ if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length) return null;
+ items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
+ return items;
+ };
+
+ _this.moveRecent = function (item, beforeItem) {
+ var recents = _this.getRecents();
+
+ var fromIndex = recents.indexOf(item);
+ var toIndex = recents.indexOf(beforeItem);
+
+ var items = _this.moveItem(recents, fromIndex, toIndex);
+
+ if (items) setRecents(items);
+ };
+
+ _this.setMostRecent = function (preset) {
+ if (preset.searchable === false) return;
+
+ var items = _this.getRecents();
+
+ var item = _this.recentMatching(preset);
+
+ if (item) {
+ items.splice(items.indexOf(item), 1);
+ } else {
+ item = RibbonItem(preset, 'recent');
+ } // remove the last recent (first in, first out)
+
+
+ while (items.length >= MAXRECENTS) {
+ items.pop();
+ } // prepend array
+
+
+ items.unshift(item);
+ setRecents(items);
+ };
+
+ function setFavorites(items) {
+ _favorites = items;
+ var minifiedItems = items.map(function (d) {
+ return d.minified();
+ });
+ corePreferences('preset_favorites', JSON.stringify(minifiedItems)); // call update
+
+ dispatch.call('favoritePreset');
+ }
+
+ _this.addFavorite = function (preset, besidePreset, after) {
+ var favorites = _this.getFavorites();
+
+ var beforeItem = _this.favoriteMatching(besidePreset);
+
+ var toIndex = favorites.indexOf(beforeItem);
+ if (after) toIndex += 1;
+ var newItem = RibbonItem(preset, 'favorite');
+ favorites.splice(toIndex, 0, newItem);
+ setFavorites(favorites);
+ };
+
+ _this.toggleFavorite = function (preset) {
+ var favs = _this.getFavorites();
+
+ var favorite = _this.favoriteMatching(preset);
+
+ if (favorite) {
+ favs.splice(favs.indexOf(favorite), 1);
+ } else {
+ // only allow 10 favorites
+ if (favs.length === 10) {
+ // remove the last favorite (last in, first out)
+ favs.pop();
+ } // append array
+
+
+ favs.push(RibbonItem(preset, 'favorite'));
+ }
+
+ setFavorites(favs);
+ };
+
+ _this.removeFavorite = function (preset) {
+ var item = _this.favoriteMatching(preset);
+
+ if (item) {
+ var items = _this.getFavorites();
+
+ items.splice(items.indexOf(item), 1);
+ setFavorites(items);
+ }
+ };
+
+ _this.getFavorites = function () {
+ if (!_favorites) {
+ // fetch from local storage
+ var rawFavorites = JSON.parse(corePreferences('preset_favorites'));
+
+ if (!rawFavorites) {
+ rawFavorites = [];
+ corePreferences('preset_favorites', JSON.stringify(rawFavorites));
+ }
+
+ _favorites = rawFavorites.reduce(function (output, d) {
+ var item = ribbonItemForMinified(d, 'favorite');
+ if (item && item.preset.addable()) output.push(item);
+ return output;
+ }, []);
+ }
+
+ return _favorites;
+ };
+
+ _this.favoriteMatching = function (preset) {
+ var favs = _this.getFavorites();
+
+ for (var index in favs) {
+ if (favs[index].matches(preset)) {
+ return favs[index];
+ }
+ }
+
+ return null;
+ };
+
+ return utilRebind(_this, dispatch, 'on');
+ }
+
+ function utilTagText(entity) {
+ var obj = entity && entity.tags || {};
+ return Object.keys(obj).map(function (k) {
+ return k + '=' + obj[k];
+ }).join(', ');
+ }
+ function utilTotalExtent(array, graph) {
+ var extent = geoExtent();
+ var val, entity;
+
+ for (var i = 0; i < array.length; i++) {
+ val = array[i];
+ entity = typeof val === 'string' ? graph.hasEntity(val) : val;
+
+ if (entity) {
+ extent._extend(entity.extent(graph));
+ }
+ }
+
+ return extent;
+ }
+ function utilTagDiff(oldTags, newTags) {
+ var tagDiff = [];
+ var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
+ keys.forEach(function (k) {
+ var oldVal = oldTags[k];
+ var newVal = newTags[k];
- {
- module.exports = aesjs; // RequireJS/AMD
- // http://www.requirejs.org/docs/api.html
- // https://github.com/amdjs/amdjs-api/wiki/AMD
+ if ((oldVal || oldVal === '') && (newVal === undefined || newVal !== oldVal)) {
+ tagDiff.push({
+ type: '-',
+ key: k,
+ oldVal: oldVal,
+ newVal: newVal,
+ display: '- ' + k + '=' + oldVal
+ });
}
- })();
- });
-
- // We can use keys that are 128 bits (16 bytes), 192 bits (24 bytes) or 256 bits (32 bytes).
- // To generate a random key: window.crypto.getRandomValues(new Uint8Array(16));
- // This default signing key is built into iD and can be used to mask/unmask sensitive values.
- var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208];
- function utilAesEncrypt(text, key) {
- key = key || DEFAULT_128;
- var textBytes = aesJs.utils.utf8.toBytes(text);
- var aesCtr = new aesJs.ModeOfOperation.ctr(key);
- var encryptedBytes = aesCtr.encrypt(textBytes);
- var encryptedHex = aesJs.utils.hex.fromBytes(encryptedBytes);
- return encryptedHex;
- }
- function utilAesDecrypt(encryptedHex, key) {
- key = key || DEFAULT_128;
- var encryptedBytes = aesJs.utils.hex.toBytes(encryptedHex);
- var aesCtr = new aesJs.ModeOfOperation.ctr(key);
- var decryptedBytes = aesCtr.decrypt(encryptedBytes);
- var text = aesJs.utils.utf8.fromBytes(decryptedBytes);
- return text;
+ if ((newVal || newVal === '') && (oldVal === undefined || newVal !== oldVal)) {
+ tagDiff.push({
+ type: '+',
+ key: k,
+ oldVal: oldVal,
+ newVal: newVal,
+ display: '+ ' + k + '=' + newVal
+ });
+ }
+ });
+ return tagDiff;
}
+ function utilEntitySelector(ids) {
+ return ids.length ? '.' + ids.join(',.') : 'nothing';
+ } // returns an selector to select entity ids for:
+ // - entityIDs passed in
+ // - shallow descendant entityIDs for any of those entities that are relations
- function utilCleanTags(tags) {
- var out = {};
+ function utilEntityOrMemberSelector(ids, graph) {
+ var seen = new Set(ids);
+ ids.forEach(collectShallowDescendants);
+ return utilEntitySelector(Array.from(seen));
- for (var k in tags) {
- if (!k) continue;
- var v = tags[k];
+ function collectShallowDescendants(id) {
+ var entity = graph.hasEntity(id);
+ if (!entity || entity.type !== 'relation') return;
+ entity.members.map(function (member) {
+ return member.id;
+ }).forEach(function (id) {
+ seen.add(id);
+ });
+ }
+ } // returns an selector to select entity ids for:
+ // - entityIDs passed in
+ // - deep descendant entityIDs for any of those entities that are relations
- if (v !== undefined) {
- out[k] = cleanValue(k, v);
- }
+ function utilEntityOrDeepMemberSelector(ids, graph) {
+ return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph));
+ } // returns an selector to select entity ids for:
+ // - entityIDs passed in
+ // - deep descendant entityIDs for any of those entities that are relations
+
+ function utilEntityAndDeepMemberIDs(ids, graph) {
+ var seen = new Set();
+ ids.forEach(collectDeepDescendants);
+ return Array.from(seen);
+
+ function collectDeepDescendants(id) {
+ if (seen.has(id)) return;
+ seen.add(id);
+ var entity = graph.hasEntity(id);
+ if (!entity || entity.type !== 'relation') return;
+ entity.members.map(function (member) {
+ return member.id;
+ }).forEach(collectDeepDescendants); // recurse
}
+ } // returns an selector to select entity ids for:
+ // - deep descendant entityIDs for any of those entities that are relations
- return out;
+ function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) {
+ var idsSet = new Set(ids);
+ var seen = new Set();
+ var returners = new Set();
+ ids.forEach(collectDeepDescendants);
+ return utilEntitySelector(Array.from(returners));
- function cleanValue(k, v) {
- function keepSpaces(k) {
- return /_hours|_times|:conditional$/.test(k);
- }
+ function collectDeepDescendants(id) {
+ if (seen.has(id)) return;
+ seen.add(id);
- function skip(k) {
- return /^(description|note|fixme)$/.test(k);
+ if (!idsSet.has(id)) {
+ returners.add(id);
}
- if (skip(k)) return v;
- var cleaned = v.split(';').map(function (s) {
- return s.trim();
- }).join(keepSpaces(k) ? '; ' : ';'); // The code below is not intended to validate websites and emails.
- // It is only intended to prevent obvious copy-paste errors. (#2323)
- // clean website- and email-like tags
+ var entity = graph.hasEntity(id);
+ if (!entity || entity.type !== 'relation') return;
+ if (skipMultipolgonMembers && entity.isMultipolygon()) return;
+ entity.members.map(function (member) {
+ return member.id;
+ }).forEach(collectDeepDescendants); // recurse
+ }
+ } // Adds or removes highlight styling for the specified entities
- if (k.indexOf('website') !== -1 || k.indexOf('email') !== -1 || cleaned.indexOf('http') === 0) {
- cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars
- }
+ function utilHighlightEntities(ids, highlighted, context) {
+ context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed('highlighted', highlighted);
+ } // returns an Array that is the union of:
+ // - nodes for any nodeIDs passed in
+ // - child nodes of any wayIDs passed in
+ // - descendant member and child nodes of relationIDs passed in
- return cleaned;
+ function utilGetAllNodes(ids, graph) {
+ var seen = new Set();
+ var nodes = new Set();
+ ids.forEach(collectNodes);
+ return Array.from(nodes);
+
+ function collectNodes(id) {
+ if (seen.has(id)) return;
+ seen.add(id);
+ var entity = graph.hasEntity(id);
+ if (!entity) return;
+
+ if (entity.type === 'node') {
+ nodes.add(entity);
+ } else if (entity.type === 'way') {
+ entity.nodes.forEach(collectNodes);
+ } else {
+ entity.members.map(function (member) {
+ return member.id;
+ }).forEach(collectNodes); // recurse
+ }
}
}
+ function utilDisplayName(entity) {
+ var localizedNameKey = 'name:' + _mainLocalizer.languageCode().toLowerCase();
+ var name = entity.tags[localizedNameKey] || entity.tags.name || '';
+ if (name) return name;
+ var tags = {
+ direction: entity.tags.direction,
+ from: entity.tags.from,
+ network: entity.tags.cycle_network || entity.tags.network,
+ ref: entity.tags.ref,
+ to: entity.tags.to,
+ via: entity.tags.via
+ };
+ var keyComponents = [];
- // Like selection.property('value', ...), but avoids no-op value sets,
- // which can result in layout/repaint thrashing in some situations.
- function utilGetSetValue(selection, value) {
- function d3_selection_value(value) {
- function valueNull() {
- delete this.value;
- }
+ if (tags.network) {
+ keyComponents.push('network');
+ }
- function valueConstant() {
- if (this.value !== value) {
- this.value = value;
- }
- }
+ if (tags.ref) {
+ keyComponents.push('ref');
+ } // Routes may need more disambiguation based on direction or destination
- function valueFunction() {
- var x = value.apply(this, arguments);
- if (x === null || x === undefined) {
- delete this.value;
- } else if (this.value !== x) {
- this.value = x;
+ if (entity.tags.route) {
+ if (tags.direction) {
+ keyComponents.push('direction');
+ } else if (tags.from && tags.to) {
+ keyComponents.push('from');
+ keyComponents.push('to');
+
+ if (tags.via) {
+ keyComponents.push('via');
}
}
+ }
- return value === null || value === undefined ? valueNull : typeof value === 'function' ? valueFunction : valueConstant;
+ if (keyComponents.length) {
+ name = _t('inspector.display_name.' + keyComponents.join('_'), tags);
}
- if (arguments.length === 1) {
- return selection.property('value');
+ return name;
+ }
+ function utilDisplayNameForPath(entity) {
+ var name = utilDisplayName(entity);
+ var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
+ var isNewChromium = Number(utilDetect().version.split('.')[0]) >= 96.0;
+
+ if (!isFirefox && !isNewChromium && name && rtlRegex.test(name)) {
+ name = fixRTLTextForSvg(name);
}
- return selection.each(d3_selection_value(value));
+ return name;
}
+ function utilDisplayType(id) {
+ return {
+ n: _t('inspector.node'),
+ w: _t('inspector.way'),
+ r: _t('inspector.relation')
+ }[id.charAt(0)];
+ } // `utilDisplayLabel`
+ // Returns a string suitable for display
+ // By default returns something like name/ref, fallback to preset type, fallback to OSM type
+ // "Main Street" or "Tertiary Road"
+ // If `verbose=true`, include both preset name and feature name.
+ // "Tertiary Road Main Street"
+ //
- function utilKeybinding(namespace) {
- var _keybindings = {};
+ function utilDisplayLabel(entity, graphOrGeometry, verbose) {
+ var result;
+ var displayName = utilDisplayName(entity);
+ var preset = typeof graphOrGeometry === 'string' ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry);
+ var presetName = preset && (preset.suggestion ? preset.subtitle() : preset.name());
- function testBindings(d3_event, isCapturing) {
- var didMatch = false;
- var bindings = Object.keys(_keybindings).map(function (id) {
- return _keybindings[id];
+ if (verbose) {
+ result = [presetName, displayName].filter(Boolean).join(' ');
+ } else {
+ result = displayName || presetName;
+ } // Fallback to the OSM type (node/way/relation)
+
+
+ return result || utilDisplayType(entity.id);
+ }
+ function utilEntityRoot(entityType) {
+ return {
+ node: 'n',
+ way: 'w',
+ relation: 'r'
+ }[entityType];
+ } // Returns a single object containing the tags of all the given entities.
+ // Example:
+ // {
+ // highway: 'service',
+ // service: 'parking_aisle'
+ // }
+ // +
+ // {
+ // highway: 'service',
+ // service: 'driveway',
+ // width: '3'
+ // }
+ // =
+ // {
+ // highway: 'service',
+ // service: [ 'driveway', 'parking_aisle' ],
+ // width: [ '3', undefined ]
+ // }
+
+ function utilCombinedTags(entityIDs, graph) {
+ var tags = {};
+ var tagCounts = {};
+ var allKeys = new Set();
+ var entities = entityIDs.map(function (entityID) {
+ return graph.hasEntity(entityID);
+ }).filter(Boolean); // gather the aggregate keys
+
+ entities.forEach(function (entity) {
+ var keys = Object.keys(entity.tags).filter(Boolean);
+ keys.forEach(function (key) {
+ allKeys.add(key);
});
- var i, binding; // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
- // so we don't strictly match on the shift key, but we prioritize
- // shifted keybindings first, and fallback to unshifted only if no match.
- // (This lets us differentiate between 'â'/'â§â' or 'âZ'/'ââ§Z')
- // priority match shifted keybindings first
+ });
+ entities.forEach(function (entity) {
+ allKeys.forEach(function (key) {
+ var value = entity.tags[key]; // purposely allow `undefined`
- for (i = 0; i < bindings.length; i++) {
- binding = bindings[i];
- if (!binding.event.modifiers.shiftKey) continue; // no shift
+ if (!tags.hasOwnProperty(key)) {
+ // first value, set as raw
+ tags[key] = value;
+ } else {
+ if (!Array.isArray(tags[key])) {
+ if (tags[key] !== value) {
+ // first alternate value, replace single value with array
+ tags[key] = [tags[key], value];
+ }
+ } else {
+ // type is array
+ if (tags[key].indexOf(value) === -1) {
+ // subsequent alternate value, add to array
+ tags[key].push(value);
+ }
+ }
+ }
- if (!!binding.capture !== isCapturing) continue;
+ var tagHash = key + '=' + value;
+ if (!tagCounts[tagHash]) tagCounts[tagHash] = 0;
+ tagCounts[tagHash] += 1;
+ });
+ });
- if (matches(d3_event, binding, true)) {
- binding.callback(d3_event);
- didMatch = true; // match a max of one binding per event
+ for (var key in tags) {
+ if (!Array.isArray(tags[key])) continue; // sort values by frequency then alphabetically
- break;
+ tags[key] = tags[key].sort(function (val1, val2) {
+ var key = key; // capture
+
+ var count2 = tagCounts[key + '=' + val2];
+ var count1 = tagCounts[key + '=' + val1];
+
+ if (count2 !== count1) {
+ return count2 - count1;
+ }
+
+ if (val2 && val1) {
+ return val1.localeCompare(val2);
}
+
+ return val1 ? 1 : -1;
+ });
+ }
+
+ return tags;
+ }
+ function utilStringQs(str) {
+ var i = 0; // advance past any leading '?' or '#' characters
+
+ while (i < str.length && (str[i] === '?' || str[i] === '#')) {
+ i++;
+ }
+
+ str = str.slice(i);
+ return str.split('&').reduce(function (obj, pair) {
+ var parts = pair.split('=');
+
+ if (parts.length === 2) {
+ obj[parts[0]] = null === parts[1] ? '' : decodeURIComponent(parts[1]);
}
- if (didMatch) return; // then unshifted keybindings
+ return obj;
+ }, {});
+ }
+ function utilQsString(obj, noencode) {
+ // encode everything except special characters used in certain hash parameters:
+ // "/" in map states, ":", ",", {" and "}" in background
+ function softEncode(s) {
+ return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
+ }
- for (i = 0; i < bindings.length; i++) {
- binding = bindings[i];
- if (binding.event.modifiers.shiftKey) continue; // shift
+ return Object.keys(obj).sort().map(function (key) {
+ return encodeURIComponent(key) + '=' + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
+ }).join('&');
+ }
+ function utilPrefixDOMProperty(property) {
+ var prefixes = ['webkit', 'ms', 'moz', 'o'];
+ var i = -1;
+ var n = prefixes.length;
+ var s = document.body;
+ if (property in s) return property;
+ property = property.substr(0, 1).toUpperCase() + property.substr(1);
- if (!!binding.capture !== isCapturing) continue;
+ while (++i < n) {
+ if (prefixes[i] + property in s) {
+ return prefixes[i] + property;
+ }
+ }
- if (matches(d3_event, binding, false)) {
- binding.callback(d3_event);
- break;
+ return false;
+ }
+ function utilPrefixCSSProperty(property) {
+ var prefixes = ['webkit', 'ms', 'Moz', 'O'];
+ var i = -1;
+ var n = prefixes.length;
+ var s = document.body.style;
+
+ if (property.toLowerCase() in s) {
+ return property.toLowerCase();
+ }
+
+ while (++i < n) {
+ if (prefixes[i] + property in s) {
+ return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
+ }
+ }
+
+ return false;
+ }
+ var transformProperty;
+ function utilSetTransform(el, x, y, scale) {
+ var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
+ var translate = utilDetect().opera ? 'translate(' + x + 'px,' + y + 'px)' : 'translate3d(' + x + 'px,' + y + 'px,0)';
+ return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
+ } // Calculates Levenshtein distance between two strings
+ // see: https://en.wikipedia.org/wiki/Levenshtein_distance
+ // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
+
+ function utilEditDistance(a, b) {
+ a = remove$6(a.toLowerCase());
+ b = remove$6(b.toLowerCase());
+ if (a.length === 0) return b.length;
+ if (b.length === 0) return a.length;
+ var matrix = [];
+ var i, j;
+
+ for (i = 0; i <= b.length; i++) {
+ matrix[i] = [i];
+ }
+
+ for (j = 0; j <= a.length; j++) {
+ matrix[0][j] = j;
+ }
+
+ for (i = 1; i <= b.length; i++) {
+ for (j = 1; j <= a.length; j++) {
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
+ matrix[i][j] = matrix[i - 1][j - 1];
+ } else {
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
+ Math.min(matrix[i][j - 1] + 1, // insertion
+ matrix[i - 1][j] + 1)); // deletion
}
}
+ }
- function matches(d3_event, binding, testShift) {
- var event = d3_event;
- var isMatch = false;
- var tryKeyCode = true; // Prefer a match on `KeyboardEvent.key`
+ return matrix[b.length][a.length];
+ } // a d3.mouse-alike which
+ // 1. Only works on HTML elements, not SVG
+ // 2. Does not cause style recalculation
- if (event.key !== undefined) {
- tryKeyCode = event.key.charCodeAt(0) > 255; // outside ISO-Latin-1
+ function utilFastMouse(container) {
+ var rect = container.getBoundingClientRect();
+ var rectLeft = rect.left;
+ var rectTop = rect.top;
+ var clientLeft = +container.clientLeft;
+ var clientTop = +container.clientTop;
+ return function (e) {
+ return [e.clientX - rectLeft - clientLeft, e.clientY - rectTop - clientTop];
+ };
+ }
+ function utilAsyncMap(inputs, func, callback) {
+ var remaining = inputs.length;
+ var results = [];
+ var errors = [];
+ inputs.forEach(function (d, i) {
+ func(d, function done(err, data) {
+ errors[i] = err;
+ results[i] = data;
+ remaining--;
+ if (!remaining) callback(errors, results);
+ });
+ });
+ } // wraps an index to an interval [0..length-1]
+
+ function utilWrap(index, length) {
+ if (index < 0) {
+ index += Math.ceil(-index / length) * length;
+ }
+
+ return index % length;
+ }
+ /**
+ * a replacement for functor
+ *
+ * @param {*} value any value
+ * @returns {Function} a function that returns that value or the value if it's a function
+ */
+
+ function utilFunctor(value) {
+ if (typeof value === 'function') return value;
+ return function () {
+ return value;
+ };
+ }
+ function utilNoAuto(selection) {
+ var isText = selection.size() && selection.node().tagName.toLowerCase() === 'textarea';
+ return selection // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
+ .attr('autocomplete', 'new-password').attr('autocorrect', 'off').attr('autocapitalize', 'off').attr('spellcheck', isText ? 'true' : 'false');
+ } // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
+ // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
+
+ function utilHashcode(str) {
+ var hash = 0;
+
+ if (str.length === 0) {
+ return hash;
+ }
+
+ for (var i = 0; i < str.length; i++) {
+ var _char = str.charCodeAt(i);
+
+ hash = (hash << 5) - hash + _char;
+ hash = hash & hash; // Convert to 32bit integer
+ }
+
+ return hash;
+ } // Returns version of `str` with all runs of special characters replaced by `_`;
+ // suitable for HTML ids, classes, selectors, etc.
+
+ function utilSafeClassName(str) {
+ return str.toLowerCase().replace(/[^a-z0-9]+/g, '_');
+ } // Returns string based on `val` that is highly unlikely to collide with an id
+ // used previously or that's present elsewhere in the document. Useful for preventing
+ // browser-provided autofills or when embedding iD on pages with unknown elements.
+
+ function utilUniqueDomId(val) {
+ return 'ideditor-' + utilSafeClassName(val.toString()) + '-' + new Date().getTime().toString();
+ } // Returns the length of `str` in unicode characters. This can be less than
+ // `String.length()` since a single unicode character can be composed of multiple
+ // JavaScript UTF-16 code units.
+
+ function utilUnicodeCharsCount(str) {
+ // Native ES2015 implementations of `Array.from` split strings into unicode characters
+ return Array.from(str).length;
+ } // Returns a new string representing `str` cut from its start to `limit` length
+ // in unicode characters. Note that this runs the risk of splitting graphemes.
+
+ function utilUnicodeCharsTruncated(str, limit) {
+ return Array.from(str).slice(0, limit).join('');
+ }
+
+ function toNumericID(id) {
+ var match = id.match(/^[cnwr](-?\d+)$/);
+
+ if (match) {
+ return parseInt(match[1], 10);
+ }
- isMatch = true;
+ return NaN;
+ }
- if (binding.event.key === undefined) {
- isMatch = false;
- } else if (Array.isArray(binding.event.key)) {
- if (binding.event.key.map(function (s) {
- return s.toLowerCase();
- }).indexOf(event.key.toLowerCase()) === -1) isMatch = false;
- } else {
- if (event.key.toLowerCase() !== binding.event.key.toLowerCase()) isMatch = false;
- }
- } // Fallback match on `KeyboardEvent.keyCode`, can happen if:
- // - browser doesn't support `KeyboardEvent.key`
- // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
+ function compareNumericIDs(left, right) {
+ if (isNaN(left) && isNaN(right)) return -1;
+ if (isNaN(left)) return 1;
+ if (isNaN(right)) return -1;
+ if (Math.sign(left) !== Math.sign(right)) return -Math.sign(left);
+ if (Math.sign(left) < 0) return Math.sign(right - left);
+ return Math.sign(left - right);
+ } // Returns -1 if the first parameter ID is older than the second,
+ // 1 if the second parameter is older, 0 if they are the same.
+ // If both IDs are test IDs, the function returns -1.
- if (!isMatch && tryKeyCode) {
- isMatch = event.keyCode === binding.event.keyCode;
- }
+ function utilCompareIDs(left, right) {
+ return compareNumericIDs(toNumericID(left), toNumericID(right));
+ } // Returns the chronologically oldest ID in the list.
+ // Database IDs (with positive numbers) before editor ones (with negative numbers).
+ // Among each category, the closest number to 0 is the oldest.
+ // Test IDs (any string that does not conform to OSM's ID scheme) are taken last.
- if (!isMatch) return false; // test modifier keys
+ function utilOldestID(ids) {
+ if (ids.length === 0) {
+ return undefined;
+ }
- if (!(event.ctrlKey && event.altKey)) {
- // if both are set, assume AltGr and skip it - #4096
- if (event.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
- if (event.altKey !== binding.event.modifiers.altKey) return false;
- }
+ var oldestIDIndex = 0;
+ var oldestID = toNumericID(ids[0]);
- if (event.metaKey !== binding.event.modifiers.metaKey) return false;
- if (testShift && event.shiftKey !== binding.event.modifiers.shiftKey) return false;
- return true;
+ for (var i = 1; i < ids.length; i++) {
+ var num = toNumericID(ids[i]);
+
+ if (compareNumericIDs(oldestID, num) === 1) {
+ oldestIDIndex = i;
+ oldestID = num;
}
}
- function capture(d3_event) {
- testBindings(d3_event, true);
- }
+ return ids[oldestIDIndex];
+ }
- function bubble(d3_event) {
- var tagName = select(d3_event.target).node().tagName;
+ function osmEntity(attrs) {
+ // For prototypal inheritance.
+ if (this instanceof osmEntity) return; // Create the appropriate subtype.
- if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
- return;
- }
+ if (attrs && attrs.type) {
+ return osmEntity[attrs.type].apply(this, arguments);
+ } else if (attrs && attrs.id) {
+ return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
+ } // Initialize a generic Entity (used only in tests).
- testBindings(d3_event, false);
- }
- function keybinding(selection) {
- selection = selection || select(document);
- selection.on('keydown.capture.' + namespace, capture, true);
- selection.on('keydown.bubble.' + namespace, bubble, false);
- return keybinding;
- } // was: keybinding.off()
+ return new osmEntity().initialize(arguments);
+ }
+ osmEntity.id = function (type) {
+ return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
+ };
- keybinding.unbind = function (selection) {
- _keybindings = [];
- selection = selection || select(document);
- selection.on('keydown.capture.' + namespace, null);
- selection.on('keydown.bubble.' + namespace, null);
- return keybinding;
- };
+ osmEntity.id.next = {
+ changeset: -1,
+ node: -1,
+ way: -1,
+ relation: -1
+ };
- keybinding.clear = function () {
- _keybindings = {};
- return keybinding;
- }; // Remove one or more keycode bindings.
+ osmEntity.id.fromOSM = function (type, id) {
+ return type[0] + id;
+ };
+ osmEntity.id.toOSM = function (id) {
+ var match = id.match(/^[cnwr](-?\d+)$/);
- keybinding.off = function (codes, capture) {
- var arr = utilArrayUniq([].concat(codes));
+ if (match) {
+ return match[1];
+ }
- for (var i = 0; i < arr.length; i++) {
- var id = arr[i] + (capture ? '-capture' : '-bubble');
- delete _keybindings[id];
- }
+ return '';
+ };
- return keybinding;
- }; // Add one or more keycode bindings.
+ osmEntity.id.type = function (id) {
+ return {
+ 'c': 'changeset',
+ 'n': 'node',
+ 'w': 'way',
+ 'r': 'relation'
+ }[id[0]];
+ }; // A function suitable for use as the second argument to d3.selection#data().
- keybinding.on = function (codes, callback, capture) {
- if (typeof callback !== 'function') {
- return keybinding.off(codes, capture);
- }
+ osmEntity.key = function (entity) {
+ return entity.id + 'v' + (entity.v || 0);
+ };
- var arr = utilArrayUniq([].concat(codes));
+ var _deprecatedTagValuesByKey;
- for (var i = 0; i < arr.length; i++) {
- var id = arr[i] + (capture ? '-capture' : '-bubble');
- var binding = {
- id: id,
- capture: capture,
- callback: callback,
- event: {
- key: undefined,
- // preferred
- keyCode: 0,
- // fallback
- modifiers: {
- shiftKey: false,
- ctrlKey: false,
- altKey: false,
- metaKey: false
+ osmEntity.deprecatedTagValuesByKey = function (dataDeprecated) {
+ if (!_deprecatedTagValuesByKey) {
+ _deprecatedTagValuesByKey = {};
+ dataDeprecated.forEach(function (d) {
+ var oldKeys = Object.keys(d.old);
+
+ if (oldKeys.length === 1) {
+ var oldKey = oldKeys[0];
+ var oldValue = d.old[oldKey];
+
+ if (oldValue !== '*') {
+ if (!_deprecatedTagValuesByKey[oldKey]) {
+ _deprecatedTagValuesByKey[oldKey] = [oldValue];
+ } else {
+ _deprecatedTagValuesByKey[oldKey].push(oldValue);
}
}
- };
-
- if (_keybindings[id]) {
- console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
}
+ });
+ }
- _keybindings[id] = binding;
- var matches = arr[i].toLowerCase().match(/(?:(?:[^+â§ââ¥â])+|[â§ââ¥â]|\+\+|^\+$)/g);
-
- for (var j = 0; j < matches.length; j++) {
- // Normalise matching errors
- if (matches[j] === '++') matches[j] = '+';
+ return _deprecatedTagValuesByKey;
+ };
- if (matches[j] in utilKeybinding.modifierCodes) {
- var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
- binding.event.modifiers[prop] = true;
- } else {
- binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
+ osmEntity.prototype = {
+ tags: {},
+ initialize: function initialize(sources) {
+ for (var i = 0; i < sources.length; ++i) {
+ var source = sources[i];
- if (matches[j] in utilKeybinding.keyCodes) {
- binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
+ for (var prop in source) {
+ if (Object.prototype.hasOwnProperty.call(source, prop)) {
+ if (source[prop] === undefined) {
+ delete this[prop];
+ } else {
+ this[prop] = source[prop];
}
}
}
}
- return keybinding;
- };
+ if (!this.id && this.type) {
+ this.id = osmEntity.id(this.type);
+ }
- return keybinding;
- }
- /*
- * See https://github.com/keithamus/jwerty
- */
+ if (!this.hasOwnProperty('visible')) {
+ this.visible = true;
+ }
- utilKeybinding.modifierCodes = {
- // Shift key, â§
- 'â§': 16,
- shift: 16,
- // CTRL key, on Mac: â
- 'â': 17,
- ctrl: 17,
- // ALT key, on Mac: ⥠(Alt)
- 'â¥': 18,
- alt: 18,
- option: 18,
- // META, on Mac: â (CMD), on Windows (Win), on Linux (Super)
- 'â': 91,
- meta: 91,
- cmd: 91,
- 'super': 91,
- win: 91
- };
- utilKeybinding.modifierProperties = {
- 16: 'shiftKey',
- 17: 'ctrlKey',
- 18: 'altKey',
- 91: 'metaKey'
- };
- utilKeybinding.plusKeys = ['plus', 'ffplus', '=', 'ffequals', 'â ', '±'];
- utilKeybinding.minusKeys = ['_', '-', 'ffminus', 'dash', 'â', 'â'];
- utilKeybinding.keys = {
- // Backspace key, on Mac: â« (Backspace)
- 'â«': 'Backspace',
- backspace: 'Backspace',
- // Tab Key, on Mac: ⥠(Tab), on Windows â¥â¥
- 'â¥': 'Tab',
- 'â': 'Tab',
- tab: 'Tab',
- // Return key, â©
- 'â©': 'Enter',
- 'âµ': 'Enter',
- 'â': 'Enter',
- 'return': 'Enter',
- enter: 'Enter',
- 'â
': 'Enter',
- // Pause/Break key
- 'pause': 'Pause',
- 'pause-break': 'Pause',
- // Caps Lock key, âª
- 'âª': 'CapsLock',
- caps: 'CapsLock',
- 'caps-lock': 'CapsLock',
- // Escape key, on Mac: â, on Windows: Esc
- 'â': ['Escape', 'Esc'],
- escape: ['Escape', 'Esc'],
- esc: ['Escape', 'Esc'],
- // Space key
- space: [' ', 'Spacebar'],
- // Page-Up key, or pgup, on Mac: â
- 'â': 'PageUp',
- pgup: 'PageUp',
- 'page-up': 'PageUp',
- // Page-Down key, or pgdown, on Mac: â
- 'â': 'PageDown',
- pgdown: 'PageDown',
- 'page-down': 'PageDown',
- // END key, on Mac: â
- 'â': 'End',
- end: 'End',
- // HOME key, on Mac: â
- 'â': 'Home',
- home: 'Home',
- // Insert key, or ins
- ins: 'Insert',
- insert: 'Insert',
- // Delete key, on Mac: ⦠(Delete)
- 'â¦': ['Delete', 'Del'],
- del: ['Delete', 'Del'],
- 'delete': ['Delete', 'Del'],
- // Left Arrow Key, or â
- 'â': ['ArrowLeft', 'Left'],
- left: ['ArrowLeft', 'Left'],
- 'arrow-left': ['ArrowLeft', 'Left'],
- // Up Arrow Key, or â
- 'â': ['ArrowUp', 'Up'],
- up: ['ArrowUp', 'Up'],
- 'arrow-up': ['ArrowUp', 'Up'],
- // Right Arrow Key, or â
- 'â': ['ArrowRight', 'Right'],
- right: ['ArrowRight', 'Right'],
- 'arrow-right': ['ArrowRight', 'Right'],
- // Up Arrow Key, or â
- 'â': ['ArrowDown', 'Down'],
- down: ['ArrowDown', 'Down'],
- 'arrow-down': ['ArrowDown', 'Down'],
- // odities, stuff for backward compatibility (browsers and code):
- // Num-Multiply, or *
- '*': ['*', 'Multiply'],
- star: ['*', 'Multiply'],
- asterisk: ['*', 'Multiply'],
- multiply: ['*', 'Multiply'],
- // Num-Plus or +
- '+': ['+', 'Add'],
- 'plus': ['+', 'Add'],
- // Num-Subtract, or -
- '-': ['-', 'Subtract'],
- subtract: ['-', 'Subtract'],
- 'dash': ['-', 'Subtract'],
- // Semicolon
- semicolon: ';',
- // = or equals
- equals: '=',
- // Comma, or ,
- comma: ',',
- // Period, or ., or full-stop
- period: '.',
- 'full-stop': '.',
- // Slash, or /, or forward-slash
- slash: '/',
- 'forward-slash': '/',
- // Tick, or `, or back-quote
- tick: '`',
- 'back-quote': '`',
- // Open bracket, or [
- 'open-bracket': '[',
- // Back slash, or \
- 'back-slash': '\\',
- // Close backet, or ]
- 'close-bracket': ']',
- // Apostrophe, or Quote, or '
- quote: '\'',
- apostrophe: '\'',
- // NUMPAD 0-9
- 'num-0': '0',
- 'num-1': '1',
- 'num-2': '2',
- 'num-3': '3',
- 'num-4': '4',
- 'num-5': '5',
- 'num-6': '6',
- 'num-7': '7',
- 'num-8': '8',
- 'num-9': '9',
- // F1-F25
- f1: 'F1',
- f2: 'F2',
- f3: 'F3',
- f4: 'F4',
- f5: 'F5',
- f6: 'F6',
- f7: 'F7',
- f8: 'F8',
- f9: 'F9',
- f10: 'F10',
- f11: 'F11',
- f12: 'F12',
- f13: 'F13',
- f14: 'F14',
- f15: 'F15',
- f16: 'F16',
- f17: 'F17',
- f18: 'F18',
- f19: 'F19',
- f20: 'F20',
- f21: 'F21',
- f22: 'F22',
- f23: 'F23',
- f24: 'F24',
- f25: 'F25'
- };
- utilKeybinding.keyCodes = {
- // Backspace key, on Mac: â« (Backspace)
- 'â«': 8,
- backspace: 8,
- // Tab Key, on Mac: ⥠(Tab), on Windows â¥â¥
- 'â¥': 9,
- 'â': 9,
- tab: 9,
- // Return key, â©
- 'â©': 13,
- 'âµ': 13,
- 'â': 13,
- 'return': 13,
- enter: 13,
- 'â
': 13,
- // Pause/Break key
- 'pause': 19,
- 'pause-break': 19,
- // Caps Lock key, âª
- 'âª': 20,
- caps: 20,
- 'caps-lock': 20,
- // Escape key, on Mac: â, on Windows: Esc
- 'â': 27,
- escape: 27,
- esc: 27,
- // Space key
- space: 32,
- // Page-Up key, or pgup, on Mac: â
- 'â': 33,
- pgup: 33,
- 'page-up': 33,
- // Page-Down key, or pgdown, on Mac: â
- 'â': 34,
- pgdown: 34,
- 'page-down': 34,
- // END key, on Mac: â
- 'â': 35,
- end: 35,
- // HOME key, on Mac: â
- 'â': 36,
- home: 36,
- // Insert key, or ins
- ins: 45,
- insert: 45,
- // Delete key, on Mac: ⦠(Delete)
- 'â¦': 46,
- del: 46,
- 'delete': 46,
- // Left Arrow Key, or â
- 'â': 37,
- left: 37,
- 'arrow-left': 37,
- // Up Arrow Key, or â
- 'â': 38,
- up: 38,
- 'arrow-up': 38,
- // Right Arrow Key, or â
- 'â': 39,
- right: 39,
- 'arrow-right': 39,
- // Up Arrow Key, or â
- 'â': 40,
- down: 40,
- 'arrow-down': 40,
- // odities, printing characters that come out wrong:
- // Firefox Equals
- 'ffequals': 61,
- // Num-Multiply, or *
- '*': 106,
- star: 106,
- asterisk: 106,
- multiply: 106,
- // Num-Plus or +
- '+': 107,
- 'plus': 107,
- // Num-Subtract, or -
- '-': 109,
- subtract: 109,
- // Firefox Plus
- 'ffplus': 171,
- // Firefox Minus
- 'ffminus': 173,
- // Semicolon
- ';': 186,
- semicolon: 186,
- // = or equals
- '=': 187,
- 'equals': 187,
- // Comma, or ,
- ',': 188,
- comma: 188,
- // Dash / Underscore key
- 'dash': 189,
- // Period, or ., or full-stop
- '.': 190,
- period: 190,
- 'full-stop': 190,
- // Slash, or /, or forward-slash
- '/': 191,
- slash: 191,
- 'forward-slash': 191,
- // Tick, or `, or back-quote
- '`': 192,
- tick: 192,
- 'back-quote': 192,
- // Open bracket, or [
- '[': 219,
- 'open-bracket': 219,
- // Back slash, or \
- '\\': 220,
- 'back-slash': 220,
- // Close backet, or ]
- ']': 221,
- 'close-bracket': 221,
- // Apostrophe, or Quote, or '
- '\'': 222,
- quote: 222,
- apostrophe: 222
- }; // NUMPAD 0-9
+ if (debug) {
+ Object.freeze(this);
+ Object.freeze(this.tags);
+ if (this.loc) Object.freeze(this.loc);
+ if (this.nodes) Object.freeze(this.nodes);
+ if (this.members) Object.freeze(this.members);
+ }
- var i$1 = 95,
- n = 0;
+ return this;
+ },
+ copy: function copy(resolver, copies) {
+ if (copies[this.id]) return copies[this.id];
+ var copy = osmEntity(this, {
+ id: undefined,
+ user: undefined,
+ version: undefined
+ });
+ copies[this.id] = copy;
+ return copy;
+ },
+ osmId: function osmId() {
+ return osmEntity.id.toOSM(this.id);
+ },
+ isNew: function isNew() {
+ var osmId = osmEntity.id.toOSM(this.id);
+ return osmId.length === 0 || osmId[0] === '-';
+ },
+ update: function update(attrs) {
+ return osmEntity(this, attrs, {
+ v: 1 + (this.v || 0)
+ });
+ },
+ mergeTags: function mergeTags(tags) {
+ var merged = Object.assign({}, this.tags); // shallow copy
+
+ var changed = false;
+
+ for (var k in tags) {
+ var t1 = merged[k];
+ var t2 = tags[k];
+
+ if (!t1) {
+ changed = true;
+ merged[k] = t2;
+ } else if (t1 !== t2) {
+ changed = true;
+ merged[k] = utilUnicodeCharsTruncated(utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';'), 255 // avoid exceeding character limit; see also services/osm.js -> maxCharsForTagValue()
+ );
+ }
+ }
+
+ return changed ? this.update({
+ tags: merged
+ }) : this;
+ },
+ intersects: function intersects(extent, resolver) {
+ return this.extent(resolver).intersects(extent);
+ },
+ hasNonGeometryTags: function hasNonGeometryTags() {
+ return Object.keys(this.tags).some(function (k) {
+ return k !== 'area';
+ });
+ },
+ hasParentRelations: function hasParentRelations(resolver) {
+ return resolver.parentRelations(this).length > 0;
+ },
+ hasInterestingTags: function hasInterestingTags() {
+ return Object.keys(this.tags).some(osmIsInterestingTag);
+ },
+ isHighwayIntersection: function isHighwayIntersection() {
+ return false;
+ },
+ isDegenerate: function isDegenerate() {
+ return true;
+ },
+ deprecatedTags: function deprecatedTags(dataDeprecated) {
+ var tags = this.tags; // if there are no tags, none can be deprecated
- while (++i$1 < 106) {
- utilKeybinding.keyCodes['num-' + n] = i$1;
- ++n;
- } // 0-9
+ if (Object.keys(tags).length === 0) return [];
+ var deprecated = [];
+ dataDeprecated.forEach(function (d) {
+ var oldKeys = Object.keys(d.old);
+ if (d.replace) {
+ var hasExistingValues = Object.keys(d.replace).some(function (replaceKey) {
+ if (!tags[replaceKey] || d.old[replaceKey]) return false;
+ var replaceValue = d.replace[replaceKey];
+ if (replaceValue === '*') return false;
+ if (replaceValue === tags[replaceKey]) return false;
+ return true;
+ }); // don't flag deprecated tags if the upgrade path would overwrite existing data - #7843
- i$1 = 47;
- n = 0;
+ if (hasExistingValues) return;
+ }
- while (++i$1 < 58) {
- utilKeybinding.keyCodes[n] = i$1;
- ++n;
- } // F1-F25
+ var matchesDeprecatedTags = oldKeys.every(function (oldKey) {
+ if (!tags[oldKey]) return false;
+ if (d.old[oldKey] === '*') return true;
+ if (d.old[oldKey] === tags[oldKey]) return true;
+ var vals = tags[oldKey].split(';').filter(Boolean);
+ if (vals.length === 0) {
+ return false;
+ } else if (vals.length > 1) {
+ return vals.indexOf(d.old[oldKey]) !== -1;
+ } else {
+ if (tags[oldKey] === d.old[oldKey]) {
+ if (d.replace && d.old[oldKey] === d.replace[oldKey]) {
+ var replaceKeys = Object.keys(d.replace);
+ return !replaceKeys.every(function (replaceKey) {
+ return tags[replaceKey] === d.replace[replaceKey];
+ });
+ } else {
+ return true;
+ }
+ }
+ }
- i$1 = 111;
- n = 1;
+ return false;
+ });
- while (++i$1 < 136) {
- utilKeybinding.keyCodes['f' + n] = i$1;
- ++n;
- } // a-z
+ if (matchesDeprecatedTags) {
+ deprecated.push(d);
+ }
+ });
+ return deprecated;
+ }
+ };
+ function osmLanes(entity) {
+ if (entity.type !== 'way') return null;
+ if (!entity.tags.highway) return null;
+ var tags = entity.tags;
+ var isOneWay = entity.isOneWay();
+ var laneCount = getLaneCount(tags, isOneWay);
+ var maxspeed = parseMaxspeed(tags);
+ var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
+ var forward = laneDirections.forward;
+ var backward = laneDirections.backward;
+ var bothways = laneDirections.bothways; // parse the piped string 'x|y|z' format
- i$1 = 64;
+ var turnLanes = {};
+ turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
+ turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
+ turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
+ var maxspeedLanes = {};
+ maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
+ maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
+ maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
+ var psvLanes = {};
+ psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
+ psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
+ psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
+ var busLanes = {};
+ busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
+ busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
+ busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
+ var taxiLanes = {};
+ taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
+ taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
+ taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
+ var hovLanes = {};
+ hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
+ hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
+ hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
+ var hgvLanes = {};
+ hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
+ hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
+ hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
+ var bicyclewayLanes = {};
+ bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
+ bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
+ bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
+ var lanesObj = {
+ forward: [],
+ backward: [],
+ unspecified: []
+ }; // map forward/backward/unspecified of each lane type to lanesObj
- while (++i$1 < 91) {
- utilKeybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
+ mapToLanesObj(lanesObj, turnLanes, 'turnLane');
+ mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
+ mapToLanesObj(lanesObj, psvLanes, 'psv');
+ mapToLanesObj(lanesObj, busLanes, 'bus');
+ mapToLanesObj(lanesObj, taxiLanes, 'taxi');
+ mapToLanesObj(lanesObj, hovLanes, 'hov');
+ mapToLanesObj(lanesObj, hgvLanes, 'hgv');
+ mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
+ return {
+ metadata: {
+ count: laneCount,
+ oneway: isOneWay,
+ forward: forward,
+ backward: backward,
+ bothways: bothways,
+ turnLanes: turnLanes,
+ maxspeed: maxspeed,
+ maxspeedLanes: maxspeedLanes,
+ psvLanes: psvLanes,
+ busLanes: busLanes,
+ taxiLanes: taxiLanes,
+ hovLanes: hovLanes,
+ hgvLanes: hgvLanes,
+ bicyclewayLanes: bicyclewayLanes
+ },
+ lanes: lanesObj
+ };
}
- function utilObjectOmit(obj, omitKeys) {
- return Object.keys(obj).reduce(function (result, key) {
- if (omitKeys.indexOf(key) === -1) {
- result[key] = obj[key]; // keep
- }
+ function getLaneCount(tags, isOneWay) {
+ var count;
- return result;
- }, {});
- }
+ if (tags.lanes) {
+ count = parseInt(tags.lanes, 10);
- // Copies a variable number of methods from source to target.
- function utilRebind(target, source) {
- var i = 1,
- n = arguments.length,
- method;
+ if (count > 0) {
+ return count;
+ }
+ }
- while (++i < n) {
- target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+ switch (tags.highway) {
+ case 'trunk':
+ case 'motorway':
+ count = isOneWay ? 2 : 4;
+ break;
+
+ default:
+ count = isOneWay ? 1 : 2;
+ break;
}
- return target;
- } // Method is assumed to be a standard D3 getter-setter:
- // If passed with no arguments, gets the value.
- // If passed with arguments, sets the value and returns the target.
+ return count;
+ }
- function d3_rebind(target, source, method) {
- return function () {
- var value = method.apply(source, arguments);
- return value === source ? target : value;
- };
+ function parseMaxspeed(tags) {
+ var maxspeed = tags.maxspeed;
+ if (!maxspeed) return;
+ var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
+ if (!maxspeedRegex.test(maxspeed)) return;
+ return parseInt(maxspeed, 10);
}
- // A per-domain session mutex backed by a cookie and dead man's
- // switch. If the session crashes, the mutex will auto-release
- // after 5 seconds.
- // This accepts a string and returns an object that complies with utilSessionMutexType
- function utilSessionMutex(name) {
- var mutex = {};
- var intervalID;
+ function parseLaneDirections(tags, isOneWay, laneCount) {
+ var forward = parseInt(tags['lanes:forward'], 10);
+ var backward = parseInt(tags['lanes:backward'], 10);
+ var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
- function renew() {
- var expires = new Date();
- expires.setSeconds(expires.getSeconds() + 5);
- document.cookie = name + '=1; expires=' + expires.toUTCString() + '; sameSite=strict';
+ if (parseInt(tags.oneway, 10) === -1) {
+ forward = 0;
+ bothways = 0;
+ backward = laneCount;
+ } else if (isOneWay) {
+ forward = laneCount;
+ bothways = 0;
+ backward = 0;
+ } else if (isNaN(forward) && isNaN(backward)) {
+ backward = Math.floor((laneCount - bothways) / 2);
+ forward = laneCount - bothways - backward;
+ } else if (isNaN(forward)) {
+ if (backward > laneCount - bothways) {
+ backward = laneCount - bothways;
+ }
+
+ forward = laneCount - bothways - backward;
+ } else if (isNaN(backward)) {
+ if (forward > laneCount - bothways) {
+ forward = laneCount - bothways;
+ }
+
+ backward = laneCount - bothways - forward;
}
- mutex.lock = function () {
- if (intervalID) return true;
- var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
- if (cookie) return false;
- renew();
- intervalID = window.setInterval(renew, 4000);
- return true;
+ return {
+ forward: forward,
+ backward: backward,
+ bothways: bothways
};
+ }
- mutex.unlock = function () {
- if (!intervalID) return;
- document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict';
- clearInterval(intervalID);
- intervalID = null;
- };
+ function parseTurnLanes(tag) {
+ if (!tag) return;
+ var validValues = ['left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right', 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'];
+ return tag.split('|').map(function (s) {
+ if (s === '') s = 'none';
+ return s.split(';').map(function (d) {
+ return validValues.indexOf(d) === -1 ? 'unknown' : d;
+ });
+ });
+ }
- mutex.locked = function () {
- return !!intervalID;
- };
+ function parseMaxspeedLanes(tag, maxspeed) {
+ if (!tag) return;
+ return tag.split('|').map(function (s) {
+ if (s === 'none') return s;
+ var m = parseInt(s, 10);
+ if (s === '' || m === maxspeed) return null;
+ return isNaN(m) ? 'unknown' : m;
+ });
+ }
- return mutex;
+ function parseMiscLanes(tag) {
+ if (!tag) return;
+ var validValues = ['yes', 'no', 'designated'];
+ return tag.split('|').map(function (s) {
+ if (s === '') s = 'no';
+ return validValues.indexOf(s) === -1 ? 'unknown' : s;
+ });
}
- function utilTiler() {
- var _size = [256, 256];
- var _scale = 256;
- var _tileSize = 256;
- var _zoomExtent = [0, 20];
- var _translate = [_size[0] / 2, _size[1] / 2];
- var _margin = 0;
- var _skipNullIsland = false;
+ function parseBicycleWay(tag) {
+ if (!tag) return;
+ var validValues = ['yes', 'no', 'designated', 'lane'];
+ return tag.split('|').map(function (s) {
+ if (s === '') s = 'no';
+ return validValues.indexOf(s) === -1 ? 'unknown' : s;
+ });
+ }
- function clamp(num, min, max) {
- return Math.max(min, Math.min(num, max));
+ function mapToLanesObj(lanesObj, data, key) {
+ if (data.forward) {
+ data.forward.forEach(function (l, i) {
+ if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
+ lanesObj.forward[i][key] = l;
+ });
}
- function nearNullIsland(tile) {
- var x = tile[0];
- var y = tile[1];
- var z = tile[2];
+ if (data.backward) {
+ data.backward.forEach(function (l, i) {
+ if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
+ lanesObj.backward[i][key] = l;
+ });
+ }
- if (z >= 7) {
- var center = Math.pow(2, z - 1);
- var width = Math.pow(2, z - 6);
- var min = center - width / 2;
- var max = center + width / 2 - 1;
- return x >= min && x <= max && y >= min && y <= max;
- }
+ if (data.unspecified) {
+ data.unspecified.forEach(function (l, i) {
+ if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
+ lanesObj.unspecified[i][key] = l;
+ });
+ }
+ }
- return false;
+ function osmWay() {
+ if (!(this instanceof osmWay)) {
+ return new osmWay().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
}
+ }
+ osmEntity.way = osmWay;
+ osmWay.prototype = Object.create(osmEntity.prototype);
+ Object.assign(osmWay.prototype, {
+ type: 'way',
+ nodes: [],
+ copy: function copy(resolver, copies) {
+ if (copies[this.id]) return copies[this.id];
+ var copy = osmEntity.prototype.copy.call(this, resolver, copies);
+ var nodes = this.nodes.map(function (id) {
+ return resolver.entity(id).copy(resolver, copies).id;
+ });
+ copy = copy.update({
+ nodes: nodes
+ });
+ copies[this.id] = copy;
+ return copy;
+ },
+ extent: function extent(resolver) {
+ return resolver["transient"](this, 'extent', function () {
+ var extent = geoExtent();
- function tiler() {
- var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
- var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
- var tileMin = 0;
- var tileMax = Math.pow(2, z0) - 1;
- var log2ts = Math.log(_tileSize) * Math.LOG2E;
- var k = Math.pow(2, z - z0 + log2ts);
- var origin = [(_translate[0] - _scale / 2) / k, (_translate[1] - _scale / 2) / k];
- var cols = range(clamp(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1), clamp(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1));
- var rows = range(clamp(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1), clamp(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1));
- var tiles = [];
+ for (var i = 0; i < this.nodes.length; i++) {
+ var node = resolver.hasEntity(this.nodes[i]);
- for (var i = 0; i < rows.length; i++) {
- var y = rows[i];
+ if (node) {
+ extent._extend(node.extent());
+ }
+ }
- for (var j = 0; j < cols.length; j++) {
- var x = cols[j];
+ return extent;
+ });
+ },
+ first: function first() {
+ return this.nodes[0];
+ },
+ last: function last() {
+ return this.nodes[this.nodes.length - 1];
+ },
+ contains: function contains(node) {
+ return this.nodes.indexOf(node) >= 0;
+ },
+ affix: function affix(node) {
+ if (this.nodes[0] === node) return 'prefix';
+ if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
+ },
+ layer: function layer() {
+ // explicit layer tag, clamp between -10, 10..
+ if (isFinite(this.tags.layer)) {
+ return Math.max(-10, Math.min(+this.tags.layer, 10));
+ } // implied layer tag..
- if (i >= _margin && i <= rows.length - _margin && j >= _margin && j <= cols.length - _margin) {
- tiles.unshift([x, y, z0]); // tiles in view at beginning
+
+ if (this.tags.covered === 'yes') return -1;
+ if (this.tags.location === 'overground') return 1;
+ if (this.tags.location === 'underground') return -1;
+ if (this.tags.location === 'underwater') return -10;
+ if (this.tags.power === 'line') return 10;
+ if (this.tags.power === 'minor_line') return 10;
+ if (this.tags.aerialway) return 10;
+ if (this.tags.bridge) return 1;
+ if (this.tags.cutting) return -1;
+ if (this.tags.tunnel) return -1;
+ if (this.tags.waterway) return -1;
+ if (this.tags.man_made === 'pipeline') return -10;
+ if (this.tags.boundary) return -10;
+ return 0;
+ },
+ // the approximate width of the line based on its tags except its `width` tag
+ impliedLineWidthMeters: function impliedLineWidthMeters() {
+ var averageWidths = {
+ highway: {
+ // width is for single lane
+ motorway: 5,
+ motorway_link: 5,
+ trunk: 4.5,
+ trunk_link: 4.5,
+ primary: 4,
+ secondary: 4,
+ tertiary: 4,
+ primary_link: 4,
+ secondary_link: 4,
+ tertiary_link: 4,
+ unclassified: 4,
+ road: 4,
+ living_street: 4,
+ bus_guideway: 4,
+ pedestrian: 4,
+ residential: 3.5,
+ service: 3.5,
+ track: 3,
+ cycleway: 2.5,
+ bridleway: 2,
+ corridor: 2,
+ steps: 2,
+ path: 1.5,
+ footway: 1.5
+ },
+ railway: {
+ // width includes ties and rail bed, not just track gauge
+ rail: 2.5,
+ light_rail: 2.5,
+ tram: 2.5,
+ subway: 2.5,
+ monorail: 2.5,
+ funicular: 2.5,
+ disused: 2.5,
+ preserved: 2.5,
+ miniature: 1.5,
+ narrow_gauge: 1.5
+ },
+ waterway: {
+ river: 50,
+ canal: 25,
+ stream: 5,
+ tidal_channel: 5,
+ fish_pass: 2.5,
+ drain: 2.5,
+ ditch: 1.5
+ }
+ };
+
+ for (var key in averageWidths) {
+ if (this.tags[key] && averageWidths[key][this.tags[key]]) {
+ var width = averageWidths[key][this.tags[key]];
+
+ if (key === 'highway') {
+ var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10);
+ if (!laneCount) laneCount = this.isOneWay() ? 1 : 2;
+ return width * laneCount;
+ }
+
+ return width;
+ }
+ }
+
+ return null;
+ },
+ isOneWay: function isOneWay() {
+ // explicit oneway tag..
+ var values = {
+ 'yes': true,
+ '1': true,
+ '-1': true,
+ 'reversible': true,
+ 'alternating': true,
+ 'no': false,
+ '0': false
+ };
+
+ if (values[this.tags.oneway] !== undefined) {
+ return values[this.tags.oneway];
+ } // implied oneway tag..
+
+
+ for (var key in this.tags) {
+ if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+ // Some identifier for tag that implies that this way is "sided",
+ // i.e. the right side is the 'inside' (e.g. the right side of a
+ // natural=cliff is lower).
+ sidednessIdentifier: function sidednessIdentifier() {
+ for (var key in this.tags) {
+ var value = this.tags[key];
+
+ if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) {
+ if (osmRightSideIsInsideTags[key][value] === true) {
+ return key;
} else {
- tiles.push([x, y, z0]); // tiles in margin at the end
+ // if the map's value is something other than a
+ // literal true, we should use it so we can
+ // special case some keys (e.g. natural=coastline
+ // is handled differently to other naturals).
+ return osmRightSideIsInsideTags[key][value];
}
}
}
- tiles.translate = origin;
- tiles.scale = k;
- return tiles;
- }
- /**
- * getTiles() returns an array of tiles that cover the map view
- */
+ return null;
+ },
+ isSided: function isSided() {
+ if (this.tags.two_sided === 'yes') {
+ return false;
+ }
+
+ return this.sidednessIdentifier() !== null;
+ },
+ lanes: function lanes() {
+ return osmLanes(this);
+ },
+ isClosed: function isClosed() {
+ return this.nodes.length > 1 && this.first() === this.last();
+ },
+ isConvex: function isConvex(resolver) {
+ if (!this.isClosed() || this.isDegenerate()) return null;
+ var nodes = utilArrayUniq(resolver.childNodes(this));
+ var coords = nodes.map(function (n) {
+ return n.loc;
+ });
+ var curr = 0;
+ var prev = 0;
+ for (var i = 0; i < coords.length; i++) {
+ var o = coords[(i + 1) % coords.length];
+ var a = coords[i];
+ var b = coords[(i + 2) % coords.length];
+ var res = geoVecCross(a, b, o);
+ curr = res > 0 ? 1 : res < 0 ? -1 : 0;
- tiler.getTiles = function (projection) {
- var origin = [projection.scale() * Math.PI - projection.translate()[0], projection.scale() * Math.PI - projection.translate()[1]];
- this.size(projection.clipExtent()[1]).scale(projection.scale() * 2 * Math.PI).translate(projection.translate());
- var tiles = tiler();
- var ts = tiles.scale;
- return tiles.map(function (tile) {
- if (_skipNullIsland && nearNullIsland(tile)) {
+ if (curr === 0) {
+ continue;
+ } else if (prev && curr !== prev) {
return false;
}
- var x = tile[0] * ts - origin[0];
- var y = tile[1] * ts - origin[1];
- return {
- id: tile.toString(),
- xyz: tile,
- extent: geoExtent(projection.invert([x, y + ts]), projection.invert([x + ts, y]))
- };
- }).filter(Boolean);
- };
- /**
- * getGeoJSON() returns a FeatureCollection for debugging tiles
- */
+ prev = curr;
+ }
+ return true;
+ },
+ // returns an object with the tag that implies this is an area, if any
+ tagSuggestingArea: function tagSuggestingArea() {
+ return osmTagSuggestingArea(this.tags);
+ },
+ isArea: function isArea() {
+ if (this.tags.area === 'yes') return true;
+ if (!this.isClosed() || this.tags.area === 'no') return false;
+ return this.tagSuggestingArea() !== null;
+ },
+ isDegenerate: function isDegenerate() {
+ return new Set(this.nodes).size < (this.isArea() ? 3 : 2);
+ },
+ areAdjacent: function areAdjacent(n1, n2) {
+ for (var i = 0; i < this.nodes.length; i++) {
+ if (this.nodes[i] === n1) {
+ if (this.nodes[i - 1] === n2) return true;
+ if (this.nodes[i + 1] === n2) return true;
+ }
+ }
- tiler.getGeoJSON = function (projection) {
- var features = tiler.getTiles(projection).map(function (tile) {
- return {
- type: 'Feature',
- properties: {
- id: tile.id,
- name: tile.id
- },
- geometry: {
- type: 'Polygon',
- coordinates: [tile.extent.polygon()]
- }
- };
+ return false;
+ },
+ geometry: function geometry(graph) {
+ return graph["transient"](this, 'geometry', function () {
+ return this.isArea() ? 'area' : 'line';
});
- return {
- type: 'FeatureCollection',
- features: features
- };
- };
-
- tiler.tileSize = function (val) {
- if (!arguments.length) return _tileSize;
- _tileSize = val;
- return tiler;
- };
+ },
+ // returns an array of objects representing the segments between the nodes in this way
+ segments: function segments(graph) {
+ function segmentExtent(graph) {
+ var n1 = graph.hasEntity(this.nodes[0]);
+ var n2 = graph.hasEntity(this.nodes[1]);
+ return n1 && n2 && geoExtent([[Math.min(n1.loc[0], n2.loc[0]), Math.min(n1.loc[1], n2.loc[1])], [Math.max(n1.loc[0], n2.loc[0]), Math.max(n1.loc[1], n2.loc[1])]]);
+ }
- tiler.zoomExtent = function (val) {
- if (!arguments.length) return _zoomExtent;
- _zoomExtent = val;
- return tiler;
- };
+ return graph["transient"](this, 'segments', function () {
+ var segments = [];
- tiler.size = function (val) {
- if (!arguments.length) return _size;
- _size = val;
- return tiler;
- };
+ for (var i = 0; i < this.nodes.length - 1; i++) {
+ segments.push({
+ id: this.id + '-' + i,
+ wayId: this.id,
+ index: i,
+ nodes: [this.nodes[i], this.nodes[i + 1]],
+ extent: segmentExtent
+ });
+ }
- tiler.scale = function (val) {
- if (!arguments.length) return _scale;
- _scale = val;
- return tiler;
- };
+ return segments;
+ });
+ },
+ // If this way is not closed, append the beginning node to the end of the nodelist to close it.
+ close: function close() {
+ if (this.isClosed() || !this.nodes.length) return this;
+ var nodes = this.nodes.slice();
+ nodes = nodes.filter(noRepeatNodes);
+ nodes.push(nodes[0]);
+ return this.update({
+ nodes: nodes
+ });
+ },
+ // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
+ unclose: function unclose() {
+ if (!this.isClosed()) return this;
+ var nodes = this.nodes.slice();
+ var connector = this.first();
+ var i = nodes.length - 1; // remove trailing connectors..
- tiler.translate = function (val) {
- if (!arguments.length) return _translate;
- _translate = val;
- return tiler;
- }; // number to extend the rows/columns beyond those covering the viewport
+ while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+ nodes.splice(i, 1);
+ i = nodes.length - 1;
+ }
+ nodes = nodes.filter(noRepeatNodes);
+ return this.update({
+ nodes: nodes
+ });
+ },
+ // Adds a node (id) in front of the node which is currently at position index.
+ // If index is undefined, the node will be added to the end of the way for linear ways,
+ // or just before the final connecting node for circular ways.
+ // Consecutive duplicates are eliminated including existing ones.
+ // Circularity is always preserved when adding a node.
+ addNode: function addNode(id, index) {
+ var nodes = this.nodes.slice();
+ var isClosed = this.isClosed();
+ var max = isClosed ? nodes.length - 1 : nodes.length;
- tiler.margin = function (val) {
- if (!arguments.length) return _margin;
- _margin = +val;
- return tiler;
- };
+ if (index === undefined) {
+ index = max;
+ }
- tiler.skipNullIsland = function (val) {
- if (!arguments.length) return _skipNullIsland;
- _skipNullIsland = val;
- return tiler;
- };
+ if (index < 0 || index > max) {
+ throw new RangeError('index ' + index + ' out of range 0..' + max);
+ } // If this is a closed way, remove all connector nodes except the first one
+ // (there may be duplicates) and adjust index if necessary..
- return tiler;
- }
- function utilTriggerEvent(target, type) {
- target.each(function () {
- var evt = document.createEvent('HTMLEvents');
- evt.initEvent(type, true, true);
- this.dispatchEvent(evt);
- });
- }
+ if (isClosed) {
+ var connector = this.first(); // leading connectors..
- var _mainLocalizer = coreLocalizer(); // singleton
+ var i = 1;
+ while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
+ nodes.splice(i, 1);
+ if (index > i) index--;
+ } // trailing connectors..
- var _t = _mainLocalizer.t;
- // coreLocalizer manages language and locale parameters including translated strings
- //
- function coreLocalizer() {
- var localizer = {};
- var _dataLanguages = {}; // `_dataLocales` is an object containing all _supported_ locale codes -> language info.
- // * `rtl` - right-to-left or left-to-right text direction
- // * `pct` - the percent of strings translated; 1 = 100%, full coverage
- //
- // {
- // en: { rtl: false, pct: {â¦} },
- // de: { rtl: false, pct: {â¦} },
- // â¦
- // }
+ i = nodes.length - 1;
- var _dataLocales = {}; // `localeStrings` is an object containing all _loaded_ locale codes -> string data.
- // {
- // en: { icons: {â¦}, toolbar: {â¦}, modes: {â¦}, operations: {â¦}, ⦠},
- // de: { icons: {â¦}, toolbar: {â¦}, modes: {â¦}, operations: {â¦}, ⦠},
- // â¦
- // }
+ while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+ nodes.splice(i, 1);
+ if (index > i) index--;
+ i = nodes.length - 1;
+ }
+ }
- var _localeStrings = {}; // the current locale
+ nodes.splice(index, 0, id);
+ nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
- var _localeCode = 'en-US'; // `_localeCodes` must contain `_localeCode` first, optionally followed by fallbacks
+ if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+ nodes.push(nodes[0]);
+ }
- var _localeCodes = ['en-US', 'en'];
- var _languageCode = 'en';
- var _textDirection = 'ltr';
- var _usesMetric = false;
- var _languageNames = {};
- var _scriptNames = {}; // getters for the current locale parameters
+ return this.update({
+ nodes: nodes
+ });
+ },
+ // Replaces the node which is currently at position index with the given node (id).
+ // Consecutive duplicates are eliminated including existing ones.
+ // Circularity is preserved when updating a node.
+ updateNode: function updateNode(id, index) {
+ var nodes = this.nodes.slice();
+ var isClosed = this.isClosed();
+ var max = nodes.length - 1;
- localizer.localeCode = function () {
- return _localeCode;
- };
+ if (index === undefined || index < 0 || index > max) {
+ throw new RangeError('index ' + index + ' out of range 0..' + max);
+ } // If this is a closed way, remove all connector nodes except the first one
+ // (there may be duplicates) and adjust index if necessary..
- localizer.localeCodes = function () {
- return _localeCodes;
- };
- localizer.languageCode = function () {
- return _languageCode;
- };
+ if (isClosed) {
+ var connector = this.first(); // leading connectors..
- localizer.textDirection = function () {
- return _textDirection;
- };
+ var i = 1;
- localizer.usesMetric = function () {
- return _usesMetric;
- };
+ while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
+ nodes.splice(i, 1);
+ if (index > i) index--;
+ } // trailing connectors..
- localizer.languageNames = function () {
- return _languageNames;
- };
- localizer.scriptNames = function () {
- return _scriptNames;
- }; // The client app may want to manually set the locale, regardless of the
- // settings provided by the browser
+ i = nodes.length - 1;
+ while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+ nodes.splice(i, 1);
+ if (index === i) index = 0; // update leading connector instead
- var _preferredLocaleCodes = [];
+ i = nodes.length - 1;
+ }
+ }
- localizer.preferredLocaleCodes = function (codes) {
- if (!arguments.length) return _preferredLocaleCodes;
+ nodes.splice(index, 1, id);
+ nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
- if (typeof codes === 'string') {
- // be generous and accept delimited strings as input
- _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean);
- } else {
- _preferredLocaleCodes = codes;
+ if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+ nodes.push(nodes[0]);
}
- return localizer;
- };
+ return this.update({
+ nodes: nodes
+ });
+ },
+ // Replaces each occurrence of node id needle with replacement.
+ // Consecutive duplicates are eliminated including existing ones.
+ // Circularity is preserved.
+ replaceNode: function replaceNode(needleID, replacementID) {
+ var nodes = this.nodes.slice();
+ var isClosed = this.isClosed();
- var _loadPromise;
+ for (var i = 0; i < nodes.length; i++) {
+ if (nodes[i] === needleID) {
+ nodes[i] = replacementID;
+ }
+ }
- localizer.ensureLoaded = function () {
- if (_loadPromise) return _loadPromise;
- return _loadPromise = Promise.all([// load the list of languages
- _mainFileFetcher.get('languages'), // load the list of supported locales
- _mainFileFetcher.get('locales')]).then(function (results) {
- _dataLanguages = results[0];
- _dataLocales = results[1];
- }).then(function () {
- var requestedLocales = (_preferredLocaleCodes || []). // List of locales preferred by the browser in priority order.
- concat(utilDetect().browserLocales) // fallback to English since it's the only guaranteed complete language
- .concat(['en']);
+ nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
+
+ if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+ nodes.push(nodes[0]);
+ }
- _localeCodes = localesToUseFrom(requestedLocales); // Run iD in the highest-priority locale; the rest are fallbacks
+ return this.update({
+ nodes: nodes
+ });
+ },
+ // Removes each occurrence of node id.
+ // Consecutive duplicates are eliminated including existing ones.
+ // Circularity is preserved.
+ removeNode: function removeNode(id) {
+ var nodes = this.nodes.slice();
+ var isClosed = this.isClosed();
+ nodes = nodes.filter(function (node) {
+ return node !== id;
+ }).filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
- _localeCode = _localeCodes[0]; // Will always return the index for `en` if nothing else
+ if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+ nodes.push(nodes[0]);
+ }
- var fullCoverageIndex = _localeCodes.findIndex(function (locale) {
- return _dataLocales[locale].pct === 1;
- }); // We only need to load locales up until we find one with full coverage
+ return this.update({
+ nodes: nodes
+ });
+ },
+ asJXON: function asJXON(changeset_id) {
+ var r = {
+ way: {
+ '@id': this.osmId(),
+ '@version': this.version || 0,
+ nd: this.nodes.map(function (id) {
+ return {
+ keyAttributes: {
+ ref: osmEntity.id.toOSM(id)
+ }
+ };
+ }, this),
+ tag: Object.keys(this.tags).map(function (k) {
+ return {
+ keyAttributes: {
+ k: k,
+ v: this.tags[k]
+ }
+ };
+ }, this)
+ }
+ };
+ if (changeset_id) {
+ r.way['@changeset'] = changeset_id;
+ }
- var loadStringsPromises = _localeCodes.slice(0, fullCoverageIndex + 1).map(function (code) {
- return localizer.loadLocale(code);
+ return r;
+ },
+ asGeoJSON: function asGeoJSON(resolver) {
+ return resolver["transient"](this, 'GeoJSON', function () {
+ var coordinates = resolver.childNodes(this).map(function (n) {
+ return n.loc;
});
- return Promise.all(loadStringsPromises);
- }).then(function () {
- updateForCurrentLocale();
- })["catch"](function (err) {
- return console.error(err);
- }); // eslint-disable-line
- }; // Returns the locales from `requestedLocales` supported by iD that we should use
-
+ if (this.isArea() && this.isClosed()) {
+ return {
+ type: 'Polygon',
+ coordinates: [coordinates]
+ };
+ } else {
+ return {
+ type: 'LineString',
+ coordinates: coordinates
+ };
+ }
+ });
+ },
+ area: function area(resolver) {
+ return resolver["transient"](this, 'area', function () {
+ var nodes = resolver.childNodes(this);
+ var json = {
+ type: 'Polygon',
+ coordinates: [nodes.map(function (n) {
+ return n.loc;
+ })]
+ };
- function localesToUseFrom(requestedLocales) {
- var supportedLocales = _dataLocales;
- var toUse = [];
+ if (!this.isClosed() && nodes.length) {
+ json.coordinates[0].push(nodes[0].loc);
+ }
- for (var i in requestedLocales) {
- var locale = requestedLocales[i];
- if (supportedLocales[locale]) toUse.push(locale);
+ var area = d3_geoArea(json); // Heuristic for detecting counterclockwise winding order. Assumes
+ // that OpenStreetMap polygons are not hemisphere-spanning.
- if (locale.includes('-')) {
- // Full locale ('es-ES'), add fallback to the base ('es')
- var langPart = locale.split('-')[0];
- if (supportedLocales[langPart]) toUse.push(langPart);
+ if (area > 2 * Math.PI) {
+ json.coordinates[0] = json.coordinates[0].reverse();
+ area = d3_geoArea(json);
}
- } // remove duplicates
-
- return utilArrayUniq(toUse);
+ return isNaN(area) ? 0 : area;
+ });
}
+ }); // Filter function to eliminate consecutive duplicates.
- function updateForCurrentLocale() {
- if (!_localeCode) return;
- _languageCode = _localeCode.split('-')[0];
- var currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode];
- var hash = utilStringQs(window.location.hash);
+ function noRepeatNodes(node, i, arr) {
+ return i === 0 || node !== arr[i - 1];
+ }
- if (hash.rtl === 'true') {
- _textDirection = 'rtl';
- } else if (hash.rtl === 'false') {
- _textDirection = 'ltr';
- } else {
- _textDirection = currentData && currentData.rtl ? 'rtl' : 'ltr';
- }
+ //
+ // 1. Relation tagged with `type=multipolygon` and no interesting tags.
+ // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
+ // 3. No members without a role.
+ //
+ // Old multipolygons are no longer recommended but are still rendered as areas by iD.
- var locale = _localeCode;
- if (locale.toLowerCase() === 'en-us') locale = 'en';
- _languageNames = _localeStrings[locale].languageNames;
- _scriptNames = _localeStrings[locale].scriptNames;
- _usesMetric = _localeCode.slice(-3).toLowerCase() !== '-us';
+ function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
+ if (entity.type !== 'relation' || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
+ return false;
}
- /* Locales */
- // Returns a Promise to load the strings for the requested locale
-
-
- localizer.loadLocale = function (requested) {
- if (!_dataLocales) {
- return Promise.reject('loadLocale called before init');
- }
-
- var locale = requested; // US English is the default
-
- if (locale.toLowerCase() === 'en-us') locale = 'en';
-
- if (!_dataLocales[locale]) {
- return Promise.reject("Unsupported locale: ".concat(requested));
- }
-
- if (_localeStrings[locale]) {
- // already loaded
- return Promise.resolve(locale);
- }
- var fileMap = _mainFileFetcher.fileMap();
- var key = "locale_".concat(locale);
- fileMap[key] = "locales/".concat(locale, ".json");
- return _mainFileFetcher.get(key).then(function (d) {
- _localeStrings[locale] = d[locale];
- return locale;
- });
- };
+ var outerMember;
- localizer.pluralRule = function (number) {
- return pluralRule(number, _localeCode);
- }; // Returns the plural rule for the given `number` with the given `localeCode`.
- // One of: `zero`, `one`, `two`, `few`, `many`, `other`
+ for (var memberIndex in entity.members) {
+ var member = entity.members[memberIndex];
+ if (!member.role || member.role === 'outer') {
+ if (outerMember) return false;
+ if (member.type !== 'way') return false;
+ if (!graph.hasEntity(member.id)) return false;
+ outerMember = graph.entity(member.id);
- function pluralRule(number, localeCode) {
- // modern browsers have this functionality built-in
- var rules = 'Intl' in window && Intl.PluralRules && new Intl.PluralRules(localeCode);
+ if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
+ return false;
+ }
+ }
+ }
- if (rules) {
- return rules.select(number);
- } // fallback to basic one/other, as in English
+ return outerMember;
+ } // For fixing up rendering of multipolygons with tags on the outer member.
+ // https://github.com/openstreetmap/iD/issues/613
+ function osmIsOldMultipolygonOuterMember(entity, graph) {
+ if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) {
+ return false;
+ }
- if (number === 1) return 'one';
- return 'other';
+ var parents = graph.parentRelations(entity);
+ if (parents.length !== 1) return false;
+ var parent = parents[0];
+
+ if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
+ return false;
}
- /**
- * Try to find that string in `locale` or the current `_localeCode` matching
- * the given `stringId`. If no string can be found in the requested locale,
- * we'll recurse down all the `_localeCodes` until one is found.
- *
- * @param {string} stringId string identifier
- * @param {object?} replacements token replacements and default string
- * @param {string?} locale locale to use (defaults to currentLocale)
- * @return {string?} localized string
- */
+ var members = parent.members,
+ member;
- localizer.tInfo = function (stringId, replacements, locale) {
- locale = locale || _localeCode;
- var path = stringId.split('.').map(function (s) {
- return s.replace(//g, '.');
- }).reverse();
- var stringsKey = locale; // US English is the default
+ for (var i = 0; i < members.length; i++) {
+ member = members[i];
- if (stringsKey.toLowerCase() === 'en-us') stringsKey = 'en';
- var result = _localeStrings[stringsKey];
+ if (member.id === entity.id && member.role && member.role !== 'outer') {
+ // Not outer member
+ return false;
+ }
- while (result !== undefined && path.length) {
- result = result[path.pop()];
+ if (member.id !== entity.id && (!member.role || member.role === 'outer')) {
+ // Not a simple multipolygon
+ return false;
}
+ }
- if (result !== undefined) {
- if (replacements) {
- if (_typeof(result) === 'object' && Object.keys(result).length) {
- // If plural forms are provided, dig one level deeper based on the
- // first numeric token replacement provided.
- var number = Object.values(replacements).find(function (value) {
- return typeof value === 'number';
- });
+ return parent;
+ }
+ function osmOldMultipolygonOuterMember(entity, graph) {
+ if (entity.type !== 'way') return false;
+ var parents = graph.parentRelations(entity);
+ if (parents.length !== 1) return false;
+ var parent = parents[0];
- if (number !== undefined) {
- var rule = pluralRule(number, locale);
+ if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
+ return false;
+ }
- if (result[rule]) {
- result = result[rule];
- } else {
- // We're pretty sure this should be a plural but no string
- // could be found for the given rule. Just pick the first
- // string and hope it makes sense.
- result = Object.values(result)[0];
- }
- }
- }
+ var members = parent.members,
+ member,
+ outerMember;
- if (typeof result === 'string') {
- for (var key in replacements) {
- var value = replacements[key];
+ for (var i = 0; i < members.length; i++) {
+ member = members[i];
- if (typeof value === 'number' && value.toLocaleString) {
- // format numbers for the locale
- value = value.toLocaleString(locale, {
- style: 'decimal',
- useGrouping: true,
- minimumFractionDigits: 0
- });
- }
+ if (!member.role || member.role === 'outer') {
+ if (outerMember) return false; // Not a simple multipolygon
- var token = "{".concat(key, "}");
- var regex = new RegExp(token, 'g');
- result = result.replace(regex, value);
- }
- }
- }
+ outerMember = member;
+ }
+ }
- if (typeof result === 'string') {
- // found a localized string!
- return {
- text: result,
- locale: locale
- };
- }
- } // no localized string found...
- // attempt to fallback to a lower-priority language
+ if (!outerMember) return false;
+ var outerEntity = graph.hasEntity(outerMember.id);
+ if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) {
+ return false;
+ }
- var index = _localeCodes.indexOf(locale);
+ return outerEntity;
+ } // Join `toJoin` array into sequences of connecting ways.
+ // Segments which share identical start/end nodes will, as much as possible,
+ // be connected with each other.
+ //
+ // The return value is a nested array. Each constituent array contains elements
+ // of `toJoin` which have been determined to connect.
+ //
+ // Each consitituent array also has a `nodes` property whose value is an
+ // ordered array of member nodes, with appropriate order reversal and
+ // start/end coordinate de-duplication.
+ //
+ // Members of `toJoin` must have, at minimum, `type` and `id` properties.
+ // Thus either an array of `osmWay`s or a relation member array may be used.
+ //
+ // If an member is an `osmWay`, its tags and childnodes may be reversed via
+ // `actionReverse` in the output.
+ //
+ // The returned sequences array also has an `actions` array property, containing
+ // any reversal actions that should be applied to the graph, should the calling
+ // code attempt to actually join the given ways.
+ //
+ // Incomplete members (those for which `graph.hasEntity(element.id)` returns
+ // false) and non-way members are ignored.
+ //
- if (index >= 0 && index < _localeCodes.length - 1) {
- // eventually this will be 'en' or another locale with 100% coverage
- var fallback = _localeCodes[index + 1];
- return localizer.tInfo(stringId, replacements, fallback);
- }
+ function osmJoinWays(toJoin, graph) {
+ function resolve(member) {
+ return graph.childNodes(graph.entity(member.id));
+ }
- if (replacements && 'default' in replacements) {
- // Fallback to a default value if one is specified in `replacements`
- return {
- text: replacements["default"],
- locale: null
- };
- }
+ function reverse(item) {
+ var action = actionReverse(item.id, {
+ reverseOneway: true
+ });
+ sequences.actions.push(action);
+ return item instanceof osmWay ? action(graph).entity(item.id) : item;
+ } // make a copy containing only the items to join
- var missing = "Missing ".concat(locale, " translation: ").concat(stringId);
- if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
- return {
- text: missing,
- locale: 'en'
- };
- }; // Returns only the localized text, discarding the locale info
+ toJoin = toJoin.filter(function (member) {
+ return member.type === 'way' && graph.hasEntity(member.id);
+ }); // Are the things we are joining relation members or `osmWays`?
+ // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
+ var i;
+ var joinAsMembers = true;
- localizer.t = function (stringId, replacements, locale) {
- return localizer.tInfo(stringId, replacements, locale).text;
- }; // Returns the localized text wrapped in an HTML element encoding the locale info
+ for (i = 0; i < toJoin.length; i++) {
+ if (toJoin[i] instanceof osmWay) {
+ joinAsMembers = false;
+ break;
+ }
+ }
+ var sequences = [];
+ sequences.actions = [];
- localizer.t.html = function (stringId, replacements, locale) {
- var info = localizer.tInfo(stringId, replacements, locale); // text may be empty or undefined if `replacements.default` is
+ while (toJoin.length) {
+ // start a new sequence
+ var item = toJoin.shift();
+ var currWays = [item];
+ var currNodes = resolve(item).slice(); // add to it
- return info.text ? localizer.htmlForLocalizedText(info.text, info.locale) : '';
- };
+ while (toJoin.length) {
+ var start = currNodes[0];
+ var end = currNodes[currNodes.length - 1];
+ var fn = null;
+ var nodes = null; // Find the next way/member to join.
- localizer.htmlForLocalizedText = function (text, localeCode) {
- return "").concat(text, "");
- };
+ for (i = 0; i < toJoin.length; i++) {
+ item = toJoin[i];
+ nodes = resolve(item); // (for member ordering only, not way ordering - see #4872)
+ // Strongly prefer to generate a forward path that preserves the order
+ // of the members array. For multipolygons and most relations, member
+ // order does not matter - but for routes, it does. (see #4589)
+ // If we started this sequence backwards (i.e. next member way attaches to
+ // the start node and not the end node), reverse the initial way before continuing.
- localizer.languageName = function (code, options) {
- if (_languageNames[code]) {
- // name in locale language
- // e.g. "German"
- return _languageNames[code];
- } // sometimes we only want the local name
+ if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start || nodes[0] === start)) {
+ currWays[0] = reverse(currWays[0]);
+ currNodes.reverse();
+ start = currNodes[0];
+ end = currNodes[currNodes.length - 1];
+ }
+ if (nodes[0] === end) {
+ fn = currNodes.push; // join to end
- if (options && options.localOnly) return null;
- var langInfo = _dataLanguages[code];
+ nodes = nodes.slice(1);
+ break;
+ } else if (nodes[nodes.length - 1] === end) {
+ fn = currNodes.push; // join to end
- if (langInfo) {
- if (langInfo.nativeName) {
- // name in native language
- // e.g. "Deutsch (de)"
- return localizer.t('translate.language_and_code', {
- language: langInfo.nativeName,
- code: code
- });
- } else if (langInfo.base && langInfo.script) {
- var base = langInfo.base; // the code of the language this is based on
+ nodes = nodes.slice(0, -1).reverse();
+ item = reverse(item);
+ break;
+ } else if (nodes[nodes.length - 1] === start) {
+ fn = currNodes.unshift; // join to beginning
- if (_languageNames[base]) {
- // base language name in locale language
- var scriptCode = langInfo.script;
- var script = _scriptNames[scriptCode] || scriptCode; // e.g. "Serbian (Cyrillic)"
+ nodes = nodes.slice(0, -1);
+ break;
+ } else if (nodes[0] === start) {
+ fn = currNodes.unshift; // join to beginning
- return localizer.t('translate.language_and_code', {
- language: _languageNames[base],
- code: script
- });
- } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) {
- // e.g. "ÑÑпÑки (sr-Cyrl)"
- return localizer.t('translate.language_and_code', {
- language: _dataLanguages[base].nativeName,
- code: code
- });
+ nodes = nodes.slice(1).reverse();
+ item = reverse(item);
+ break;
+ } else {
+ fn = nodes = null;
}
}
+
+ if (!nodes) {
+ // couldn't find a joinable way/member
+ break;
+ }
+
+ fn.apply(currWays, [item]);
+ fn.apply(currNodes, nodes);
+ toJoin.splice(i, 1);
}
- return code; // if not found, use the code
- };
+ currWays.nodes = currNodes;
+ sequences.push(currWays);
+ }
- return localizer;
+ return sequences;
}
- // `presetCollection` is a wrapper around an `Array` of presets `collection`,
- // and decorated with some extra methods for searching and matching geometry
- //
+ function actionAddMember(relationId, member, memberIndex, insertPair) {
+ return function action(graph) {
+ var relation = graph.entity(relationId); // There are some special rules for Public Transport v2 routes.
- function presetCollection(collection) {
- var MAXRESULTS = 50;
- var _this = {};
- var _memo = {};
- _this.collection = collection;
+ var isPTv2 = /stop|platform/.test(member.role);
- _this.item = function (id) {
- if (_memo[id]) return _memo[id];
+ if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
+ // Try to perform sensible inserts based on how the ways join together
+ graph = addWayMember(relation, graph);
+ } else {
+ // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
+ // Stops and Platforms for PTv2 should be ordered first.
+ // hack: We do not currently have the ability to place them in the exactly correct order.
+ if (isPTv2 && isNaN(memberIndex)) {
+ memberIndex = 0;
+ }
- var found = _this.collection.find(function (d) {
- return d.id === id;
- });
+ graph = graph.replace(relation.addMember(member, memberIndex));
+ }
- if (found) _memo[id] = found;
- return found;
- };
+ return graph;
+ }; // Add a way member into the relation "wherever it makes sense".
+ // In this situation we were not supplied a memberIndex.
- _this.index = function (id) {
- return _this.collection.findIndex(function (d) {
- return d.id === id;
- });
- };
+ function addWayMember(relation, graph) {
+ var groups, tempWay, insertPairIsReversed, item, i, j, k; // remove PTv2 stops and platforms before doing anything.
- _this.matchGeometry = function (geometry) {
- return presetCollection(_this.collection.filter(function (d) {
- return d.matchGeometry(geometry);
- }));
- };
+ var PTv2members = [];
+ var members = [];
- _this.matchAllGeometry = function (geometries) {
- return presetCollection(_this.collection.filter(function (d) {
- return d && d.matchAllGeometry(geometries);
- }));
- };
+ for (i = 0; i < relation.members.length; i++) {
+ var m = relation.members[i];
- _this.matchAnyGeometry = function (geometries) {
- return presetCollection(_this.collection.filter(function (d) {
- return geometries.some(function (geom) {
- return d.matchGeometry(geom);
- });
- }));
- };
+ if (/stop|platform/.test(m.role)) {
+ PTv2members.push(m);
+ } else {
+ members.push(m);
+ }
+ }
- _this.fallback = function (geometry) {
- var id = geometry;
- if (id === 'vertex') id = 'point';
- return _this.item(id);
- };
+ relation = relation.update({
+ members: members
+ });
- _this.search = function (value, geometry, countryCode) {
- if (!value) return _this;
- value = value.toLowerCase().trim(); // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
+ if (insertPair) {
+ // We're adding a member that must stay paired with an existing member.
+ // (This feature is used by `actionSplit`)
+ //
+ // This is tricky because the members may exist multiple times in the
+ // member list, and with different A-B/B-A ordering and different roles.
+ // (e.g. a bus route that loops out and back - #4589).
+ //
+ // Replace the existing member with a temporary way,
+ // so that `osmJoinWays` can treat the pair like a single way.
+ tempWay = osmWay({
+ id: 'wTemp',
+ nodes: insertPair.nodes
+ });
+ graph = graph.replace(tempWay);
+ var tempMember = {
+ id: tempWay.id,
+ type: 'way',
+ role: member.role
+ };
+ var tempRelation = relation.replaceMember({
+ id: insertPair.originalID
+ }, tempMember, true);
+ groups = utilArrayGroupBy(tempRelation.members, 'type');
+ groups.way = groups.way || []; // Insert pair is reversed if the inserted way comes before the original one.
+ // (Except when they form a loop.)
- function leading(a) {
- var index = a.indexOf(value);
- return index === 0 || a[index - 1] === ' ';
- } // match at name beginning only
+ var originalWay = graph.entity(insertPair.originalID);
+ var insertedWay = graph.entity(insertPair.insertedID);
+ 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];
+ } else {
+ // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
+ groups = utilArrayGroupBy(relation.members, 'type');
+ groups.way = groups.way || [];
+ groups.way.push(member);
+ }
+ members = withIndex(groups.way);
+ var joined = osmJoinWays(members, graph); // `joined` might not contain all of the way members,
+ // But will contain only the completed (downloaded) members
- function leadingStrict(a) {
- var index = a.indexOf(value);
- return index === 0;
- }
+ for (i = 0; i < joined.length; i++) {
+ var segment = joined[i];
+ var nodes = segment.nodes.slice();
+ var startIndex = segment[0].index; // j = array index in `members` where this segment starts
- function sortNames(a, b) {
- var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
- var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase(); // priority if search string matches preset name exactly - #4325
+ for (j = 0; j < members.length; j++) {
+ if (members[j].index === startIndex) {
+ break;
+ }
+ } // k = each member in segment
- if (value === aCompare) return -1;
- if (value === bCompare) return 1; // priority for higher matchScore
- var i = b.originalScore - a.originalScore;
- if (i !== 0) return i; // priority if search string appears earlier in preset name
+ for (k = 0; k < segment.length; k++) {
+ item = segment[k];
+ var way = graph.entity(item.id); // If this is a paired item, generate members in correct order and role
- i = aCompare.indexOf(value) - bCompare.indexOf(value);
- if (i !== 0) return i; // priority for shorter preset names
+ if (tempWay && item.id === tempWay.id) {
+ var reverse = nodes[0].id !== insertPair.nodes[0] ^ insertPairIsReversed;
- return aCompare.length - bCompare.length;
- }
+ if (reverse) {
+ item.pair = [{
+ id: insertPair.insertedID,
+ type: 'way',
+ role: item.role
+ }, {
+ id: insertPair.originalID,
+ type: 'way',
+ role: item.role
+ }];
+ } else {
+ item.pair = [{
+ id: insertPair.originalID,
+ type: 'way',
+ role: item.role
+ }, {
+ id: insertPair.insertedID,
+ type: 'way',
+ role: item.role
+ }];
+ }
+ } // reorder `members` if necessary
- var pool = _this.collection;
- if (countryCode) {
- pool = pool.filter(function (a) {
- if (a.countryCodes && a.countryCodes.indexOf(countryCode) === -1) return false;
- if (a.notCountryCodes && a.notCountryCodes.indexOf(countryCode) !== -1) return false;
- return true;
- });
+ if (k > 0) {
+ if (j + k >= members.length || item.index !== members[j + k].index) {
+ moveMember(members, item.index, j + k);
+ }
+ }
+
+ nodes.splice(0, way.nodes.length - 1);
+ }
}
- var searchable = pool.filter(function (a) {
- return a.searchable !== false && a.suggestion !== true;
- });
- var suggestions = pool.filter(function (a) {
- return a.suggestion === true;
- }); // matches value to preset.name
+ if (tempWay) {
+ graph = graph.remove(tempWay);
+ } // Final pass: skip dead items, split pairs, remove index properties
- var leading_name = searchable.filter(function (a) {
- return leading(a.name().toLowerCase());
- }).sort(sortNames); // matches value to preset suggestion name (original name is unhyphenated)
- var leading_suggestions = suggestions.filter(function (a) {
- return leadingStrict(a.originalName.toLowerCase());
- }).sort(sortNames); // matches value to preset.terms values
+ var wayMembers = [];
- var leading_terms = searchable.filter(function (a) {
- return (a.terms() || []).some(leading);
- }); // matches value to preset.tags values
+ for (i = 0; i < members.length; i++) {
+ item = members[i];
+ if (item.index === -1) continue;
- var leading_tag_values = searchable.filter(function (a) {
- return Object.values(a.tags || {}).filter(function (val) {
- return val !== '*';
- }).some(leading);
- }); // finds close matches to value in preset.name
+ if (item.pair) {
+ wayMembers.push(item.pair[0]);
+ wayMembers.push(item.pair[1]);
+ } else {
+ wayMembers.push(utilObjectOmit(item, ['index']));
+ }
+ } // Put stops and platforms first, then nodes, ways, relations
+ // This is recommended for Public Transport v2 routes:
+ // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
- var similar_name = searchable.map(function (a) {
- return {
- preset: a,
- dist: utilEditDistance(value, a.name())
- };
- }).filter(function (a) {
- return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
- }).sort(function (a, b) {
- return a.dist - b.dist;
- }).map(function (a) {
- return a.preset;
- }); // finds close matches to value to preset suggestion name (original name is unhyphenated)
- var similar_suggestions = suggestions.map(function (a) {
- return {
- preset: a,
- dist: utilEditDistance(value, a.originalName.toLowerCase())
- };
- }).filter(function (a) {
- return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
- }).sort(function (a, b) {
- return a.dist - b.dist;
- }).map(function (a) {
- return a.preset;
- }); // finds close matches to value in preset.terms
+ var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []);
+ return graph.replace(relation.update({
+ members: newMembers
+ })); // `moveMember()` changes the `members` array in place by splicing
+ // the item with `.index = findIndex` to where it belongs,
+ // and marking the old position as "dead" with `.index = -1`
+ //
+ // j=5, k=0 jk
+ // segment 5 4 7 6
+ // members 0 1 2 3 4 5 6 7 8 9 keep 5 in j+k
+ //
+ // j=5, k=1 j k
+ // segment 5 4 7 6
+ // members 0 1 2 3 4 5 6 7 8 9 move 4 to j+k
+ // members 0 1 2 3 x 5 4 6 7 8 9 moved
+ //
+ // j=5, k=2 j k
+ // segment 5 4 7 6
+ // members 0 1 2 3 x 5 4 6 7 8 9 move 7 to j+k
+ // members 0 1 2 3 x 5 4 7 6 x 8 9 moved
+ //
+ // j=5, k=3 j k
+ // segment 5 4 7 6
+ // members 0 1 2 3 x 5 4 7 6 x 8 9 keep 6 in j+k
+ //
- var similar_terms = searchable.filter(function (a) {
- return (a.terms() || []).some(function (b) {
- return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
- });
- });
- var results = leading_name.concat(leading_suggestions, leading_terms, leading_tag_values, similar_name, similar_suggestions, similar_terms).slice(0, MAXRESULTS - 1);
+ function moveMember(arr, findIndex, toIndex) {
+ var i;
- if (geometry) {
- if (typeof geometry === 'string') {
- results.push(_this.fallback(geometry));
- } else {
- geometry.forEach(function (geom) {
- return results.push(_this.fallback(geom));
- });
+ for (i = 0; i < arr.length; i++) {
+ if (arr[i].index === findIndex) {
+ break;
+ }
}
- }
- return presetCollection(utilArrayUniq(results));
- };
+ var item = Object.assign({}, arr[i]); // shallow copy
- return _this;
- }
+ arr[i].index = -1; // mark as dead
- // `presetCategory` builds a `presetCollection` of member presets,
- // decorated with some extra methods for searching and matching geometry
- //
+ item.index = toIndex;
+ arr.splice(toIndex, 0, item);
+ } // This is the same as `Relation.indexedMembers`,
+ // Except we don't want to index all the members, only the ways
- function presetCategory(categoryID, category, all) {
- var _this = Object.assign({}, category); // shallow copy
+ function withIndex(arr) {
+ var result = new Array(arr.length);
- _this.id = categoryID;
- _this.members = presetCollection(category.members.map(function (presetID) {
- return all.item(presetID);
- }).filter(Boolean));
- _this.geometry = _this.members.collection.reduce(function (acc, preset) {
- for (var i in preset.geometry) {
- var geometry = preset.geometry[i];
+ for (var i = 0; i < arr.length; i++) {
+ result[i] = Object.assign({}, arr[i]); // shallow copy
- if (acc.indexOf(geometry) === -1) {
- acc.push(geometry);
+ result[i].index = i;
}
- }
-
- return acc;
- }, []);
-
- _this.matchGeometry = function (geom) {
- return _this.geometry.indexOf(geom) >= 0;
- };
-
- _this.matchAllGeometry = function (geometries) {
- return _this.members.collection.some(function (preset) {
- return preset.matchAllGeometry(geometries);
- });
- };
- _this.matchScore = function () {
- return -1;
- };
+ return result;
+ }
+ }
+ }
- _this.name = function () {
- return _t("presets.categories.".concat(categoryID, ".name"), {
- 'default': categoryID
- });
- };
+ function actionAddMidpoint(midpoint, node) {
+ return function (graph) {
+ graph = graph.replace(node.move(midpoint.loc));
+ var parents = utilArrayIntersection(graph.parentWays(graph.entity(midpoint.edge[0])), graph.parentWays(graph.entity(midpoint.edge[1])));
+ parents.forEach(function (way) {
+ for (var i = 0; i < way.nodes.length - 1; i++) {
+ if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
+ graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1)); // Add only one midpoint on doubled-back segments,
+ // turning them into self-intersections.
- _this.nameLabel = function () {
- return _t.html("presets.categories.".concat(categoryID, ".name"), {
- 'default': categoryID
+ return;
+ }
+ }
});
+ return graph;
};
+ }
- _this.terms = function () {
- return [];
+ // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
+ function actionAddVertex(wayId, nodeId, index) {
+ return function (graph) {
+ return graph.replace(graph.entity(wayId).addNode(nodeId, index));
};
-
- return _this;
}
- // `presetField` decorates a given `field` Object
- // with some extra methods for searching and matching geometry
- //
-
- function presetField(fieldID, field) {
- var _this = Object.assign({}, field); // shallow copy
-
-
- _this.id = fieldID; // for use in classes, element ids, css selectors
-
- _this.safeid = utilSafeClassName(fieldID);
-
- _this.matchGeometry = function (geom) {
- return !_this.geometry || _this.geometry.indexOf(geom) !== -1;
+ function actionChangeMember(relationId, member, memberIndex) {
+ return function (graph) {
+ return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
};
+ }
- _this.matchAllGeometry = function (geometries) {
- return !_this.geometry || geometries.every(function (geom) {
- return _this.geometry.indexOf(geom) !== -1;
- });
- };
+ function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
+ return function action(graph) {
+ var entity = graph.entity(entityID);
+ var geometry = entity.geometry(graph);
+ var tags = entity.tags; // preserve tags that the new preset might care about, if any
- _this.t = function (scope, options) {
- return _t("presets.fields.".concat(fieldID, ".").concat(scope), options);
+ if (oldPreset) tags = oldPreset.unsetTags(tags, geometry, newPreset && newPreset.addTags ? Object.keys(newPreset.addTags) : null);
+ if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
+ return graph.replace(entity.update({
+ tags: tags
+ }));
};
+ }
- _this.t.html = function (scope, options) {
- return _t.html("presets.fields.".concat(fieldID, ".").concat(scope), options);
+ function actionChangeTags(entityId, tags) {
+ return function (graph) {
+ var entity = graph.entity(entityId);
+ return graph.replace(entity.update({
+ tags: tags
+ }));
};
+ }
- _this.title = function () {
- return _this.overrideLabel || _this.t('label', {
- 'default': fieldID
+ function osmNode() {
+ if (!(this instanceof osmNode)) {
+ return new osmNode().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+ }
+ osmEntity.node = osmNode;
+ osmNode.prototype = Object.create(osmEntity.prototype);
+ Object.assign(osmNode.prototype, {
+ type: 'node',
+ loc: [9999, 9999],
+ extent: function extent() {
+ return new geoExtent(this.loc);
+ },
+ geometry: function geometry(graph) {
+ return graph["transient"](this, 'geometry', function () {
+ return graph.isPoi(this) ? 'point' : 'vertex';
});
- };
-
- _this.label = function () {
- return _this.overrideLabel || _this.t.html('label', {
- 'default': fieldID
+ },
+ move: function move(loc) {
+ return this.update({
+ loc: loc
});
- };
-
- var _placeholder = _this.placeholder;
+ },
+ isDegenerate: function isDegenerate() {
+ 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);
+ },
+ // Inspect tags and geometry to determine which direction(s) this node/vertex points
+ directions: function directions(resolver, projection) {
+ var val;
+ var i; // which tag to use?
- _this.placeholder = function () {
- return _this.t('placeholder', {
- 'default': _placeholder
- });
- };
+ if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
+ // all-way stop tag on a highway intersection
+ val = 'all';
+ } else {
+ // generic direction tag
+ val = (this.tags.direction || '').toLowerCase(); // better suffix-style direction tag
- _this.originalTerms = (_this.terms || []).join();
+ var re = /:direction$/i;
+ var keys = Object.keys(this.tags);
- _this.terms = function () {
- return _this.t('terms', {
- 'default': _this.originalTerms
- }).toLowerCase().trim().split(/\s*,+\s*/);
- };
+ for (i = 0; i < keys.length; i++) {
+ if (re.test(keys[i])) {
+ val = this.tags[keys[i]].toLowerCase();
+ break;
+ }
+ }
+ }
- _this.increment = _this.type === 'number' ? _this.increment || 1 : undefined;
- return _this;
- }
+ if (val === '') return [];
+ var cardinal = {
+ north: 0,
+ n: 0,
+ northnortheast: 22,
+ nne: 22,
+ northeast: 45,
+ ne: 45,
+ eastnortheast: 67,
+ ene: 67,
+ east: 90,
+ e: 90,
+ eastsoutheast: 112,
+ ese: 112,
+ southeast: 135,
+ se: 135,
+ southsoutheast: 157,
+ sse: 157,
+ south: 180,
+ s: 180,
+ southsouthwest: 202,
+ ssw: 202,
+ southwest: 225,
+ sw: 225,
+ westsouthwest: 247,
+ wsw: 247,
+ west: 270,
+ w: 270,
+ westnorthwest: 292,
+ wnw: 292,
+ northwest: 315,
+ nw: 315,
+ northnorthwest: 337,
+ nnw: 337
+ };
+ var values = val.split(';');
+ var results = [];
+ values.forEach(function (v) {
+ // swap cardinal for numeric directions
+ if (cardinal[v] !== undefined) {
+ v = cardinal[v];
+ } // numeric direction - just add to results
- // `Array.prototype.lastIndexOf` method
- // https://tc39.es/ecma262/#sec-array.prototype.lastindexof
- _export({ target: 'Array', proto: true, forced: arrayLastIndexOf !== [].lastIndexOf }, {
- lastIndexOf: arrayLastIndexOf
- });
- // `presetPreset` decorates a given `preset` Object
- // with some extra methods for searching and matching geometry
- //
+ if (v !== '' && !isNaN(+v)) {
+ results.push(+v);
+ return;
+ } // string direction - inspect parent ways
- function presetPreset(presetID, preset, addable, allFields, allPresets) {
- allFields = allFields || {};
- allPresets = allPresets || {};
- var _this = Object.assign({}, preset); // shallow copy
+ var lookBackward = this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all';
+ var lookForward = this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all';
+ if (!lookForward && !lookBackward) return;
+ var nodeIds = {};
+ resolver.parentWays(this).forEach(function (parent) {
+ var nodes = parent.nodes;
+ for (i = 0; i < nodes.length; i++) {
+ if (nodes[i] === this.id) {
+ // match current entity
+ if (lookForward && i > 0) {
+ nodeIds[nodes[i - 1]] = true; // look back to prev node
+ }
- var _addable = addable || false;
+ if (lookBackward && i < nodes.length - 1) {
+ nodeIds[nodes[i + 1]] = true; // look ahead to next node
+ }
+ }
+ }
+ }, this);
+ Object.keys(nodeIds).forEach(function (nodeId) {
+ // +90 because geoAngle returns angle from X axis, not Y (north)
+ results.push(geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI) + 90);
+ }, this);
+ }, this);
+ return utilArrayUniq(results);
+ },
+ isCrossing: function isCrossing() {
+ return this.tags.highway === 'crossing' || this.tags.railway && this.tags.railway.indexOf('crossing') !== -1;
+ },
+ isEndpoint: function isEndpoint(resolver) {
+ return resolver["transient"](this, 'isEndpoint', function () {
+ var id = this.id;
+ return resolver.parentWays(this).filter(function (parent) {
+ return !parent.isClosed() && !!parent.affix(id);
+ }).length > 0;
+ });
+ },
+ isConnected: function isConnected(resolver) {
+ return resolver["transient"](this, 'isConnected', function () {
+ var parents = resolver.parentWays(this);
- var _resolvedFields; // cache
+ if (parents.length > 1) {
+ // vertex is connected to multiple parent ways
+ for (var i in parents) {
+ if (parents[i].geometry(resolver) === 'line' && parents[i].hasInterestingTags()) return true;
+ }
+ } else if (parents.length === 1) {
+ var way = parents[0];
+ var nodes = way.nodes.slice();
+ if (way.isClosed()) {
+ nodes.pop();
+ } // ignore connecting node if closed
+ // return true if vertex appears multiple times (way is self intersecting)
- var _resolvedMoreFields; // cache
+ return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
+ }
- _this.id = presetID;
- _this.safeid = utilSafeClassName(presetID); // for use in css classes, selectors, element ids
+ return false;
+ });
+ },
+ parentIntersectionWays: function parentIntersectionWays(resolver) {
+ return resolver["transient"](this, 'parentIntersectionWays', function () {
+ return resolver.parentWays(this).filter(function (parent) {
+ return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === 'line';
+ });
+ });
+ },
+ isIntersection: function isIntersection(resolver) {
+ return this.parentIntersectionWays(resolver).length > 1;
+ },
+ isHighwayIntersection: function isHighwayIntersection(resolver) {
+ return resolver["transient"](this, 'isHighwayIntersection', function () {
+ return resolver.parentWays(this).filter(function (parent) {
+ return parent.tags.highway && parent.geometry(resolver) === 'line';
+ }).length > 1;
+ });
+ },
+ isOnAddressLine: function isOnAddressLine(resolver) {
+ return resolver["transient"](this, 'isOnAddressLine', function () {
+ return resolver.parentWays(this).filter(function (parent) {
+ return parent.tags.hasOwnProperty('addr:interpolation') && parent.geometry(resolver) === 'line';
+ }).length > 0;
+ });
+ },
+ asJXON: function asJXON(changeset_id) {
+ var r = {
+ node: {
+ '@id': this.osmId(),
+ '@lon': this.loc[0],
+ '@lat': this.loc[1],
+ '@version': this.version || 0,
+ tag: Object.keys(this.tags).map(function (k) {
+ return {
+ keyAttributes: {
+ k: k,
+ v: this.tags[k]
+ }
+ };
+ }, this)
+ }
+ };
+ if (changeset_id) r.node['@changeset'] = changeset_id;
+ return r;
+ },
+ asGeoJSON: function asGeoJSON() {
+ return {
+ type: 'Point',
+ coordinates: this.loc
+ };
+ }
+ });
- _this.originalTerms = (_this.terms || []).join();
- _this.originalName = _this.name || '';
- _this.originalScore = _this.matchScore || 1;
- _this.originalReference = _this.reference || {};
- _this.originalFields = _this.fields || [];
- _this.originalMoreFields = _this.moreFields || [];
+ function actionCircularize(wayId, projection, maxAngle) {
+ maxAngle = (maxAngle || 20) * Math.PI / 180;
- _this.fields = function () {
- return _resolvedFields || (_resolvedFields = resolve('fields'));
- };
+ var action = function action(graph, t) {
+ if (t === null || !isFinite(t)) t = 1;
+ t = Math.min(Math.max(+t, 0), 1);
+ var way = graph.entity(wayId);
+ var origNodes = {};
+ graph.childNodes(way).forEach(function (node) {
+ if (!origNodes[node.id]) origNodes[node.id] = node;
+ });
- _this.moreFields = function () {
- return _resolvedMoreFields || (_resolvedMoreFields = resolve('moreFields'));
- };
+ if (!way.isConvex(graph)) {
+ graph = action.makeConvex(graph);
+ }
- _this.resetFields = function () {
- return _resolvedFields = _resolvedMoreFields = null;
- };
+ var nodes = utilArrayUniq(graph.childNodes(way));
+ var keyNodes = nodes.filter(function (n) {
+ return graph.parentWays(n).length !== 1;
+ });
+ var points = nodes.map(function (n) {
+ return projection(n.loc);
+ });
+ var keyPoints = keyNodes.map(function (n) {
+ return projection(n.loc);
+ });
+ var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points);
+ var radius = d3_median(points, function (p) {
+ return geoVecLength(centroid, p);
+ });
+ var sign = d3_polygonArea(points) > 0 ? 1 : -1;
+ var ids, i, j, k; // we need at least two key nodes for the algorithm to work
- _this.tags = _this.tags || {};
- _this.addTags = _this.addTags || _this.tags;
- _this.removeTags = _this.removeTags || _this.addTags;
- _this.geometry = _this.geometry || [];
+ if (!keyNodes.length) {
+ keyNodes = [nodes[0]];
+ keyPoints = [points[0]];
+ }
- _this.matchGeometry = function (geom) {
- return _this.geometry.indexOf(geom) >= 0;
- };
+ if (keyNodes.length === 1) {
+ var index = nodes.indexOf(keyNodes[0]);
+ var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
+ keyNodes.push(nodes[oppositeIndex]);
+ keyPoints.push(points[oppositeIndex]);
+ } // key points and nodes are those connected to the ways,
+ // they are projected onto the circle, in between nodes are moved
+ // to constant intervals between key nodes, extra in between nodes are
+ // added if necessary.
- _this.matchAllGeometry = function (geoms) {
- return geoms.every(_this.matchGeometry);
- };
- _this.matchScore = function (entityTags) {
- var tags = _this.tags;
- var seen = {};
- var score = 0; // match on tags
+ for (i = 0; i < keyPoints.length; i++) {
+ var nextKeyNodeIndex = (i + 1) % keyNodes.length;
+ var startNode = keyNodes[i];
+ var endNode = keyNodes[nextKeyNodeIndex];
+ var startNodeIndex = nodes.indexOf(startNode);
+ var endNodeIndex = nodes.indexOf(endNode);
+ var numberNewPoints = -1;
+ var indexRange = endNodeIndex - startNodeIndex;
+ var nearNodes = {};
+ var inBetweenNodes = [];
+ var startAngle, endAngle, totalAngle, eachAngle;
+ var angle, loc, node, origNode;
- for (var k in tags) {
- seen[k] = true;
+ if (indexRange < 0) {
+ indexRange += nodes.length;
+ } // position this key node
- if (entityTags[k] === tags[k]) {
- score += _this.originalScore;
- } else if (tags[k] === '*' && k in entityTags) {
- score += _this.originalScore / 2;
- } else {
- return -1;
- }
- } // boost score for additional matches in addTags - #6802
+ var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4;
+ keyPoints[i] = [centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius, centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius];
+ loc = projection.invert(keyPoints[i]);
+ node = keyNodes[i];
+ origNode = origNodes[node.id];
+ node = node.move(geoVecInterp(origNode.loc, loc, t));
+ graph = graph.replace(node); // figure out the between delta angle we want to match to
- var addTags = _this.addTags;
+ startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
+ endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
+ totalAngle = endAngle - startAngle; // detects looping around -pi/pi
- for (var _k in addTags) {
- if (!seen[_k] && entityTags[_k] === addTags[_k]) {
- score += _this.originalScore;
+ if (totalAngle * sign > 0) {
+ totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
}
- }
-
- return score;
- };
-
- _this.t = function (scope, options) {
- var textID = "presets.presets.".concat(presetID, ".").concat(scope);
- return _t(textID, options);
- };
-
- _this.t.html = function (scope, options) {
- var textID = "presets.presets.".concat(presetID, ".").concat(scope);
- return _t.html(textID, options);
- };
- _this.name = function () {
- return _this.t('name', {
- 'default': _this.originalName
- });
- };
+ do {
+ numberNewPoints++;
+ eachAngle = totalAngle / (indexRange + numberNewPoints);
+ } while (Math.abs(eachAngle) > maxAngle); // move existing nodes
- _this.nameLabel = function () {
- return _this.t.html('name', {
- 'default': _this.originalName
- });
- };
- _this.subtitle = function () {
- if (_this.suggestion) {
- var path = presetID.split('/');
- path.pop(); // remove brand name
+ for (j = 1; j < indexRange; j++) {
+ angle = startAngle + j * eachAngle;
+ loc = projection.invert([centroid[0] + Math.cos(angle) * radius, centroid[1] + Math.sin(angle) * radius]);
+ node = nodes[(j + startNodeIndex) % nodes.length];
+ origNode = origNodes[node.id];
+ nearNodes[node.id] = angle;
+ node = node.move(geoVecInterp(origNode.loc, loc, t));
+ graph = graph.replace(node);
+ } // add new in between nodes if necessary
- return _t('presets.presets.' + path.join('/') + '.name');
- }
- return null;
- };
+ for (j = 0; j < numberNewPoints; j++) {
+ angle = startAngle + (indexRange + j) * eachAngle;
+ loc = projection.invert([centroid[0] + Math.cos(angle) * radius, centroid[1] + Math.sin(angle) * radius]); // choose a nearnode to use as the original
- _this.subtitleLabel = function () {
- if (_this.suggestion) {
- var path = presetID.split('/');
- path.pop(); // remove brand name
+ var min = Infinity;
- return _t.html('presets.presets.' + path.join('/') + '.name');
- }
+ for (var nodeId in nearNodes) {
+ var nearAngle = nearNodes[nodeId];
+ var dist = Math.abs(nearAngle - angle);
- return null;
- };
+ if (dist < min) {
+ min = dist;
+ origNode = origNodes[nodeId];
+ }
+ }
- _this.terms = function () {
- return _this.t('terms', {
- 'default': _this.originalTerms
- }).toLowerCase().trim().split(/\s*,+\s*/);
- };
+ node = osmNode({
+ loc: geoVecInterp(origNode.loc, loc, t)
+ });
+ graph = graph.replace(node);
+ nodes.splice(endNodeIndex + j, 0, node);
+ inBetweenNodes.push(node.id);
+ } // Check for other ways that share these keyNodes..
+ // If keyNodes are adjacent in both ways,
+ // we can add inBetweenNodes to that shared way too..
- _this.isFallback = function () {
- var tagCount = Object.keys(_this.tags).length;
- return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty('area');
- };
- _this.addable = function (val) {
- if (!arguments.length) return _addable;
- _addable = val;
- return _this;
- };
+ if (indexRange === 1 && inBetweenNodes.length) {
+ var startIndex1 = way.nodes.lastIndexOf(startNode.id);
+ var endIndex1 = way.nodes.lastIndexOf(endNode.id);
+ var wayDirection1 = endIndex1 - startIndex1;
- _this.reference = function () {
- // Lookup documentation on Wikidata...
- var qid = _this.tags.wikidata || _this.tags['brand:wikidata'] || _this.tags['operator:wikidata'];
+ if (wayDirection1 < -1) {
+ wayDirection1 = 1;
+ }
- if (qid) {
- return {
- qid: qid
- };
- } // Lookup documentation on OSM Wikibase...
+ var parentWays = graph.parentWays(keyNodes[i]);
+ for (j = 0; j < parentWays.length; j++) {
+ var sharedWay = parentWays[j];
+ if (sharedWay === way) continue;
- var key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, 'name'))[0];
- var value = _this.originalReference.value || _this.tags[key];
+ if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
+ var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
+ var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
+ var wayDirection2 = endIndex2 - startIndex2;
+ var insertAt = endIndex2;
- if (value === '*') {
- return {
- key: key
- };
- } else {
- return {
- key: key,
- value: value
- };
- }
- };
+ if (wayDirection2 < -1) {
+ wayDirection2 = 1;
+ }
- _this.unsetTags = function (tags, geometry, skipFieldDefaults) {
- tags = utilObjectOmit(tags, Object.keys(_this.removeTags));
+ if (wayDirection1 !== wayDirection2) {
+ inBetweenNodes.reverse();
+ insertAt = startIndex2;
+ }
- if (geometry && !skipFieldDefaults) {
- _this.fields().forEach(function (field) {
- if (field.matchGeometry(geometry) && field.key && field["default"] === tags[field.key]) {
- delete tags[field.key];
+ for (k = 0; k < inBetweenNodes.length; k++) {
+ sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
+ }
+
+ graph = graph.replace(sharedWay);
+ }
}
- });
- }
+ }
+ } // update the way to have all the new nodes
- delete tags.area;
- return tags;
- };
- _this.setTags = function (tags, geometry, skipFieldDefaults) {
- var addTags = _this.addTags;
- tags = Object.assign({}, tags); // shallow copy
+ ids = nodes.map(function (n) {
+ return n.id;
+ });
+ ids.push(ids[0]);
+ way = way.update({
+ nodes: ids
+ });
+ graph = graph.replace(way);
+ return graph;
+ };
- for (var k in addTags) {
- if (addTags[k] === '*') {
- tags[k] = 'yes';
- } else {
- tags[k] = addTags[k];
- }
- } // Add area=yes if necessary.
- // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
- // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
- // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`)
+ action.makeConvex = function (graph) {
+ var way = graph.entity(wayId);
+ var nodes = utilArrayUniq(graph.childNodes(way));
+ var points = nodes.map(function (n) {
+ return projection(n.loc);
+ });
+ var sign = d3_polygonArea(points) > 0 ? 1 : -1;
+ var hull = d3_polygonHull(points);
+ var i, j; // D3 convex hulls go counterclockwise..
+ if (sign === -1) {
+ nodes.reverse();
+ points.reverse();
+ }
- if (!addTags.hasOwnProperty('area')) {
- delete tags.area;
+ for (i = 0; i < hull.length - 1; i++) {
+ var startIndex = points.indexOf(hull[i]);
+ var endIndex = points.indexOf(hull[i + 1]);
+ var indexRange = endIndex - startIndex;
- if (geometry === 'area') {
- var needsAreaTag = true;
+ if (indexRange < 0) {
+ indexRange += nodes.length;
+ } // move interior nodes to the surface of the convex hull..
- if (_this.geometry.indexOf('line') === -1) {
- for (var _k2 in addTags) {
- if (_k2 in osmAreaKeys) {
- needsAreaTag = false;
- break;
- }
- }
- }
- if (needsAreaTag) {
- tags.area = 'yes';
- }
+ for (j = 1; j < indexRange; j++) {
+ var point = geoVecInterp(hull[i], hull[i + 1], j / indexRange);
+ var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
+ graph = graph.replace(node);
}
}
- if (geometry && !skipFieldDefaults) {
- _this.fields().forEach(function (field) {
- if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field["default"]) {
- tags[field.key] = field["default"];
- }
- });
- }
+ return graph;
+ };
- return tags;
- }; // For a preset without fields, use the fields of the parent preset.
- // Replace {preset} placeholders with the fields of the specified presets.
+ action.disabled = function (graph) {
+ if (!graph.entity(wayId).isClosed()) {
+ return 'not_closed';
+ } //disable when already circular
- function resolve(which) {
- var fieldIDs = which === 'fields' ? _this.originalFields : _this.originalMoreFields;
- var resolved = [];
- fieldIDs.forEach(function (fieldID) {
- var match = fieldID.match(/\{(.*)\}/);
+ var way = graph.entity(wayId);
+ var nodes = utilArrayUniq(graph.childNodes(way));
+ var points = nodes.map(function (n) {
+ return projection(n.loc);
+ });
+ var hull = d3_polygonHull(points);
+ var epsilonAngle = Math.PI / 180;
- if (match !== null) {
- // a presetID wrapped in braces {}
- resolved = resolved.concat(inheritFields(match[1], which));
- } else if (allFields[fieldID]) {
- // a normal fieldID
- resolved.push(allFields[fieldID]);
- } else {
- console.log("Cannot resolve \"".concat(fieldID, "\" found in ").concat(_this.id, ".").concat(which)); // eslint-disable-line no-console
- }
- }); // no fields resolved, so use the parent's if possible
+ if (hull.length !== points.length || hull.length < 3) {
+ return false;
+ }
- if (!resolved.length) {
- var endIndex = _this.id.lastIndexOf('/');
+ var centroid = d3_polygonCentroid(points);
+ var radius = geoVecLengthSquare(centroid, points[0]);
+ var i, actualPoint; // compare distances between centroid and points
- var parentID = endIndex && _this.id.substring(0, endIndex);
+ for (i = 0; i < hull.length; i++) {
+ actualPoint = hull[i];
+ var actualDist = geoVecLengthSquare(actualPoint, centroid);
+ var diff = Math.abs(actualDist - radius); //compare distances with epsilon-error (5%)
- if (parentID) {
- resolved = inheritFields(parentID, which);
+ if (diff > 0.05 * radius) {
+ return false;
}
- }
+ } //check if central angles are smaller than maxAngle
- return utilArrayUniq(resolved); // returns an array of fields to inherit from the given presetID, if found
- function inheritFields(presetID, which) {
- var parent = allPresets[presetID];
- if (!parent) return [];
+ for (i = 0; i < hull.length; i++) {
+ actualPoint = hull[i];
+ var nextPoint = hull[(i + 1) % hull.length];
+ var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]);
+ var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]);
+ var angle = endAngle - startAngle;
- if (which === 'fields') {
- return parent.fields().filter(shouldInherit);
- } else if (which === 'moreFields') {
- return parent.moreFields();
- } else {
- return [];
+ if (angle < 0) {
+ angle = -angle;
}
- } // Skip `fields` for the keys which define the preset.
- // These are usually `typeCombo` fields like `shop=*`
+ if (angle > Math.PI) {
+ angle = 2 * Math.PI - angle;
+ }
- function shouldInherit(f) {
- if (f.key && _this.tags[f.key] !== undefined && // inherit anyway if multiple values are allowed or just a checkbox
- f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'manyCombo' && f.type !== 'check') return false;
- return true;
+ if (angle > maxAngle + epsilonAngle) {
+ return false;
+ }
}
- }
-
- return _this;
- }
- var _mainPresetIndex = presetIndex(); // singleton
- // `presetIndex` wraps a `presetCollection`
- // with methods for loading new data and returning defaults
- //
+ return 'already_circular';
+ };
- function presetIndex() {
- var dispatch$1 = dispatch('favoritePreset', 'recentsChange');
- var MAXRECENTS = 30; // seed the preset lists with geometry fallbacks
+ action.transitionable = true;
+ return action;
+ }
- var POINT = presetPreset('point', {
- name: 'Point',
- tags: {},
- geometry: ['point', 'vertex'],
- matchScore: 0.1
- });
- var LINE = presetPreset('line', {
- name: 'Line',
- tags: {},
- geometry: ['line'],
- matchScore: 0.1
- });
- var AREA = presetPreset('area', {
- name: 'Area',
- tags: {
- area: 'yes'
- },
- geometry: ['area'],
- matchScore: 0.1
- });
- var RELATION = presetPreset('relation', {
- name: 'Relation',
- tags: {},
- geometry: ['relation'],
- matchScore: 0.1
- });
+ function actionDeleteWay(wayID) {
+ function canDeleteNode(node, graph) {
+ // don't delete nodes still attached to ways or relations
+ if (graph.parentWays(node).length || graph.parentRelations(node).length) return false;
+ var geometries = osmNodeGeometriesForTags(node.tags); // don't delete if this node can be a standalone point
- var _this = presetCollection([POINT, LINE, AREA, RELATION]);
+ if (geometries.point) return false; // delete if this node only be a vertex
- var _presets = {
- point: POINT,
- line: LINE,
- area: AREA,
- relation: RELATION
- };
- var _defaults = {
- point: presetCollection([POINT]),
- vertex: presetCollection([POINT]),
- line: presetCollection([LINE]),
- area: presetCollection([AREA]),
- relation: presetCollection([RELATION])
- };
- var _fields = {};
- var _categories = {};
- var _universal = [];
- var _addablePresetIDs = null; // Set of preset IDs that the user can add
+ if (geometries.vertex) return true; // iD doesn't know if this should be a point or vertex,
+ // so only delete if there are no interesting tags
- var _recents;
+ return !node.hasInterestingTags();
+ }
- var _favorites; // Index of presets by (geometry, tag key).
+ var action = function action(graph) {
+ var way = graph.entity(wayID);
+ graph.parentRelations(way).forEach(function (parent) {
+ parent = parent.removeMembersWithID(wayID);
+ graph = graph.replace(parent);
+ if (parent.isDegenerate()) {
+ graph = actionDeleteRelation(parent.id)(graph);
+ }
+ });
+ new Set(way.nodes).forEach(function (nodeID) {
+ graph = graph.replace(way.removeNode(nodeID));
+ var node = graph.entity(nodeID);
- var _geometryIndex = {
- point: {},
- vertex: {},
- line: {},
- area: {},
- relation: {}
+ if (canDeleteNode(node, graph)) {
+ graph = graph.remove(node);
+ }
+ });
+ return graph.remove(way);
};
- var _loadPromise;
+ return action;
+ }
- _this.ensureLoaded = function () {
- if (_loadPromise) return _loadPromise;
- return _loadPromise = Promise.all([_mainFileFetcher.get('preset_categories'), _mainFileFetcher.get('preset_defaults'), _mainFileFetcher.get('preset_presets'), _mainFileFetcher.get('preset_fields')]).then(function (vals) {
- _this.merge({
- categories: vals[0],
- defaults: vals[1],
- presets: vals[2],
- fields: vals[3]
- });
+ function actionDeleteMultiple(ids) {
+ var actions = {
+ way: actionDeleteWay,
+ node: actionDeleteNode,
+ relation: actionDeleteRelation
+ };
- osmSetAreaKeys(_this.areaKeys());
- osmSetPointTags(_this.pointTags());
- osmSetVertexTags(_this.vertexTags());
+ var action = function action(graph) {
+ ids.forEach(function (id) {
+ if (graph.hasEntity(id)) {
+ // It may have been deleted already.
+ graph = actions[graph.entity(id).type](id)(graph);
+ }
});
+ return graph;
};
- _this.merge = function (d) {
- // Merge Fields
- if (d.fields) {
- Object.keys(d.fields).forEach(function (fieldID) {
- var f = d.fields[fieldID];
+ return action;
+ }
- if (f) {
- // add or replace
- _fields[fieldID] = presetField(fieldID, f);
- } else {
- // remove
- delete _fields[fieldID];
- }
- });
- } // Merge Presets
+ function actionDeleteRelation(relationID, allowUntaggedMembers) {
+ function canDeleteEntity(entity, graph) {
+ return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && !entity.hasInterestingTags() && !allowUntaggedMembers;
+ }
+ var action = function action(graph) {
+ var relation = graph.entity(relationID);
+ graph.parentRelations(relation).forEach(function (parent) {
+ parent = parent.removeMembersWithID(relationID);
+ graph = graph.replace(parent);
- if (d.presets) {
- Object.keys(d.presets).forEach(function (presetID) {
- var p = d.presets[presetID];
+ if (parent.isDegenerate()) {
+ graph = actionDeleteRelation(parent.id)(graph);
+ }
+ });
+ var memberIDs = utilArrayUniq(relation.members.map(function (m) {
+ return m.id;
+ }));
+ memberIDs.forEach(function (memberID) {
+ graph = graph.replace(relation.removeMembersWithID(memberID));
+ var entity = graph.entity(memberID);
- if (p) {
- // add or replace
- var isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID);
+ if (canDeleteEntity(entity, graph)) {
+ graph = actionDeleteMultiple([memberID])(graph);
+ }
+ });
+ return graph.remove(relation);
+ };
- _presets[presetID] = presetPreset(presetID, p, isAddable, _fields, _presets);
- } else {
- // remove (but not if it's a fallback)
- var existing = _presets[presetID];
+ return action;
+ }
- if (existing && !existing.isFallback()) {
- delete _presets[presetID];
- }
- }
- });
- } // Need to rebuild _this.collection before loading categories
+ function actionDeleteNode(nodeId) {
+ var action = function action(graph) {
+ var node = graph.entity(nodeId);
+ graph.parentWays(node).forEach(function (parent) {
+ parent = parent.removeNode(nodeId);
+ graph = graph.replace(parent);
+ if (parent.isDegenerate()) {
+ graph = actionDeleteWay(parent.id)(graph);
+ }
+ });
+ graph.parentRelations(node).forEach(function (parent) {
+ parent = parent.removeMembersWithID(nodeId);
+ graph = graph.replace(parent);
- _this.collection = Object.values(_presets).concat(Object.values(_categories)); // Merge Categories
+ if (parent.isDegenerate()) {
+ graph = actionDeleteRelation(parent.id)(graph);
+ }
+ });
+ return graph.remove(node);
+ };
- if (d.categories) {
- Object.keys(d.categories).forEach(function (categoryID) {
- var c = d.categories[categoryID];
+ return action;
+ }
- if (c) {
- // add or replace
- _categories[categoryID] = presetCategory(categoryID, c, _this);
- } else {
- // remove
- delete _categories[categoryID];
- }
- });
- } // Rebuild _this.collection after loading categories
+ //
+ // First choose a node to be the survivor, with preference given
+ // to the oldest existing (not new) and "interesting" node.
+ //
+ // Tags and relation memberships of of non-surviving nodes are merged
+ // to the survivor.
+ //
+ // This is the inverse of `iD.actionDisconnect`.
+ //
+ // Reference:
+ // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
+ // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
+ //
+ function actionConnect(nodeIDs) {
+ var action = function action(graph) {
+ var survivor;
+ var node;
+ var parents;
+ var i, j; // Select the node with the ID passed as parameter if it is in the list,
+ // otherwise select the node with the oldest ID as the survivor, or the
+ // last one if there are only new nodes.
- _this.collection = Object.values(_presets).concat(Object.values(_categories)); // Merge Defaults
+ nodeIDs.reverse();
+ var interestingIDs = [];
- if (d.defaults) {
- Object.keys(d.defaults).forEach(function (geometry) {
- var def = d.defaults[geometry];
+ for (i = 0; i < nodeIDs.length; i++) {
+ node = graph.entity(nodeIDs[i]);
- if (Array.isArray(def)) {
- // add or replace
- _defaults[geometry] = presetCollection(def.map(function (id) {
- return _presets[id] || _categories[id];
- }).filter(Boolean));
- } else {
- // remove
- delete _defaults[geometry];
+ if (node.hasInterestingTags()) {
+ if (!node.isNew()) {
+ interestingIDs.push(node.id);
}
- });
- } // Rebuild universal fields array
+ }
+ }
+ survivor = graph.entity(utilOldestID(interestingIDs.length > 0 ? interestingIDs : nodeIDs)); // Replace all non-surviving nodes with the survivor and merge tags.
- _universal = Object.values(_fields).filter(function (field) {
- return field.universal;
- }); // Reset all the preset fields - they'll need to be resolved again
+ for (i = 0; i < nodeIDs.length; i++) {
+ node = graph.entity(nodeIDs[i]);
+ if (node.id === survivor.id) continue;
+ parents = graph.parentWays(node);
- Object.values(_presets).forEach(function (preset) {
- return preset.resetFields();
- }); // Rebuild geometry index
+ for (j = 0; j < parents.length; j++) {
+ graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
+ }
- _geometryIndex = {
- point: {},
- vertex: {},
- line: {},
- area: {},
- relation: {}
- };
+ parents = graph.parentRelations(node);
- _this.collection.forEach(function (preset) {
- (preset.geometry || []).forEach(function (geometry) {
- var g = _geometryIndex[geometry];
+ for (j = 0; j < parents.length; j++) {
+ graph = graph.replace(parents[j].replaceMember(node, survivor));
+ }
- for (var key in preset.tags) {
- (g[key] = g[key] || []).push(preset);
- }
- });
- });
+ survivor = survivor.mergeTags(node.tags);
+ graph = actionDeleteNode(node.id)(graph);
+ }
- return _this;
- };
+ graph = graph.replace(survivor); // find and delete any degenerate ways created by connecting adjacent vertices
- _this.match = function (entity, resolver) {
- return resolver["transient"](entity, 'presetMatch', function () {
- var geometry = entity.geometry(resolver); // Treat entities on addr:interpolation lines as points, not vertices - #3241
+ parents = graph.parentWays(survivor);
- if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
- geometry = 'point';
+ for (i = 0; i < parents.length; i++) {
+ if (parents[i].isDegenerate()) {
+ graph = actionDeleteWay(parents[i].id)(graph);
}
+ }
- return _this.matchTags(entity.tags, geometry);
- });
+ return graph;
};
- _this.matchTags = function (tags, geometry) {
- var geometryMatches = _geometryIndex[geometry];
- var address;
- var best = -1;
- var match;
+ action.disabled = function (graph) {
+ var seen = {};
+ var restrictionIDs = [];
+ var survivor;
+ var node, way;
+ var relations, relation, role;
+ var i, j, k; // Select the node with the oldest ID as the survivor.
+
+ survivor = graph.entity(utilOldestID(nodeIDs)); // 1. disable if the nodes being connected have conflicting relation roles
- for (var k in tags) {
- // If any part of an address is present, allow fallback to "Address" preset - #4353
- if (/^addr:/.test(k) && geometryMatches['addr:*']) {
- address = geometryMatches['addr:*'][0];
- }
+ for (i = 0; i < nodeIDs.length; i++) {
+ node = graph.entity(nodeIDs[i]);
+ relations = graph.parentRelations(node);
- var keyMatches = geometryMatches[k];
- if (!keyMatches) continue;
+ for (j = 0; j < relations.length; j++) {
+ relation = relations[j];
+ role = relation.memberById(node.id).role || ''; // if this node is a via node in a restriction, remember for later
- for (var i = 0; i < keyMatches.length; i++) {
- var score = keyMatches[i].matchScore(tags);
+ if (relation.hasFromViaTo()) {
+ restrictionIDs.push(relation.id);
+ }
- if (score > best) {
- best = score;
- match = keyMatches[i];
+ if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
+ return 'relation';
+ } else {
+ seen[relation.id] = role;
}
}
- }
-
- if (address && (!match || match.isFallback())) {
- match = address;
- }
+ } // gather restrictions for parent ways
- return match || _this.fallback(geometry);
- };
- _this.allowsVertex = function (entity, resolver) {
- if (entity.type !== 'node') return false;
- if (Object.keys(entity.tags).length === 0) return true;
- return resolver["transient"](entity, 'vertexMatch', function () {
- // address lines allow vertices to act as standalone points
- if (entity.isOnAddressLine(resolver)) return true;
- var geometries = osmNodeGeometriesForTags(entity.tags);
- if (geometries.vertex) return true;
- if (geometries.point) return false; // allow vertices for unspecified points
+ for (i = 0; i < nodeIDs.length; i++) {
+ node = graph.entity(nodeIDs[i]);
+ var parents = graph.parentWays(node);
- return true;
- });
- }; // Because of the open nature of tagging, iD will never have a complete
- // list of tags used in OSM, so we want it to have logic like "assume
- // that a closed way with an amenity tag is an area, unless the amenity
- // is one of these specific types". This function computes a structure
- // that allows testing of such conditions, based on the presets designated
- // as as supporting (or not supporting) the area geometry.
- //
- // The returned object L is a keeplist/discardlist of tags. A closed way
- // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
- // (see `Way#isArea()`). In other words, the keys of L form the keeplist,
- // and the subkeys form the discardlist.
+ for (j = 0; j < parents.length; j++) {
+ var parent = parents[j];
+ relations = graph.parentRelations(parent);
+ for (k = 0; k < relations.length; k++) {
+ relation = relations[k];
- _this.areaKeys = function () {
- // The ignore list is for keys that imply lines. (We always add `area=yes` for exceptions)
- var ignore = ['barrier', 'highway', 'footway', 'railway', 'junction', 'type'];
- var areaKeys = {}; // ignore name-suggestion-index and deprecated presets
+ if (relation.hasFromViaTo()) {
+ restrictionIDs.push(relation.id);
+ }
+ }
+ }
+ } // test restrictions
- var presets = _this.collection.filter(function (p) {
- return !p.suggestion && !p.replacement;
- }); // keeplist
+ restrictionIDs = utilArrayUniq(restrictionIDs);
- presets.forEach(function (p) {
- var keys = p.tags && Object.keys(p.tags);
- var key = keys && keys.length && keys[0]; // pick the first tag
+ for (i = 0; i < restrictionIDs.length; i++) {
+ relation = graph.entity(restrictionIDs[i]);
+ if (!relation.isComplete(graph)) continue;
+ var memberWays = relation.members.filter(function (m) {
+ return m.type === 'way';
+ }).map(function (m) {
+ return graph.entity(m.id);
+ });
+ memberWays = utilArrayUniq(memberWays);
+ var f = relation.memberByRole('from');
+ var t = relation.memberByRole('to');
+ var isUturn = f.id === t.id; // 2a. disable if connection would damage a restriction
+ // (a key node is a node at the junction of ways)
- if (!key) return;
- if (ignore.indexOf(key) !== -1) return;
+ var nodes = {
+ from: [],
+ via: [],
+ to: [],
+ keyfrom: [],
+ keyto: []
+ };
- if (p.geometry.indexOf('area') !== -1) {
- // probably an area..
- areaKeys[key] = areaKeys[key] || {};
+ for (j = 0; j < relation.members.length; j++) {
+ collectNodes(relation.members[j], nodes);
}
- }); // discardlist
- presets.forEach(function (p) {
- var key;
+ nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
+ nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
+ var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
+ nodes.from = nodes.from.filter(filter);
+ nodes.via = nodes.via.filter(filter);
+ nodes.to = nodes.to.filter(filter);
+ var connectFrom = false;
+ var connectVia = false;
+ var connectTo = false;
+ var connectKeyFrom = false;
+ var connectKeyTo = false;
- for (key in p.addTags) {
- // examine all addTags to get a better sense of what can be tagged on lines - #6800
- var value = p.addTags[key];
+ for (j = 0; j < nodeIDs.length; j++) {
+ var n = nodeIDs[j];
- if (key in areaKeys && // probably an area...
- p.geometry.indexOf('line') !== -1 && // but sometimes a line
- value !== '*') {
- areaKeys[key][value] = true;
+ if (nodes.from.indexOf(n) !== -1) {
+ connectFrom = true;
}
- }
- });
- return areaKeys;
- };
- _this.pointTags = function () {
- return _this.collection.reduce(function (pointTags, d) {
- // ignore name-suggestion-index, deprecated, and generic presets
- if (d.suggestion || d.replacement || d.searchable === false) return pointTags; // only care about the primary tag
+ if (nodes.via.indexOf(n) !== -1) {
+ connectVia = true;
+ }
- var keys = d.tags && Object.keys(d.tags);
- var key = keys && keys.length && keys[0]; // pick the first tag
+ if (nodes.to.indexOf(n) !== -1) {
+ connectTo = true;
+ }
- if (!key) return pointTags; // if this can be a point
+ if (nodes.keyfrom.indexOf(n) !== -1) {
+ connectKeyFrom = true;
+ }
- if (d.geometry.indexOf('point') !== -1) {
- pointTags[key] = pointTags[key] || {};
- pointTags[key][d.tags[key]] = true;
+ if (nodes.keyto.indexOf(n) !== -1) {
+ connectKeyTo = true;
+ }
}
- return pointTags;
- }, {});
- };
+ if (connectFrom && connectTo && !isUturn) {
+ return 'restriction';
+ }
- _this.vertexTags = function () {
- return _this.collection.reduce(function (vertexTags, d) {
- // ignore name-suggestion-index, deprecated, and generic presets
- if (d.suggestion || d.replacement || d.searchable === false) return vertexTags; // only care about the primary tag
+ if (connectFrom && connectVia) {
+ return 'restriction';
+ }
- var keys = d.tags && Object.keys(d.tags);
- var key = keys && keys.length && keys[0]; // pick the first tag
+ if (connectTo && connectVia) {
+ return 'restriction';
+ } // connecting to a key node -
+ // if both nodes are on a member way (i.e. part of the turn restriction),
+ // the connecting node must be adjacent to the key node.
- if (!key) return vertexTags; // if this can be a vertex
- if (d.geometry.indexOf('vertex') !== -1) {
- vertexTags[key] = vertexTags[key] || {};
- vertexTags[key][d.tags[key]] = true;
- }
+ if (connectKeyFrom || connectKeyTo) {
+ if (nodeIDs.length !== 2) {
+ return 'restriction';
+ }
- return vertexTags;
- }, {});
- };
+ var n0 = null;
+ var n1 = null;
- _this.field = function (id) {
- return _fields[id];
- };
+ for (j = 0; j < memberWays.length; j++) {
+ way = memberWays[j];
- _this.universal = function () {
- return _universal;
- };
+ if (way.contains(nodeIDs[0])) {
+ n0 = nodeIDs[0];
+ }
- _this.defaults = function (geometry, n, startWithRecents) {
- var recents = [];
+ if (way.contains(nodeIDs[1])) {
+ n1 = nodeIDs[1];
+ }
+ }
- if (startWithRecents) {
- recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4);
- }
+ if (n0 && n1) {
+ // both nodes are part of the restriction
+ var ok = false;
- var defaults;
+ for (j = 0; j < memberWays.length; j++) {
+ way = memberWays[j];
- if (_addablePresetIDs) {
- defaults = Array.from(_addablePresetIDs).map(function (id) {
- var preset = _this.item(id);
+ if (way.areAdjacent(n0, n1)) {
+ ok = true;
+ break;
+ }
+ }
- if (preset && preset.matchGeometry(geometry)) return preset;
- return null;
- }).filter(Boolean);
- } else {
- defaults = _defaults[geometry].collection.concat(_this.fallback(geometry));
- }
+ if (!ok) {
+ return 'restriction';
+ }
+ }
+ } // 2b. disable if nodes being connected will destroy a member way in a restriction
+ // (to test, make a copy and try actually connecting the nodes)
- return presetCollection(utilArrayUniq(recents.concat(defaults)).slice(0, n - 1));
- }; // pass a Set of addable preset ids
+ for (j = 0; j < memberWays.length; j++) {
+ way = memberWays[j].update({}); // make copy
- _this.addablePresetIDs = function (val) {
- if (!arguments.length) return _addablePresetIDs; // accept and convert arrays
+ for (k = 0; k < nodeIDs.length; k++) {
+ if (nodeIDs[k] === survivor.id) continue;
- if (Array.isArray(val)) val = new Set(val);
- _addablePresetIDs = val;
+ if (way.areAdjacent(nodeIDs[k], survivor.id)) {
+ way = way.removeNode(nodeIDs[k]);
+ } else {
+ way = way.replaceNode(nodeIDs[k], survivor.id);
+ }
+ }
- if (_addablePresetIDs) {
- // reset all presets
- _this.collection.forEach(function (p) {
- // categories aren't addable
- if (p.addable) p.addable(_addablePresetIDs.has(p.id));
- });
- } else {
- _this.collection.forEach(function (p) {
- if (p.addable) p.addable(true);
- });
+ if (way.isDegenerate()) {
+ return 'restriction';
+ }
+ }
}
- return _this;
- };
-
- _this.recent = function () {
- return presetCollection(utilArrayUniq(_this.getRecents().map(function (d) {
- return d.preset;
- })));
- };
+ return false; // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
- function RibbonItem(preset, source) {
- var item = {};
- item.preset = preset;
- item.source = source;
+ function hasDuplicates(n, i, arr) {
+ return arr.indexOf(n) !== arr.lastIndexOf(n);
+ }
- item.isFavorite = function () {
- return item.source === 'favorite';
- };
+ function keyNodeFilter(froms, tos) {
+ return function (n) {
+ return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
+ };
+ }
- item.isRecent = function () {
- return item.source === 'recent';
- };
+ function collectNodes(member, collection) {
+ var entity = graph.hasEntity(member.id);
+ if (!entity) return;
+ var role = member.role || '';
- item.matches = function (preset) {
- return item.preset.id === preset.id;
- };
+ if (!collection[role]) {
+ collection[role] = [];
+ }
- item.minified = function () {
- return {
- pID: item.preset.id
- };
- };
+ if (member.type === 'node') {
+ collection[role].push(member.id);
- return item;
- }
+ if (role === 'via') {
+ collection.keyfrom.push(member.id);
+ collection.keyto.push(member.id);
+ }
+ } else if (member.type === 'way') {
+ collection[role].push.apply(collection[role], entity.nodes);
- function ribbonItemForMinified(d, source) {
- if (d && d.pID) {
- var preset = _this.item(d.pID);
+ if (role === 'from' || role === 'via') {
+ collection.keyfrom.push(entity.first());
+ collection.keyfrom.push(entity.last());
+ }
- if (!preset) return null;
- return RibbonItem(preset, source);
+ if (role === 'to' || role === 'via') {
+ collection.keyto.push(entity.first());
+ collection.keyto.push(entity.last());
+ }
+ }
}
+ };
- return null;
- }
+ return action;
+ }
- _this.getGenericRibbonItems = function () {
- return ['point', 'line', 'area'].map(function (id) {
- return RibbonItem(_this.item(id), 'generic');
+ function actionCopyEntities(ids, fromGraph) {
+ var _copies = {};
+
+ var action = function action(graph) {
+ ids.forEach(function (id) {
+ fromGraph.entity(id).copy(fromGraph, _copies);
});
- };
- _this.getAddable = function () {
- if (!_addablePresetIDs) return [];
- return _addablePresetIDs.map(function (id) {
- var preset = _this.item(id);
+ for (var id in _copies) {
+ graph = graph.replace(_copies[id]);
+ }
- if (preset) return RibbonItem(preset, 'addable');
- return null;
- }).filter(Boolean);
+ return graph;
};
- function setRecents(items) {
- _recents = items;
- var minifiedItems = items.map(function (d) {
- return d.minified();
- });
- corePreferences('preset_recents', JSON.stringify(minifiedItems));
- dispatch$1.call('recentsChange');
- }
+ action.copies = function () {
+ return _copies;
+ };
- _this.getRecents = function () {
- if (!_recents) {
- // fetch from local storage
- _recents = (JSON.parse(corePreferences('preset_recents')) || []).reduce(function (acc, d) {
- var item = ribbonItemForMinified(d, 'recent');
- if (item && item.preset.addable()) acc.push(item);
- return acc;
- }, []);
+ return action;
+ }
+
+ function actionDeleteMember(relationId, memberIndex) {
+ return function (graph) {
+ var relation = graph.entity(relationId).removeMember(memberIndex);
+ graph = graph.replace(relation);
+
+ if (relation.isDegenerate()) {
+ graph = actionDeleteRelation(relation.id)(graph);
}
- return _recents;
+ return graph;
};
+ }
- _this.addRecent = function (preset, besidePreset, after) {
- var recents = _this.getRecents();
+ function actionDiscardTags(difference, discardTags) {
+ discardTags = discardTags || {};
+ return function (graph) {
+ difference.modified().forEach(checkTags);
+ difference.created().forEach(checkTags);
+ return graph;
- var beforeItem = _this.recentMatching(besidePreset);
+ function checkTags(entity) {
+ var keys = Object.keys(entity.tags);
+ var didDiscard = false;
+ var tags = {};
- var toIndex = recents.indexOf(beforeItem);
- if (after) toIndex += 1;
- var newItem = RibbonItem(preset, 'recent');
- recents.splice(toIndex, 0, newItem);
- setRecents(recents);
+ for (var i = 0; i < keys.length; i++) {
+ var k = keys[i];
+
+ if (discardTags[k] || !entity.tags[k]) {
+ didDiscard = true;
+ } else {
+ tags[k] = entity.tags[k];
+ }
+ }
+
+ if (didDiscard) {
+ graph = graph.replace(entity.update({
+ tags: tags
+ }));
+ }
+ }
+ };
+ }
+
+ //
+ // Optionally, disconnect only the given ways.
+ //
+ // For testing convenience, accepts an ID to assign to the (first) new node.
+ // Normally, this will be undefined and the way will automatically
+ // be assigned a new ID.
+ //
+ // This is the inverse of `iD.actionConnect`.
+ //
+ // Reference:
+ // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
+ // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
+ //
+
+ function actionDisconnect(nodeId, newNodeId) {
+ var wayIds;
+ var disconnectableRelationTypes = {
+ 'associatedStreet': true,
+ 'enforcement': true,
+ 'site': true
+ };
+
+ var action = function action(graph) {
+ var node = graph.entity(nodeId);
+ var connections = action.connections(graph);
+ connections.forEach(function (connection) {
+ var way = graph.entity(connection.wayID);
+ var newNode = osmNode({
+ id: newNodeId,
+ loc: node.loc,
+ tags: node.tags
+ });
+ graph = graph.replace(newNode);
+
+ if (connection.index === 0 && way.isArea()) {
+ // replace shared node with shared node..
+ graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
+ } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
+ // replace closing node with new new node..
+ graph = graph.replace(way.unclose().addNode(newNode.id));
+ } else {
+ // replace shared node with multiple new nodes..
+ graph = graph.replace(way.updateNode(newNode.id, connection.index));
+ }
+ });
+ return graph;
};
- _this.removeRecent = function (preset) {
- var item = _this.recentMatching(preset);
+ action.connections = function (graph) {
+ var candidates = [];
+ var keeping = false;
+ var parentWays = graph.parentWays(graph.entity(nodeId));
+ var way, waynode;
- if (item) {
- var items = _this.getRecents();
+ for (var i = 0; i < parentWays.length; i++) {
+ way = parentWays[i];
- items.splice(items.indexOf(item), 1);
- setRecents(items);
- }
- };
+ if (wayIds && wayIds.indexOf(way.id) === -1) {
+ keeping = true;
+ continue;
+ }
- _this.recentMatching = function (preset) {
- var items = _this.getRecents();
+ if (way.isArea() && way.nodes[0] === nodeId) {
+ candidates.push({
+ wayID: way.id,
+ index: 0
+ });
+ } else {
+ for (var j = 0; j < way.nodes.length; j++) {
+ waynode = way.nodes[j];
- for (var i in items) {
- if (items[i].matches(preset)) {
- return items[i];
+ if (waynode === nodeId) {
+ if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j === way.nodes.length - 1) {
+ continue;
+ }
+
+ candidates.push({
+ wayID: way.id,
+ index: j
+ });
+ }
+ }
}
}
- return null;
+ return keeping ? candidates : candidates.slice(1);
};
- _this.moveItem = function (items, fromIndex, toIndex) {
- if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length) return null;
- items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
- return items;
+ action.disabled = function (graph) {
+ var connections = action.connections(graph);
+ if (connections.length === 0) return 'not_connected';
+ var parentWays = graph.parentWays(graph.entity(nodeId));
+ var seenRelationIds = {};
+ var sharedRelation;
+ parentWays.forEach(function (way) {
+ var relations = graph.parentRelations(way);
+ relations.filter(function (relation) {
+ return !disconnectableRelationTypes[relation.tags.type];
+ }).forEach(function (relation) {
+ if (relation.id in seenRelationIds) {
+ if (wayIds) {
+ if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
+ sharedRelation = relation;
+ }
+ } else {
+ sharedRelation = relation;
+ }
+ } else {
+ seenRelationIds[relation.id] = way.id;
+ }
+ });
+ });
+ if (sharedRelation) return 'relation';
};
- _this.moveRecent = function (item, beforeItem) {
- var recents = _this.getRecents();
+ action.limitWays = function (val) {
+ if (!arguments.length) return wayIds;
+ wayIds = val;
+ return action;
+ };
- var fromIndex = recents.indexOf(item);
- var toIndex = recents.indexOf(beforeItem);
+ return action;
+ }
- var items = _this.moveItem(recents, fromIndex, toIndex);
+ function actionExtract(entityID, projection) {
+ var extractedNodeID;
- if (items) setRecents(items);
+ var action = function action(graph) {
+ var entity = graph.entity(entityID);
+
+ if (entity.type === 'node') {
+ return extractFromNode(entity, graph);
+ }
+
+ return extractFromWayOrRelation(entity, graph);
};
- _this.setMostRecent = function (preset) {
- if (preset.searchable === false) return;
+ function extractFromNode(node, graph) {
+ extractedNodeID = node.id; // Create a new node to replace the one we will detach
- var items = _this.getRecents();
+ var replacement = osmNode({
+ loc: node.loc
+ });
+ graph = graph.replace(replacement); // Process each way in turn, updating the graph as we go
- var item = _this.recentMatching(preset);
+ graph = graph.parentWays(node).reduce(function (accGraph, parentWay) {
+ return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
+ }, graph); // Process any relations too
- if (item) {
- items.splice(items.indexOf(item), 1);
- } else {
- item = RibbonItem(preset, 'recent');
- } // remove the last recent (first in, first out)
+ return graph.parentRelations(node).reduce(function (accGraph, parentRel) {
+ return accGraph.replace(parentRel.replaceMember(node, replacement));
+ }, graph);
+ }
+ function extractFromWayOrRelation(entity, graph) {
+ var fromGeometry = entity.geometry(graph);
+ var keysToCopyAndRetain = ['source', 'wheelchair'];
+ var keysToRetain = ['area'];
+ var buildingKeysToRetain = ['architect', 'building', 'height', 'layer'];
+ var extractedLoc = d3_geoPath(projection).centroid(entity.asGeoJSON(graph));
+ extractedLoc = extractedLoc && projection.invert(extractedLoc);
- while (items.length >= MAXRECENTS) {
- items.pop();
- } // prepend array
+ if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) {
+ extractedLoc = entity.extent(graph).center();
+ }
+ var indoorAreaValues = {
+ area: true,
+ corridor: true,
+ elevator: true,
+ level: true,
+ room: true
+ };
+ var isBuilding = entity.tags.building && entity.tags.building !== 'no' || entity.tags['building:part'] && entity.tags['building:part'] !== 'no';
+ var isIndoorArea = fromGeometry === 'area' && entity.tags.indoor && indoorAreaValues[entity.tags.indoor];
+ var entityTags = Object.assign({}, entity.tags); // shallow copy
- items.unshift(item);
- setRecents(items);
- };
+ var pointTags = {};
- function setFavorites(items) {
- _favorites = items;
- var minifiedItems = items.map(function (d) {
- return d.minified();
- });
- corePreferences('preset_favorites', JSON.stringify(minifiedItems)); // call update
+ for (var key in entityTags) {
+ if (entity.type === 'relation' && key === 'type') {
+ continue;
+ }
- dispatch$1.call('favoritePreset');
- }
+ if (keysToRetain.indexOf(key) !== -1) {
+ continue;
+ }
- _this.addFavorite = function (preset, besidePreset, after) {
- var favorites = _this.getFavorites();
+ if (isBuilding) {
+ // don't transfer building-related tags
+ if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/)) continue;
+ } // leave `indoor` tag on the area
- var beforeItem = _this.favoriteMatching(besidePreset);
- var toIndex = favorites.indexOf(beforeItem);
- if (after) toIndex += 1;
- var newItem = RibbonItem(preset, 'favorite');
- favorites.splice(toIndex, 0, newItem);
- setFavorites(favorites);
- };
+ if (isIndoorArea && key === 'indoor') {
+ continue;
+ } // copy the tag from the entity to the point
- _this.toggleFavorite = function (preset) {
- var favs = _this.getFavorites();
- var favorite = _this.favoriteMatching(preset);
+ pointTags[key] = entityTags[key]; // leave addresses and some other tags so they're on both features
- if (favorite) {
- favs.splice(favs.indexOf(favorite), 1);
- } else {
- // only allow 10 favorites
- if (favs.length === 10) {
- // remove the last favorite (last in, first out)
- favs.pop();
- } // append array
+ if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
+ continue;
+ } else if (isIndoorArea && key === 'level') {
+ // leave `level` on both features
+ continue;
+ } // remove the tag from the entity
- favs.push(RibbonItem(preset, 'favorite'));
+ delete entityTags[key];
}
- setFavorites(favs);
- };
-
- _this.removeFavorite = function (preset) {
- var item = _this.favoriteMatching(preset);
+ if (!isBuilding && !isIndoorArea && fromGeometry === 'area') {
+ // ensure that areas keep area geometry
+ entityTags.area = 'yes';
+ }
- if (item) {
- var items = _this.getFavorites();
+ var replacement = osmNode({
+ loc: extractedLoc,
+ tags: pointTags
+ });
+ graph = graph.replace(replacement);
+ extractedNodeID = replacement.id;
+ return graph.replace(entity.update({
+ tags: entityTags
+ }));
+ }
- items.splice(items.indexOf(item), 1);
- setFavorites(items);
- }
+ action.getExtractedNodeID = function () {
+ return extractedNodeID;
};
- _this.getFavorites = function () {
- if (!_favorites) {
- // fetch from local storage
- var rawFavorites = JSON.parse(corePreferences('preset_favorites'));
+ return action;
+ }
- if (!rawFavorites) {
- rawFavorites = [];
- corePreferences('preset_favorites', JSON.stringify(rawFavorites));
- }
+ //
+ // This is the inverse of `iD.actionSplit`.
+ //
+ // Reference:
+ // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
+ // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
+ //
- _favorites = rawFavorites.reduce(function (output, d) {
- var item = ribbonItemForMinified(d, 'favorite');
- if (item && item.preset.addable()) output.push(item);
- return output;
- }, []);
- }
+ function actionJoin(ids) {
+ function groupEntitiesByGeometry(graph) {
+ var entities = ids.map(function (id) {
+ return graph.entity(id);
+ });
+ return Object.assign({
+ line: []
+ }, utilArrayGroupBy(entities, function (entity) {
+ return entity.geometry(graph);
+ }));
+ }
- return _favorites;
- };
+ var action = function action(graph) {
+ var ways = ids.map(graph.entity, graph); // Prefer to keep an existing way.
+ // if there are multiple existing ways, keep the oldest one
+ // the oldest way is determined by the ID of the way.
- _this.favoriteMatching = function (preset) {
- var favs = _this.getFavorites();
+ var survivorID = utilOldestID(ways.map(function (way) {
+ return way.id;
+ })); // if any of the ways are sided (e.g. coastline, cliff, kerb)
+ // sort them first so they establish the overall order - #6033
- for (var index in favs) {
- if (favs[index].matches(preset)) {
- return favs[index];
- }
- }
+ ways.sort(function (a, b) {
+ var aSided = a.isSided();
+ var bSided = b.isSided();
+ return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0;
+ });
+ var sequences = osmJoinWays(ways, graph);
+ var joined = sequences[0]; // We might need to reverse some of these ways before joining them. #4688
+ // `joined.actions` property will contain any actions we need to apply.
- return null;
- };
+ graph = sequences.actions.reduce(function (g, action) {
+ return action(g);
+ }, graph);
+ var survivor = graph.entity(survivorID);
+ survivor = survivor.update({
+ nodes: joined.nodes.map(function (n) {
+ return n.id;
+ })
+ });
+ graph = graph.replace(survivor);
+ joined.forEach(function (way) {
+ if (way.id === survivorID) return;
+ graph.parentRelations(way).forEach(function (parent) {
+ graph = graph.replace(parent.replaceMember(way, survivor));
+ });
+ survivor = survivor.mergeTags(way.tags);
+ graph = graph.replace(survivor);
+ graph = actionDeleteWay(way.id)(graph);
+ }); // Finds if the join created a single-member multipolygon,
+ // and if so turns it into a basic area instead
- return utilRebind(_this, dispatch$1, 'on');
- }
+ function checkForSimpleMultipolygon() {
+ if (!survivor.isClosed()) return;
+ var multipolygons = graph.parentMultipolygons(survivor).filter(function (multipolygon) {
+ // find multipolygons where the survivor is the only member
+ return multipolygon.members.length === 1;
+ }); // skip if this is the single member of multiple multipolygons
- function utilTagText(entity) {
- var obj = entity && entity.tags || {};
- return Object.keys(obj).map(function (k) {
- return k + '=' + obj[k];
- }).join(', ');
- }
- function utilTotalExtent(array, graph) {
- var extent = geoExtent();
- var val, entity;
+ if (multipolygons.length !== 1) return;
+ var multipolygon = multipolygons[0];
- for (var i = 0; i < array.length; i++) {
- val = array[i];
- entity = typeof val === 'string' ? graph.hasEntity(val) : val;
+ for (var key in survivor.tags) {
+ if (multipolygon.tags[key] && // don't collapse if tags cannot be cleanly merged
+ multipolygon.tags[key] !== survivor.tags[key]) return;
+ }
- if (entity) {
- extent._extend(entity.extent(graph));
- }
- }
+ survivor = survivor.mergeTags(multipolygon.tags);
+ graph = graph.replace(survivor);
+ graph = actionDeleteRelation(multipolygon.id, true
+ /* allow untagged members */
+ )(graph);
+ var tags = Object.assign({}, survivor.tags);
- return extent;
- }
- function utilTagDiff(oldTags, newTags) {
- var tagDiff = [];
- var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
- keys.forEach(function (k) {
- var oldVal = oldTags[k];
- var newVal = newTags[k];
+ if (survivor.geometry(graph) !== 'area') {
+ // ensure the feature persists as an area
+ tags.area = 'yes';
+ }
- if ((oldVal || oldVal === '') && (newVal === undefined || newVal !== oldVal)) {
- tagDiff.push({
- type: '-',
- key: k,
- oldVal: oldVal,
- newVal: newVal,
- display: '- ' + k + '=' + oldVal
- });
- }
+ delete tags.type; // remove type=multipolygon
- if ((newVal || newVal === '') && (oldVal === undefined || newVal !== oldVal)) {
- tagDiff.push({
- type: '+',
- key: k,
- oldVal: oldVal,
- newVal: newVal,
- display: '+ ' + k + '=' + newVal
+ survivor = survivor.update({
+ tags: tags
});
+ graph = graph.replace(survivor);
}
- });
- return tagDiff;
- }
- function utilEntitySelector(ids) {
- return ids.length ? '.' + ids.join(',.') : 'nothing';
- } // returns an selector to select entity ids for:
- // - entityIDs passed in
- // - shallow descendant entityIDs for any of those entities that are relations
-
- function utilEntityOrMemberSelector(ids, graph) {
- var seen = new Set(ids);
- ids.forEach(collectShallowDescendants);
- return utilEntitySelector(Array.from(seen));
- function collectShallowDescendants(id) {
- var entity = graph.hasEntity(id);
- if (!entity || entity.type !== 'relation') return;
- entity.members.map(function (member) {
- return member.id;
- }).forEach(function (id) {
- seen.add(id);
- });
- }
- } // returns an selector to select entity ids for:
- // - entityIDs passed in
- // - deep descendant entityIDs for any of those entities that are relations
+ checkForSimpleMultipolygon();
+ return graph;
+ }; // Returns the number of nodes the resultant way is expected to have
- function utilEntityOrDeepMemberSelector(ids, graph) {
- return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph));
- } // returns an selector to select entity ids for:
- // - entityIDs passed in
- // - deep descendant entityIDs for any of those entities that are relations
- function utilEntityAndDeepMemberIDs(ids, graph) {
- var seen = new Set();
- ids.forEach(collectDeepDescendants);
- return Array.from(seen);
+ action.resultingWayNodesLength = function (graph) {
+ return ids.reduce(function (count, id) {
+ return count + graph.entity(id).nodes.length;
+ }, 0) - ids.length - 1;
+ };
- function collectDeepDescendants(id) {
- if (seen.has(id)) return;
- seen.add(id);
- var entity = graph.hasEntity(id);
- if (!entity || entity.type !== 'relation') return;
- entity.members.map(function (member) {
- return member.id;
- }).forEach(collectDeepDescendants); // recurse
- }
- } // returns an selector to select entity ids for:
- // - deep descendant entityIDs for any of those entities that are relations
+ action.disabled = function (graph) {
+ var geometries = groupEntitiesByGeometry(graph);
- function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) {
- var idsSet = new Set(ids);
- var seen = new Set();
- var returners = new Set();
- ids.forEach(collectDeepDescendants);
- return utilEntitySelector(Array.from(returners));
+ if (ids.length < 2 || ids.length !== geometries.line.length) {
+ return 'not_eligible';
+ }
- function collectDeepDescendants(id) {
- if (seen.has(id)) return;
- seen.add(id);
+ var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
- if (!idsSet.has(id)) {
- returners.add(id);
+ if (joined.length > 1) {
+ return 'not_adjacent';
}
- var entity = graph.hasEntity(id);
- if (!entity || entity.type !== 'relation') return;
- if (skipMultipolgonMembers && entity.isMultipolygon()) return;
- entity.members.map(function (member) {
- return member.id;
- }).forEach(collectDeepDescendants); // recurse
- }
- } // Adds or removes highlight styling for the specified entities
+ var i; // All joined ways must belong to the same set of (non-restriction) relations.
+ // Restriction relations have different logic, below, which allows some cases
+ // this prohibits, and prohibits some cases this allows.
- function utilHighlightEntities(ids, highlighted, context) {
- context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed('highlighted', highlighted);
- } // returns an Array that is the union of:
- // - nodes for any nodeIDs passed in
- // - child nodes of any wayIDs passed in
- // - descendant member and child nodes of relationIDs passed in
+ var sortedParentRelations = function sortedParentRelations(id) {
+ return graph.parentRelations(graph.entity(id)).filter(function (rel) {
+ return !rel.isRestriction() && !rel.isConnectivity();
+ }).sort(function (a, b) {
+ return a.id - b.id;
+ });
+ };
- function utilGetAllNodes(ids, graph) {
- var seen = new Set();
- var nodes = new Set();
- ids.forEach(collectNodes);
- return Array.from(nodes);
+ var relsA = sortedParentRelations(ids[0]);
- function collectNodes(id) {
- if (seen.has(id)) return;
- seen.add(id);
- var entity = graph.hasEntity(id);
- if (!entity) return;
+ for (i = 1; i < ids.length; i++) {
+ var relsB = sortedParentRelations(ids[i]);
- if (entity.type === 'node') {
- nodes.add(entity);
- } else if (entity.type === 'way') {
- entity.nodes.forEach(collectNodes);
- } else {
- entity.members.map(function (member) {
- return member.id;
- }).forEach(collectNodes); // recurse
+ if (!utilArrayIdentical(relsA, relsB)) {
+ return 'conflicting_relations';
+ }
+ } // Loop through all combinations of path-pairs
+ // to check potential intersections between all pairs
+
+
+ for (i = 0; i < ids.length - 1; i++) {
+ for (var j = i + 1; j < ids.length; j++) {
+ var path1 = graph.childNodes(graph.entity(ids[i])).map(function (e) {
+ return e.loc;
+ });
+ var path2 = graph.childNodes(graph.entity(ids[j])).map(function (e) {
+ return e.loc;
+ });
+ var intersections = geoPathIntersections(path1, path2); // Check if intersections are just nodes lying on top of
+ // each other/the line, as opposed to crossing it
+
+ var common = utilArrayIntersection(joined[0].nodes.map(function (n) {
+ return n.loc.toString();
+ }), intersections.map(function (n) {
+ return n.toString();
+ }));
+
+ if (common.length !== intersections.length) {
+ return 'paths_intersect';
+ }
+ }
}
- }
- }
- function utilDisplayName(entity) {
- var localizedNameKey = 'name:' + _mainLocalizer.languageCode().toLowerCase();
- var name = entity.tags[localizedNameKey] || entity.tags.name || '';
- var network = entity.tags.cycle_network || entity.tags.network;
- if (!name && entity.tags.ref) {
- name = entity.tags.ref;
+ var nodeIds = joined[0].nodes.map(function (n) {
+ return n.id;
+ }).slice(1, -1);
+ var relation;
+ var tags = {};
+ var conflicting = false;
+ joined[0].forEach(function (way) {
+ var parents = graph.parentRelations(way);
+ parents.forEach(function (parent) {
+ if ((parent.isRestriction() || parent.isConnectivity()) && parent.members.some(function (m) {
+ return nodeIds.indexOf(m.id) >= 0;
+ })) {
+ relation = parent;
+ }
+ });
+
+ for (var k in way.tags) {
+ if (!(k in tags)) {
+ tags[k] = way.tags[k];
+ } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
+ conflicting = true;
+ }
+ }
+ });
- if (network) {
- name = network + ' ' + name;
+ if (relation) {
+ return relation.isRestriction() ? 'restriction' : 'connectivity';
}
- }
- return name;
- }
- function utilDisplayNameForPath(entity) {
- var name = utilDisplayName(entity);
- var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
-
- if (!isFirefox && name && rtlRegex.test(name)) {
- name = fixRTLTextForSvg(name);
- }
+ if (conflicting) {
+ return 'conflicting_tags';
+ }
+ };
- return name;
- }
- function utilDisplayType(id) {
- return {
- n: _t('inspector.node'),
- w: _t('inspector.way'),
- r: _t('inspector.relation')
- }[id.charAt(0)];
+ return action;
}
- function utilDisplayLabel(entity, graphOrGeometry) {
- var displayName = utilDisplayName(entity);
- if (displayName) {
- // use the display name if there is one
- return displayName;
+ function actionMerge(ids) {
+ function groupEntitiesByGeometry(graph) {
+ var entities = ids.map(function (id) {
+ return graph.entity(id);
+ });
+ return Object.assign({
+ point: [],
+ area: [],
+ line: [],
+ relation: []
+ }, utilArrayGroupBy(entities, function (entity) {
+ return entity.geometry(graph);
+ }));
}
- var preset = typeof graphOrGeometry === 'string' ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry);
+ var action = function action(graph) {
+ var geometries = groupEntitiesByGeometry(graph);
+ var target = geometries.area[0] || geometries.line[0];
+ var points = geometries.point;
+ points.forEach(function (point) {
+ target = target.mergeTags(point.tags);
+ graph = graph.replace(target);
+ graph.parentRelations(point).forEach(function (parent) {
+ graph = graph.replace(parent.replaceMember(point, target));
+ });
+ var nodes = utilArrayUniq(graph.childNodes(target));
+ var removeNode = point;
- if (preset && preset.name()) {
- // use the preset name if there is a match
- return preset.name();
- } // fallback to the display type (node/way/relation)
+ if (!point.isNew()) {
+ // Try to preserve the original point if it already has
+ // an ID in the database.
+ var inserted = false;
+ var canBeReplaced = function canBeReplaced(node) {
+ return !(graph.parentWays(node).length > 1 || graph.parentRelations(node).length);
+ };
- return utilDisplayType(entity.id);
- }
- function utilEntityRoot(entityType) {
- return {
- node: 'n',
- way: 'w',
- relation: 'r'
- }[entityType];
- } // Returns a single object containing the tags of all the given entities.
- // Example:
- // {
- // highway: 'service',
- // service: 'parking_aisle'
- // }
- // +
- // {
- // highway: 'service',
- // service: 'driveway',
- // width: '3'
- // }
- // =
- // {
- // highway: 'service',
- // service: [ 'driveway', 'parking_aisle' ],
- // width: [ '3', undefined ]
- // }
+ var replaceNode = function replaceNode(node) {
+ graph = graph.replace(point.update({
+ tags: node.tags,
+ loc: node.loc
+ }));
+ target = target.replaceNode(node.id, point.id);
+ graph = graph.replace(target);
+ removeNode = node;
+ inserted = true;
+ };
- function utilCombinedTags(entityIDs, graph) {
- var tags = {};
- var tagCounts = {};
- var allKeys = new Set();
- var entities = entityIDs.map(function (entityID) {
- return graph.hasEntity(entityID);
- }).filter(Boolean); // gather the aggregate keys
+ var i;
+ var node; // First, try to replace a new child node on the target way.
- entities.forEach(function (entity) {
- var keys = Object.keys(entity.tags).filter(Boolean);
- keys.forEach(function (key) {
- allKeys.add(key);
- });
- });
- entities.forEach(function (entity) {
- allKeys.forEach(function (key) {
- var value = entity.tags[key]; // purposely allow `undefined`
+ for (i = 0; i < nodes.length; i++) {
+ node = nodes[i];
- if (!tags.hasOwnProperty(key)) {
- // first value, set as raw
- tags[key] = value;
- } else {
- if (!Array.isArray(tags[key])) {
- if (tags[key] !== value) {
- // first alternate value, replace single value with array
- tags[key] = [tags[key], value];
- }
- } else {
- // type is array
- if (tags[key].indexOf(value) === -1) {
- // subsequent alternate value, add to array
- tags[key].push(value);
+ if (canBeReplaced(node) && node.isNew()) {
+ replaceNode(node);
+ break;
}
}
- }
-
- var tagHash = key + '=' + value;
- if (!tagCounts[tagHash]) tagCounts[tagHash] = 0;
- tagCounts[tagHash] += 1;
- });
- });
- for (var key in tags) {
- if (!Array.isArray(tags[key])) continue; // sort values by frequency then alphabetically
+ if (!inserted && point.hasInterestingTags()) {
+ // No new child node found, try to find an existing, but
+ // uninteresting child node instead.
+ for (i = 0; i < nodes.length; i++) {
+ node = nodes[i];
- tags[key] = tags[key].sort(function (val1, val2) {
- var key = key; // capture
+ if (canBeReplaced(node) && !node.hasInterestingTags()) {
+ replaceNode(node);
+ break;
+ }
+ }
- var count2 = tagCounts[key + '=' + val2];
- var count1 = tagCounts[key + '=' + val1];
+ if (!inserted) {
+ // Still not inserted, try to find an existing, interesting,
+ // but more recent child node.
+ for (i = 0; i < nodes.length; i++) {
+ node = nodes[i];
- if (count2 !== count1) {
- return count2 - count1;
- }
+ if (canBeReplaced(node) && utilCompareIDs(point.id, node.id) < 0) {
+ replaceNode(node);
+ break;
+ }
+ }
+ } // If the point still hasn't been inserted, we give up.
+ // There are more interesting or older nodes on the way.
- if (val2 && val1) {
- return val1.localeCompare(val2);
+ }
}
- return val1 ? 1 : -1;
+ graph = graph.remove(removeNode);
});
- }
-
- return tags;
- }
- function utilStringQs(str) {
- var i = 0; // advance past any leading '?' or '#' characters
- while (i < str.length && (str[i] === '?' || str[i] === '#')) {
- i++;
- }
+ if (target.tags.area === 'yes') {
+ var tags = Object.assign({}, target.tags); // shallow copy
- str = str.slice(i);
- return str.split('&').reduce(function (obj, pair) {
- var parts = pair.split('=');
+ delete tags.area;
- if (parts.length === 2) {
- obj[parts[0]] = null === parts[1] ? '' : decodeURIComponent(parts[1]);
+ if (osmTagSuggestingArea(tags)) {
+ // remove the `area` tag if area geometry is now implied - #3851
+ target = target.update({
+ tags: tags
+ });
+ graph = graph.replace(target);
+ }
}
- return obj;
- }, {});
- }
- function utilQsString(obj, noencode) {
- // encode everything except special characters used in certain hash parameters:
- // "/" in map states, ":", ",", {" and "}" in background
- function softEncode(s) {
- return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
- }
+ return graph;
+ };
- return Object.keys(obj).sort().map(function (key) {
- return encodeURIComponent(key) + '=' + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
- }).join('&');
- }
- function utilPrefixDOMProperty(property) {
- var prefixes = ['webkit', 'ms', 'moz', 'o'];
- var i = -1;
- var n = prefixes.length;
- var s = document.body;
- if (property in s) return property;
- property = property.substr(0, 1).toUpperCase() + property.substr(1);
+ action.disabled = function (graph) {
+ var geometries = groupEntitiesByGeometry(graph);
- while (++i < n) {
- if (prefixes[i] + property in s) {
- return prefixes[i] + property;
+ if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) {
+ return 'not_eligible';
}
- }
+ };
- return false;
+ return action;
}
- function utilPrefixCSSProperty(property) {
- var prefixes = ['webkit', 'ms', 'Moz', 'O'];
- var i = -1;
- var n = prefixes.length;
- var s = document.body.style;
- if (property.toLowerCase() in s) {
- return property.toLowerCase();
- }
+ //
+ // 1. move all the nodes to a common location
+ // 2. `actionConnect` them
- while (++i < n) {
- if (prefixes[i] + property in s) {
- return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
- }
- }
+ function actionMergeNodes(nodeIDs, loc) {
+ // If there is a single "interesting" node, use that as the location.
+ // Otherwise return the average location of all the nodes.
+ function chooseLoc(graph) {
+ if (!nodeIDs.length) return null;
+ var sum = [0, 0];
+ var interestingCount = 0;
+ var interestingLoc;
- return false;
- }
- var transformProperty;
- function utilSetTransform(el, x, y, scale) {
- var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
- var translate = utilDetect().opera ? 'translate(' + x + 'px,' + y + 'px)' : 'translate3d(' + x + 'px,' + y + 'px,0)';
- return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
- } // Calculates Levenshtein distance between two strings
- // see: https://en.wikipedia.org/wiki/Levenshtein_distance
- // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
+ for (var i = 0; i < nodeIDs.length; i++) {
+ var node = graph.entity(nodeIDs[i]);
- function utilEditDistance(a, b) {
- a = remove$1(a.toLowerCase());
- b = remove$1(b.toLowerCase());
- if (a.length === 0) return b.length;
- if (b.length === 0) return a.length;
- var matrix = [];
- var i, j;
+ if (node.hasInterestingTags()) {
+ interestingLoc = ++interestingCount === 1 ? node.loc : null;
+ }
- for (i = 0; i <= b.length; i++) {
- matrix[i] = [i];
- }
+ sum = geoVecAdd(sum, node.loc);
+ }
- for (j = 0; j <= a.length; j++) {
- matrix[0][j] = j;
+ return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
}
- for (i = 1; i <= b.length; i++) {
- for (j = 1; j <= a.length; j++) {
- if (b.charAt(i - 1) === a.charAt(j - 1)) {
- matrix[i][j] = matrix[i - 1][j - 1];
- } else {
- matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
- Math.min(matrix[i][j - 1] + 1, // insertion
- matrix[i - 1][j] + 1)); // deletion
- }
+ var action = function action(graph) {
+ if (nodeIDs.length < 2) return graph;
+ var toLoc = loc;
+
+ if (!toLoc) {
+ toLoc = chooseLoc(graph);
}
- }
- return matrix[b.length][a.length];
- } // a d3.mouse-alike which
- // 1. Only works on HTML elements, not SVG
- // 2. Does not cause style recalculation
+ for (var i = 0; i < nodeIDs.length; i++) {
+ var node = graph.entity(nodeIDs[i]);
- function utilFastMouse(container) {
- var rect = container.getBoundingClientRect();
- var rectLeft = rect.left;
- var rectTop = rect.top;
- var clientLeft = +container.clientLeft;
- var clientTop = +container.clientTop;
- return function (e) {
- return [e.clientX - rectLeft - clientLeft, e.clientY - rectTop - clientTop];
+ if (node.loc !== toLoc) {
+ graph = graph.replace(node.move(toLoc));
+ }
+ }
+
+ return actionConnect(nodeIDs)(graph);
};
- }
- function utilAsyncMap(inputs, func, callback) {
- var remaining = inputs.length;
- var results = [];
- var errors = [];
- inputs.forEach(function (d, i) {
- func(d, function done(err, data) {
- errors[i] = err;
- results[i] = data;
- remaining--;
- if (!remaining) callback(errors, results);
- });
- });
- } // wraps an index to an interval [0..length-1]
- function utilWrap(index, length) {
- if (index < 0) {
- index += Math.ceil(-index / length) * length;
- }
+ action.disabled = function (graph) {
+ if (nodeIDs.length < 2) return 'not_eligible';
- return index % length;
- }
- /**
- * a replacement for functor
- *
- * @param {*} value any value
- * @returns {Function} a function that returns that value or the value if it's a function
- */
+ for (var i = 0; i < nodeIDs.length; i++) {
+ var entity = graph.entity(nodeIDs[i]);
+ if (entity.type !== 'node') return 'not_eligible';
+ }
- function utilFunctor(value) {
- if (typeof value === 'function') return value;
- return function () {
- return value;
+ return actionConnect(nodeIDs).disabled(graph);
};
- }
- function utilNoAuto(selection) {
- var isText = selection.size() && selection.node().tagName.toLowerCase() === 'textarea';
- return selection // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
- .attr('autocomplete', 'new-password').attr('autocorrect', 'off').attr('autocapitalize', 'off').attr('spellcheck', isText ? 'true' : 'false');
- } // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
- // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
-
- function utilHashcode(str) {
- var hash = 0;
- if (str.length === 0) {
- return hash;
- }
-
- for (var i = 0; i < str.length; i++) {
- var _char = str.charCodeAt(i);
+ return action;
+ }
- hash = (hash << 5) - hash + _char;
- hash = hash & hash; // Convert to 32bit integer
+ function osmChangeset() {
+ if (!(this instanceof osmChangeset)) {
+ return new osmChangeset().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
}
-
- return hash;
- } // Returns version of `str` with all runs of special characters replaced by `_`;
- // suitable for HTML ids, classes, selectors, etc.
-
- function utilSafeClassName(str) {
- return str.toLowerCase().replace(/[^a-z0-9]+/g, '_');
- } // Returns string based on `val` that is highly unlikely to collide with an id
- // used previously or that's present elsewhere in the document. Useful for preventing
- // browser-provided autofills or when embedding iD on pages with unknown elements.
-
- function utilUniqueDomId(val) {
- return 'ideditor-' + utilSafeClassName(val.toString()) + '-' + new Date().getTime().toString();
- } // Returns the length of `str` in unicode characters. This can be less than
- // `String.length()` since a single unicode character can be composed of multiple
- // JavaScript UTF-16 code units.
-
- function utilUnicodeCharsCount(str) {
- // Native ES2015 implementations of `Array.from` split strings into unicode characters
- return Array.from(str).length;
- } // Returns a new string representing `str` cut from its start to `limit` length
- // in unicode characters. Note that this runs the risk of splitting graphemes.
-
- function utilUnicodeCharsTruncated(str, limit) {
- return Array.from(str).slice(0, limit).join('');
}
+ osmEntity.changeset = osmChangeset;
+ osmChangeset.prototype = Object.create(osmEntity.prototype);
+ Object.assign(osmChangeset.prototype, {
+ type: 'changeset',
+ extent: function extent() {
+ return new geoExtent();
+ },
+ geometry: function geometry() {
+ return 'changeset';
+ },
+ asJXON: function asJXON() {
+ return {
+ osm: {
+ changeset: {
+ tag: Object.keys(this.tags).map(function (k) {
+ return {
+ '@k': k,
+ '@v': this.tags[k]
+ };
+ }, this),
+ '@version': 0.6,
+ '@generator': 'iD'
+ }
+ }
+ };
+ },
+ // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
+ // XML. Returns a string.
+ osmChangeJXON: function osmChangeJXON(changes) {
+ var changeset_id = this.id;
- function osmEntity(attrs) {
- // For prototypal inheritance.
- if (this instanceof osmEntity) return; // Create the appropriate subtype.
-
- if (attrs && attrs.type) {
- return osmEntity[attrs.type].apply(this, arguments);
- } else if (attrs && attrs.id) {
- return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
- } // Initialize a generic Entity (used only in tests).
-
-
- return new osmEntity().initialize(arguments);
- }
+ function nest(x, order) {
+ var groups = {};
- osmEntity.id = function (type) {
- return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
- };
+ for (var i = 0; i < x.length; i++) {
+ var tagName = Object.keys(x[i])[0];
+ if (!groups[tagName]) groups[tagName] = [];
+ groups[tagName].push(x[i][tagName]);
+ }
- osmEntity.id.next = {
- changeset: -1,
- node: -1,
- way: -1,
- relation: -1
- };
+ var ordered = {};
+ order.forEach(function (o) {
+ if (groups[o]) ordered[o] = groups[o];
+ });
+ return ordered;
+ } // sort relations in a changeset by dependencies
- osmEntity.id.fromOSM = function (type, id) {
- return type[0] + id;
- };
- osmEntity.id.toOSM = function (id) {
- return id.slice(1);
- };
+ function sort(changes) {
+ // find a referenced relation in the current changeset
+ function resolve(item) {
+ return relations.find(function (relation) {
+ return item.keyAttributes.type === 'relation' && item.keyAttributes.ref === relation['@id'];
+ });
+ } // a new item is an item that has not been already processed
- osmEntity.id.type = function (id) {
- return {
- 'c': 'changeset',
- 'n': 'node',
- 'w': 'way',
- 'r': 'relation'
- }[id[0]];
- }; // A function suitable for use as the second argument to d3.selection#data().
+ function isNew(item) {
+ return !sorted[item['@id']] && !processing.find(function (proc) {
+ return proc['@id'] === item['@id'];
+ });
+ }
- osmEntity.key = function (entity) {
- return entity.id + 'v' + (entity.v || 0);
- };
+ var processing = [];
+ var sorted = {};
+ var relations = changes.relation;
+ if (!relations) return changes;
- var _deprecatedTagValuesByKey;
+ for (var i = 0; i < relations.length; i++) {
+ var relation = relations[i]; // skip relation if already sorted
- osmEntity.deprecatedTagValuesByKey = function (dataDeprecated) {
- if (!_deprecatedTagValuesByKey) {
- _deprecatedTagValuesByKey = {};
- dataDeprecated.forEach(function (d) {
- var oldKeys = Object.keys(d.old);
+ if (!sorted[relation['@id']]) {
+ processing.push(relation);
+ }
- if (oldKeys.length === 1) {
- var oldKey = oldKeys[0];
- var oldValue = d.old[oldKey];
+ while (processing.length > 0) {
+ var next = processing[0],
+ deps = next.member.map(resolve).filter(Boolean).filter(isNew);
- if (oldValue !== '*') {
- if (!_deprecatedTagValuesByKey[oldKey]) {
- _deprecatedTagValuesByKey[oldKey] = [oldValue];
+ if (deps.length === 0) {
+ sorted[next['@id']] = next;
+ processing.shift();
} else {
- _deprecatedTagValuesByKey[oldKey].push(oldValue);
+ processing = deps.concat(processing);
}
}
}
- });
+
+ changes.relation = Object.values(sorted);
+ return changes;
+ }
+
+ function rep(entity) {
+ return entity.asJXON(changeset_id);
+ }
+
+ return {
+ osmChange: {
+ '@version': 0.6,
+ '@generator': 'iD',
+ 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
+ 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
+ 'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), {
+ '@if-unused': true
+ })
+ }
+ };
+ },
+ asGeoJSON: function asGeoJSON() {
+ return {};
}
+ });
- return _deprecatedTagValuesByKey;
+ function osmNote() {
+ if (!(this instanceof osmNote)) {
+ return new osmNote().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+ }
+
+ osmNote.id = function () {
+ return osmNote.id.next--;
};
- osmEntity.prototype = {
- tags: {},
+ osmNote.id.next = -1;
+ Object.assign(osmNote.prototype, {
+ type: 'note',
initialize: function initialize(sources) {
for (var i = 0; i < sources.length; ++i) {
var source = sources[i];
@@ -23977,74240 +40408,82972 @@
}
}
- if (!this.id && this.type) {
- this.id = osmEntity.id(this.type);
- }
-
- if (!this.hasOwnProperty('visible')) {
- this.visible = true;
+ if (!this.id) {
+ this.id = osmNote.id().toString();
}
return this;
},
+ extent: function extent() {
+ return new geoExtent(this.loc);
+ },
+ update: function update(attrs) {
+ return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
+ },
+ isNew: function isNew() {
+ return this.id < 0;
+ },
+ move: function move(loc) {
+ return this.update({
+ loc: loc
+ });
+ }
+ });
+
+ function osmRelation() {
+ if (!(this instanceof osmRelation)) {
+ return new osmRelation().initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+ }
+ osmEntity.relation = osmRelation;
+ osmRelation.prototype = Object.create(osmEntity.prototype);
+
+ osmRelation.creationOrder = function (a, b) {
+ var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
+ var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
+ if (aId < 0 || bId < 0) return aId - bId;
+ return bId - aId;
+ };
+
+ Object.assign(osmRelation.prototype, {
+ type: 'relation',
+ members: [],
copy: function copy(resolver, copies) {
if (copies[this.id]) return copies[this.id];
- var copy = osmEntity(this, {
- id: undefined,
- user: undefined,
- version: undefined
+ var copy = osmEntity.prototype.copy.call(this, resolver, copies);
+ var members = this.members.map(function (member) {
+ return Object.assign({}, member, {
+ id: resolver.entity(member.id).copy(resolver, copies).id
+ });
+ });
+ copy = copy.update({
+ members: members
});
copies[this.id] = copy;
return copy;
},
- osmId: function osmId() {
- return osmEntity.id.toOSM(this.id);
+ extent: function extent(resolver, memo) {
+ return resolver["transient"](this, 'extent', function () {
+ if (memo && memo[this.id]) return geoExtent();
+ memo = memo || {};
+ memo[this.id] = true;
+ var extent = geoExtent();
+
+ for (var i = 0; i < this.members.length; i++) {
+ var member = resolver.hasEntity(this.members[i].id);
+
+ if (member) {
+ extent._extend(member.extent(resolver, memo));
+ }
+ }
+
+ return extent;
+ });
},
- isNew: function isNew() {
- return this.osmId() < 0;
+ geometry: function geometry(graph) {
+ return graph["transient"](this, 'geometry', function () {
+ return this.isMultipolygon() ? 'area' : 'relation';
+ });
},
- update: function update(attrs) {
- return osmEntity(this, attrs, {
- v: 1 + (this.v || 0)
+ isDegenerate: function isDegenerate() {
+ return this.members.length === 0;
+ },
+ // Return an array of members, each extended with an 'index' property whose value
+ // is the member index.
+ indexedMembers: function indexedMembers() {
+ var result = new Array(this.members.length);
+
+ for (var i = 0; i < this.members.length; i++) {
+ result[i] = Object.assign({}, this.members[i], {
+ index: i
+ });
+ }
+
+ return result;
+ },
+ // Return the first member with the given role. A copy of the member object
+ // is returned, extended with an 'index' property whose value is the member index.
+ memberByRole: function memberByRole(role) {
+ for (var i = 0; i < this.members.length; i++) {
+ if (this.members[i].role === role) {
+ return Object.assign({}, this.members[i], {
+ index: i
+ });
+ }
+ }
+ },
+ // Same as memberByRole, but returns all members with the given role
+ membersByRole: function membersByRole(role) {
+ var result = [];
+
+ for (var i = 0; i < this.members.length; i++) {
+ if (this.members[i].role === role) {
+ result.push(Object.assign({}, this.members[i], {
+ index: i
+ }));
+ }
+ }
+
+ return result;
+ },
+ // Return the first member with the given id. A copy of the member object
+ // is returned, extended with an 'index' property whose value is the member index.
+ memberById: function memberById(id) {
+ for (var i = 0; i < this.members.length; i++) {
+ if (this.members[i].id === id) {
+ return Object.assign({}, this.members[i], {
+ index: i
+ });
+ }
+ }
+ },
+ // Return the first member with the given id and role. A copy of the member object
+ // is returned, extended with an 'index' property whose value is the member index.
+ memberByIdAndRole: function memberByIdAndRole(id, role) {
+ for (var i = 0; i < this.members.length; i++) {
+ if (this.members[i].id === id && this.members[i].role === role) {
+ return Object.assign({}, this.members[i], {
+ index: i
+ });
+ }
+ }
+ },
+ addMember: function addMember(member, index) {
+ var members = this.members.slice();
+ members.splice(index === undefined ? members.length : index, 0, member);
+ return this.update({
+ members: members
});
},
- mergeTags: function mergeTags(tags) {
- var merged = Object.assign({}, this.tags); // shallow copy
+ updateMember: function updateMember(member, index) {
+ var members = this.members.slice();
+ members.splice(index, 1, Object.assign({}, members[index], member));
+ return this.update({
+ members: members
+ });
+ },
+ removeMember: function removeMember(index) {
+ var members = this.members.slice();
+ members.splice(index, 1);
+ return this.update({
+ members: members
+ });
+ },
+ removeMembersWithID: function removeMembersWithID(id) {
+ var members = this.members.filter(function (m) {
+ return m.id !== id;
+ });
+ return this.update({
+ members: members
+ });
+ },
+ moveMember: function moveMember(fromIndex, toIndex) {
+ var members = this.members.slice();
+ members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
+ return this.update({
+ members: members
+ });
+ },
+ // Wherever a member appears with id `needle.id`, replace it with a member
+ // with id `replacement.id`, type `replacement.type`, and the original role,
+ // By default, adding a duplicate member (by id and role) is prevented.
+ // Return an updated relation.
+ replaceMember: function replaceMember(needle, replacement, keepDuplicates) {
+ if (!this.memberById(needle.id)) return this;
+ var members = [];
- var changed = false;
+ for (var i = 0; i < this.members.length; i++) {
+ var member = this.members[i];
- for (var k in tags) {
- var t1 = merged[k];
- var t2 = tags[k];
+ if (member.id !== needle.id) {
+ members.push(member);
+ } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
+ members.push({
+ id: replacement.id,
+ type: replacement.type,
+ role: member.role
+ });
+ }
+ }
- if (!t1) {
- changed = true;
- merged[k] = t2;
- } else if (t1 !== t2) {
- changed = true;
- merged[k] = utilUnicodeCharsTruncated(utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';'), 255 // avoid exceeding character limit; see also services/osm.js -> maxCharsForTagValue()
- );
+ return this.update({
+ members: members
+ });
+ },
+ asJXON: function asJXON(changeset_id) {
+ var r = {
+ relation: {
+ '@id': this.osmId(),
+ '@version': this.version || 0,
+ member: this.members.map(function (member) {
+ return {
+ keyAttributes: {
+ type: member.type,
+ role: member.role,
+ ref: osmEntity.id.toOSM(member.id)
+ }
+ };
+ }, this),
+ tag: Object.keys(this.tags).map(function (k) {
+ return {
+ keyAttributes: {
+ k: k,
+ v: this.tags[k]
+ }
+ };
+ }, this)
}
+ };
+
+ if (changeset_id) {
+ r.relation['@changeset'] = changeset_id;
}
- return changed ? this.update({
- tags: merged
- }) : this;
+ return r;
},
- intersects: function intersects(extent, resolver) {
- return this.extent(resolver).intersects(extent);
+ asGeoJSON: function asGeoJSON(resolver) {
+ return resolver["transient"](this, 'GeoJSON', function () {
+ if (this.isMultipolygon()) {
+ return {
+ type: 'MultiPolygon',
+ coordinates: this.multipolygon(resolver)
+ };
+ } else {
+ return {
+ type: 'FeatureCollection',
+ properties: this.tags,
+ features: this.members.map(function (member) {
+ return Object.assign({
+ role: member.role
+ }, resolver.entity(member.id).asGeoJSON(resolver));
+ })
+ };
+ }
+ });
},
- hasNonGeometryTags: function hasNonGeometryTags() {
- return Object.keys(this.tags).some(function (k) {
- return k !== 'area';
+ area: function area(resolver) {
+ return resolver["transient"](this, 'area', function () {
+ return d3_geoArea(this.asGeoJSON(resolver));
});
},
- hasParentRelations: function hasParentRelations(resolver) {
- return resolver.parentRelations(this).length > 0;
+ isMultipolygon: function isMultipolygon() {
+ return this.tags.type === 'multipolygon';
},
- hasInterestingTags: function hasInterestingTags() {
- return Object.keys(this.tags).some(osmIsInterestingTag);
+ isComplete: function isComplete(resolver) {
+ for (var i = 0; i < this.members.length; i++) {
+ if (!resolver.hasEntity(this.members[i].id)) {
+ return false;
+ }
+ }
+
+ return true;
},
- hasWikidata: function hasWikidata() {
- return !!this.tags.wikidata || !!this.tags['brand:wikidata'];
+ hasFromViaTo: function hasFromViaTo() {
+ return this.members.some(function (m) {
+ return m.role === 'from';
+ }) && this.members.some(function (m) {
+ return m.role === 'via';
+ }) && this.members.some(function (m) {
+ return m.role === 'to';
+ });
},
- isHighwayIntersection: function isHighwayIntersection() {
- return false;
+ isRestriction: function isRestriction() {
+ return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
},
- isDegenerate: function isDegenerate() {
+ isValidRestriction: function isValidRestriction() {
+ if (!this.isRestriction()) return false;
+ var froms = this.members.filter(function (m) {
+ return m.role === 'from';
+ });
+ var vias = this.members.filter(function (m) {
+ return m.role === 'via';
+ });
+ var tos = this.members.filter(function (m) {
+ return m.role === 'to';
+ });
+ if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
+ if (froms.some(function (m) {
+ return m.type !== 'way';
+ })) return false;
+ if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
+ if (tos.some(function (m) {
+ return m.type !== 'way';
+ })) return false;
+ if (vias.length === 0) return false;
+ if (vias.length > 1 && vias.some(function (m) {
+ return m.type !== 'way';
+ })) return false;
return true;
},
- deprecatedTags: function deprecatedTags(dataDeprecated) {
- var tags = this.tags; // if there are no tags, none can be deprecated
+ isConnectivity: function isConnectivity() {
+ return !!(this.tags.type && this.tags.type.match(/^connectivity:?/));
+ },
+ // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
+ // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
+ //
+ // This corresponds to the structure needed for rendering a multipolygon path using a
+ // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
+ //
+ // In the case of invalid geometries, this function will still return a result which
+ // includes the nodes of all way members, but some Nds may be unclosed and some inner
+ // rings not matched with the intended outer ring.
+ //
+ multipolygon: function multipolygon(resolver) {
+ var outers = this.members.filter(function (m) {
+ return 'outer' === (m.role || 'outer');
+ });
+ var inners = this.members.filter(function (m) {
+ return 'inner' === m.role;
+ });
+ outers = osmJoinWays(outers, resolver);
+ inners = osmJoinWays(inners, resolver);
- if (Object.keys(tags).length === 0) return [];
- var deprecated = [];
- dataDeprecated.forEach(function (d) {
- var oldKeys = Object.keys(d.old);
+ var sequenceToLineString = function sequenceToLineString(sequence) {
+ if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) {
+ // close unclosed parts to ensure correct area rendering - #2945
+ sequence.nodes.push(sequence.nodes[0]);
+ }
+
+ return sequence.nodes.map(function (node) {
+ return node.loc;
+ });
+ };
+
+ outers = outers.map(sequenceToLineString);
+ inners = inners.map(sequenceToLineString);
+ var result = outers.map(function (o) {
+ // Heuristic for detecting counterclockwise winding order. Assumes
+ // that OpenStreetMap polygons are not hemisphere-spanning.
+ return [d3_geoArea({
+ type: 'Polygon',
+ coordinates: [o]
+ }) > 2 * Math.PI ? o.reverse() : o];
+ });
+
+ function findOuter(inner) {
+ var o, outer;
+
+ for (o = 0; o < outers.length; o++) {
+ outer = outers[o];
+
+ if (geoPolygonContainsPolygon(outer, inner)) {
+ return o;
+ }
+ }
+
+ for (o = 0; o < outers.length; o++) {
+ outer = outers[o];
+
+ if (geoPolygonIntersectsPolygon(outer, inner, false)) {
+ return o;
+ }
+ }
+ }
+
+ for (var i = 0; i < inners.length; i++) {
+ var inner = inners[i];
+
+ if (d3_geoArea({
+ type: 'Polygon',
+ coordinates: [inner]
+ }) < 2 * Math.PI) {
+ inner = inner.reverse();
+ }
+
+ var o = findOuter(inners[i]);
+
+ if (o !== undefined) {
+ result[o].push(inners[i]);
+ } else {
+ result.push([inners[i]]); // Invalid geometry
+ }
+ }
+
+ return result;
+ }
+ });
+
+ var QAItem = /*#__PURE__*/function () {
+ function QAItem(loc, service, itemType, id, props) {
+ _classCallCheck$1(this, QAItem);
+
+ // Store required properties
+ this.loc = loc;
+ this.service = service.title;
+ this.itemType = itemType; // All issues must have an ID for selection, use generic if none specified
+
+ this.id = id ? id : "".concat(QAItem.id());
+ this.update(props); // Some QA services have marker icons to differentiate issues
+
+ if (service && typeof service.getIcon === 'function') {
+ this.icon = service.getIcon(itemType);
+ }
+ }
+
+ _createClass$1(QAItem, [{
+ key: "update",
+ value: function update(props) {
+ var _this = this;
+
+ // You can't override this initial information
+ var loc = this.loc,
+ service = this.service,
+ itemType = this.itemType,
+ id = this.id;
+ Object.keys(props).forEach(function (prop) {
+ return _this[prop] = props[prop];
+ });
+ this.loc = loc;
+ this.service = service;
+ this.itemType = itemType;
+ this.id = id;
+ return this;
+ } // Generic handling for newly created QAItems
+
+ }], [{
+ key: "id",
+ value: function id() {
+ return this.nextId--;
+ }
+ }]);
+
+ return QAItem;
+ }();
+ QAItem.nextId = -1;
+
+ //
+ // Optionally, split only the given ways, if multiple ways share
+ // the given node.
+ //
+ // This is the inverse of `iD.actionJoin`.
+ //
+ // For testing convenience, accepts an ID to assign to the new way.
+ // Normally, this will be undefined and the way will automatically
+ // be assigned a new ID.
+ //
+ // Reference:
+ // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
+ //
+
+ function actionSplit(nodeIds, newWayIds) {
+ // accept single ID for backwards-compatiblity
+ if (typeof nodeIds === 'string') nodeIds = [nodeIds];
+
+ var _wayIDs; // the strategy for picking which way will have a new version and which way is newly created
+
+
+ var _keepHistoryOn = 'longest'; // 'longest', 'first'
+ // The IDs of the ways actually created by running this action
+
+ var _createdWayIDs = [];
+
+ function dist(graph, nA, nB) {
+ var locA = graph.entity(nA).loc;
+ var locB = graph.entity(nB).loc;
+ var epsilon = 1e-6;
+ return locA && locB ? geoSphericalDistance(locA, locB) : epsilon;
+ } // If the way is closed, we need to search for a partner node
+ // to split the way at.
+ //
+ // The following looks for a node that is both far away from
+ // the initial node in terms of way segment length and nearby
+ // in terms of beeline-distance. This assures that areas get
+ // split on the most "natural" points (independent of the number
+ // of nodes).
+ // For example: bone-shaped areas get split across their waist
+ // line, circles across the diameter.
- if (d.replace) {
- var hasExistingValues = Object.keys(d.replace).some(function (replaceKey) {
- if (!tags[replaceKey] || d.old[replaceKey]) return false;
- var replaceValue = d.replace[replaceKey];
- if (replaceValue === '*') return false;
- if (replaceValue === tags[replaceKey]) return false;
- return true;
- }); // don't flag deprecated tags if the upgrade path would overwrite existing data - #7843
- if (hasExistingValues) return;
- }
+ function splitArea(nodes, idxA, graph) {
+ var lengths = new Array(nodes.length);
+ var length;
+ var i;
+ var best = 0;
+ var idxB;
- var matchesDeprecatedTags = oldKeys.every(function (oldKey) {
- if (!tags[oldKey]) return false;
- if (d.old[oldKey] === '*') return true;
- if (d.old[oldKey] === tags[oldKey]) return true;
- var vals = tags[oldKey].split(';').filter(Boolean);
+ function wrap(index) {
+ return utilWrap(index, nodes.length);
+ } // calculate lengths
- if (vals.length === 0) {
- return false;
- } else if (vals.length > 1) {
- return vals.indexOf(d.old[oldKey]) !== -1;
- } else {
- if (tags[oldKey] === d.old[oldKey]) {
- if (d.replace && d.old[oldKey] === d.replace[oldKey]) {
- var replaceKeys = Object.keys(d.replace);
- return !replaceKeys.every(function (replaceKey) {
- return tags[replaceKey] === d.replace[replaceKey];
- });
- } else {
- return true;
- }
- }
- }
- return false;
- });
+ length = 0;
- if (matchesDeprecatedTags) {
- deprecated.push(d);
- }
- });
- return deprecated;
- }
- };
+ for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) {
+ length += dist(graph, nodes[i], nodes[wrap(i - 1)]);
+ lengths[i] = length;
+ }
- function osmLanes(entity) {
- if (entity.type !== 'way') return null;
- if (!entity.tags.highway) return null;
- var tags = entity.tags;
- var isOneWay = entity.isOneWay();
- var laneCount = getLaneCount(tags, isOneWay);
- var maxspeed = parseMaxspeed(tags);
- var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
- var forward = laneDirections.forward;
- var backward = laneDirections.backward;
- var bothways = laneDirections.bothways; // parse the piped string 'x|y|z' format
+ length = 0;
- var turnLanes = {};
- turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
- turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
- turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
- var maxspeedLanes = {};
- maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
- maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
- maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
- var psvLanes = {};
- psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
- psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
- psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
- var busLanes = {};
- busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
- busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
- busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
- var taxiLanes = {};
- taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
- taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
- taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
- var hovLanes = {};
- hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
- hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
- hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
- var hgvLanes = {};
- hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
- hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
- hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
- var bicyclewayLanes = {};
- bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
- bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
- bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
- var lanesObj = {
- forward: [],
- backward: [],
- unspecified: []
- }; // map forward/backward/unspecified of each lane type to lanesObj
+ for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) {
+ length += dist(graph, nodes[i], nodes[wrap(i + 1)]);
- mapToLanesObj(lanesObj, turnLanes, 'turnLane');
- mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
- mapToLanesObj(lanesObj, psvLanes, 'psv');
- mapToLanesObj(lanesObj, busLanes, 'bus');
- mapToLanesObj(lanesObj, taxiLanes, 'taxi');
- mapToLanesObj(lanesObj, hovLanes, 'hov');
- mapToLanesObj(lanesObj, hgvLanes, 'hgv');
- mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
- return {
- metadata: {
- count: laneCount,
- oneway: isOneWay,
- forward: forward,
- backward: backward,
- bothways: bothways,
- turnLanes: turnLanes,
- maxspeed: maxspeed,
- maxspeedLanes: maxspeedLanes,
- psvLanes: psvLanes,
- busLanes: busLanes,
- taxiLanes: taxiLanes,
- hovLanes: hovLanes,
- hgvLanes: hgvLanes,
- bicyclewayLanes: bicyclewayLanes
- },
- lanes: lanesObj
- };
- }
+ if (length < lengths[i]) {
+ lengths[i] = length;
+ }
+ } // determine best opposite node to split
- function getLaneCount(tags, isOneWay) {
- var count;
- if (tags.lanes) {
- count = parseInt(tags.lanes, 10);
+ for (i = 0; i < nodes.length; i++) {
+ var cost = lengths[i] / dist(graph, nodes[idxA], nodes[i]);
- if (count > 0) {
- return count;
+ if (cost > best) {
+ idxB = i;
+ best = cost;
+ }
}
+
+ return idxB;
}
- switch (tags.highway) {
- case 'trunk':
- case 'motorway':
- count = isOneWay ? 2 : 4;
- break;
+ function totalLengthBetweenNodes(graph, nodes) {
+ var totalLength = 0;
- default:
- count = isOneWay ? 1 : 2;
- break;
+ for (var i = 0; i < nodes.length - 1; i++) {
+ totalLength += dist(graph, nodes[i], nodes[i + 1]);
+ }
+
+ return totalLength;
}
- return count;
- }
+ function split(graph, nodeId, wayA, newWayId) {
+ var wayB = osmWay({
+ id: newWayId,
+ tags: wayA.tags
+ }); // `wayB` is the NEW way
- function parseMaxspeed(tags) {
- var maxspeed = tags.maxspeed;
- if (!maxspeed) return;
- var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
- if (!maxspeedRegex.test(maxspeed)) return;
- return parseInt(maxspeed, 10);
- }
+ var origNodes = wayA.nodes.slice();
+ var nodesA;
+ var nodesB;
+ var isArea = wayA.isArea();
+ var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
- function parseLaneDirections(tags, isOneWay, laneCount) {
- var forward = parseInt(tags['lanes:forward'], 10);
- var backward = parseInt(tags['lanes:backward'], 10);
- var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
+ if (wayA.isClosed()) {
+ var nodes = wayA.nodes.slice(0, -1);
+ var idxA = nodes.indexOf(nodeId);
+ var idxB = splitArea(nodes, idxA, graph);
- if (parseInt(tags.oneway, 10) === -1) {
- forward = 0;
- bothways = 0;
- backward = laneCount;
- } else if (isOneWay) {
- forward = laneCount;
- bothways = 0;
- backward = 0;
- } else if (isNaN(forward) && isNaN(backward)) {
- backward = Math.floor((laneCount - bothways) / 2);
- forward = laneCount - bothways - backward;
- } else if (isNaN(forward)) {
- if (backward > laneCount - bothways) {
- backward = laneCount - bothways;
+ if (idxB < idxA) {
+ nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
+ nodesB = nodes.slice(idxB, idxA + 1);
+ } else {
+ nodesA = nodes.slice(idxA, idxB + 1);
+ nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
+ }
+ } else {
+ var idx = wayA.nodes.indexOf(nodeId, 1);
+ nodesA = wayA.nodes.slice(0, idx + 1);
+ nodesB = wayA.nodes.slice(idx);
}
- forward = laneCount - bothways - backward;
- } else if (isNaN(backward)) {
- if (forward > laneCount - bothways) {
- forward = laneCount - bothways;
+ var lengthA = totalLengthBetweenNodes(graph, nodesA);
+ var lengthB = totalLengthBetweenNodes(graph, nodesB);
+
+ if (_keepHistoryOn === 'longest' && lengthB > lengthA) {
+ // keep the history on the longer way, regardless of the node count
+ wayA = wayA.update({
+ nodes: nodesB
+ });
+ wayB = wayB.update({
+ nodes: nodesA
+ });
+ var temp = lengthA;
+ lengthA = lengthB;
+ lengthB = temp;
+ } else {
+ wayA = wayA.update({
+ nodes: nodesA
+ });
+ wayB = wayB.update({
+ nodes: nodesB
+ });
}
- backward = laneCount - bothways - forward;
- }
+ if (wayA.tags.step_count) {
+ // divide up the the step count proportionally between the two ways
+ var stepCount = parseFloat(wayA.tags.step_count);
- return {
- forward: forward,
- backward: backward,
- bothways: bothways
- };
- }
+ if (stepCount && // ensure a number
+ isFinite(stepCount) && // ensure positive
+ stepCount > 0 && // ensure integer
+ Math.round(stepCount) === stepCount) {
+ var tagsA = Object.assign({}, wayA.tags);
+ var tagsB = Object.assign({}, wayB.tags);
+ var ratioA = lengthA / (lengthA + lengthB);
+ var countA = Math.round(stepCount * ratioA);
+ tagsA.step_count = countA.toString();
+ tagsB.step_count = (stepCount - countA).toString();
+ wayA = wayA.update({
+ tags: tagsA
+ });
+ wayB = wayB.update({
+ tags: tagsB
+ });
+ }
+ }
- function parseTurnLanes(tag) {
- if (!tag) return;
- var validValues = ['left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right', 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'];
- return tag.split('|').map(function (s) {
- if (s === '') s = 'none';
- return s.split(';').map(function (d) {
- return validValues.indexOf(d) === -1 ? 'unknown' : d;
- });
- });
- }
+ graph = graph.replace(wayA);
+ graph = graph.replace(wayB);
+ graph.parentRelations(wayA).forEach(function (relation) {
+ var member; // Turn restrictions - make sure:
+ // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
+ // (whichever one is connected to the VIA node/ways)
+ // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
- function parseMaxspeedLanes(tag, maxspeed) {
- if (!tag) return;
- return tag.split('|').map(function (s) {
- if (s === 'none') return s;
- var m = parseInt(s, 10);
- if (s === '' || m === maxspeed) return null;
- return isNaN(m) ? 'unknown' : m;
- });
- }
+ if (relation.hasFromViaTo()) {
+ var f = relation.memberByRole('from');
+ var v = relation.membersByRole('via');
+ var t = relation.memberByRole('to');
+ var i; // 1. split a FROM/TO
- function parseMiscLanes(tag) {
- if (!tag) return;
- var validValues = ['yes', 'no', 'designated'];
- return tag.split('|').map(function (s) {
- if (s === '') s = 'no';
- return validValues.indexOf(s) === -1 ? 'unknown' : s;
- });
- }
+ if (f.id === wayA.id || t.id === wayA.id) {
+ var keepB = false;
- function parseBicycleWay(tag) {
- if (!tag) return;
- var validValues = ['yes', 'no', 'designated', 'lane'];
- return tag.split('|').map(function (s) {
- if (s === '') s = 'no';
- return validValues.indexOf(s) === -1 ? 'unknown' : s;
- });
- }
+ if (v.length === 1 && v[0].type === 'node') {
+ // check via node
+ keepB = wayB.contains(v[0].id);
+ } else {
+ // check via way(s)
+ for (i = 0; i < v.length; i++) {
+ if (v[i].type === 'way') {
+ var wayVia = graph.hasEntity(v[i].id);
- function mapToLanesObj(lanesObj, data, key) {
- if (data.forward) data.forward.forEach(function (l, i) {
- if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
- lanesObj.forward[i][key] = l;
- });
- if (data.backward) data.backward.forEach(function (l, i) {
- if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
- lanesObj.backward[i][key] = l;
- });
- if (data.unspecified) data.unspecified.forEach(function (l, i) {
- if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
- lanesObj.unspecified[i][key] = l;
- });
- }
+ if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
+ keepB = true;
+ break;
+ }
+ }
+ }
+ }
- function osmWay() {
- if (!(this instanceof osmWay)) {
- return new osmWay().initialize(arguments);
- } else if (arguments.length) {
- this.initialize(arguments);
- }
- }
- osmEntity.way = osmWay;
- osmWay.prototype = Object.create(osmEntity.prototype);
- Object.assign(osmWay.prototype, {
- type: 'way',
- nodes: [],
- copy: function copy(resolver, copies) {
- if (copies[this.id]) return copies[this.id];
- var copy = osmEntity.prototype.copy.call(this, resolver, copies);
- var nodes = this.nodes.map(function (id) {
- return resolver.entity(id).copy(resolver, copies).id;
- });
- copy = copy.update({
- nodes: nodes
- });
- copies[this.id] = copy;
- return copy;
- },
- extent: function extent(resolver) {
- return resolver["transient"](this, 'extent', function () {
- var extent = geoExtent();
+ if (keepB) {
+ relation = relation.replaceMember(wayA, wayB);
+ graph = graph.replace(relation);
+ } // 2. split a VIA
- for (var i = 0; i < this.nodes.length; i++) {
- var node = resolver.hasEntity(this.nodes[i]);
+ } else {
+ for (i = 0; i < v.length; i++) {
+ if (v[i].type === 'way' && v[i].id === wayA.id) {
+ member = {
+ id: wayB.id,
+ type: 'way',
+ role: 'via'
+ };
+ graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
+ break;
+ }
+ }
+ } // All other relations (Routes, Multipolygons, etc):
+ // 1. Both `wayA` and `wayB` remain in the relation
+ // 2. But must be inserted as a pair (see `actionAddMember` for details)
- if (node) {
- extent._extend(node.extent());
+ } else {
+ if (relation === isOuter) {
+ graph = graph.replace(relation.mergeTags(wayA.tags));
+ graph = graph.replace(wayA.update({
+ tags: {}
+ }));
+ graph = graph.replace(wayB.update({
+ tags: {}
+ }));
}
- }
-
- return extent;
- });
- },
- first: function first() {
- return this.nodes[0];
- },
- last: function last() {
- return this.nodes[this.nodes.length - 1];
- },
- contains: function contains(node) {
- return this.nodes.indexOf(node) >= 0;
- },
- affix: function affix(node) {
- if (this.nodes[0] === node) return 'prefix';
- if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
- },
- layer: function layer() {
- // explicit layer tag, clamp between -10, 10..
- if (isFinite(this.tags.layer)) {
- return Math.max(-10, Math.min(+this.tags.layer, 10));
- } // implied layer tag..
-
- if (this.tags.covered === 'yes') return -1;
- if (this.tags.location === 'overground') return 1;
- if (this.tags.location === 'underground') return -1;
- if (this.tags.location === 'underwater') return -10;
- if (this.tags.power === 'line') return 10;
- if (this.tags.power === 'minor_line') return 10;
- if (this.tags.aerialway) return 10;
- if (this.tags.bridge) return 1;
- if (this.tags.cutting) return -1;
- if (this.tags.tunnel) return -1;
- if (this.tags.waterway) return -1;
- if (this.tags.man_made === 'pipeline') return -10;
- if (this.tags.boundary) return -10;
- return 0;
- },
- // the approximate width of the line based on its tags except its `width` tag
- impliedLineWidthMeters: function impliedLineWidthMeters() {
- var averageWidths = {
- highway: {
- // width is for single lane
- motorway: 5,
- motorway_link: 5,
- trunk: 4.5,
- trunk_link: 4.5,
- primary: 4,
- secondary: 4,
- tertiary: 4,
- primary_link: 4,
- secondary_link: 4,
- tertiary_link: 4,
- unclassified: 4,
- road: 4,
- living_street: 4,
- bus_guideway: 4,
- pedestrian: 4,
- residential: 3.5,
- service: 3.5,
- track: 3,
- cycleway: 2.5,
- bridleway: 2,
- corridor: 2,
- steps: 2,
- path: 1.5,
- footway: 1.5
- },
- railway: {
- // width includes ties and rail bed, not just track gauge
- rail: 2.5,
- light_rail: 2.5,
- tram: 2.5,
- subway: 2.5,
- monorail: 2.5,
- funicular: 2.5,
- disused: 2.5,
- preserved: 2.5,
- miniature: 1.5,
- narrow_gauge: 1.5
- },
- waterway: {
- river: 50,
- canal: 25,
- stream: 5,
- tidal_channel: 5,
- fish_pass: 2.5,
- drain: 2.5,
- ditch: 1.5
+ member = {
+ id: wayB.id,
+ type: 'way',
+ role: relation.memberById(wayA.id).role
+ };
+ var insertPair = {
+ originalID: wayA.id,
+ insertedID: wayB.id,
+ nodes: origNodes
+ };
+ graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
}
- };
+ });
- for (var key in averageWidths) {
- if (this.tags[key] && averageWidths[key][this.tags[key]]) {
- var width = averageWidths[key][this.tags[key]];
+ if (!isOuter && isArea) {
+ var multipolygon = osmRelation({
+ tags: Object.assign({}, wayA.tags, {
+ type: 'multipolygon'
+ }),
+ members: [{
+ id: wayA.id,
+ role: 'outer',
+ type: 'way'
+ }, {
+ id: wayB.id,
+ role: 'outer',
+ type: 'way'
+ }]
+ });
+ graph = graph.replace(multipolygon);
+ graph = graph.replace(wayA.update({
+ tags: {}
+ }));
+ graph = graph.replace(wayB.update({
+ tags: {}
+ }));
+ }
- if (key === 'highway') {
- var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10);
- if (!laneCount) laneCount = this.isOneWay() ? 1 : 2;
- return width * laneCount;
- }
+ _createdWayIDs.push(wayB.id);
- return width;
+ return graph;
+ }
+
+ var action = function action(graph) {
+ _createdWayIDs = [];
+ var newWayIndex = 0;
+
+ for (var i = 0; i < nodeIds.length; i++) {
+ var nodeId = nodeIds[i];
+ var candidates = action.waysForNode(nodeId, graph);
+
+ for (var j = 0; j < candidates.length; j++) {
+ graph = split(graph, nodeId, candidates[j], newWayIds && newWayIds[newWayIndex]);
+ newWayIndex += 1;
}
}
- return null;
- },
- isOneWay: function isOneWay() {
- // explicit oneway tag..
- var values = {
- 'yes': true,
- '1': true,
- '-1': true,
- 'reversible': true,
- 'alternating': true,
- 'no': false,
- '0': false
- };
-
- if (values[this.tags.oneway] !== undefined) {
- return values[this.tags.oneway];
- } // implied oneway tag..
+ return graph;
+ };
+ action.getCreatedWayIDs = function () {
+ return _createdWayIDs;
+ };
- for (var key in this.tags) {
- if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) return true;
- }
+ action.waysForNode = function (nodeId, graph) {
+ var node = graph.entity(nodeId);
+ var splittableParents = graph.parentWays(node).filter(isSplittable);
- return false;
- },
- // Some identifier for tag that implies that this way is "sided",
- // i.e. the right side is the 'inside' (e.g. the right side of a
- // natural=cliff is lower).
- sidednessIdentifier: function sidednessIdentifier() {
- for (var key in this.tags) {
- var value = this.tags[key];
+ if (!_wayIDs) {
+ // If the ways to split aren't specified, only split the lines.
+ // If there are no lines to split, split the areas.
+ var hasLine = splittableParents.some(function (parent) {
+ return parent.geometry(graph) === 'line';
+ });
- if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) {
- if (osmRightSideIsInsideTags[key][value] === true) {
- return key;
- } else {
- // if the map's value is something other than a
- // literal true, we should use it so we can
- // special case some keys (e.g. natural=coastline
- // is handled differently to other naturals).
- return osmRightSideIsInsideTags[key][value];
- }
+ if (hasLine) {
+ return splittableParents.filter(function (parent) {
+ return parent.geometry(graph) === 'line';
+ });
}
}
- return null;
- },
- isSided: function isSided() {
- if (this.tags.two_sided === 'yes') {
- return false;
- }
+ return splittableParents;
- return this.sidednessIdentifier() !== null;
- },
- lanes: function lanes() {
- return osmLanes(this);
- },
- isClosed: function isClosed() {
- return this.nodes.length > 1 && this.first() === this.last();
- },
- isConvex: function isConvex(resolver) {
- if (!this.isClosed() || this.isDegenerate()) return null;
- var nodes = utilArrayUniq(resolver.childNodes(this));
- var coords = nodes.map(function (n) {
- return n.loc;
- });
- var curr = 0;
- var prev = 0;
+ function isSplittable(parent) {
+ // If the ways to split are specified, ignore everything else.
+ if (_wayIDs && _wayIDs.indexOf(parent.id) === -1) return false; // We can fake splitting closed ways at their endpoints...
- for (var i = 0; i < coords.length; i++) {
- var o = coords[(i + 1) % coords.length];
- var a = coords[i];
- var b = coords[(i + 2) % coords.length];
- var res = geoVecCross(a, b, o);
- curr = res > 0 ? 1 : res < 0 ? -1 : 0;
+ if (parent.isClosed()) return true; // otherwise, we can't split nodes at their endpoints.
- if (curr === 0) {
- continue;
- } else if (prev && curr !== prev) {
- return false;
+ for (var i = 1; i < parent.nodes.length - 1; i++) {
+ if (parent.nodes[i] === nodeId) return true;
}
- prev = curr;
+ return false;
}
+ };
- return true;
- },
- // returns an object with the tag that implies this is an area, if any
- tagSuggestingArea: function tagSuggestingArea() {
- return osmTagSuggestingArea(this.tags);
- },
- isArea: function isArea() {
- if (this.tags.area === 'yes') return true;
- if (!this.isClosed() || this.tags.area === 'no') return false;
- return this.tagSuggestingArea() !== null;
- },
- isDegenerate: function isDegenerate() {
- return new Set(this.nodes).size < (this.isArea() ? 3 : 2);
- },
- areAdjacent: function areAdjacent(n1, n2) {
- for (var i = 0; i < this.nodes.length; i++) {
- if (this.nodes[i] === n1) {
- if (this.nodes[i - 1] === n2) return true;
- if (this.nodes[i + 1] === n2) return true;
+ action.ways = function (graph) {
+ return utilArrayUniq([].concat.apply([], nodeIds.map(function (nodeId) {
+ return action.waysForNode(nodeId, graph);
+ })));
+ };
+
+ action.disabled = function (graph) {
+ for (var i = 0; i < nodeIds.length; i++) {
+ var nodeId = nodeIds[i];
+ var candidates = action.waysForNode(nodeId, graph);
+
+ if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) {
+ return 'not_eligible';
}
}
+ };
- return false;
- },
- geometry: function geometry(graph) {
- return graph["transient"](this, 'geometry', function () {
- return this.isArea() ? 'area' : 'line';
- });
- },
- // returns an array of objects representing the segments between the nodes in this way
- segments: function segments(graph) {
- function segmentExtent(graph) {
- var n1 = graph.hasEntity(this.nodes[0]);
- var n2 = graph.hasEntity(this.nodes[1]);
- return n1 && n2 && geoExtent([[Math.min(n1.loc[0], n2.loc[0]), Math.min(n1.loc[1], n2.loc[1])], [Math.max(n1.loc[0], n2.loc[0]), Math.max(n1.loc[1], n2.loc[1])]]);
- }
+ action.limitWays = function (val) {
+ if (!arguments.length) return _wayIDs;
+ _wayIDs = val;
+ return action;
+ };
- return graph["transient"](this, 'segments', function () {
- var segments = [];
+ action.keepHistoryOn = function (val) {
+ if (!arguments.length) return _keepHistoryOn;
+ _keepHistoryOn = val;
+ return action;
+ };
- for (var i = 0; i < this.nodes.length - 1; i++) {
- segments.push({
- id: this.id + '-' + i,
- wayId: this.id,
- index: i,
- nodes: [this.nodes[i], this.nodes[i + 1]],
- extent: segmentExtent
- });
- }
+ return action;
+ }
- return segments;
- });
- },
- // If this way is not closed, append the beginning node to the end of the nodelist to close it.
- close: function close() {
- if (this.isClosed() || !this.nodes.length) return this;
- var nodes = this.nodes.slice();
- nodes = nodes.filter(noRepeatNodes);
- nodes.push(nodes[0]);
- return this.update({
- nodes: nodes
- });
- },
- // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
- unclose: function unclose() {
- if (!this.isClosed()) return this;
- var nodes = this.nodes.slice();
- var connector = this.first();
- var i = nodes.length - 1; // remove trailing connectors..
+ function coreGraph(other, mutable) {
+ if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
- while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
- nodes.splice(i, 1);
- i = nodes.length - 1;
- }
+ if (other instanceof coreGraph) {
+ var base = other.base();
+ this.entities = Object.assign(Object.create(base.entities), other.entities);
+ this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
+ this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
+ } else {
+ this.entities = Object.create({});
+ this._parentWays = Object.create({});
+ this._parentRels = Object.create({});
+ this.rebase(other || [], [this]);
+ }
- nodes = nodes.filter(noRepeatNodes);
- return this.update({
- nodes: nodes
- });
+ this.transients = {};
+ this._childNodes = {};
+ this.frozen = !mutable;
+ }
+ coreGraph.prototype = {
+ hasEntity: function hasEntity(id) {
+ return this.entities[id];
},
- // Adds a node (id) in front of the node which is currently at position index.
- // If index is undefined, the node will be added to the end of the way for linear ways,
- // or just before the final connecting node for circular ways.
- // Consecutive duplicates are eliminated including existing ones.
- // Circularity is always preserved when adding a node.
- addNode: function addNode(id, index) {
- var nodes = this.nodes.slice();
- var isClosed = this.isClosed();
- var max = isClosed ? nodes.length - 1 : nodes.length;
+ entity: function entity(id) {
+ var entity = this.entities[id]; //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
- if (index === undefined) {
- index = max;
+ if (!entity) {
+ entity = this.entities.__proto__[id]; // eslint-disable-line no-proto
}
- if (index < 0 || index > max) {
- throw new RangeError('index ' + index + ' out of range 0..' + max);
- } // If this is a closed way, remove all connector nodes except the first one
- // (there may be duplicates) and adjust index if necessary..
-
-
- if (isClosed) {
- var connector = this.first(); // leading connectors..
-
- var i = 1;
+ if (!entity) {
+ throw new Error('entity ' + id + ' not found');
+ }
- while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
- nodes.splice(i, 1);
- if (index > i) index--;
- } // trailing connectors..
+ return entity;
+ },
+ geometry: function geometry(id) {
+ return this.entity(id).geometry(this);
+ },
+ "transient": function transient(entity, key, fn) {
+ var id = entity.id;
+ var transients = this.transients[id] || (this.transients[id] = {});
+ if (transients[key] !== undefined) {
+ return transients[key];
+ }
- i = nodes.length - 1;
+ transients[key] = fn.call(entity);
+ return transients[key];
+ },
+ parentWays: function parentWays(entity) {
+ var parents = this._parentWays[entity.id];
+ var result = [];
- while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
- nodes.splice(i, 1);
- if (index > i) index--;
- i = nodes.length - 1;
- }
+ if (parents) {
+ parents.forEach(function (id) {
+ result.push(this.entity(id));
+ }, this);
}
- nodes.splice(index, 0, id);
- nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
+ return result;
+ },
+ isPoi: function isPoi(entity) {
+ var parents = this._parentWays[entity.id];
+ return !parents || parents.size === 0;
+ },
+ isShared: function isShared(entity) {
+ var parents = this._parentWays[entity.id];
+ return parents && parents.size > 1;
+ },
+ parentRelations: function parentRelations(entity) {
+ var parents = this._parentRels[entity.id];
+ var result = [];
- if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
- nodes.push(nodes[0]);
+ if (parents) {
+ parents.forEach(function (id) {
+ result.push(this.entity(id));
+ }, this);
}
- return this.update({
- nodes: nodes
+ return result;
+ },
+ parentMultipolygons: function parentMultipolygons(entity) {
+ return this.parentRelations(entity).filter(function (relation) {
+ return relation.isMultipolygon();
});
},
- // Replaces the node which is currently at position index with the given node (id).
- // Consecutive duplicates are eliminated including existing ones.
- // Circularity is preserved when updating a node.
- updateNode: function updateNode(id, index) {
- var nodes = this.nodes.slice();
- var isClosed = this.isClosed();
- var max = nodes.length - 1;
-
- if (index === undefined || index < 0 || index > max) {
- throw new RangeError('index ' + index + ' out of range 0..' + max);
- } // If this is a closed way, remove all connector nodes except the first one
- // (there may be duplicates) and adjust index if necessary..
+ childNodes: function childNodes(entity) {
+ if (this._childNodes[entity.id]) return this._childNodes[entity.id];
+ if (!entity.nodes) return [];
+ var nodes = [];
+ for (var i = 0; i < entity.nodes.length; i++) {
+ nodes[i] = this.entity(entity.nodes[i]);
+ }
+ this._childNodes[entity.id] = nodes;
+ return this._childNodes[entity.id];
+ },
+ base: function base() {
+ return {
+ 'entities': Object.getPrototypeOf(this.entities),
+ 'parentWays': Object.getPrototypeOf(this._parentWays),
+ 'parentRels': Object.getPrototypeOf(this._parentRels)
+ };
+ },
+ // Unlike other graph methods, rebase mutates in place. This is because it
+ // is used only during the history operation that merges newly downloaded
+ // data into each state. To external consumers, it should appear as if the
+ // graph always contained the newly downloaded data.
+ rebase: function rebase(entities, stack, force) {
+ var base = this.base();
+ var i, j, k, id;
- if (isClosed) {
- var connector = this.first(); // leading connectors..
+ for (i = 0; i < entities.length; i++) {
+ var entity = entities[i];
+ if (!entity.visible || !force && base.entities[entity.id]) continue; // Merging data into the base graph
- var i = 1;
+ base.entities[entity.id] = entity;
- while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
- nodes.splice(i, 1);
- if (index > i) index--;
- } // trailing connectors..
+ this._updateCalculated(undefined, entity, base.parentWays, base.parentRels); // Restore provisionally-deleted nodes that are discovered to have an extant parent
- i = nodes.length - 1;
+ if (entity.type === 'way') {
+ for (j = 0; j < entity.nodes.length; j++) {
+ id = entity.nodes[j];
- while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
- nodes.splice(i, 1);
- if (index === i) index = 0; // update leading connector instead
+ for (k = 1; k < stack.length; k++) {
+ var ents = stack[k].entities;
- i = nodes.length - 1;
+ if (ents.hasOwnProperty(id) && ents[id] === undefined) {
+ delete ents[id];
+ }
+ }
+ }
}
}
- nodes.splice(index, 1, id);
- nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
-
- if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
- nodes.push(nodes[0]);
+ for (i = 0; i < stack.length; i++) {
+ stack[i]._updateRebased();
}
-
- return this.update({
- nodes: nodes
- });
},
- // Replaces each occurrence of node id needle with replacement.
- // Consecutive duplicates are eliminated including existing ones.
- // Circularity is preserved.
- replaceNode: function replaceNode(needleID, replacementID) {
- var nodes = this.nodes.slice();
- var isClosed = this.isClosed();
-
- for (var i = 0; i < nodes.length; i++) {
- if (nodes[i] === needleID) {
- nodes[i] = replacementID;
+ _updateRebased: function _updateRebased() {
+ var base = this.base();
+ Object.keys(this._parentWays).forEach(function (child) {
+ if (base.parentWays[child]) {
+ base.parentWays[child].forEach(function (id) {
+ if (!this.entities.hasOwnProperty(id)) {
+ this._parentWays[child].add(id);
+ }
+ }, this);
}
- }
-
- nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
-
- if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
- nodes.push(nodes[0]);
- }
-
- return this.update({
- nodes: nodes
- });
+ }, this);
+ Object.keys(this._parentRels).forEach(function (child) {
+ if (base.parentRels[child]) {
+ base.parentRels[child].forEach(function (id) {
+ if (!this.entities.hasOwnProperty(id)) {
+ this._parentRels[child].add(id);
+ }
+ }, this);
+ }
+ }, this);
+ this.transients = {}; // this._childNodes is not updated, under the assumption that
+ // ways are always downloaded with their child nodes.
},
- // Removes each occurrence of node id.
- // Consecutive duplicates are eliminated including existing ones.
- // Circularity is preserved.
- removeNode: function removeNode(id) {
- var nodes = this.nodes.slice();
- var isClosed = this.isClosed();
- nodes = nodes.filter(function (node) {
- return node !== id;
- }).filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
-
- if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
- nodes.push(nodes[0]);
- }
+ // Updates calculated properties (parentWays, parentRels) for the specified change
+ _updateCalculated: function _updateCalculated(oldentity, entity, parentWays, parentRels) {
+ parentWays = parentWays || this._parentWays;
+ parentRels = parentRels || this._parentRels;
+ var type = entity && entity.type || oldentity && oldentity.type;
+ var removed, added, i;
- return this.update({
- nodes: nodes
- });
- },
- asJXON: function asJXON(changeset_id) {
- var r = {
- way: {
- '@id': this.osmId(),
- '@version': this.version || 0,
- nd: this.nodes.map(function (id) {
- return {
- keyAttributes: {
- ref: osmEntity.id.toOSM(id)
- }
- };
- }, this),
- tag: Object.keys(this.tags).map(function (k) {
- return {
- keyAttributes: {
- k: k,
- v: this.tags[k]
- }
- };
- }, this)
+ if (type === 'way') {
+ // Update parentWays
+ if (oldentity && entity) {
+ removed = utilArrayDifference(oldentity.nodes, entity.nodes);
+ added = utilArrayDifference(entity.nodes, oldentity.nodes);
+ } else if (oldentity) {
+ removed = oldentity.nodes;
+ added = [];
+ } else if (entity) {
+ removed = [];
+ added = entity.nodes;
}
- };
-
- if (changeset_id) {
- r.way['@changeset'] = changeset_id;
- }
- return r;
- },
- asGeoJSON: function asGeoJSON(resolver) {
- return resolver["transient"](this, 'GeoJSON', function () {
- var coordinates = resolver.childNodes(this).map(function (n) {
- return n.loc;
- });
+ for (i = 0; i < removed.length; i++) {
+ // make a copy of prototype property, store as own property, and update..
+ parentWays[removed[i]] = new Set(parentWays[removed[i]]);
+ parentWays[removed[i]]["delete"](oldentity.id);
+ }
- if (this.isArea() && this.isClosed()) {
- return {
- type: 'Polygon',
- coordinates: [coordinates]
- };
- } else {
- return {
- type: 'LineString',
- coordinates: coordinates
- };
+ for (i = 0; i < added.length; i++) {
+ // make a copy of prototype property, store as own property, and update..
+ parentWays[added[i]] = new Set(parentWays[added[i]]);
+ parentWays[added[i]].add(entity.id);
}
- });
- },
- area: function area(resolver) {
- return resolver["transient"](this, 'area', function () {
- var nodes = resolver.childNodes(this);
- var json = {
- type: 'Polygon',
- coordinates: [nodes.map(function (n) {
- return n.loc;
- })]
- };
+ } else if (type === 'relation') {
+ // Update parentRels
+ // diff only on the IDs since the same entity can be a member multiple times with different roles
+ var oldentityMemberIDs = oldentity ? oldentity.members.map(function (m) {
+ return m.id;
+ }) : [];
+ var entityMemberIDs = entity ? entity.members.map(function (m) {
+ return m.id;
+ }) : [];
- if (!this.isClosed() && nodes.length) {
- json.coordinates[0].push(nodes[0].loc);
+ if (oldentity && entity) {
+ removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
+ added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
+ } else if (oldentity) {
+ removed = oldentityMemberIDs;
+ added = [];
+ } else if (entity) {
+ removed = [];
+ added = entityMemberIDs;
}
- var area = d3_geoArea(json); // Heuristic for detecting counterclockwise winding order. Assumes
- // that OpenStreetMap polygons are not hemisphere-spanning.
+ for (i = 0; i < removed.length; i++) {
+ // make a copy of prototype property, store as own property, and update..
+ parentRels[removed[i]] = new Set(parentRels[removed[i]]);
+ parentRels[removed[i]]["delete"](oldentity.id);
+ }
- if (area > 2 * Math.PI) {
- json.coordinates[0] = json.coordinates[0].reverse();
- area = d3_geoArea(json);
+ for (i = 0; i < added.length; i++) {
+ // make a copy of prototype property, store as own property, and update..
+ parentRels[added[i]] = new Set(parentRels[added[i]]);
+ parentRels[added[i]].add(entity.id);
}
+ }
+ },
+ replace: function replace(entity) {
+ if (this.entities[entity.id] === entity) return this;
+ return this.update(function () {
+ this._updateCalculated(this.entities[entity.id], entity);
- return isNaN(area) ? 0 : area;
+ this.entities[entity.id] = entity;
});
- }
- }); // Filter function to eliminate consecutive duplicates.
-
- function noRepeatNodes(node, i, arr) {
- return i === 0 || node !== arr[i - 1];
- }
+ },
+ remove: function remove(entity) {
+ return this.update(function () {
+ this._updateCalculated(entity, undefined);
- //
- // 1. Relation tagged with `type=multipolygon` and no interesting tags.
- // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
- // 3. No members without a role.
- //
- // Old multipolygons are no longer recommended but are still rendered as areas by iD.
+ this.entities[entity.id] = undefined;
+ });
+ },
+ revert: function revert(id) {
+ var baseEntity = this.base().entities[id];
+ var headEntity = this.entities[id];
+ if (headEntity === baseEntity) return this;
+ return this.update(function () {
+ this._updateCalculated(headEntity, baseEntity);
- function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
- if (entity.type !== 'relation' || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
- return false;
- }
+ delete this.entities[id];
+ });
+ },
+ update: function update() {
+ var graph = this.frozen ? coreGraph(this, true) : this;
- var outerMember;
+ for (var i = 0; i < arguments.length; i++) {
+ arguments[i].call(graph, graph);
+ }
- for (var memberIndex in entity.members) {
- var member = entity.members[memberIndex];
+ if (this.frozen) graph.frozen = true;
+ return graph;
+ },
+ // Obliterates any existing entities
+ load: function load(entities) {
+ var base = this.base();
+ this.entities = Object.create(base.entities);
- if (!member.role || member.role === 'outer') {
- if (outerMember) return false;
- if (member.type !== 'way') return false;
- if (!graph.hasEntity(member.id)) return false;
- outerMember = graph.entity(member.id);
+ for (var i in entities) {
+ this.entities[i] = entities[i];
- if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
- return false;
- }
+ this._updateCalculated(base.entities[i], this.entities[i]);
}
- }
-
- return outerMember;
- } // For fixing up rendering of multipolygons with tags on the outer member.
- // https://github.com/openstreetmap/iD/issues/613
-
- function osmIsOldMultipolygonOuterMember(entity, graph) {
- if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) return false;
- var parents = graph.parentRelations(entity);
- if (parents.length !== 1) return false;
- var parent = parents[0];
- if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) return false;
- var members = parent.members,
- member;
- for (var i = 0; i < members.length; i++) {
- member = members[i];
- if (member.id === entity.id && member.role && member.role !== 'outer') return false; // Not outer member
+ return this;
+ }
+ };
- if (member.id !== entity.id && (!member.role || member.role === 'outer')) return false; // Not a simple multipolygon
+ function osmTurn(turn) {
+ if (!(this instanceof osmTurn)) {
+ return new osmTurn(turn);
}
- return parent;
+ Object.assign(this, turn);
}
- function osmOldMultipolygonOuterMember(entity, graph) {
- if (entity.type !== 'way') return false;
- var parents = graph.parentRelations(entity);
- if (parents.length !== 1) return false;
- var parent = parents[0];
- if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) return false;
- var members = parent.members,
- member,
- outerMember;
+ function osmIntersection(graph, startVertexId, maxDistance) {
+ maxDistance = maxDistance || 30; // in meters
- for (var i = 0; i < members.length; i++) {
- member = members[i];
+ var vgraph = coreGraph(); // virtual graph
- if (!member.role || member.role === 'outer') {
- if (outerMember) return false; // Not a simple multipolygon
+ var i, j, k;
- outerMember = member;
- }
+ function memberOfRestriction(entity) {
+ return graph.parentRelations(entity).some(function (r) {
+ return r.isRestriction();
+ });
}
- if (!outerMember) return false;
- var outerEntity = graph.hasEntity(outerMember.id);
- if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) return false;
- return outerEntity;
- } // Join `toJoin` array into sequences of connecting ways.
- // Segments which share identical start/end nodes will, as much as possible,
- // be connected with each other.
- //
- // The return value is a nested array. Each constituent array contains elements
- // of `toJoin` which have been determined to connect.
- //
- // Each consitituent array also has a `nodes` property whose value is an
- // ordered array of member nodes, with appropriate order reversal and
- // start/end coordinate de-duplication.
- //
- // Members of `toJoin` must have, at minimum, `type` and `id` properties.
- // Thus either an array of `osmWay`s or a relation member array may be used.
- //
- // If an member is an `osmWay`, its tags and childnodes may be reversed via
- // `actionReverse` in the output.
- //
- // The returned sequences array also has an `actions` array property, containing
- // any reversal actions that should be applied to the graph, should the calling
- // code attempt to actually join the given ways.
- //
- // Incomplete members (those for which `graph.hasEntity(element.id)` returns
- // false) and non-way members are ignored.
- //
-
- function osmJoinWays(toJoin, graph) {
- function resolve(member) {
- return graph.childNodes(graph.entity(member.id));
+ function isRoad(way) {
+ if (way.isArea() || way.isDegenerate()) return false;
+ var roads = {
+ 'motorway': true,
+ 'motorway_link': true,
+ 'trunk': true,
+ 'trunk_link': true,
+ 'primary': true,
+ 'primary_link': true,
+ 'secondary': true,
+ 'secondary_link': true,
+ 'tertiary': true,
+ 'tertiary_link': true,
+ 'residential': true,
+ 'unclassified': true,
+ 'living_street': true,
+ 'service': true,
+ 'road': true,
+ 'track': true
+ };
+ return roads[way.tags.highway];
}
- function reverse(item) {
- var action = actionReverse(item.id, {
- reverseOneway: true
- });
- sequences.actions.push(action);
- return item instanceof osmWay ? action(graph).entity(item.id) : item;
- } // make a copy containing only the items to join
+ var startNode = graph.entity(startVertexId);
+ var checkVertices = [startNode];
+ var checkWays;
+ var vertices = [];
+ var vertexIds = [];
+ var vertex;
+ var ways = [];
+ var wayIds = [];
+ var way;
+ var nodes = [];
+ var node;
+ var parents = [];
+ var parent; // `actions` will store whatever actions must be performed to satisfy
+ // preconditions for adding a turn restriction to this intersection.
+ // - Remove any existing degenerate turn restrictions (missing from/to, etc)
+ // - Reverse oneways so that they are drawn in the forward direction
+ // - Split ways on key vertices
+ var actions = []; // STEP 1: walk the graph outwards from starting vertex to search
+ // for more key vertices and ways to include in the intersection..
- toJoin = toJoin.filter(function (member) {
- return member.type === 'way' && graph.hasEntity(member.id);
- }); // Are the things we are joining relation members or `osmWays`?
- // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
+ while (checkVertices.length) {
+ vertex = checkVertices.pop(); // check this vertex for parent ways that are roads
- var i;
- var joinAsMembers = true;
+ checkWays = graph.parentWays(vertex);
+ var hasWays = false;
- for (i = 0; i < toJoin.length; i++) {
- if (toJoin[i] instanceof osmWay) {
- joinAsMembers = false;
- break;
- }
- }
+ for (i = 0; i < checkWays.length; i++) {
+ way = checkWays[i];
+ if (!isRoad(way) && !memberOfRestriction(way)) continue;
+ ways.push(way); // it's a road, or it's already in a turn restriction
- var sequences = [];
- sequences.actions = [];
+ hasWays = true; // check the way's children for more key vertices
- while (toJoin.length) {
- // start a new sequence
- var item = toJoin.shift();
- var currWays = [item];
- var currNodes = resolve(item).slice(); // add to it
+ nodes = utilArrayUniq(graph.childNodes(way));
- while (toJoin.length) {
- var start = currNodes[0];
- var end = currNodes[currNodes.length - 1];
- var fn = null;
- var nodes = null; // Find the next way/member to join.
+ for (j = 0; j < nodes.length; j++) {
+ node = nodes[j];
+ if (node === vertex) continue; // same thing
- for (i = 0; i < toJoin.length; i++) {
- item = toJoin[i];
- nodes = resolve(item); // (for member ordering only, not way ordering - see #4872)
- // Strongly prefer to generate a forward path that preserves the order
- // of the members array. For multipolygons and most relations, member
- // order does not matter - but for routes, it does. (see #4589)
- // If we started this sequence backwards (i.e. next member way attaches to
- // the start node and not the end node), reverse the initial way before continuing.
+ if (vertices.indexOf(node) !== -1) continue; // seen it already
- if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start || nodes[0] === start)) {
- currWays[0] = reverse(currWays[0]);
- currNodes.reverse();
- start = currNodes[0];
- end = currNodes[currNodes.length - 1];
- }
+ if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue; // too far from start
+ // a key vertex will have parents that are also roads
- if (nodes[0] === end) {
- fn = currNodes.push; // join to end
+ var hasParents = false;
+ parents = graph.parentWays(node);
- nodes = nodes.slice(1);
- break;
- } else if (nodes[nodes.length - 1] === end) {
- fn = currNodes.push; // join to end
+ for (k = 0; k < parents.length; k++) {
+ parent = parents[k];
+ if (parent === way) continue; // same thing
- nodes = nodes.slice(0, -1).reverse();
- item = reverse(item);
- break;
- } else if (nodes[nodes.length - 1] === start) {
- fn = currNodes.unshift; // join to beginning
+ if (ways.indexOf(parent) !== -1) continue; // seen it already
- nodes = nodes.slice(0, -1);
- break;
- } else if (nodes[0] === start) {
- fn = currNodes.unshift; // join to beginning
+ if (!isRoad(parent)) continue; // not a road
- nodes = nodes.slice(1).reverse();
- item = reverse(item);
+ hasParents = true;
break;
- } else {
- fn = nodes = null;
}
- }
- if (!nodes) {
- // couldn't find a joinable way/member
- break;
+ if (hasParents) {
+ checkVertices.push(node);
+ }
}
-
- fn.apply(currWays, [item]);
- fn.apply(currNodes, nodes);
- toJoin.splice(i, 1);
}
- currWays.nodes = currNodes;
- sequences.push(currWays);
+ if (hasWays) {
+ vertices.push(vertex);
+ }
}
- return sequences;
- }
-
- function actionAddMember(relationId, member, memberIndex, insertPair) {
- return function action(graph) {
- var relation = graph.entity(relationId); // There are some special rules for Public Transport v2 routes.
-
- var isPTv2 = /stop|platform/.test(member.role);
+ vertices = utilArrayUniq(vertices);
+ ways = utilArrayUniq(ways); // STEP 2: Build a virtual graph containing only the entities in the intersection..
+ // Everything done after this step should act on the virtual graph
+ // Any actions that must be performed later to the main graph go in `actions` array
- if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
- // Try to perform sensible inserts based on how the ways join together
- graph = addWayMember(relation, graph);
- } else {
- // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
- // Stops and Platforms for PTv2 should be ordered first.
- // hack: We do not currently have the ability to place them in the exactly correct order.
- if (isPTv2 && isNaN(memberIndex)) {
- memberIndex = 0;
+ ways.forEach(function (way) {
+ graph.childNodes(way).forEach(function (node) {
+ vgraph = vgraph.replace(node);
+ });
+ vgraph = vgraph.replace(way);
+ graph.parentRelations(way).forEach(function (relation) {
+ if (relation.isRestriction()) {
+ if (relation.isValidRestriction(graph)) {
+ vgraph = vgraph.replace(relation);
+ } else if (relation.isComplete(graph)) {
+ actions.push(actionDeleteRelation(relation.id));
+ }
}
+ });
+ }); // STEP 3: Force all oneways to be drawn in the forward direction
- graph = graph.replace(relation.addMember(member, memberIndex));
+ ways.forEach(function (w) {
+ var way = vgraph.entity(w.id);
+
+ if (way.tags.oneway === '-1') {
+ var action = actionReverse(way.id, {
+ reverseOneway: true
+ });
+ actions.push(action);
+ vgraph = action(vgraph);
}
+ }); // STEP 4: Split ways on key vertices
- return graph;
- }; // Add a way member into the relation "wherever it makes sense".
- // In this situation we were not supplied a memberIndex.
+ var origCount = osmEntity.id.next.way;
+ vertices.forEach(function (v) {
+ // This is an odd way to do it, but we need to find all the ways that
+ // will be split here, then split them one at a time to ensure that these
+ // actions can be replayed on the main graph exactly in the same order.
+ // (It is unintuitive, but the order of ways returned from graph.parentWays()
+ // is arbitrary, depending on how the main graph and vgraph were built)
+ var splitAll = actionSplit([v.id]).keepHistoryOn('first');
- function addWayMember(relation, graph) {
- var groups, tempWay, item, i, j, k; // remove PTv2 stops and platforms before doing anything.
+ if (!splitAll.disabled(vgraph)) {
+ splitAll.ways(vgraph).forEach(function (way) {
+ var splitOne = actionSplit([v.id]).limitWays([way.id]).keepHistoryOn('first');
+ actions.push(splitOne);
+ vgraph = splitOne(vgraph);
+ });
+ }
+ }); // In here is where we should also split the intersection at nearby junction.
+ // for https://github.com/mapbox/iD-internal/issues/31
+ // nearbyVertices.forEach(function(v) {
+ // });
+ // Reasons why we reset the way id count here:
+ // 1. Continuity with way ids created by the splits so that we can replay
+ // these actions later if the user decides to create a turn restriction
+ // 2. Avoids churning way ids just by hovering over a vertex
+ // and displaying the turn restriction editor
- var PTv2members = [];
- var members = [];
+ osmEntity.id.next.way = origCount; // STEP 5: Update arrays to point to vgraph entities
- for (i = 0; i < relation.members.length; i++) {
- var m = relation.members[i];
+ vertexIds = vertices.map(function (v) {
+ return v.id;
+ });
+ vertices = [];
+ ways = [];
+ vertexIds.forEach(function (id) {
+ var vertex = vgraph.entity(id);
+ var parents = vgraph.parentWays(vertex);
+ vertices.push(vertex);
+ ways = ways.concat(parents);
+ });
+ vertices = utilArrayUniq(vertices);
+ ways = utilArrayUniq(ways);
+ vertexIds = vertices.map(function (v) {
+ return v.id;
+ });
+ wayIds = ways.map(function (w) {
+ return w.id;
+ }); // STEP 6: Update the ways with some metadata that will be useful for
+ // walking the intersection graph later and rendering turn arrows.
- if (/stop|platform/.test(m.role)) {
- PTv2members.push(m);
- } else {
- members.push(m);
- }
- }
+ function withMetadata(way, vertexIds) {
+ var __oneWay = way.isOneWay(); // which affixes are key vertices?
- relation = relation.update({
- members: members
- });
- if (insertPair) {
- // We're adding a member that must stay paired with an existing member.
- // (This feature is used by `actionSplit`)
- //
- // This is tricky because the members may exist multiple times in the
- // member list, and with different A-B/B-A ordering and different roles.
- // (e.g. a bus route that loops out and back - #4589).
- //
- // Replace the existing member with a temporary way,
- // so that `osmJoinWays` can treat the pair like a single way.
- tempWay = osmWay({
- id: 'wTemp',
- nodes: insertPair.nodes
- });
- graph = graph.replace(tempWay);
- var tempMember = {
- id: tempWay.id,
- type: 'way',
- role: member.role
- };
- var tempRelation = relation.replaceMember({
- id: insertPair.originalID
- }, tempMember, true);
- groups = utilArrayGroupBy(tempRelation.members, 'type');
- groups.way = groups.way || [];
- } else {
- // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
- groups = utilArrayGroupBy(relation.members, 'type');
- groups.way = groups.way || [];
- groups.way.push(member);
- }
+ var __first = vertexIds.indexOf(way.first()) !== -1;
- members = withIndex(groups.way);
- var joined = osmJoinWays(members, graph); // `joined` might not contain all of the way members,
- // But will contain only the completed (downloaded) members
+ var __last = vertexIds.indexOf(way.last()) !== -1; // what roles is this way eligible for?
- for (i = 0; i < joined.length; i++) {
- var segment = joined[i];
- var nodes = segment.nodes.slice();
- var startIndex = segment[0].index; // j = array index in `members` where this segment starts
- for (j = 0; j < members.length; j++) {
- if (members[j].index === startIndex) {
- break;
- }
- } // k = each member in segment
+ var __via = __first && __last;
+ var __from = __first && !__oneWay || __last;
- for (k = 0; k < segment.length; k++) {
- item = segment[k];
- var way = graph.entity(item.id); // If this is a paired item, generate members in correct order and role
+ var __to = __first || __last && !__oneWay;
- if (tempWay && item.id === tempWay.id) {
- if (nodes[0].id === insertPair.nodes[0]) {
- item.pair = [{
- id: insertPair.originalID,
- type: 'way',
- role: item.role
- }, {
- id: insertPair.insertedID,
- type: 'way',
- role: item.role
- }];
- } else {
- item.pair = [{
- id: insertPair.insertedID,
- type: 'way',
- role: item.role
- }, {
- id: insertPair.originalID,
- type: 'way',
- role: item.role
- }];
- }
- } // reorder `members` if necessary
+ return way.update({
+ __first: __first,
+ __last: __last,
+ __from: __from,
+ __via: __via,
+ __to: __to,
+ __oneWay: __oneWay
+ });
+ }
+ ways = [];
+ wayIds.forEach(function (id) {
+ var way = withMetadata(vgraph.entity(id), vertexIds);
+ vgraph = vgraph.replace(way);
+ ways.push(way);
+ }); // STEP 7: Simplify - This is an iterative process where we:
+ // 1. Find trivial vertices with only 2 parents
+ // 2. trim off the leaf way from those vertices and remove from vgraph
- if (k > 0) {
- if (j + k >= members.length || item.index !== members[j + k].index) {
- moveMember(members, item.index, j + k);
- }
+ var keepGoing;
+ var removeWayIds = [];
+ var removeVertexIds = [];
+
+ do {
+ keepGoing = false;
+ checkVertices = vertexIds.slice();
+
+ for (i = 0; i < checkVertices.length; i++) {
+ var vertexId = checkVertices[i];
+ vertex = vgraph.hasEntity(vertexId);
+
+ if (!vertex) {
+ if (vertexIds.indexOf(vertexId) !== -1) {
+ vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
}
- nodes.splice(0, way.nodes.length - 1);
+ removeVertexIds.push(vertexId);
+ continue;
}
- }
- if (tempWay) {
- graph = graph.remove(tempWay);
- } // Final pass: skip dead items, split pairs, remove index properties
+ parents = vgraph.parentWays(vertex);
+ if (parents.length < 3) {
+ if (vertexIds.indexOf(vertexId) !== -1) {
+ vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
+ }
+ }
- var wayMembers = [];
+ if (parents.length === 2) {
+ // vertex with 2 parents is trivial
+ var a = parents[0];
+ var b = parents[1];
+ var aIsLeaf = a && !a.__via;
+ var bIsLeaf = b && !b.__via;
+ var leaf, survivor;
- for (i = 0; i < members.length; i++) {
- item = members[i];
- if (item.index === -1) continue;
+ if (aIsLeaf && !bIsLeaf) {
+ leaf = a;
+ survivor = b;
+ } else if (!aIsLeaf && bIsLeaf) {
+ leaf = b;
+ survivor = a;
+ }
- if (item.pair) {
- wayMembers.push(item.pair[0]);
- wayMembers.push(item.pair[1]);
- } else {
- wayMembers.push(utilObjectOmit(item, ['index']));
- }
- } // Put stops and platforms first, then nodes, ways, relations
- // This is recommended for Public Transport v2 routes:
- // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
+ if (leaf && survivor) {
+ survivor = withMetadata(survivor, vertexIds); // update survivor way
+ vgraph = vgraph.replace(survivor).remove(leaf); // update graph
- var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []);
- return graph.replace(relation.update({
- members: newMembers
- })); // `moveMember()` changes the `members` array in place by splicing
- // the item with `.index = findIndex` to where it belongs,
- // and marking the old position as "dead" with `.index = -1`
- //
- // j=5, k=0 jk
- // segment 5 4 7 6
- // members 0 1 2 3 4 5 6 7 8 9 keep 5 in j+k
- //
- // j=5, k=1 j k
- // segment 5 4 7 6
- // members 0 1 2 3 4 5 6 7 8 9 move 4 to j+k
- // members 0 1 2 3 x 5 4 6 7 8 9 moved
- //
- // j=5, k=2 j k
- // segment 5 4 7 6
- // members 0 1 2 3 x 5 4 6 7 8 9 move 7 to j+k
- // members 0 1 2 3 x 5 4 7 6 x 8 9 moved
- //
- // j=5, k=3 j k
- // segment 5 4 7 6
- // members 0 1 2 3 x 5 4 7 6 x 8 9 keep 6 in j+k
- //
+ removeWayIds.push(leaf.id);
+ keepGoing = true;
+ }
+ }
- function moveMember(arr, findIndex, toIndex) {
- var i;
+ parents = vgraph.parentWays(vertex);
- for (i = 0; i < arr.length; i++) {
- if (arr[i].index === findIndex) {
- break;
+ if (parents.length < 2) {
+ // vertex is no longer a key vertex
+ if (vertexIds.indexOf(vertexId) !== -1) {
+ vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
}
+
+ removeVertexIds.push(vertexId);
+ keepGoing = true;
}
- var item = Object.assign({}, arr[i]); // shallow copy
+ if (parents.length < 1) {
+ // vertex is no longer attached to anything
+ vgraph = vgraph.remove(vertex);
+ }
+ }
+ } while (keepGoing);
- arr[i].index = -1; // mark as dead
+ vertices = vertices.filter(function (vertex) {
+ return removeVertexIds.indexOf(vertex.id) === -1;
+ }).map(function (vertex) {
+ return vgraph.entity(vertex.id);
+ });
+ ways = ways.filter(function (way) {
+ return removeWayIds.indexOf(way.id) === -1;
+ }).map(function (way) {
+ return vgraph.entity(way.id);
+ }); // OK! Here is our intersection..
- item.index = toIndex;
- arr.splice(toIndex, 0, item);
- } // This is the same as `Relation.indexedMembers`,
- // Except we don't want to index all the members, only the ways
+ var intersection = {
+ graph: vgraph,
+ actions: actions,
+ vertices: vertices,
+ ways: ways
+ }; // Get all the valid turns through this intersection given a starting way id.
+ // This operates on the virtual graph for everything.
+ //
+ // Basically, walk through all possible paths from starting way,
+ // honoring the existing turn restrictions as we go (watch out for loops!)
+ //
+ // For each path found, generate and return a `osmTurn` datastructure.
+ //
+ intersection.turns = function (fromWayId, maxViaWay) {
+ if (!fromWayId) return [];
+ if (!maxViaWay) maxViaWay = 0;
+ var vgraph = intersection.graph;
+ var keyVertexIds = intersection.vertices.map(function (v) {
+ return v.id;
+ });
+ var start = vgraph.entity(fromWayId);
+ if (!start || !(start.__from || start.__via)) return []; // maxViaWay=0 from-*-to (0 vias)
+ // maxViaWay=1 from-*-via-*-to (1 via max)
+ // maxViaWay=2 from-*-via-*-via-*-to (2 vias max)
- function withIndex(arr) {
- var result = new Array(arr.length);
+ var maxPathLength = maxViaWay * 2 + 3;
+ var turns = [];
+ step(start);
+ return turns; // traverse the intersection graph and find all the valid paths
- for (var i = 0; i < arr.length; i++) {
- result[i] = Object.assign({}, arr[i]); // shallow copy
+ function step(entity, currPath, currRestrictions, matchedRestriction) {
+ currPath = (currPath || []).slice(); // shallow copy
- result[i].index = i;
- }
+ if (currPath.length >= maxPathLength) return;
+ currPath.push(entity.id);
+ currRestrictions = (currRestrictions || []).slice(); // shallow copy
- return result;
- }
- }
- }
+ var i, j;
- function actionAddMidpoint(midpoint, node) {
- return function (graph) {
- graph = graph.replace(node.move(midpoint.loc));
- var parents = utilArrayIntersection(graph.parentWays(graph.entity(midpoint.edge[0])), graph.parentWays(graph.entity(midpoint.edge[1])));
- parents.forEach(function (way) {
- for (var i = 0; i < way.nodes.length - 1; i++) {
- if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
- graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1)); // Add only one midpoint on doubled-back segments,
- // turning them into self-intersections.
+ if (entity.type === 'node') {
+ var parents = vgraph.parentWays(entity);
+ var nextWays = []; // which ways can we step into?
- return;
- }
- }
- });
- return graph;
- };
- }
+ for (i = 0; i < parents.length; i++) {
+ var way = parents[i]; // if next way is a oneway incoming to this vertex, skip
- // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
- function actionAddVertex(wayId, nodeId, index) {
- return function (graph) {
- return graph.replace(graph.entity(wayId).addNode(nodeId, index));
- };
- }
+ if (way.__oneWay && way.nodes[0] !== entity.id) continue; // if we have seen it before (allowing for an initial u-turn), skip
- function actionChangeMember(relationId, member, memberIndex) {
- return function (graph) {
- return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
- };
- }
+ if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue; // Check all "current" restrictions (where we've already walked the `FROM`)
- function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
- return function action(graph) {
- var entity = graph.entity(entityID);
- var geometry = entity.geometry(graph);
- var tags = entity.tags;
- if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
- if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
- return graph.replace(entity.update({
- tags: tags
- }));
- };
- }
+ var restrict = null;
- function actionChangeTags(entityId, tags) {
- return function (graph) {
- var entity = graph.entity(entityId);
- return graph.replace(entity.update({
- tags: tags
- }));
- };
- }
+ for (j = 0; j < currRestrictions.length; j++) {
+ var restriction = currRestrictions[j];
+ var f = restriction.memberByRole('from');
+ var v = restriction.membersByRole('via');
+ var t = restriction.memberByRole('to');
+ var isOnly = /^only_/.test(restriction.tags.restriction); // Does the current path match this turn restriction?
- function osmNode() {
- if (!(this instanceof osmNode)) {
- return new osmNode().initialize(arguments);
- } else if (arguments.length) {
- this.initialize(arguments);
- }
- }
- osmEntity.node = osmNode;
- osmNode.prototype = Object.create(osmEntity.prototype);
- Object.assign(osmNode.prototype, {
- type: 'node',
- loc: [9999, 9999],
- extent: function extent() {
- return new geoExtent(this.loc);
- },
- geometry: function geometry(graph) {
- return graph["transient"](this, 'geometry', function () {
- return graph.isPoi(this) ? 'point' : 'vertex';
- });
- },
- move: function move(loc) {
- return this.update({
- loc: loc
- });
- },
- isDegenerate: function isDegenerate() {
- 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);
- },
- // Inspect tags and geometry to determine which direction(s) this node/vertex points
- directions: function directions(resolver, projection) {
- var val;
- var i; // which tag to use?
+ var matchesFrom = f.id === fromWayId;
+ var matchesViaTo = false;
+ var isAlongOnlyPath = false;
- if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
- // all-way stop tag on a highway intersection
- val = 'all';
- } else {
- // generic direction tag
- val = (this.tags.direction || '').toLowerCase(); // better suffix-style direction tag
+ if (t.id === way.id) {
+ // match TO
+ if (v.length === 1 && v[0].type === 'node') {
+ // match VIA node
+ matchesViaTo = v[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2);
+ } else {
+ // match all VIA ways
+ var pathVias = [];
- var re = /:direction$/i;
- var keys = Object.keys(this.tags);
+ for (k = 2; k < currPath.length; k += 2) {
+ // k = 2 skips FROM
+ pathVias.push(currPath[k]); // (path goes way-node-way...)
+ }
- for (i = 0; i < keys.length; i++) {
- if (re.test(keys[i])) {
- val = this.tags[keys[i]].toLowerCase();
- break;
- }
- }
- }
+ var restrictionVias = [];
- if (val === '') return [];
- var cardinal = {
- north: 0,
- n: 0,
- northnortheast: 22,
- nne: 22,
- northeast: 45,
- ne: 45,
- eastnortheast: 67,
- ene: 67,
- east: 90,
- e: 90,
- eastsoutheast: 112,
- ese: 112,
- southeast: 135,
- se: 135,
- southsoutheast: 157,
- sse: 157,
- south: 180,
- s: 180,
- southsouthwest: 202,
- ssw: 202,
- southwest: 225,
- sw: 225,
- westsouthwest: 247,
- wsw: 247,
- west: 270,
- w: 270,
- westnorthwest: 292,
- wnw: 292,
- northwest: 315,
- nw: 315,
- northnorthwest: 337,
- nnw: 337
- };
- var values = val.split(';');
- var results = [];
- values.forEach(function (v) {
- // swap cardinal for numeric directions
- if (cardinal[v] !== undefined) {
- v = cardinal[v];
- } // numeric direction - just add to results
+ for (k = 0; k < v.length; k++) {
+ if (v[k].type === 'way') {
+ restrictionVias.push(v[k].id);
+ }
+ }
+ var diff = utilArrayDifference(pathVias, restrictionVias);
+ matchesViaTo = !diff.length;
+ }
+ } else if (isOnly) {
+ for (k = 0; k < v.length; k++) {
+ // way doesn't match TO, but is one of the via ways along the path of an "only"
+ if (v[k].type === 'way' && v[k].id === way.id) {
+ isAlongOnlyPath = true;
+ break;
+ }
+ }
+ }
- if (v !== '' && !isNaN(+v)) {
- results.push(+v);
- return;
- } // string direction - inspect parent ways
+ if (matchesViaTo) {
+ if (isOnly) {
+ restrict = {
+ id: restriction.id,
+ direct: matchesFrom,
+ from: f.id,
+ only: true,
+ end: true
+ };
+ } else {
+ restrict = {
+ id: restriction.id,
+ direct: matchesFrom,
+ from: f.id,
+ no: true,
+ end: true
+ };
+ }
+ } else {
+ // indirect - caused by a different nearby restriction
+ if (isAlongOnlyPath) {
+ restrict = {
+ id: restriction.id,
+ direct: false,
+ from: f.id,
+ only: true,
+ end: false
+ };
+ } else if (isOnly) {
+ restrict = {
+ id: restriction.id,
+ direct: false,
+ from: f.id,
+ no: true,
+ end: true
+ };
+ }
+ } // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
- var lookBackward = this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all';
- var lookForward = this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all';
- if (!lookForward && !lookBackward) return;
- var nodeIds = {};
- resolver.parentWays(this).forEach(function (parent) {
- var nodes = parent.nodes;
+ if (restrict && restrict.direct) break;
+ }
- for (i = 0; i < nodes.length; i++) {
- if (nodes[i] === this.id) {
- // match current entity
- if (lookForward && i > 0) {
- nodeIds[nodes[i - 1]] = true; // look back to prev node
+ nextWays.push({
+ way: way,
+ restrict: restrict
+ });
+ }
+
+ nextWays.forEach(function (nextWay) {
+ step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
+ });
+ } else {
+ // entity.type === 'way'
+ if (currPath.length >= 3) {
+ // this is a "complete" path..
+ var turnPath = currPath.slice(); // shallow copy
+ // an indirect restriction - only include the partial path (starting at FROM)
+
+ if (matchedRestriction && matchedRestriction.direct === false) {
+ for (i = 0; i < turnPath.length; i++) {
+ if (turnPath[i] === matchedRestriction.from) {
+ turnPath = turnPath.slice(i);
+ break;
+ }
+ }
+ }
+
+ var turn = pathToTurn(turnPath);
+
+ if (turn) {
+ if (matchedRestriction) {
+ turn.restrictionID = matchedRestriction.id;
+ turn.no = matchedRestriction.no;
+ turn.only = matchedRestriction.only;
+ turn.direct = matchedRestriction.direct;
}
- if (lookBackward && i < nodes.length - 1) {
- nodeIds[nodes[i + 1]] = true; // look ahead to next node
- }
- }
+ turns.push(osmTurn(turn));
+ }
+
+ if (currPath[0] === currPath[2]) return; // if we made a u-turn - stop here
+ }
+
+ if (matchedRestriction && matchedRestriction.end) return; // don't advance any further
+ // which nodes can we step into?
+
+ var n1 = vgraph.entity(entity.first());
+ var n2 = vgraph.entity(entity.last());
+ var dist = geoSphericalDistance(n1.loc, n2.loc);
+ var nextNodes = [];
+
+ if (currPath.length > 1) {
+ if (dist > maxDistance) return; // the next node is too far
+
+ if (!entity.__via) return; // this way is a leaf / can't be a via
}
- }, this);
- Object.keys(nodeIds).forEach(function (nodeId) {
- // +90 because geoAngle returns angle from X axis, not Y (north)
- results.push(geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI) + 90);
- }, this);
- }, this);
- return utilArrayUniq(results);
- },
- isEndpoint: function isEndpoint(resolver) {
- return resolver["transient"](this, 'isEndpoint', function () {
- var id = this.id;
- return resolver.parentWays(this).filter(function (parent) {
- return !parent.isClosed() && !!parent.affix(id);
- }).length > 0;
- });
- },
- isConnected: function isConnected(resolver) {
- return resolver["transient"](this, 'isConnected', function () {
- var parents = resolver.parentWays(this);
- if (parents.length > 1) {
- // vertex is connected to multiple parent ways
- for (var i in parents) {
- if (parents[i].geometry(resolver) === 'line' && parents[i].hasInterestingTags()) return true;
+ if (!entity.__oneWay && // bidirectional..
+ keyVertexIds.indexOf(n1.id) !== -1 && // key vertex..
+ currPath.indexOf(n1.id) === -1) {
+ // haven't seen it yet..
+ nextNodes.push(n1); // can advance to first node
}
- } else if (parents.length === 1) {
- var way = parents[0];
- var nodes = way.nodes.slice();
- if (way.isClosed()) {
- nodes.pop();
- } // ignore connecting node if closed
- // return true if vertex appears multiple times (way is self intersecting)
+ if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex..
+ currPath.indexOf(n2.id) === -1) {
+ // haven't seen it yet..
+ nextNodes.push(n2); // can advance to last node
+ }
+ nextNodes.forEach(function (nextNode) {
+ // gather restrictions FROM this way
+ var fromRestrictions = vgraph.parentRelations(entity).filter(function (r) {
+ if (!r.isRestriction()) return false;
+ var f = r.memberByRole('from');
+ if (!f || f.id !== entity.id) return false;
+ var isOnly = /^only_/.test(r.tags.restriction);
+ if (!isOnly) return true; // `only_` restrictions only matter along the direction of the VIA - #4849
- return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
- }
+ var isOnlyVia = false;
+ var v = r.membersByRole('via');
- return false;
- });
- },
- parentIntersectionWays: function parentIntersectionWays(resolver) {
- return resolver["transient"](this, 'parentIntersectionWays', function () {
- return resolver.parentWays(this).filter(function (parent) {
- return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === 'line';
- });
- });
- },
- isIntersection: function isIntersection(resolver) {
- return this.parentIntersectionWays(resolver).length > 1;
- },
- isHighwayIntersection: function isHighwayIntersection(resolver) {
- return resolver["transient"](this, 'isHighwayIntersection', function () {
- return resolver.parentWays(this).filter(function (parent) {
- return parent.tags.highway && parent.geometry(resolver) === 'line';
- }).length > 1;
- });
- },
- isOnAddressLine: function isOnAddressLine(resolver) {
- return resolver["transient"](this, 'isOnAddressLine', function () {
- return resolver.parentWays(this).filter(function (parent) {
- return parent.tags.hasOwnProperty('addr:interpolation') && parent.geometry(resolver) === 'line';
- }).length > 0;
- });
- },
- asJXON: function asJXON(changeset_id) {
- var r = {
- node: {
- '@id': this.osmId(),
- '@lon': this.loc[0],
- '@lat': this.loc[1],
- '@version': this.version || 0,
- tag: Object.keys(this.tags).map(function (k) {
- return {
- keyAttributes: {
- k: k,
- v: this.tags[k]
+ if (v.length === 1 && v[0].type === 'node') {
+ // via node
+ isOnlyVia = v[0].id === nextNode.id;
+ } else {
+ // via way(s)
+ for (var i = 0; i < v.length; i++) {
+ if (v[i].type !== 'way') continue;
+ var viaWay = vgraph.entity(v[i].id);
+
+ if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
+ isOnlyVia = true;
+ break;
+ }
+ }
}
- };
- }, this)
+
+ return isOnlyVia;
+ });
+ step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
+ });
}
- };
- if (changeset_id) r.node['@changeset'] = changeset_id;
- return r;
- },
- asGeoJSON: function asGeoJSON() {
- return {
- type: 'Point',
- coordinates: this.loc
- };
- }
- });
+ } // assumes path is alternating way-node-way of odd length
- function actionCircularize(wayId, projection, maxAngle) {
- maxAngle = (maxAngle || 20) * Math.PI / 180;
- var action = function action(graph, t) {
- if (t === null || !isFinite(t)) t = 1;
- t = Math.min(Math.max(+t, 0), 1);
- var way = graph.entity(wayId);
- var origNodes = {};
- graph.childNodes(way).forEach(function (node) {
- if (!origNodes[node.id]) origNodes[node.id] = node;
- });
+ function pathToTurn(path) {
+ if (path.length < 3) return;
+ var fromWayId, fromNodeId, fromVertexId;
+ var toWayId, toNodeId, toVertexId;
+ var viaWayIds, viaNodeId, isUturn;
+ fromWayId = path[0];
+ toWayId = path[path.length - 1];
- if (!way.isConvex(graph)) {
- graph = action.makeConvex(graph);
- }
+ if (path.length === 3 && fromWayId === toWayId) {
+ // u turn
+ var way = vgraph.entity(fromWayId);
+ if (way.__oneWay) return null;
+ isUturn = true;
+ viaNodeId = fromVertexId = toVertexId = path[1];
+ fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
+ } else {
+ isUturn = false;
+ fromVertexId = path[1];
+ fromNodeId = adjacentNode(fromWayId, fromVertexId);
+ toVertexId = path[path.length - 2];
+ toNodeId = adjacentNode(toWayId, toVertexId);
- var nodes = utilArrayUniq(graph.childNodes(way));
- var keyNodes = nodes.filter(function (n) {
- return graph.parentWays(n).length !== 1;
- });
- var points = nodes.map(function (n) {
- return projection(n.loc);
- });
- var keyPoints = keyNodes.map(function (n) {
- return projection(n.loc);
- });
- var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points);
- var radius = d3_median(points, function (p) {
- return geoVecLength(centroid, p);
- });
- var sign = d3_polygonArea(points) > 0 ? 1 : -1;
- var ids, i, j, k; // we need at least two key nodes for the algorithm to work
+ if (path.length === 3) {
+ viaNodeId = path[1];
+ } else {
+ viaWayIds = path.filter(function (entityId) {
+ return entityId[0] === 'w';
+ });
+ viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last
+ }
+ }
- if (!keyNodes.length) {
- keyNodes = [nodes[0]];
- keyPoints = [points[0]];
+ return {
+ key: path.join('_'),
+ path: path,
+ from: {
+ node: fromNodeId,
+ way: fromWayId,
+ vertex: fromVertexId
+ },
+ via: {
+ node: viaNodeId,
+ ways: viaWayIds
+ },
+ to: {
+ node: toNodeId,
+ way: toWayId,
+ vertex: toVertexId
+ },
+ u: isUturn
+ };
+
+ function adjacentNode(wayId, affixId) {
+ var nodes = vgraph.entity(wayId).nodes;
+ return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
+ }
}
+ };
- if (keyNodes.length === 1) {
- var index = nodes.indexOf(keyNodes[0]);
- var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
- keyNodes.push(nodes[oppositeIndex]);
- keyPoints.push(points[oppositeIndex]);
- } // key points and nodes are those connected to the ways,
- // they are projected onto the circle, in between nodes are moved
- // to constant intervals between key nodes, extra in between nodes are
- // added if necessary.
+ return intersection;
+ }
+ function osmInferRestriction(graph, turn, projection) {
+ var fromWay = graph.entity(turn.from.way);
+ var fromNode = graph.entity(turn.from.node);
+ var fromVertex = graph.entity(turn.from.vertex);
+ var toWay = graph.entity(turn.to.way);
+ var toNode = graph.entity(turn.to.node);
+ var toVertex = graph.entity(turn.to.vertex);
+ var fromOneWay = fromWay.tags.oneway === 'yes';
+ var toOneWay = toWay.tags.oneway === 'yes';
+ var angle = (geoAngle(fromVertex, fromNode, projection) - geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
+ while (angle < 0) {
+ angle += 360;
+ }
- for (i = 0; i < keyPoints.length; i++) {
- var nextKeyNodeIndex = (i + 1) % keyNodes.length;
- var startNode = keyNodes[i];
- var endNode = keyNodes[nextKeyNodeIndex];
- var startNodeIndex = nodes.indexOf(startNode);
- var endNodeIndex = nodes.indexOf(endNode);
- var numberNewPoints = -1;
- var indexRange = endNodeIndex - startNodeIndex;
- var nearNodes = {};
- var inBetweenNodes = [];
- var startAngle, endAngle, totalAngle, eachAngle;
- var angle, loc, node, origNode;
+ if (fromNode === toNode) {
+ return 'no_u_turn';
+ }
- if (indexRange < 0) {
- indexRange += nodes.length;
- } // position this key node
+ if ((angle < 23 || angle > 336) && fromOneWay && toOneWay) {
+ return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway
+ }
+ if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) {
+ return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to)
+ }
- var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4;
- keyPoints[i] = [centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius, centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius];
- loc = projection.invert(keyPoints[i]);
- node = keyNodes[i];
- origNode = origNodes[node.id];
- node = node.move(geoVecInterp(origNode.loc, loc, t));
- graph = graph.replace(node); // figure out the between delta angle we want to match to
+ if (angle < 158) {
+ return 'no_right_turn';
+ }
- startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
- endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
- totalAngle = endAngle - startAngle; // detects looping around -pi/pi
+ if (angle > 202) {
+ return 'no_left_turn';
+ }
- if (totalAngle * sign > 0) {
- totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
+ return 'no_straight_on';
+ }
+
+ function actionMergePolygon(ids, newRelationId) {
+ function groupEntities(graph) {
+ var entities = ids.map(function (id) {
+ return graph.entity(id);
+ });
+ var geometryGroups = utilArrayGroupBy(entities, function (entity) {
+ if (entity.type === 'way' && entity.isClosed()) {
+ return 'closedWay';
+ } else if (entity.type === 'relation' && entity.isMultipolygon()) {
+ return 'multipolygon';
+ } else {
+ return 'other';
}
+ });
+ return Object.assign({
+ closedWay: [],
+ multipolygon: [],
+ other: []
+ }, geometryGroups);
+ }
- do {
- numberNewPoints++;
- eachAngle = totalAngle / (indexRange + numberNewPoints);
- } while (Math.abs(eachAngle) > maxAngle); // move existing nodes
+ var action = function action(graph) {
+ var entities = groupEntities(graph); // An array representing all the polygons that are part of the multipolygon.
+ //
+ // Each element is itself an array of objects with an id property, and has a
+ // locs property which is an array of the locations forming the polygon.
+ var polygons = entities.multipolygon.reduce(function (polygons, m) {
+ return polygons.concat(osmJoinWays(m.members, graph));
+ }, []).concat(entities.closedWay.map(function (d) {
+ var member = [{
+ id: d.id
+ }];
+ member.nodes = graph.childNodes(d);
+ return member;
+ })); // contained is an array of arrays of boolean values,
+ // where contained[j][k] is true iff the jth way is
+ // contained by the kth way.
- for (j = 1; j < indexRange; j++) {
- angle = startAngle + j * eachAngle;
- loc = projection.invert([centroid[0] + Math.cos(angle) * radius, centroid[1] + Math.sin(angle) * radius]);
- node = nodes[(j + startNodeIndex) % nodes.length];
- origNode = origNodes[node.id];
- nearNodes[node.id] = angle;
- node = node.move(geoVecInterp(origNode.loc, loc, t));
- graph = graph.replace(node);
- } // add new in between nodes if necessary
+ var contained = polygons.map(function (w, i) {
+ return polygons.map(function (d, n) {
+ if (i === n) return null;
+ return geoPolygonContainsPolygon(d.nodes.map(function (n) {
+ return n.loc;
+ }), w.nodes.map(function (n) {
+ return n.loc;
+ }));
+ });
+ }); // Sort all polygons as either outer or inner ways
+ var members = [];
+ var outer = true;
- for (j = 0; j < numberNewPoints; j++) {
- angle = startAngle + (indexRange + j) * eachAngle;
- loc = projection.invert([centroid[0] + Math.cos(angle) * radius, centroid[1] + Math.sin(angle) * radius]); // choose a nearnode to use as the original
+ while (polygons.length) {
+ extractUncontained(polygons);
+ polygons = polygons.filter(isContained);
+ contained = contained.filter(isContained).map(filterContained);
+ }
- var min = Infinity;
+ function isContained(d, i) {
+ return contained[i].some(function (val) {
+ return val;
+ });
+ }
- for (var nodeId in nearNodes) {
- var nearAngle = nearNodes[nodeId];
- var dist = Math.abs(nearAngle - angle);
+ function filterContained(d) {
+ return d.filter(isContained);
+ }
- if (dist < min) {
- min = dist;
- origNode = origNodes[nodeId];
- }
+ function extractUncontained(polygons) {
+ polygons.forEach(function (d, i) {
+ if (!isContained(d, i)) {
+ d.forEach(function (member) {
+ members.push({
+ type: 'way',
+ id: member.id,
+ role: outer ? 'outer' : 'inner'
+ });
+ });
}
-
- node = osmNode({
- loc: geoVecInterp(origNode.loc, loc, t)
- });
- graph = graph.replace(node);
- nodes.splice(endNodeIndex + j, 0, node);
- inBetweenNodes.push(node.id);
- } // Check for other ways that share these keyNodes..
- // If keyNodes are adjacent in both ways,
- // we can add inBetweenNodes to that shared way too..
+ });
+ outer = !outer;
+ } // Move all tags to one relation.
+ // Keep the oldest multipolygon alive if it exists.
- if (indexRange === 1 && inBetweenNodes.length) {
- var startIndex1 = way.nodes.lastIndexOf(startNode.id);
- var endIndex1 = way.nodes.lastIndexOf(endNode.id);
- var wayDirection1 = endIndex1 - startIndex1;
+ var relation;
- if (wayDirection1 < -1) {
- wayDirection1 = 1;
+ if (entities.multipolygon.length > 0) {
+ var oldestID = utilOldestID(entities.multipolygon.map(function (entity) {
+ return entity.id;
+ }));
+ relation = entities.multipolygon.find(function (entity) {
+ return entity.id === oldestID;
+ });
+ } else {
+ relation = osmRelation({
+ id: newRelationId,
+ tags: {
+ type: 'multipolygon'
}
+ });
+ }
- var parentWays = graph.parentWays(keyNodes[i]);
-
- for (j = 0; j < parentWays.length; j++) {
- var sharedWay = parentWays[j];
- if (sharedWay === way) continue;
+ entities.multipolygon.forEach(function (m) {
+ if (m.id !== relation.id) {
+ relation = relation.mergeTags(m.tags);
+ graph = graph.remove(m);
+ }
+ });
+ entities.closedWay.forEach(function (way) {
+ function isThisOuter(m) {
+ return m.id === way.id && m.role !== 'inner';
+ }
- if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
- var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
- var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
- var wayDirection2 = endIndex2 - startIndex2;
- var insertAt = endIndex2;
+ if (members.some(isThisOuter)) {
+ relation = relation.mergeTags(way.tags);
+ graph = graph.replace(way.update({
+ tags: {}
+ }));
+ }
+ });
+ return graph.replace(relation.update({
+ members: members,
+ tags: utilObjectOmit(relation.tags, ['area'])
+ }));
+ };
- if (wayDirection2 < -1) {
- wayDirection2 = 1;
- }
+ action.disabled = function (graph) {
+ var entities = groupEntities(graph);
- if (wayDirection1 !== wayDirection2) {
- inBetweenNodes.reverse();
- insertAt = startIndex2;
- }
+ if (entities.other.length > 0 || entities.closedWay.length + entities.multipolygon.length < 2) {
+ return 'not_eligible';
+ }
- for (k = 0; k < inBetweenNodes.length; k++) {
- sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
- }
+ if (!entities.multipolygon.every(function (r) {
+ return r.isComplete(graph);
+ })) {
+ return 'incomplete_relation';
+ }
- graph = graph.replace(sharedWay);
- }
+ if (!entities.multipolygon.length) {
+ var sharedMultipolygons = [];
+ entities.closedWay.forEach(function (way, i) {
+ if (i === 0) {
+ sharedMultipolygons = graph.parentMultipolygons(way);
+ } else {
+ sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way));
}
+ });
+ sharedMultipolygons = sharedMultipolygons.filter(function (relation) {
+ return relation.members.length === entities.closedWay.length;
+ });
+
+ if (sharedMultipolygons.length) {
+ // don't create a new multipolygon if it'd be redundant
+ return 'not_eligible';
}
- } // update the way to have all the new nodes
+ } else if (entities.closedWay.some(function (way) {
+ return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length;
+ })) {
+ // don't add a way to a multipolygon again if it's already a member
+ return 'not_eligible';
+ }
+ };
+ return action;
+ }
- ids = nodes.map(function (n) {
- return n.id;
- });
- ids.push(ids[0]);
- way = way.update({
- nodes: ids
- });
- graph = graph.replace(way);
- return graph;
- };
+ var DESCRIPTORS$1 = descriptors;
+ var objectDefinePropertyModule = objectDefineProperty;
+ var regExpFlags = regexpFlags$1;
+ var fails$4 = fails$V;
- action.makeConvex = function (graph) {
- var way = graph.entity(wayId);
- var nodes = utilArrayUniq(graph.childNodes(way));
- var points = nodes.map(function (n) {
- return projection(n.loc);
- });
- var sign = d3_polygonArea(points) > 0 ? 1 : -1;
- var hull = d3_polygonHull(points);
- var i, j; // D3 convex hulls go counterclockwise..
+ var RegExpPrototype = RegExp.prototype;
+
+ var FORCED$2 = DESCRIPTORS$1 && fails$4(function () {
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ return Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call({ dotAll: true, sticky: true }) !== 'sy';
+ });
+
+ // `RegExp.prototype.flags` getter
+ // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
+ if (FORCED$2) objectDefinePropertyModule.f(RegExpPrototype, 'flags', {
+ configurable: true,
+ get: regExpFlags
+ });
+
+ var fastDeepEqual = function equal(a, b) {
+ if (a === b) return true;
+
+ if (a && b && _typeof(a) == 'object' && _typeof(b) == 'object') {
+ if (a.constructor !== b.constructor) return false;
+ var length, i, keys;
+
+ if (Array.isArray(a)) {
+ length = a.length;
+ if (length != b.length) return false;
+
+ for (i = length; i-- !== 0;) {
+ if (!equal(a[i], b[i])) return false;
+ }
- if (sign === -1) {
- nodes.reverse();
- points.reverse();
+ return true;
}
- for (i = 0; i < hull.length - 1; i++) {
- var startIndex = points.indexOf(hull[i]);
- var endIndex = points.indexOf(hull[i + 1]);
- var indexRange = endIndex - startIndex;
-
- if (indexRange < 0) {
- indexRange += nodes.length;
- } // move interior nodes to the surface of the convex hull..
+ if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
+ if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
+ if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
+ keys = Object.keys(a);
+ length = keys.length;
+ if (length !== Object.keys(b).length) return false;
+ for (i = length; i-- !== 0;) {
+ if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
+ }
- for (j = 1; j < indexRange; j++) {
- var point = geoVecInterp(hull[i], hull[i + 1], j / indexRange);
- var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
- graph = graph.replace(node);
- }
+ for (i = length; i-- !== 0;) {
+ var key = keys[i];
+ if (!equal(a[key], b[key])) return false;
}
- return graph;
- };
+ return true;
+ } // true if both NaN, false otherwise
- action.disabled = function (graph) {
- if (!graph.entity(wayId).isClosed()) {
- return 'not_closed';
- } //disable when already circular
+ return a !== a && b !== b;
+ };
- var way = graph.entity(wayId);
- var nodes = utilArrayUniq(graph.childNodes(way));
- var points = nodes.map(function (n) {
- return projection(n.loc);
- });
- var hull = d3_polygonHull(points);
- var epsilonAngle = Math.PI / 180;
+ // J. W. Hunt and M. D. McIlroy, An algorithm for differential buffer
+ // comparison, Bell Telephone Laboratories CSTR #41 (1976)
+ // http://www.cs.dartmouth.edu/~doug/
+ // https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
+ //
+ // Expects two arrays, finds longest common sequence
- if (hull.length !== points.length || hull.length < 3) {
- return false;
- }
+ function LCS(buffer1, buffer2) {
+ var equivalenceClasses = {};
- var centroid = d3_polygonCentroid(points);
- var radius = geoVecLengthSquare(centroid, points[0]);
- var i, actualPoint; // compare distances between centroid and points
+ for (var j = 0; j < buffer2.length; j++) {
+ var item = buffer2[j];
- for (i = 0; i < hull.length; i++) {
- actualPoint = hull[i];
- var actualDist = geoVecLengthSquare(actualPoint, centroid);
- var diff = Math.abs(actualDist - radius); //compare distances with epsilon-error (5%)
+ if (equivalenceClasses[item]) {
+ equivalenceClasses[item].push(j);
+ } else {
+ equivalenceClasses[item] = [j];
+ }
+ }
- if (diff > 0.05 * radius) {
- return false;
- }
- } //check if central angles are smaller than maxAngle
+ var NULLRESULT = {
+ buffer1index: -1,
+ buffer2index: -1,
+ chain: null
+ };
+ var candidates = [NULLRESULT];
+ for (var i = 0; i < buffer1.length; i++) {
+ var _item = buffer1[i];
+ var buffer2indices = equivalenceClasses[_item] || [];
+ var r = 0;
+ var c = candidates[0];
- for (i = 0; i < hull.length; i++) {
- actualPoint = hull[i];
- var nextPoint = hull[(i + 1) % hull.length];
- var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]);
- var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]);
- var angle = endAngle - startAngle;
+ for (var jx = 0; jx < buffer2indices.length; jx++) {
+ var _j = buffer2indices[jx];
+ var s = void 0;
- if (angle < 0) {
- angle = -angle;
+ for (s = r; s < candidates.length; s++) {
+ if (candidates[s].buffer2index < _j && (s === candidates.length - 1 || candidates[s + 1].buffer2index > _j)) {
+ break;
+ }
}
- if (angle > Math.PI) {
- angle = 2 * Math.PI - angle;
- }
+ if (s < candidates.length) {
+ var newCandidate = {
+ buffer1index: i,
+ buffer2index: _j,
+ chain: candidates[s]
+ };
- if (angle > maxAngle + epsilonAngle) {
- return false;
+ if (r === candidates.length) {
+ candidates.push(c);
+ } else {
+ candidates[r] = c;
+ }
+
+ r = s + 1;
+ c = newCandidate;
+
+ if (r === candidates.length) {
+ break; // no point in examining further (j)s
+ }
}
}
- return 'already_circular';
- };
+ candidates[r] = c;
+ } // At this point, we know the LCS: it's in the reverse of the
+ // linked-list through .chain of candidates[candidates.length - 1].
- action.transitionable = true;
- return action;
- }
- function actionDeleteWay(wayID) {
- function canDeleteNode(node, graph) {
- // don't delete nodes still attached to ways or relations
- if (graph.parentWays(node).length || graph.parentRelations(node).length) return false;
- var geometries = osmNodeGeometriesForTags(node.tags); // don't delete if this node can be a standalone point
+ return candidates[candidates.length - 1];
+ } // We apply the LCS to build a 'comm'-style picture of the
+ // offsets and lengths of mismatched chunks in the input
+ // buffers. This is used by diff3MergeRegions.
- if (geometries.point) return false; // delete if this node only be a vertex
- if (geometries.vertex) return true; // iD doesn't know if this should be a point or vertex,
- // so only delete if there are no interesting tags
+ function diffIndices(buffer1, buffer2) {
+ var lcs = LCS(buffer1, buffer2);
+ var result = [];
+ var tail1 = buffer1.length;
+ var tail2 = buffer2.length;
- return !node.hasInterestingTags();
- }
+ for (var candidate = lcs; candidate !== null; candidate = candidate.chain) {
+ var mismatchLength1 = tail1 - candidate.buffer1index - 1;
+ var mismatchLength2 = tail2 - candidate.buffer2index - 1;
+ tail1 = candidate.buffer1index;
+ tail2 = candidate.buffer2index;
- var action = function action(graph) {
- var way = graph.entity(wayID);
- graph.parentRelations(way).forEach(function (parent) {
- parent = parent.removeMembersWithID(wayID);
- graph = graph.replace(parent);
+ if (mismatchLength1 || mismatchLength2) {
+ result.push({
+ buffer1: [tail1 + 1, mismatchLength1],
+ buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1),
+ buffer2: [tail2 + 1, mismatchLength2],
+ buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2)
+ });
+ }
+ }
- if (parent.isDegenerate()) {
- graph = actionDeleteRelation(parent.id)(graph);
- }
- });
- new Set(way.nodes).forEach(function (nodeID) {
- graph = graph.replace(way.removeNode(nodeID));
- var node = graph.entity(nodeID);
+ result.reverse();
+ return result;
+ } // We apply the LCS to build a JSON representation of a
+ // independently derived from O, returns a fairly complicated
+ // internal representation of merge decisions it's taken. The
+ // interested reader may wish to consult
+ //
+ // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
+ // 'A Formal Investigation of ' In Arvind and Prasad,
+ // editors, Foundations of Software Technology and Theoretical
+ // Computer Science (FSTTCS), December 2007.
+ //
+ // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
+ //
- if (canDeleteNode(node, graph)) {
- graph = graph.remove(node);
- }
- });
- return graph.remove(way);
- };
- return action;
- }
+ function diff3MergeRegions(a, o, b) {
+ // "hunks" are array subsets where `a` or `b` are different from `o`
+ // https://www.gnu.org/software/diffutils/manual/html_node/diff3-Hunks.html
+ var hunks = [];
- function actionDeleteMultiple(ids) {
- var actions = {
- way: actionDeleteWay,
- node: actionDeleteNode,
- relation: actionDeleteRelation
- };
+ function addHunk(h, ab) {
+ hunks.push({
+ ab: ab,
+ oStart: h.buffer1[0],
+ oLength: h.buffer1[1],
+ // length of o to remove
+ abStart: h.buffer2[0],
+ abLength: h.buffer2[1] // length of a/b to insert
+ // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1])
- var action = function action(graph) {
- ids.forEach(function (id) {
- if (graph.hasEntity(id)) {
- // It may have been deleted already.
- graph = actions[graph.entity(id).type](id)(graph);
- }
});
- return graph;
- };
+ }
- return action;
- }
+ diffIndices(o, a).forEach(function (item) {
+ return addHunk(item, 'a');
+ });
+ diffIndices(o, b).forEach(function (item) {
+ return addHunk(item, 'b');
+ });
+ hunks.sort(function (x, y) {
+ return x.oStart - y.oStart;
+ });
+ var results = [];
+ var currOffset = 0;
- function actionDeleteRelation(relationID, allowUntaggedMembers) {
- function canDeleteEntity(entity, graph) {
- return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && !entity.hasInterestingTags() && !allowUntaggedMembers;
+ function advanceTo(endOffset) {
+ if (endOffset > currOffset) {
+ results.push({
+ stable: true,
+ buffer: 'o',
+ bufferStart: currOffset,
+ bufferLength: endOffset - currOffset,
+ bufferContent: o.slice(currOffset, endOffset)
+ });
+ currOffset = endOffset;
+ }
}
- var action = function action(graph) {
- var relation = graph.entity(relationID);
- graph.parentRelations(relation).forEach(function (parent) {
- parent = parent.removeMembersWithID(relationID);
- graph = graph.replace(parent);
+ while (hunks.length) {
+ var hunk = hunks.shift();
+ var regionStart = hunk.oStart;
+ var regionEnd = hunk.oStart + hunk.oLength;
+ var regionHunks = [hunk];
+ advanceTo(regionStart); // Try to pull next overlapping hunk into this region
- if (parent.isDegenerate()) {
- graph = actionDeleteRelation(parent.id)(graph);
+ while (hunks.length) {
+ var nextHunk = hunks[0];
+ var nextHunkStart = nextHunk.oStart;
+ if (nextHunkStart > regionEnd) break; // no overlap
+
+ regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength);
+ regionHunks.push(hunks.shift());
+ }
+
+ if (regionHunks.length === 1) {
+ // Only one hunk touches this region, meaning that there is no conflict here.
+ // Either `a` or `b` is inserting into a region of `o` unchanged by the other.
+ if (hunk.abLength > 0) {
+ var buffer = hunk.ab === 'a' ? a : b;
+ results.push({
+ stable: true,
+ buffer: hunk.ab,
+ bufferStart: hunk.abStart,
+ bufferLength: hunk.abLength,
+ bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength)
+ });
}
- });
- var memberIDs = utilArrayUniq(relation.members.map(function (m) {
- return m.id;
- }));
- memberIDs.forEach(function (memberID) {
- graph = graph.replace(relation.removeMembersWithID(memberID));
- var entity = graph.entity(memberID);
+ } else {
+ // A true a/b conflict. Determine the bounds involved from `a`, `o`, and `b`.
+ // Effectively merge all the `a` hunks into one giant hunk, then do the
+ // same for the `b` hunks; then, correct for skew in the regions of `o`
+ // that each side changed, and report appropriate spans for the three sides.
+ var bounds = {
+ a: [a.length, -1, o.length, -1],
+ b: [b.length, -1, o.length, -1]
+ };
- if (canDeleteEntity(entity, graph)) {
- graph = actionDeleteMultiple([memberID])(graph);
+ while (regionHunks.length) {
+ hunk = regionHunks.shift();
+ var oStart = hunk.oStart;
+ var oEnd = oStart + hunk.oLength;
+ var abStart = hunk.abStart;
+ var abEnd = abStart + hunk.abLength;
+ var _b = bounds[hunk.ab];
+ _b[0] = Math.min(abStart, _b[0]);
+ _b[1] = Math.max(abEnd, _b[1]);
+ _b[2] = Math.min(oStart, _b[2]);
+ _b[3] = Math.max(oEnd, _b[3]);
}
- });
- return graph.remove(relation);
- };
- return action;
- }
+ var aStart = bounds.a[0] + (regionStart - bounds.a[2]);
+ var aEnd = bounds.a[1] + (regionEnd - bounds.a[3]);
+ var bStart = bounds.b[0] + (regionStart - bounds.b[2]);
+ var bEnd = bounds.b[1] + (regionEnd - bounds.b[3]);
+ var result = {
+ stable: false,
+ aStart: aStart,
+ aLength: aEnd - aStart,
+ aContent: a.slice(aStart, aEnd),
+ oStart: regionStart,
+ oLength: regionEnd - regionStart,
+ oContent: o.slice(regionStart, regionEnd),
+ bStart: bStart,
+ bLength: bEnd - bStart,
+ bContent: b.slice(bStart, bEnd)
+ };
+ results.push(result);
+ }
- function actionDeleteNode(nodeId) {
- var action = function action(graph) {
- var node = graph.entity(nodeId);
- graph.parentWays(node).forEach(function (parent) {
- parent = parent.removeNode(nodeId);
- graph = graph.replace(parent);
+ currOffset = regionEnd;
+ }
- if (parent.isDegenerate()) {
- graph = actionDeleteWay(parent.id)(graph);
- }
- });
- graph.parentRelations(node).forEach(function (parent) {
- parent = parent.removeMembersWithID(nodeId);
- graph = graph.replace(parent);
+ advanceTo(o.length);
+ return results;
+ } // Applies the output of diff3MergeRegions to actually
+ // construct the merged buffer; the returned result alternates
+ // between 'ok' and 'conflict' blocks.
+ // A "false conflict" is where `a` and `b` both change the same from `o`
- if (parent.isDegenerate()) {
- graph = actionDeleteRelation(parent.id)(graph);
- }
- });
- return graph.remove(node);
- };
- return action;
- }
+ function diff3Merge(a, o, b, options) {
+ var defaults = {
+ excludeFalseConflicts: true,
+ stringSeparator: /\s+/
+ };
+ options = Object.assign(defaults, options);
+ var aString = typeof a === 'string';
+ var oString = typeof o === 'string';
+ var bString = typeof b === 'string';
+ if (aString) a = a.split(options.stringSeparator);
+ if (oString) o = o.split(options.stringSeparator);
+ if (bString) b = b.split(options.stringSeparator);
+ var results = [];
+ var regions = diff3MergeRegions(a, o, b);
+ var okBuffer = [];
- //
- // First choose a node to be the survivor, with preference given
- // to an existing (not new) node.
- //
- // Tags and relation memberships of of non-surviving nodes are merged
- // to the survivor.
- //
- // This is the inverse of `iD.actionDisconnect`.
- //
- // Reference:
- // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
- // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
- //
+ function flushOk() {
+ if (okBuffer.length) {
+ results.push({
+ ok: okBuffer
+ });
+ }
- function actionConnect(nodeIDs) {
- var action = function action(graph) {
- var survivor;
- var node;
- var parents;
- var i, j; // Choose a survivor node, prefer an existing (not new) node - #4974
+ okBuffer = [];
+ }
- for (i = 0; i < nodeIDs.length; i++) {
- survivor = graph.entity(nodeIDs[i]);
- if (survivor.version) break; // found one
- } // Replace all non-surviving nodes with the survivor and merge tags.
+ function isFalseConflict(a, b) {
+ if (a.length !== b.length) return false;
+ for (var i = 0; i < a.length; i++) {
+ if (a[i] !== b[i]) return false;
+ }
- for (i = 0; i < nodeIDs.length; i++) {
- node = graph.entity(nodeIDs[i]);
- if (node.id === survivor.id) continue;
- parents = graph.parentWays(node);
+ return true;
+ }
- for (j = 0; j < parents.length; j++) {
- graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
- }
+ regions.forEach(function (region) {
+ if (region.stable) {
+ var _okBuffer;
- parents = graph.parentRelations(node);
+ (_okBuffer = okBuffer).push.apply(_okBuffer, _toConsumableArray(region.bufferContent));
+ } else {
+ if (options.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) {
+ var _okBuffer2;
- for (j = 0; j < parents.length; j++) {
- graph = graph.replace(parents[j].replaceMember(node, survivor));
+ (_okBuffer2 = okBuffer).push.apply(_okBuffer2, _toConsumableArray(region.aContent));
+ } else {
+ flushOk();
+ results.push({
+ conflict: {
+ a: region.aContent,
+ aIndex: region.aStart,
+ o: region.oContent,
+ oIndex: region.oStart,
+ b: region.bContent,
+ bIndex: region.bStart
+ }
+ });
}
-
- survivor = survivor.mergeTags(node.tags);
- graph = actionDeleteNode(node.id)(graph);
}
+ });
+ flushOk();
+ return results;
+ }
- graph = graph.replace(survivor); // find and delete any degenerate ways created by connecting adjacent vertices
+ var lodash = {exports: {}};
- parents = graph.parentWays(survivor);
+ (function (module, exports) {
+ (function () {
+ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
+ var undefined$1;
+ /** Used as the semantic version number. */
+
+ var VERSION = '4.17.21';
+ /** Used as the size to enable large array optimizations. */
+
+ var LARGE_ARRAY_SIZE = 200;
+ /** Error message constants. */
+
+ var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
+ FUNC_ERROR_TEXT = 'Expected a function',
+ INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';
+ /** Used to stand-in for `undefined` hash values. */
+
+ var HASH_UNDEFINED = '__lodash_hash_undefined__';
+ /** Used as the maximum memoize cache size. */
+
+ var MAX_MEMOIZE_SIZE = 500;
+ /** Used as the internal argument placeholder. */
+
+ var PLACEHOLDER = '__lodash_placeholder__';
+ /** Used to compose bitmasks for cloning. */
+
+ var CLONE_DEEP_FLAG = 1,
+ CLONE_FLAT_FLAG = 2,
+ CLONE_SYMBOLS_FLAG = 4;
+ /** Used to compose bitmasks for value comparisons. */
+
+ var COMPARE_PARTIAL_FLAG = 1,
+ COMPARE_UNORDERED_FLAG = 2;
+ /** Used to compose bitmasks for function metadata. */
+
+ 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;
+ /** Used as default options for `_.truncate`. */
+
+ var DEFAULT_TRUNC_LENGTH = 30,
+ DEFAULT_TRUNC_OMISSION = '...';
+ /** Used to detect hot functions by number of calls within a span of milliseconds. */
+
+ var HOT_COUNT = 800,
+ HOT_SPAN = 16;
+ /** Used to indicate the type of lazy iteratees. */
+
+ var LAZY_FILTER_FLAG = 1,
+ LAZY_MAP_FLAG = 2,
+ LAZY_WHILE_FLAG = 3;
+ /** Used as references for various `Number` constants. */
+
+ var INFINITY = 1 / 0,
+ MAX_SAFE_INTEGER = 9007199254740991,
+ MAX_INTEGER = 1.7976931348623157e+308,
+ NAN = 0 / 0;
+ /** Used as references for the maximum length and index of an array. */
+
+ var MAX_ARRAY_LENGTH = 4294967295,
+ MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
+ HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
+ /** Used to associate wrap methods with their bit flags. */
+
+ var wrapFlags = [['ary', WRAP_ARY_FLAG], ['bind', WRAP_BIND_FLAG], ['bindKey', WRAP_BIND_KEY_FLAG], ['curry', WRAP_CURRY_FLAG], ['curryRight', WRAP_CURRY_RIGHT_FLAG], ['flip', WRAP_FLIP_FLAG], ['partial', WRAP_PARTIAL_FLAG], ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], ['rearg', WRAP_REARG_FLAG]];
+ /** `Object#toString` result references. */
+
+ var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ asyncTag = '[object AsyncFunction]',
+ boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ domExcTag = '[object DOMException]',
+ errorTag = '[object Error]',
+ funcTag = '[object Function]',
+ genTag = '[object GeneratorFunction]',
+ mapTag = '[object Map]',
+ numberTag = '[object Number]',
+ nullTag = '[object Null]',
+ objectTag = '[object Object]',
+ promiseTag = '[object Promise]',
+ proxyTag = '[object Proxy]',
+ regexpTag = '[object RegExp]',
+ setTag = '[object Set]',
+ stringTag = '[object String]',
+ symbolTag = '[object Symbol]',
+ undefinedTag = '[object Undefined]',
+ weakMapTag = '[object WeakMap]',
+ weakSetTag = '[object WeakSet]';
+ var arrayBufferTag = '[object ArrayBuffer]',
+ dataViewTag = '[object DataView]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+ /** Used to match empty string literals in compiled template source. */
+
+ var reEmptyStringLeading = /\b__p \+= '';/g,
+ reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
+ reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
+ /** Used to match HTML entities and HTML characters. */
+
+ var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
+ reUnescapedHtml = /[&<>"']/g,
+ reHasEscapedHtml = RegExp(reEscapedHtml.source),
+ reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+ /** Used to match template delimiters. */
+
+ var reEscape = /<%-([\s\S]+?)%>/g,
+ reEvaluate = /<%([\s\S]+?)%>/g,
+ reInterpolate = /<%=([\s\S]+?)%>/g;
+ /** Used to match property names within property paths. */
+
+ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
+ reIsPlainProp = /^\w*$/,
+ rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
+ /**
+ * Used to match `RegExp`
+ * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+ */
- for (i = 0; i < parents.length; i++) {
- if (parents[i].isDegenerate()) {
- graph = actionDeleteWay(parents[i].id)(graph);
- }
- }
+ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
+ reHasRegExpChar = RegExp(reRegExpChar.source);
+ /** Used to match leading whitespace. */
- return graph;
- };
+ var reTrimStart = /^\s+/;
+ /** Used to match a single whitespace character. */
- action.disabled = function (graph) {
- var seen = {};
- var restrictionIDs = [];
- var survivor;
- var node, way;
- var relations, relation, role;
- var i, j, k; // Choose a survivor node, prefer an existing (not new) node - #4974
+ var reWhitespace = /\s/;
+ /** Used to match wrap detail comments. */
- for (i = 0; i < nodeIDs.length; i++) {
- survivor = graph.entity(nodeIDs[i]);
- if (survivor.version) break; // found one
- } // 1. disable if the nodes being connected have conflicting relation roles
+ var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
+ reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
+ reSplitDetails = /,? & /;
+ /** Used to match words composed of alphanumeric characters. */
+ var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
+ /**
+ * Used to validate the `validate` option in `_.template` variable.
+ *
+ * Forbids characters which could potentially change the meaning of the function argument definition:
+ * - "()," (modification of function parameters)
+ * - "=" (default value)
+ * - "[]{}" (destructuring of function parameters)
+ * - "/" (beginning of a comment)
+ * - whitespace
+ */
- for (i = 0; i < nodeIDs.length; i++) {
- node = graph.entity(nodeIDs[i]);
- relations = graph.parentRelations(node);
+ var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
+ /** Used to match backslashes in property paths. */
- for (j = 0; j < relations.length; j++) {
- relation = relations[j];
- role = relation.memberById(node.id).role || ''; // if this node is a via node in a restriction, remember for later
+ var reEscapeChar = /\\(\\)?/g;
+ /**
+ * Used to match
+ * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
+ */
- if (relation.hasFromViaTo()) {
- restrictionIDs.push(relation.id);
- }
+ var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
+ /** Used to match `RegExp` flags from their coerced string values. */
+
+ var reFlags = /\w*$/;
+ /** Used to detect bad signed hexadecimal string values. */
+
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+ /** Used to detect binary string values. */
+
+ var reIsBinary = /^0b[01]+$/i;
+ /** Used to detect host constructors (Safari). */
+
+ var reIsHostCtor = /^\[object .+?Constructor\]$/;
+ /** Used to detect octal string values. */
+
+ var reIsOctal = /^0o[0-7]+$/i;
+ /** Used to detect unsigned integer values. */
+
+ var reIsUint = /^(?:0|[1-9]\d*)$/;
+ /** Used to match Latin Unicode letters (excluding mathematical operators). */
+
+ var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
+ /** Used to ensure capturing order of template delimiters. */
+
+ var reNoMatch = /($^)/;
+ /** Used to match unescaped characters in compiled string literals. */
+
+ var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
+ /** Used to compose unicode character classes. */
+
+ 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;
+ /** Used to compose unicode capture groups. */
+
+ 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";
+ /** Used to compose unicode regexes. */
+
+ 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('|') + ')';
+ /** Used to match apostrophes. */
+
+ var reApos = RegExp(rsApos, 'g');
+ /**
+ * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
+ * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
+ */
- if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
- return 'relation';
- } else {
- seen[relation.id] = role;
- }
- }
- } // gather restrictions for parent ways
+ var reComboMark = RegExp(rsCombo, 'g');
+ /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
+
+ var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
+ /** Used to match complex or compound words. */
+
+ var reUnicodeWord = RegExp([rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, rsUpper + '+' + rsOptContrUpper, rsOrdUpper, rsOrdLower, rsDigits, rsEmoji].join('|'), 'g');
+ /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
+
+ var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');
+ /** Used to detect strings that need a more robust regexp to match words. */
+
+ 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 ]/;
+ /** Used to assign default `context` object properties. */
+
+ var contextProps = ['Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'];
+ /** Used to make template sourceURLs easier to identify. */
+
+ var templateCounter = -1;
+ /** Used to identify `toStringTag` values of typed arrays. */
+
+ var typedArrayTags = {};
+ typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
+ typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
+ /** Used to identify `toStringTag` values supported by `_.clone`. */
+
+ var cloneableTags = {};
+ cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+ cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
+ /** Used to map Latin Unicode letters to basic Latin letters. */
+
+ var deburredLetters = {
+ // Latin-1 Supplement block.
+ '\xc0': 'A',
+ '\xc1': 'A',
+ '\xc2': 'A',
+ '\xc3': 'A',
+ '\xc4': 'A',
+ '\xc5': 'A',
+ '\xe0': 'a',
+ '\xe1': 'a',
+ '\xe2': 'a',
+ '\xe3': 'a',
+ '\xe4': 'a',
+ '\xe5': 'a',
+ '\xc7': 'C',
+ '\xe7': 'c',
+ '\xd0': 'D',
+ '\xf0': 'd',
+ '\xc8': 'E',
+ '\xc9': 'E',
+ '\xca': 'E',
+ '\xcb': 'E',
+ '\xe8': 'e',
+ '\xe9': 'e',
+ '\xea': 'e',
+ '\xeb': 'e',
+ '\xcc': 'I',
+ '\xcd': 'I',
+ '\xce': 'I',
+ '\xcf': 'I',
+ '\xec': 'i',
+ '\xed': 'i',
+ '\xee': 'i',
+ '\xef': 'i',
+ '\xd1': 'N',
+ '\xf1': 'n',
+ '\xd2': 'O',
+ '\xd3': 'O',
+ '\xd4': 'O',
+ '\xd5': 'O',
+ '\xd6': 'O',
+ '\xd8': 'O',
+ '\xf2': 'o',
+ '\xf3': 'o',
+ '\xf4': 'o',
+ '\xf5': 'o',
+ '\xf6': 'o',
+ '\xf8': 'o',
+ '\xd9': 'U',
+ '\xda': 'U',
+ '\xdb': 'U',
+ '\xdc': 'U',
+ '\xf9': 'u',
+ '\xfa': 'u',
+ '\xfb': 'u',
+ '\xfc': 'u',
+ '\xdd': 'Y',
+ '\xfd': 'y',
+ '\xff': 'y',
+ '\xc6': 'Ae',
+ '\xe6': 'ae',
+ '\xde': 'Th',
+ '\xfe': 'th',
+ '\xdf': 'ss',
+ // Latin Extended-A block.
+ "\u0100": 'A',
+ "\u0102": 'A',
+ "\u0104": 'A',
+ "\u0101": 'a',
+ "\u0103": 'a',
+ "\u0105": 'a',
+ "\u0106": 'C',
+ "\u0108": 'C',
+ "\u010A": 'C',
+ "\u010C": 'C',
+ "\u0107": 'c',
+ "\u0109": 'c',
+ "\u010B": 'c',
+ "\u010D": 'c',
+ "\u010E": 'D',
+ "\u0110": 'D',
+ "\u010F": 'd',
+ "\u0111": 'd',
+ "\u0112": 'E',
+ "\u0114": 'E',
+ "\u0116": 'E',
+ "\u0118": 'E',
+ "\u011A": 'E',
+ "\u0113": 'e',
+ "\u0115": 'e',
+ "\u0117": 'e',
+ "\u0119": 'e',
+ "\u011B": 'e',
+ "\u011C": 'G',
+ "\u011E": 'G',
+ "\u0120": 'G',
+ "\u0122": 'G',
+ "\u011D": 'g',
+ "\u011F": 'g',
+ "\u0121": 'g',
+ "\u0123": 'g',
+ "\u0124": 'H',
+ "\u0126": 'H',
+ "\u0125": 'h',
+ "\u0127": 'h',
+ "\u0128": 'I',
+ "\u012A": 'I',
+ "\u012C": 'I',
+ "\u012E": 'I',
+ "\u0130": 'I',
+ "\u0129": 'i',
+ "\u012B": 'i',
+ "\u012D": 'i',
+ "\u012F": 'i',
+ "\u0131": 'i',
+ "\u0134": 'J',
+ "\u0135": 'j',
+ "\u0136": 'K',
+ "\u0137": 'k',
+ "\u0138": 'k',
+ "\u0139": 'L',
+ "\u013B": 'L',
+ "\u013D": 'L',
+ "\u013F": 'L',
+ "\u0141": 'L',
+ "\u013A": 'l',
+ "\u013C": 'l',
+ "\u013E": 'l',
+ "\u0140": 'l',
+ "\u0142": 'l',
+ "\u0143": 'N',
+ "\u0145": 'N',
+ "\u0147": 'N',
+ "\u014A": 'N',
+ "\u0144": 'n',
+ "\u0146": 'n',
+ "\u0148": 'n',
+ "\u014B": 'n',
+ "\u014C": 'O',
+ "\u014E": 'O',
+ "\u0150": 'O',
+ "\u014D": 'o',
+ "\u014F": 'o',
+ "\u0151": 'o',
+ "\u0154": 'R',
+ "\u0156": 'R',
+ "\u0158": 'R',
+ "\u0155": 'r',
+ "\u0157": 'r',
+ "\u0159": 'r',
+ "\u015A": 'S',
+ "\u015C": 'S',
+ "\u015E": 'S',
+ "\u0160": 'S',
+ "\u015B": 's',
+ "\u015D": 's',
+ "\u015F": 's',
+ "\u0161": 's',
+ "\u0162": 'T',
+ "\u0164": 'T',
+ "\u0166": 'T',
+ "\u0163": 't',
+ "\u0165": 't',
+ "\u0167": 't',
+ "\u0168": 'U',
+ "\u016A": 'U',
+ "\u016C": 'U',
+ "\u016E": 'U',
+ "\u0170": 'U',
+ "\u0172": 'U',
+ "\u0169": 'u',
+ "\u016B": 'u',
+ "\u016D": 'u',
+ "\u016F": 'u',
+ "\u0171": 'u',
+ "\u0173": 'u',
+ "\u0174": 'W',
+ "\u0175": 'w',
+ "\u0176": 'Y',
+ "\u0177": 'y',
+ "\u0178": 'Y',
+ "\u0179": 'Z',
+ "\u017B": 'Z',
+ "\u017D": 'Z',
+ "\u017A": 'z',
+ "\u017C": 'z',
+ "\u017E": 'z',
+ "\u0132": 'IJ',
+ "\u0133": 'ij',
+ "\u0152": 'Oe',
+ "\u0153": 'oe',
+ "\u0149": "'n",
+ "\u017F": 's'
+ };
+ /** Used to map characters to HTML entities. */
+
+ var htmlEscapes = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": '''
+ };
+ /** Used to map HTML entities to characters. */
+
+ var htmlUnescapes = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ ''': "'"
+ };
+ /** Used to escape characters for inclusion in compiled string literals. */
+
+ var stringEscapes = {
+ '\\': '\\',
+ "'": "'",
+ '\n': 'n',
+ '\r': 'r',
+ "\u2028": 'u2028',
+ "\u2029": 'u2029'
+ };
+ /** Built-in method references without a dependency on `root`. */
+ var freeParseFloat = parseFloat,
+ freeParseInt = parseInt;
+ /** Detect free variable `global` from Node.js. */
- for (i = 0; i < nodeIDs.length; i++) {
- node = graph.entity(nodeIDs[i]);
- var parents = graph.parentWays(node);
+ var freeGlobal = _typeof(commonjsGlobal) == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
+ /** Detect free variable `self`. */
- for (j = 0; j < parents.length; j++) {
- var parent = parents[j];
- relations = graph.parentRelations(parent);
+ var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self;
+ /** Used as a reference to the global object. */
- for (k = 0; k < relations.length; k++) {
- relation = relations[k];
+ var root = freeGlobal || freeSelf || Function('return this')();
+ /** Detect free variable `exports`. */
+
+ var freeExports = exports && !exports.nodeType && exports;
+ /** Detect free variable `module`. */
+
+ var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;
+ /** Detect the popular CommonJS extension `module.exports`. */
- if (relation.hasFromViaTo()) {
- restrictionIDs.push(relation.id);
- }
- }
- }
- } // test restrictions
+ var moduleExports = freeModule && freeModule.exports === freeExports;
+ /** Detect free variable `process` from Node.js. */
+ var freeProcess = moduleExports && freeGlobal.process;
+ /** Used to access faster Node.js helpers. */
- restrictionIDs = utilArrayUniq(restrictionIDs);
+ var nodeUtil = function () {
+ try {
+ // Use `util.types` for Node.js 10+.
+ var types = freeModule && freeModule.require && freeModule.require('util').types;
- for (i = 0; i < restrictionIDs.length; i++) {
- relation = graph.entity(restrictionIDs[i]);
- if (!relation.isComplete(graph)) continue;
- var memberWays = relation.members.filter(function (m) {
- return m.type === 'way';
- }).map(function (m) {
- return graph.entity(m.id);
- });
- memberWays = utilArrayUniq(memberWays);
- var f = relation.memberByRole('from');
- var t = relation.memberByRole('to');
- var isUturn = f.id === t.id; // 2a. disable if connection would damage a restriction
- // (a key node is a node at the junction of ways)
+ if (types) {
+ return types;
+ } // Legacy `process.binding('util')` for Node.js < 10.
- var nodes = {
- from: [],
- via: [],
- to: [],
- keyfrom: [],
- keyto: []
- };
- for (j = 0; j < relation.members.length; j++) {
- collectNodes(relation.members[j], nodes);
- }
+ return freeProcess && freeProcess.binding && freeProcess.binding('util');
+ } catch (e) {}
+ }();
+ /* Node.js helper references. */
- nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
- nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
- var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
- nodes.from = nodes.from.filter(filter);
- nodes.via = nodes.via.filter(filter);
- nodes.to = nodes.to.filter(filter);
- var connectFrom = false;
- var connectVia = false;
- var connectTo = false;
- var connectKeyFrom = false;
- var connectKeyTo = false;
- for (j = 0; j < nodeIDs.length; j++) {
- var n = nodeIDs[j];
+ var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
+ nodeIsDate = nodeUtil && nodeUtil.isDate,
+ nodeIsMap = nodeUtil && nodeUtil.isMap,
+ nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
+ nodeIsSet = nodeUtil && nodeUtil.isSet,
+ nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+ /*--------------------------------------------------------------------------*/
- if (nodes.from.indexOf(n) !== -1) {
- connectFrom = true;
- }
+ /**
+ * A faster alternative to `Function#apply`, this function invokes `func`
+ * with the `this` binding of `thisArg` and the arguments of `args`.
+ *
+ * @private
+ * @param {Function} func The function to invoke.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} args The arguments to invoke `func` with.
+ * @returns {*} Returns the result of `func`.
+ */
- if (nodes.via.indexOf(n) !== -1) {
- connectVia = true;
- }
+ function apply(func, thisArg, args) {
+ switch (args.length) {
+ case 0:
+ return func.call(thisArg);
- if (nodes.to.indexOf(n) !== -1) {
- connectTo = true;
- }
+ case 1:
+ return func.call(thisArg, args[0]);
- if (nodes.keyfrom.indexOf(n) !== -1) {
- connectKeyFrom = true;
- }
+ case 2:
+ return func.call(thisArg, args[0], args[1]);
- if (nodes.keyto.indexOf(n) !== -1) {
- connectKeyTo = true;
- }
+ case 3:
+ return func.call(thisArg, args[0], args[1], args[2]);
}
- if (connectFrom && connectTo && !isUturn) {
- return 'restriction';
- }
+ return func.apply(thisArg, args);
+ }
+ /**
+ * A specialized version of `baseAggregator` for arrays.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} setter The function to set `accumulator` values.
+ * @param {Function} iteratee The iteratee to transform keys.
+ * @param {Object} accumulator The initial aggregated object.
+ * @returns {Function} Returns `accumulator`.
+ */
- if (connectFrom && connectVia) {
- return 'restriction';
+
+ function arrayAggregator(array, setter, iteratee, accumulator) {
+ var index = -1,
+ length = array == null ? 0 : array.length;
+
+ while (++index < length) {
+ var value = array[index];
+ setter(accumulator, value, iteratee(value), array);
}
- if (connectTo && connectVia) {
- return 'restriction';
- } // connecting to a key node -
- // if both nodes are on a member way (i.e. part of the turn restriction),
- // the connecting node must be adjacent to the key node.
+ return accumulator;
+ }
+ /**
+ * A specialized version of `_.forEach` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
- if (connectKeyFrom || connectKeyTo) {
- if (nodeIDs.length !== 2) {
- return 'restriction';
+ function arrayEach(array, iteratee) {
+ var index = -1,
+ length = array == null ? 0 : array.length;
+
+ while (++index < length) {
+ if (iteratee(array[index], index, array) === false) {
+ break;
}
+ }
- var n0 = null;
- var n1 = null;
+ return array;
+ }
+ /**
+ * A specialized version of `_.forEachRight` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
- for (j = 0; j < memberWays.length; j++) {
- way = memberWays[j];
- if (way.contains(nodeIDs[0])) {
- n0 = nodeIDs[0];
- }
+ function arrayEachRight(array, iteratee) {
+ var length = array == null ? 0 : array.length;
- if (way.contains(nodeIDs[1])) {
- n1 = nodeIDs[1];
- }
+ while (length--) {
+ if (iteratee(array[length], length, array) === false) {
+ break;
}
+ }
- if (n0 && n1) {
- // both nodes are part of the restriction
- var ok = false;
+ return array;
+ }
+ /**
+ * A specialized version of `_.every` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`.
+ */
- for (j = 0; j < memberWays.length; j++) {
- way = memberWays[j];
- if (way.areAdjacent(n0, n1)) {
- ok = true;
- break;
- }
- }
+ function arrayEvery(array, predicate) {
+ var index = -1,
+ length = array == null ? 0 : array.length;
- if (!ok) {
- return 'restriction';
- }
+ while (++index < length) {
+ if (!predicate(array[index], index, array)) {
+ return false;
}
- } // 2b. disable if nodes being connected will destroy a member way in a restriction
- // (to test, make a copy and try actually connecting the nodes)
+ }
+ return true;
+ }
+ /**
+ * A specialized version of `_.filter` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
- for (j = 0; j < memberWays.length; j++) {
- way = memberWays[j].update({}); // make copy
- for (k = 0; k < nodeIDs.length; k++) {
- if (nodeIDs[k] === survivor.id) continue;
+ function arrayFilter(array, predicate) {
+ var index = -1,
+ length = array == null ? 0 : array.length,
+ resIndex = 0,
+ result = [];
- if (way.areAdjacent(nodeIDs[k], survivor.id)) {
- way = way.removeNode(nodeIDs[k]);
- } else {
- way = way.replaceNode(nodeIDs[k], survivor.id);
- }
- }
+ while (++index < length) {
+ var value = array[index];
- if (way.isDegenerate()) {
- return 'restriction';
+ if (predicate(value, index, array)) {
+ result[resIndex++] = value;
}
}
+
+ return result;
}
+ /**
+ * A specialized version of `_.includes` for arrays without support for
+ * specifying an index to search from.
+ *
+ * @private
+ * @param {Array} [array] The array to inspect.
+ * @param {*} target The value to search for.
+ * @returns {boolean} Returns `true` if `target` is found, else `false`.
+ */
- return false; // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
- function hasDuplicates(n, i, arr) {
- return arr.indexOf(n) !== arr.lastIndexOf(n);
+ function arrayIncludes(array, value) {
+ var length = array == null ? 0 : array.length;
+ return !!length && baseIndexOf(array, value, 0) > -1;
}
+ /**
+ * This function is like `arrayIncludes` except that it accepts a comparator.
+ *
+ * @private
+ * @param {Array} [array] The array to inspect.
+ * @param {*} target The value to search for.
+ * @param {Function} comparator The comparator invoked per element.
+ * @returns {boolean} Returns `true` if `target` is found, else `false`.
+ */
- function keyNodeFilter(froms, tos) {
- return function (n) {
- return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
- };
- }
- function collectNodes(member, collection) {
- var entity = graph.hasEntity(member.id);
- if (!entity) return;
- var role = member.role || '';
+ function arrayIncludesWith(array, value, comparator) {
+ var index = -1,
+ length = array == null ? 0 : array.length;
- if (!collection[role]) {
- collection[role] = [];
+ while (++index < length) {
+ if (comparator(value, array[index])) {
+ return true;
+ }
}
- if (member.type === 'node') {
- collection[role].push(member.id);
+ return false;
+ }
+ /**
+ * A specialized version of `_.map` for arrays without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
- if (role === 'via') {
- collection.keyfrom.push(member.id);
- collection.keyto.push(member.id);
- }
- } else if (member.type === 'way') {
- collection[role].push.apply(collection[role], entity.nodes);
- if (role === 'from' || role === 'via') {
- collection.keyfrom.push(entity.first());
- collection.keyfrom.push(entity.last());
- }
+ function arrayMap(array, iteratee) {
+ var index = -1,
+ length = array == null ? 0 : array.length,
+ result = Array(length);
- if (role === 'to' || role === 'via') {
- collection.keyto.push(entity.first());
- collection.keyto.push(entity.last());
- }
+ while (++index < length) {
+ result[index] = iteratee(array[index], index, array);
}
+
+ return result;
}
- };
+ /**
+ * Appends the elements of `values` to `array`.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to append.
+ * @returns {Array} Returns `array`.
+ */
- return action;
- }
- function actionCopyEntities(ids, fromGraph) {
- var _copies = {};
+ function arrayPush(array, values) {
+ var index = -1,
+ length = values.length,
+ offset = array.length;
- var action = function action(graph) {
- ids.forEach(function (id) {
- fromGraph.entity(id).copy(fromGraph, _copies);
- });
+ while (++index < length) {
+ array[offset + index] = values[index];
+ }
- for (var id in _copies) {
- graph = graph.replace(_copies[id]);
+ return array;
}
+ /**
+ * A specialized version of `_.reduce` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initAccum] Specify using the first element of `array` as
+ * the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
- return graph;
- };
- action.copies = function () {
- return _copies;
- };
+ function arrayReduce(array, iteratee, accumulator, initAccum) {
+ var index = -1,
+ length = array == null ? 0 : array.length;
- return action;
- }
+ if (initAccum && length) {
+ accumulator = array[++index];
+ }
- function actionDeleteMember(relationId, memberIndex) {
- return function (graph) {
- var relation = graph.entity(relationId).removeMember(memberIndex);
- graph = graph.replace(relation);
- if (relation.isDegenerate()) graph = actionDeleteRelation(relation.id)(graph);
- return graph;
- };
- }
+ while (++index < length) {
+ accumulator = iteratee(accumulator, array[index], index, array);
+ }
- function actionDiscardTags(difference, discardTags) {
- discardTags = discardTags || {};
- return function (graph) {
- difference.modified().forEach(checkTags);
- difference.created().forEach(checkTags);
- return graph;
+ return accumulator;
+ }
+ /**
+ * A specialized version of `_.reduceRight` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initAccum] Specify using the last element of `array` as
+ * the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
- function checkTags(entity) {
- var keys = Object.keys(entity.tags);
- var didDiscard = false;
- var tags = {};
- for (var i = 0; i < keys.length; i++) {
- var k = keys[i];
+ function arrayReduceRight(array, iteratee, accumulator, initAccum) {
+ var length = array == null ? 0 : array.length;
- if (discardTags[k] || !entity.tags[k]) {
- didDiscard = true;
- } else {
- tags[k] = entity.tags[k];
- }
+ if (initAccum && length) {
+ accumulator = array[--length];
}
- if (didDiscard) {
- graph = graph.replace(entity.update({
- tags: tags
- }));
+ while (length--) {
+ accumulator = iteratee(accumulator, array[length], length, array);
}
- }
- };
- }
- //
- // Optionally, disconnect only the given ways.
- //
- // For testing convenience, accepts an ID to assign to the (first) new node.
- // Normally, this will be undefined and the way will automatically
- // be assigned a new ID.
- //
- // This is the inverse of `iD.actionConnect`.
- //
- // Reference:
- // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
- // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
- //
+ return accumulator;
+ }
+ /**
+ * A specialized version of `_.some` for arrays without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ */
- function actionDisconnect(nodeId, newNodeId) {
- var wayIds;
- var action = function action(graph) {
- var node = graph.entity(nodeId);
- var connections = action.connections(graph);
- connections.forEach(function (connection) {
- var way = graph.entity(connection.wayID);
- var newNode = osmNode({
- id: newNodeId,
- loc: node.loc,
- tags: node.tags
- });
- graph = graph.replace(newNode);
+ function arraySome(array, predicate) {
+ var index = -1,
+ length = array == null ? 0 : array.length;
- if (connection.index === 0 && way.isArea()) {
- // replace shared node with shared node..
- graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
- } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
- // replace closing node with new new node..
- graph = graph.replace(way.unclose().addNode(newNode.id));
- } else {
- // replace shared node with multiple new nodes..
- graph = graph.replace(way.updateNode(newNode.id, connection.index));
+ while (++index < length) {
+ if (predicate(array[index], index, array)) {
+ return true;
+ }
}
- });
- return graph;
- };
- action.connections = function (graph) {
- var candidates = [];
- var keeping = false;
- var parentWays = graph.parentWays(graph.entity(nodeId));
- var way, waynode;
+ return false;
+ }
+ /**
+ * Gets the size of an ASCII `string`.
+ *
+ * @private
+ * @param {string} string The string inspect.
+ * @returns {number} Returns the string size.
+ */
- for (var i = 0; i < parentWays.length; i++) {
- way = parentWays[i];
- if (wayIds && wayIds.indexOf(way.id) === -1) {
- keeping = true;
- continue;
- }
+ var asciiSize = baseProperty('length');
+ /**
+ * Converts an ASCII `string` to an array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the converted array.
+ */
- if (way.isArea() && way.nodes[0] === nodeId) {
- candidates.push({
- wayID: way.id,
- index: 0
- });
- } else {
- for (var j = 0; j < way.nodes.length; j++) {
- waynode = way.nodes[j];
+ function asciiToArray(string) {
+ return string.split('');
+ }
+ /**
+ * Splits an ASCII `string` into an array of its words.
+ *
+ * @private
+ * @param {string} The string to inspect.
+ * @returns {Array} Returns the words of `string`.
+ */
- if (waynode === nodeId) {
- if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j === way.nodes.length - 1) {
- continue;
- }
- candidates.push({
- wayID: way.id,
- index: j
- });
- }
- }
- }
+ function asciiWords(string) {
+ return string.match(reAsciiWord) || [];
}
+ /**
+ * The base implementation of methods like `_.findKey` and `_.findLastKey`,
+ * without support for iteratee shorthands, which iterates over `collection`
+ * using `eachFunc`.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to inspect.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {Function} eachFunc The function to iterate over `collection`.
+ * @returns {*} Returns the found element or its key, else `undefined`.
+ */
- return keeping ? candidates : candidates.slice(1);
- };
- action.disabled = function (graph) {
- var connections = action.connections(graph);
- if (connections.length === 0) return 'not_connected';
- var parentWays = graph.parentWays(graph.entity(nodeId));
- var seenRelationIds = {};
- var sharedRelation;
- parentWays.forEach(function (way) {
- var relations = graph.parentRelations(way);
- relations.forEach(function (relation) {
- if (relation.id in seenRelationIds) {
- if (wayIds) {
- if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
- sharedRelation = relation;
- }
- } else {
- sharedRelation = relation;
- }
- } else {
- seenRelationIds[relation.id] = way.id;
+ function baseFindKey(collection, predicate, eachFunc) {
+ var result;
+ eachFunc(collection, function (value, key, collection) {
+ if (predicate(value, key, collection)) {
+ result = key;
+ return false;
}
});
- });
- if (sharedRelation) return 'relation';
- };
-
- action.limitWays = function (val) {
- if (!arguments.length) return wayIds;
- wayIds = val;
- return action;
- };
+ return result;
+ }
+ /**
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
+ * support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {number} fromIndex The index to search from.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
- return action;
- }
- var geojsonRewind = rewind;
+ function baseFindIndex(array, predicate, fromIndex, fromRight) {
+ var length = array.length,
+ index = fromIndex + (fromRight ? 1 : -1);
- function rewind(gj, outer) {
- var type = gj && gj.type,
- i;
+ while (fromRight ? index-- : ++index < length) {
+ if (predicate(array[index], index, array)) {
+ return index;
+ }
+ }
- if (type === 'FeatureCollection') {
- for (i = 0; i < gj.features.length; i++) {
- rewind(gj.features[i], outer);
- }
- } else if (type === 'GeometryCollection') {
- for (i = 0; i < gj.geometries.length; i++) {
- rewind(gj.geometries[i], outer);
+ return -1;
}
- } else if (type === 'Feature') {
- rewind(gj.geometry, outer);
- } else if (type === 'Polygon') {
- rewindRings(gj.coordinates, outer);
- } else if (type === 'MultiPolygon') {
- for (i = 0; i < gj.coordinates.length; i++) {
- rewindRings(gj.coordinates[i], outer);
+ /**
+ * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+
+
+ function baseIndexOf(array, value, fromIndex) {
+ return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);
}
- }
+ /**
+ * This function is like `baseIndexOf` except that it accepts a comparator.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @param {Function} comparator The comparator invoked per element.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
- return gj;
- }
- function rewindRings(rings, outer) {
- if (rings.length === 0) return;
- rewindRing(rings[0], outer);
+ function baseIndexOfWith(array, value, fromIndex, comparator) {
+ var index = fromIndex - 1,
+ length = array.length;
- for (var i = 1; i < rings.length; i++) {
- rewindRing(rings[i], !outer);
- }
- }
+ while (++index < length) {
+ if (comparator(array[index], value)) {
+ return index;
+ }
+ }
- function rewindRing(ring, dir) {
- var area = 0;
+ return -1;
+ }
+ /**
+ * The base implementation of `_.isNaN` without support for number objects.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+ */
- for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
- area += (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]);
- }
- if (area >= 0 !== !!dir) ring.reverse();
- }
+ function baseIsNaN(value) {
+ return value !== value;
+ }
+ /**
+ * The base implementation of `_.mean` and `_.meanBy` without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {number} Returns the mean.
+ */
- function actionExtract(entityID) {
- var extractedNodeID;
- var action = function action(graph) {
- var entity = graph.entity(entityID);
+ function baseMean(array, iteratee) {
+ var length = array == null ? 0 : array.length;
+ return length ? baseSum(array, iteratee) / length : NAN;
+ }
+ /**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new accessor function.
+ */
- if (entity.type === 'node') {
- return extractFromNode(entity, graph);
+
+ function baseProperty(key) {
+ return function (object) {
+ return object == null ? undefined$1 : object[key];
+ };
}
+ /**
+ * The base implementation of `_.propertyOf` without support for deep paths.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Function} Returns the new accessor function.
+ */
- return extractFromWayOrRelation(entity, graph);
- };
- function extractFromNode(node, graph) {
- extractedNodeID = node.id; // Create a new node to replace the one we will detach
+ function basePropertyOf(object) {
+ return function (key) {
+ return object == null ? undefined$1 : object[key];
+ };
+ }
+ /**
+ * The base implementation of `_.reduce` and `_.reduceRight`, without support
+ * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} accumulator The initial value.
+ * @param {boolean} initAccum Specify using the first or last element of
+ * `collection` as the initial value.
+ * @param {Function} eachFunc The function to iterate over `collection`.
+ * @returns {*} Returns the accumulated value.
+ */
- var replacement = osmNode({
- loc: node.loc
- });
- graph = graph.replace(replacement); // Process each way in turn, updating the graph as we go
- graph = graph.parentWays(node).reduce(function (accGraph, parentWay) {
- return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
- }, graph); // Process any relations too
+ function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
+ eachFunc(collection, function (value, index, collection) {
+ accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection);
+ });
+ return accumulator;
+ }
+ /**
+ * The base implementation of `_.sortBy` which uses `comparer` to define the
+ * sort order of `array` and replaces criteria objects with their corresponding
+ * values.
+ *
+ * @private
+ * @param {Array} array The array to sort.
+ * @param {Function} comparer The function to define sort order.
+ * @returns {Array} Returns `array`.
+ */
- return graph.parentRelations(node).reduce(function (accGraph, parentRel) {
- return accGraph.replace(parentRel.replaceMember(node, replacement));
- }, graph);
- }
- function extractFromWayOrRelation(entity, graph) {
- var fromGeometry = entity.geometry(graph);
- var keysToCopyAndRetain = ['source', 'wheelchair'];
- var keysToRetain = ['area'];
- var buildingKeysToRetain = ['architect', 'building', 'height', 'layer']; // d3_geoCentroid is wrong for counterclockwise-wound polygons, so wind them clockwise
+ function baseSortBy(array, comparer) {
+ var length = array.length;
+ array.sort(comparer);
- var extractedLoc = d3_geoCentroid(geojsonRewind(Object.assign({}, entity.asGeoJSON(graph)), true));
+ while (length--) {
+ array[length] = array[length].value;
+ }
- if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) {
- extractedLoc = entity.extent(graph).center();
+ return array;
}
+ /**
+ * The base implementation of `_.sum` and `_.sumBy` without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {number} Returns the sum.
+ */
- var indoorAreaValues = {
- area: true,
- corridor: true,
- elevator: true,
- level: true,
- room: true
- };
- var isBuilding = entity.tags.building && entity.tags.building !== 'no' || entity.tags['building:part'] && entity.tags['building:part'] !== 'no';
- var isIndoorArea = fromGeometry === 'area' && entity.tags.indoor && indoorAreaValues[entity.tags.indoor];
- var entityTags = Object.assign({}, entity.tags); // shallow copy
- var pointTags = {};
+ function baseSum(array, iteratee) {
+ var result,
+ index = -1,
+ length = array.length;
- for (var key in entityTags) {
- if (entity.type === 'relation' && key === 'type') {
- continue;
- }
+ while (++index < length) {
+ var current = iteratee(array[index]);
- if (keysToRetain.indexOf(key) !== -1) {
- continue;
+ if (current !== undefined$1) {
+ result = result === undefined$1 ? current : result + current;
+ }
}
- if (isBuilding) {
- // don't transfer building-related tags
- if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/)) continue;
- } // leave `indoor` tag on the area
+ return result;
+ }
+ /**
+ * The base implementation of `_.times` without support for iteratee shorthands
+ * or max array length checks.
+ *
+ * @private
+ * @param {number} n The number of times to invoke `iteratee`.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the array of results.
+ */
- if (isIndoorArea && key === 'indoor') {
- continue;
- } // copy the tag from the entity to the point
+ function baseTimes(n, iteratee) {
+ var index = -1,
+ result = Array(n);
+ while (++index < n) {
+ result[index] = iteratee(index);
+ }
- pointTags[key] = entityTags[key]; // leave addresses and some other tags so they're on both features
+ return result;
+ }
+ /**
+ * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
+ * of key-value pairs for `object` corresponding to the property names of `props`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} props The property names to get values for.
+ * @returns {Object} Returns the key-value pairs.
+ */
- if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
- continue;
- } else if (isIndoorArea && key === 'level') {
- // leave `level` on both features
- continue;
- } // remove the tag from the entity
+
+ function baseToPairs(object, props) {
+ return arrayMap(props, function (key) {
+ return [key, object[key]];
+ });
+ }
+ /**
+ * The base implementation of `_.trim`.
+ *
+ * @private
+ * @param {string} string The string to trim.
+ * @returns {string} Returns the trimmed string.
+ */
- delete entityTags[key];
+ function baseTrim(string) {
+ return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') : string;
}
+ /**
+ * The base implementation of `_.unary` without support for storing metadata.
+ *
+ * @private
+ * @param {Function} func The function to cap arguments for.
+ * @returns {Function} Returns the new capped function.
+ */
- if (!isBuilding && !isIndoorArea && fromGeometry === 'area') {
- // ensure that areas keep area geometry
- entityTags.area = 'yes';
+
+ function baseUnary(func) {
+ return function (value) {
+ return func(value);
+ };
}
+ /**
+ * The base implementation of `_.values` and `_.valuesIn` which creates an
+ * array of `object` property values corresponding to the property names
+ * of `props`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} props The property names to get values for.
+ * @returns {Object} Returns the array of property values.
+ */
- var replacement = osmNode({
- loc: extractedLoc,
- tags: pointTags
- });
- graph = graph.replace(replacement);
- extractedNodeID = replacement.id;
- return graph.replace(entity.update({
- tags: entityTags
- }));
- }
- action.getExtractedNodeID = function () {
- return extractedNodeID;
- };
+ function baseValues(object, props) {
+ return arrayMap(props, function (key) {
+ return object[key];
+ });
+ }
+ /**
+ * Checks if a `cache` value for `key` exists.
+ *
+ * @private
+ * @param {Object} cache The cache to query.
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
- return action;
- }
- //
- // This is the inverse of `iD.actionSplit`.
- //
- // Reference:
- // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
- // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
- //
+ function cacheHas(cache, key) {
+ return cache.has(key);
+ }
+ /**
+ * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
+ * that is not found in the character symbols.
+ *
+ * @private
+ * @param {Array} strSymbols The string symbols to inspect.
+ * @param {Array} chrSymbols The character symbols to find.
+ * @returns {number} Returns the index of the first unmatched string symbol.
+ */
- function actionJoin(ids) {
- function groupEntitiesByGeometry(graph) {
- var entities = ids.map(function (id) {
- return graph.entity(id);
- });
- return Object.assign({
- line: []
- }, utilArrayGroupBy(entities, function (entity) {
- return entity.geometry(graph);
- }));
- }
- var action = function action(graph) {
- var ways = ids.map(graph.entity, graph);
- var survivorID = ways[0].id; // if any of the ways are sided (e.g. coastline, cliff, kerb)
- // sort them first so they establish the overall order - #6033
+ function charsStartIndex(strSymbols, chrSymbols) {
+ var index = -1,
+ length = strSymbols.length;
- ways.sort(function (a, b) {
- var aSided = a.isSided();
- var bSided = b.isSided();
- return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0;
- }); // Prefer to keep an existing way.
+ while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
- for (var i = 0; i < ways.length; i++) {
- if (!ways[i].isNew()) {
- survivorID = ways[i].id;
- break;
- }
+ return index;
}
+ /**
+ * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
+ * that is not found in the character symbols.
+ *
+ * @private
+ * @param {Array} strSymbols The string symbols to inspect.
+ * @param {Array} chrSymbols The character symbols to find.
+ * @returns {number} Returns the index of the last unmatched string symbol.
+ */
- var sequences = osmJoinWays(ways, graph);
- var joined = sequences[0]; // We might need to reverse some of these ways before joining them. #4688
- // `joined.actions` property will contain any actions we need to apply.
- graph = sequences.actions.reduce(function (g, action) {
- return action(g);
- }, graph);
- var survivor = graph.entity(survivorID);
- survivor = survivor.update({
- nodes: joined.nodes.map(function (n) {
- return n.id;
- })
- });
- graph = graph.replace(survivor);
- joined.forEach(function (way) {
- if (way.id === survivorID) return;
- graph.parentRelations(way).forEach(function (parent) {
- graph = graph.replace(parent.replaceMember(way, survivor));
- });
- survivor = survivor.mergeTags(way.tags);
- graph = graph.replace(survivor);
- graph = actionDeleteWay(way.id)(graph);
- }); // Finds if the join created a single-member multipolygon,
- // and if so turns it into a basic area instead
+ function charsEndIndex(strSymbols, chrSymbols) {
+ var index = strSymbols.length;
- function checkForSimpleMultipolygon() {
- if (!survivor.isClosed()) return;
- var multipolygons = graph.parentMultipolygons(survivor).filter(function (multipolygon) {
- // find multipolygons where the survivor is the only member
- return multipolygon.members.length === 1;
- }); // skip if this is the single member of multiple multipolygons
+ while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
- if (multipolygons.length !== 1) return;
- var multipolygon = multipolygons[0];
+ return index;
+ }
+ /**
+ * Gets the number of `placeholder` occurrences in `array`.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} placeholder The placeholder to search for.
+ * @returns {number} Returns the placeholder count.
+ */
- for (var key in survivor.tags) {
- if (multipolygon.tags[key] && // don't collapse if tags cannot be cleanly merged
- multipolygon.tags[key] !== survivor.tags[key]) return;
- }
- survivor = survivor.mergeTags(multipolygon.tags);
- graph = graph.replace(survivor);
- graph = actionDeleteRelation(multipolygon.id, true
- /* allow untagged members */
- )(graph);
- var tags = Object.assign({}, survivor.tags);
+ function countHolders(array, placeholder) {
+ var length = array.length,
+ result = 0;
- if (survivor.geometry(graph) !== 'area') {
- // ensure the feature persists as an area
- tags.area = 'yes';
+ while (length--) {
+ if (array[length] === placeholder) {
+ ++result;
+ }
}
- delete tags.type; // remove type=multipolygon
-
- survivor = survivor.update({
- tags: tags
- });
- graph = graph.replace(survivor);
+ return result;
}
+ /**
+ * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
+ * letters to basic Latin letters.
+ *
+ * @private
+ * @param {string} letter The matched letter to deburr.
+ * @returns {string} Returns the deburred letter.
+ */
- checkForSimpleMultipolygon();
- return graph;
- }; // Returns the number of nodes the resultant way is expected to have
+ var deburrLetter = basePropertyOf(deburredLetters);
+ /**
+ * Used by `_.escape` to convert characters to HTML entities.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */
- action.resultingWayNodesLength = function (graph) {
- return ids.reduce(function (count, id) {
- return count + graph.entity(id).nodes.length;
- }, 0) - ids.length - 1;
- };
+ var escapeHtmlChar = basePropertyOf(htmlEscapes);
+ /**
+ * Used by `_.template` to escape characters for inclusion in compiled string literals.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */
- action.disabled = function (graph) {
- var geometries = groupEntitiesByGeometry(graph);
+ function escapeStringChar(chr) {
+ return '\\' + stringEscapes[chr];
+ }
+ /**
+ * Gets the value at `key` of `object`.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {string} key The key of the property to get.
+ * @returns {*} Returns the property value.
+ */
- if (ids.length < 2 || ids.length !== geometries.line.length) {
- return 'not_eligible';
+
+ function getValue(object, key) {
+ return object == null ? undefined$1 : object[key];
}
+ /**
+ * Checks if `string` contains Unicode symbols.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {boolean} Returns `true` if a symbol is found, else `false`.
+ */
- var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
- if (joined.length > 1) {
- return 'not_adjacent';
- } // Loop through all combinations of path-pairs
- // to check potential intersections between all pairs
+ function hasUnicode(string) {
+ return reHasUnicode.test(string);
+ }
+ /**
+ * Checks if `string` contains a word composed of Unicode symbols.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {boolean} Returns `true` if a word is found, else `false`.
+ */
- for (var i = 0; i < ids.length - 1; i++) {
- for (var j = i + 1; j < ids.length; j++) {
- var path1 = graph.childNodes(graph.entity(ids[i])).map(function (e) {
- return e.loc;
- });
- var path2 = graph.childNodes(graph.entity(ids[j])).map(function (e) {
- return e.loc;
- });
- var intersections = geoPathIntersections(path1, path2); // Check if intersections are just nodes lying on top of
- // each other/the line, as opposed to crossing it
+ function hasUnicodeWord(string) {
+ return reHasUnicodeWord.test(string);
+ }
+ /**
+ * Converts `iterator` to an array.
+ *
+ * @private
+ * @param {Object} iterator The iterator to convert.
+ * @returns {Array} Returns the converted array.
+ */
- var common = utilArrayIntersection(joined[0].nodes.map(function (n) {
- return n.loc.toString();
- }), intersections.map(function (n) {
- return n.toString();
- }));
- if (common.length !== intersections.length) {
- return 'paths_intersect';
- }
+ function iteratorToArray(iterator) {
+ var data,
+ result = [];
+
+ while (!(data = iterator.next()).done) {
+ result.push(data.value);
}
+
+ return result;
}
+ /**
+ * Converts `map` to its key-value pairs.
+ *
+ * @private
+ * @param {Object} map The map to convert.
+ * @returns {Array} Returns the key-value pairs.
+ */
- var nodeIds = joined[0].nodes.map(function (n) {
- return n.id;
- }).slice(1, -1);
- var relation;
- var tags = {};
- var conflicting = false;
- joined[0].forEach(function (way) {
- var parents = graph.parentRelations(way);
- parents.forEach(function (parent) {
- if (parent.isRestriction() && parent.members.some(function (m) {
- return nodeIds.indexOf(m.id) >= 0;
- })) {
- relation = parent;
- }
+
+ function mapToArray(map) {
+ var index = -1,
+ result = Array(map.size);
+ map.forEach(function (value, key) {
+ result[++index] = [key, value];
});
+ return result;
+ }
+ /**
+ * Creates a unary function that invokes `func` with its argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
- for (var k in way.tags) {
- if (!(k in tags)) {
- tags[k] = way.tags[k];
- } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
- conflicting = true;
+
+ function overArg(func, transform) {
+ return function (arg) {
+ return func(transform(arg));
+ };
+ }
+ /**
+ * Replaces all `placeholder` elements in `array` with an internal placeholder
+ * and returns an array of their indexes.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {*} placeholder The placeholder to replace.
+ * @returns {Array} Returns the new array of placeholder indexes.
+ */
+
+
+ function replaceHolders(array, placeholder) {
+ var index = -1,
+ length = array.length,
+ resIndex = 0,
+ result = [];
+
+ while (++index < length) {
+ var value = array[index];
+
+ if (value === placeholder || value === PLACEHOLDER) {
+ array[index] = PLACEHOLDER;
+ result[resIndex++] = index;
}
}
- });
- if (relation) {
- return 'restriction';
+ return result;
}
+ /**
+ * Converts `set` to an array of its values.
+ *
+ * @private
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the values.
+ */
- if (conflicting) {
- return 'conflicting_tags';
- }
- };
- return action;
- }
+ function setToArray(set) {
+ var index = -1,
+ result = Array(set.size);
+ set.forEach(function (value) {
+ result[++index] = value;
+ });
+ return result;
+ }
+ /**
+ * Converts `set` to its value-value pairs.
+ *
+ * @private
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the value-value pairs.
+ */
- function actionMerge(ids) {
- function groupEntitiesByGeometry(graph) {
- var entities = ids.map(function (id) {
- return graph.entity(id);
- });
- return Object.assign({
- point: [],
- area: [],
- line: [],
- relation: []
- }, utilArrayGroupBy(entities, function (entity) {
- return entity.geometry(graph);
- }));
- }
- var action = function action(graph) {
- var geometries = groupEntitiesByGeometry(graph);
- var target = geometries.area[0] || geometries.line[0];
- var points = geometries.point;
- points.forEach(function (point) {
- target = target.mergeTags(point.tags);
- graph = graph.replace(target);
- graph.parentRelations(point).forEach(function (parent) {
- graph = graph.replace(parent.replaceMember(point, target));
+ function setToPairs(set) {
+ var index = -1,
+ result = Array(set.size);
+ set.forEach(function (value) {
+ result[++index] = [value, value];
});
- var nodes = utilArrayUniq(graph.childNodes(target));
- var removeNode = point;
-
- for (var i = 0; i < nodes.length; i++) {
- var node = nodes[i];
+ return result;
+ }
+ /**
+ * A specialized version of `_.indexOf` which performs strict equality
+ * comparisons of values, i.e. `===`.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
- if (graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags()) {
- continue;
- } // Found an uninteresting child node on the target way.
- // Move orig point into its place to preserve point's history. #3683
+ function strictIndexOf(array, value, fromIndex) {
+ var index = fromIndex - 1,
+ length = array.length;
- graph = graph.replace(point.update({
- tags: {},
- loc: node.loc
- }));
- target = target.replaceNode(node.id, point.id);
- graph = graph.replace(target);
- removeNode = node;
- break;
+ while (++index < length) {
+ if (array[index] === value) {
+ return index;
+ }
}
- graph = graph.remove(removeNode);
- });
+ return -1;
+ }
+ /**
+ * A specialized version of `_.lastIndexOf` which performs strict equality
+ * comparisons of values, i.e. `===`.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
- if (target.tags.area === 'yes') {
- var tags = Object.assign({}, target.tags); // shallow copy
- delete tags.area;
+ function strictLastIndexOf(array, value, fromIndex) {
+ var index = fromIndex + 1;
- if (osmTagSuggestingArea(tags)) {
- // remove the `area` tag if area geometry is now implied - #3851
- target = target.update({
- tags: tags
- });
- graph = graph.replace(target);
+ while (index--) {
+ if (array[index] === value) {
+ return index;
+ }
}
- }
- return graph;
- };
+ return index;
+ }
+ /**
+ * Gets the number of symbols in `string`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {number} Returns the string size.
+ */
- action.disabled = function (graph) {
- var geometries = groupEntitiesByGeometry(graph);
- if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) {
- return 'not_eligible';
+ function stringSize(string) {
+ return hasUnicode(string) ? unicodeSize(string) : asciiSize(string);
}
- };
+ /**
+ * Converts `string` to an array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the converted array.
+ */
- return action;
- }
- //
- // 1. move all the nodes to a common location
- // 2. `actionConnect` them
+ function stringToArray(string) {
+ return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
+ }
+ /**
+ * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
+ * character of `string`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {number} Returns the index of the last non-whitespace character.
+ */
- function actionMergeNodes(nodeIDs, loc) {
- // If there is a single "interesting" node, use that as the location.
- // Otherwise return the average location of all the nodes.
- function chooseLoc(graph) {
- if (!nodeIDs.length) return null;
- var sum = [0, 0];
- var interestingCount = 0;
- var interestingLoc;
- for (var i = 0; i < nodeIDs.length; i++) {
- var node = graph.entity(nodeIDs[i]);
+ function trimmedEndIndex(string) {
+ var index = string.length;
- if (node.hasInterestingTags()) {
- interestingLoc = ++interestingCount === 1 ? node.loc : null;
- }
+ while (index-- && reWhitespace.test(string.charAt(index))) {}
- sum = geoVecAdd(sum, node.loc);
+ return index;
}
+ /**
+ * Used by `_.unescape` to convert HTML entities to characters.
+ *
+ * @private
+ * @param {string} chr The matched character to unescape.
+ * @returns {string} Returns the unescaped character.
+ */
- return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
- }
-
- var action = function action(graph) {
- if (nodeIDs.length < 2) return graph;
- var toLoc = loc;
- if (!toLoc) {
- toLoc = chooseLoc(graph);
- }
+ var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
+ /**
+ * Gets the size of a Unicode `string`.
+ *
+ * @private
+ * @param {string} string The string inspect.
+ * @returns {number} Returns the string size.
+ */
- for (var i = 0; i < nodeIDs.length; i++) {
- var node = graph.entity(nodeIDs[i]);
+ function unicodeSize(string) {
+ var result = reUnicode.lastIndex = 0;
- if (node.loc !== toLoc) {
- graph = graph.replace(node.move(toLoc));
+ while (reUnicode.test(string)) {
+ ++result;
}
- }
- return actionConnect(nodeIDs)(graph);
- };
+ return result;
+ }
+ /**
+ * Converts a Unicode `string` to an array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the converted array.
+ */
- action.disabled = function (graph) {
- if (nodeIDs.length < 2) return 'not_eligible';
- for (var i = 0; i < nodeIDs.length; i++) {
- var entity = graph.entity(nodeIDs[i]);
- if (entity.type !== 'node') return 'not_eligible';
+ function unicodeToArray(string) {
+ return string.match(reUnicode) || [];
}
+ /**
+ * Splits a Unicode `string` into an array of its words.
+ *
+ * @private
+ * @param {string} The string to inspect.
+ * @returns {Array} Returns the words of `string`.
+ */
- return actionConnect(nodeIDs).disabled(graph);
- };
- return action;
- }
+ function unicodeWords(string) {
+ return string.match(reUnicodeWord) || [];
+ }
+ /*--------------------------------------------------------------------------*/
- function osmChangeset() {
- if (!(this instanceof osmChangeset)) {
- return new osmChangeset().initialize(arguments);
- } else if (arguments.length) {
- this.initialize(arguments);
- }
- }
- osmEntity.changeset = osmChangeset;
- osmChangeset.prototype = Object.create(osmEntity.prototype);
- Object.assign(osmChangeset.prototype, {
- type: 'changeset',
- extent: function extent() {
- return new geoExtent();
- },
- geometry: function geometry() {
- return 'changeset';
- },
- asJXON: function asJXON() {
- return {
- osm: {
- changeset: {
- tag: Object.keys(this.tags).map(function (k) {
- return {
- '@k': k,
- '@v': this.tags[k]
- };
- }, this),
- '@version': 0.6,
- '@generator': 'iD'
- }
- }
- };
- },
- // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
- // XML. Returns a string.
- osmChangeJXON: function osmChangeJXON(changes) {
- var changeset_id = this.id;
+ /**
+ * Create a new pristine `lodash` function using the `context` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.1.0
+ * @category Util
+ * @param {Object} [context=root] The context object.
+ * @returns {Function} Returns a new `lodash` function.
+ * @example
+ *
+ * _.mixin({ 'foo': _.constant('foo') });
+ *
+ * var lodash = _.runInContext();
+ * lodash.mixin({ 'bar': lodash.constant('bar') });
+ *
+ * _.isFunction(_.foo);
+ * // => true
+ * _.isFunction(_.bar);
+ * // => false
+ *
+ * lodash.isFunction(lodash.foo);
+ * // => false
+ * lodash.isFunction(lodash.bar);
+ * // => true
+ *
+ * // Create a suped-up `defer` in Node.js.
+ * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
+ */
- function nest(x, order) {
- var groups = {};
- for (var i = 0; i < x.length; i++) {
- var tagName = Object.keys(x[i])[0];
- if (!groups[tagName]) groups[tagName] = [];
- groups[tagName].push(x[i][tagName]);
- }
+ var runInContext = function runInContext(context) {
+ context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
+ /** Built-in constructor references. */
- var ordered = {};
- order.forEach(function (o) {
- if (groups[o]) ordered[o] = groups[o];
- });
- return ordered;
- } // sort relations in a changeset by dependencies
+ var Array = context.Array,
+ Date = context.Date,
+ Error = context.Error,
+ Function = context.Function,
+ Math = context.Math,
+ Object = context.Object,
+ RegExp = context.RegExp,
+ String = context.String,
+ TypeError = context.TypeError;
+ /** Used for built-in method references. */
+ var arrayProto = Array.prototype,
+ funcProto = Function.prototype,
+ objectProto = Object.prototype;
+ /** Used to detect overreaching core-js shims. */
- function sort(changes) {
- // find a referenced relation in the current changeset
- function resolve(item) {
- return relations.find(function (relation) {
- return item.keyAttributes.type === 'relation' && item.keyAttributes.ref === relation['@id'];
- });
- } // a new item is an item that has not been already processed
+ var coreJsData = context['__core-js_shared__'];
+ /** Used to resolve the decompiled source of functions. */
+ var funcToString = funcProto.toString;
+ /** Used to check objects for own properties. */
- function isNew(item) {
- return !sorted[item['@id']] && !processing.find(function (proc) {
- return proc['@id'] === item['@id'];
- });
- }
+ var hasOwnProperty = objectProto.hasOwnProperty;
+ /** Used to generate unique IDs. */
- var processing = [];
- var sorted = {};
- var relations = changes.relation;
- if (!relations) return changes;
+ var idCounter = 0;
+ /** Used to detect methods masquerading as native. */
- for (var i = 0; i < relations.length; i++) {
- var relation = relations[i]; // skip relation if already sorted
+ var maskSrcKey = function () {
+ var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+ return uid ? 'Symbol(src)_1.' + uid : '';
+ }();
+ /**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
- if (!sorted[relation['@id']]) {
- processing.push(relation);
- }
- while (processing.length > 0) {
- var next = processing[0],
- deps = next.member.map(resolve).filter(Boolean).filter(isNew);
+ var nativeObjectToString = objectProto.toString;
+ /** Used to infer the `Object` constructor. */
- if (deps.length === 0) {
- sorted[next['@id']] = next;
- processing.shift();
- } else {
- processing = deps.concat(processing);
- }
- }
- }
+ var objectCtorString = funcToString.call(Object);
+ /** Used to restore the original `_` reference in `_.noConflict`. */
- changes.relation = Object.values(sorted);
- return changes;
- }
+ var oldDash = root._;
+ /** Used to detect if a method is native. */
- function rep(entity) {
- return entity.asJXON(changeset_id);
- }
+ var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');
+ /** Built-in value references. */
- return {
- osmChange: {
- '@version': 0.6,
- '@generator': 'iD',
- 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
- 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
- 'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), {
- '@if-unused': true
- })
- }
- };
- },
- asGeoJSON: function asGeoJSON() {
- return {};
- }
- });
+ var Buffer = moduleExports ? context.Buffer : undefined$1,
+ _Symbol = context.Symbol,
+ Uint8Array = context.Uint8Array,
+ allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined$1,
+ getPrototype = overArg(Object.getPrototypeOf, Object),
+ objectCreate = Object.create,
+ propertyIsEnumerable = objectProto.propertyIsEnumerable,
+ splice = arrayProto.splice,
+ spreadableSymbol = _Symbol ? _Symbol.isConcatSpreadable : undefined$1,
+ symIterator = _Symbol ? _Symbol.iterator : undefined$1,
+ symToStringTag = _Symbol ? _Symbol.toStringTag : undefined$1;
- function osmNote() {
- if (!(this instanceof osmNote)) {
- return new osmNote().initialize(arguments);
- } else if (arguments.length) {
- this.initialize(arguments);
- }
- }
+ var defineProperty = function () {
+ try {
+ var func = getNative(Object, 'defineProperty');
+ func({}, '', {});
+ return func;
+ } catch (e) {}
+ }();
+ /** Mocked built-ins. */
+
+
+ var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
+ ctxNow = Date && Date.now !== root.Date.now && Date.now,
+ ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
+ /* Built-in method references for those with the same name as other `lodash` methods. */
+
+ var nativeCeil = Math.ceil,
+ nativeFloor = Math.floor,
+ nativeGetSymbols = Object.getOwnPropertySymbols,
+ nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined$1,
+ nativeIsFinite = context.isFinite,
+ nativeJoin = arrayProto.join,
+ nativeKeys = overArg(Object.keys, Object),
+ nativeMax = Math.max,
+ nativeMin = Math.min,
+ nativeNow = Date.now,
+ nativeParseInt = context.parseInt,
+ nativeRandom = Math.random,
+ nativeReverse = arrayProto.reverse;
+ /* Built-in method references that are verified to be native. */
+
+ var DataView = getNative(context, 'DataView'),
+ Map = getNative(context, 'Map'),
+ Promise = getNative(context, 'Promise'),
+ Set = getNative(context, 'Set'),
+ WeakMap = getNative(context, 'WeakMap'),
+ nativeCreate = getNative(Object, 'create');
+ /** Used to store function metadata. */
+
+ var metaMap = WeakMap && new WeakMap();
+ /** Used to lookup unminified function names. */
+
+ var realNames = {};
+ /** Used to detect maps, sets, and weakmaps. */
+
+ var dataViewCtorString = toSource(DataView),
+ mapCtorString = toSource(Map),
+ promiseCtorString = toSource(Promise),
+ setCtorString = toSource(Set),
+ weakMapCtorString = toSource(WeakMap);
+ /** Used to convert symbols to primitives and strings. */
+
+ var symbolProto = _Symbol ? _Symbol.prototype : undefined$1,
+ symbolValueOf = symbolProto ? symbolProto.valueOf : undefined$1,
+ symbolToString = symbolProto ? symbolProto.toString : undefined$1;
+ /*------------------------------------------------------------------------*/
- osmNote.id = function () {
- return osmNote.id.next--;
- };
+ /**
+ * Creates a `lodash` object which wraps `value` to enable implicit method
+ * chain sequences. Methods that operate on and return arrays, collections,
+ * and functions can be chained together. Methods that retrieve a single value
+ * or may return a primitive value will automatically end the chain sequence
+ * and return the unwrapped value. Otherwise, the value must be unwrapped
+ * with `_#value`.
+ *
+ * Explicit chain sequences, which must be unwrapped with `_#value`, may be
+ * enabled using `_.chain`.
+ *
+ * The execution of chained methods is lazy, that is, it's deferred until
+ * `_#value` is implicitly or explicitly called.
+ *
+ * Lazy evaluation allows several methods to support shortcut fusion.
+ * Shortcut fusion is an optimization to merge iteratee calls; this avoids
+ * the creation of intermediate arrays and can greatly reduce the number of
+ * iteratee executions. Sections of a chain sequence qualify for shortcut
+ * fusion if the section is applied to an array and iteratees accept only
+ * one argument. The heuristic for whether a section qualifies for shortcut
+ * fusion is subject to change.
+ *
+ * Chaining is supported in custom builds as long as the `_#value` method is
+ * directly or indirectly included in the build.
+ *
+ * In addition to lodash methods, wrappers have `Array` and `String` methods.
+ *
+ * The wrapper `Array` methods are:
+ * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
+ *
+ * The wrapper `String` methods are:
+ * `replace` and `split`
+ *
+ * The wrapper methods that support shortcut fusion are:
+ * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
+ * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
+ * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
+ *
+ * The chainable wrapper methods are:
+ * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
+ * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
+ * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
+ * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
+ * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
+ * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
+ * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
+ * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
+ * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
+ * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
+ * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
+ * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
+ * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
+ * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
+ * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
+ * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
+ * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
+ * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
+ * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
+ * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
+ * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
+ * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
+ * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
+ * `zipObject`, `zipObjectDeep`, and `zipWith`
+ *
+ * The wrapper methods that are **not** chainable by default are:
+ * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
+ * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
+ * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
+ * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
+ * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
+ * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
+ * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
+ * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
+ * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
+ * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
+ * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
+ * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
+ * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
+ * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
+ * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
+ * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
+ * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
+ * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
+ * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
+ * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
+ * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
+ * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
+ * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
+ * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
+ * `upperFirst`, `value`, and `words`
+ *
+ * @name _
+ * @constructor
+ * @category Seq
+ * @param {*} value The value to wrap in a `lodash` instance.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var wrapped = _([1, 2, 3]);
+ *
+ * // Returns an unwrapped value.
+ * wrapped.reduce(_.add);
+ * // => 6
+ *
+ * // Returns a wrapped value.
+ * var squares = wrapped.map(square);
+ *
+ * _.isArray(squares);
+ * // => false
+ *
+ * _.isArray(squares.value());
+ * // => true
+ */
- osmNote.id.next = -1;
- Object.assign(osmNote.prototype, {
- type: 'note',
- initialize: function initialize(sources) {
- for (var i = 0; i < sources.length; ++i) {
- var source = sources[i];
+ function lodash(value) {
+ if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
+ if (value instanceof LodashWrapper) {
+ return value;
+ }
- for (var prop in source) {
- if (Object.prototype.hasOwnProperty.call(source, prop)) {
- if (source[prop] === undefined) {
- delete this[prop];
- } else {
- this[prop] = source[prop];
+ if (hasOwnProperty.call(value, '__wrapped__')) {
+ return wrapperClone(value);
}
}
+
+ return new LodashWrapper(value);
}
- }
+ /**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} proto The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
- if (!this.id) {
- this.id = osmNote.id().toString();
- }
- return this;
- },
- extent: function extent() {
- return new geoExtent(this.loc);
- },
- update: function update(attrs) {
- return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
- },
- isNew: function isNew() {
- return this.id < 0;
- },
- move: function move(loc) {
- return this.update({
- loc: loc
- });
- }
- });
+ var baseCreate = function () {
+ function object() {}
- function osmRelation() {
- if (!(this instanceof osmRelation)) {
- return new osmRelation().initialize(arguments);
- } else if (arguments.length) {
- this.initialize(arguments);
- }
- }
- osmEntity.relation = osmRelation;
- osmRelation.prototype = Object.create(osmEntity.prototype);
+ return function (proto) {
+ if (!isObject(proto)) {
+ return {};
+ }
- osmRelation.creationOrder = function (a, b) {
- var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
- var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
- if (aId < 0 || bId < 0) return aId - bId;
- return bId - aId;
- };
+ if (objectCreate) {
+ return objectCreate(proto);
+ }
- Object.assign(osmRelation.prototype, {
- type: 'relation',
- members: [],
- copy: function copy(resolver, copies) {
- if (copies[this.id]) return copies[this.id];
- var copy = osmEntity.prototype.copy.call(this, resolver, copies);
- var members = this.members.map(function (member) {
- return Object.assign({}, member, {
- id: resolver.entity(member.id).copy(resolver, copies).id
- });
- });
- copy = copy.update({
- members: members
- });
- copies[this.id] = copy;
- return copy;
- },
- extent: function extent(resolver, memo) {
- return resolver["transient"](this, 'extent', function () {
- if (memo && memo[this.id]) return geoExtent();
- memo = memo || {};
- memo[this.id] = true;
- var extent = geoExtent();
+ object.prototype = proto;
+ var result = new object();
+ object.prototype = undefined$1;
+ return result;
+ };
+ }();
+ /**
+ * The function whose prototype chain sequence wrappers inherit from.
+ *
+ * @private
+ */
- for (var i = 0; i < this.members.length; i++) {
- var member = resolver.hasEntity(this.members[i].id);
- if (member) {
- extent._extend(member.extent(resolver, memo));
- }
+ function baseLodash() {// No operation performed.
}
+ /**
+ * The base constructor for creating `lodash` wrapper objects.
+ *
+ * @private
+ * @param {*} value The value to wrap.
+ * @param {boolean} [chainAll] Enable explicit method chain sequences.
+ */
- return extent;
- });
- },
- geometry: function geometry(graph) {
- return graph["transient"](this, 'geometry', function () {
- return this.isMultipolygon() ? 'area' : 'relation';
- });
- },
- isDegenerate: function isDegenerate() {
- return this.members.length === 0;
- },
- // Return an array of members, each extended with an 'index' property whose value
- // is the member index.
- indexedMembers: function indexedMembers() {
- var result = new Array(this.members.length);
-
- for (var i = 0; i < this.members.length; i++) {
- result[i] = Object.assign({}, this.members[i], {
- index: i
- });
- }
- return result;
- },
- // Return the first member with the given role. A copy of the member object
- // is returned, extended with an 'index' property whose value is the member index.
- memberByRole: function memberByRole(role) {
- for (var i = 0; i < this.members.length; i++) {
- if (this.members[i].role === role) {
- return Object.assign({}, this.members[i], {
- index: i
- });
+ function LodashWrapper(value, chainAll) {
+ this.__wrapped__ = value;
+ this.__actions__ = [];
+ this.__chain__ = !!chainAll;
+ this.__index__ = 0;
+ this.__values__ = undefined$1;
}
- }
- },
- // Same as memberByRole, but returns all members with the given role
- membersByRole: function membersByRole(role) {
- var result = [];
+ /**
+ * By default, the template delimiters used by lodash are like those in
+ * embedded Ruby (ERB) as well as ES2015 template strings. Change the
+ * following template settings to use alternative delimiters.
+ *
+ * @static
+ * @memberOf _
+ * @type {Object}
+ */
- for (var i = 0; i < this.members.length; i++) {
- if (this.members[i].role === role) {
- result.push(Object.assign({}, this.members[i], {
- index: i
- }));
- }
- }
- return result;
- },
- // Return the first member with the given id. A copy of the member object
- // is returned, extended with an 'index' property whose value is the member index.
- memberById: function memberById(id) {
- for (var i = 0; i < this.members.length; i++) {
- if (this.members[i].id === id) {
- return Object.assign({}, this.members[i], {
- index: i
- });
- }
- }
- },
- // Return the first member with the given id and role. A copy of the member object
- // is returned, extended with an 'index' property whose value is the member index.
- memberByIdAndRole: function memberByIdAndRole(id, role) {
- for (var i = 0; i < this.members.length; i++) {
- if (this.members[i].id === id && this.members[i].role === role) {
- return Object.assign({}, this.members[i], {
- index: i
- });
- }
- }
- },
- addMember: function addMember(member, index) {
- var members = this.members.slice();
- members.splice(index === undefined ? members.length : index, 0, member);
- return this.update({
- members: members
- });
- },
- updateMember: function updateMember(member, index) {
- var members = this.members.slice();
- members.splice(index, 1, Object.assign({}, members[index], member));
- return this.update({
- members: members
- });
- },
- removeMember: function removeMember(index) {
- var members = this.members.slice();
- members.splice(index, 1);
- return this.update({
- members: members
- });
- },
- removeMembersWithID: function removeMembersWithID(id) {
- var members = this.members.filter(function (m) {
- return m.id !== id;
- });
- return this.update({
- members: members
- });
- },
- moveMember: function moveMember(fromIndex, toIndex) {
- var members = this.members.slice();
- members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
- return this.update({
- members: members
- });
- },
- // Wherever a member appears with id `needle.id`, replace it with a member
- // with id `replacement.id`, type `replacement.type`, and the original role,
- // By default, adding a duplicate member (by id and role) is prevented.
- // Return an updated relation.
- replaceMember: function replaceMember(needle, replacement, keepDuplicates) {
- if (!this.memberById(needle.id)) return this;
- var members = [];
+ lodash.templateSettings = {
+ /**
+ * Used to detect `data` property values to be HTML-escaped.
+ *
+ * @memberOf _.templateSettings
+ * @type {RegExp}
+ */
+ 'escape': reEscape,
- for (var i = 0; i < this.members.length; i++) {
- var member = this.members[i];
+ /**
+ * Used to detect code to be evaluated.
+ *
+ * @memberOf _.templateSettings
+ * @type {RegExp}
+ */
+ 'evaluate': reEvaluate,
- if (member.id !== needle.id) {
- members.push(member);
- } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
- members.push({
- id: replacement.id,
- type: replacement.type,
- role: member.role
- });
- }
- }
+ /**
+ * Used to detect `data` property values to inject.
+ *
+ * @memberOf _.templateSettings
+ * @type {RegExp}
+ */
+ 'interpolate': reInterpolate,
- return this.update({
- members: members
- });
- },
- asJXON: function asJXON(changeset_id) {
- var r = {
- relation: {
- '@id': this.osmId(),
- '@version': this.version || 0,
- member: this.members.map(function (member) {
- return {
- keyAttributes: {
- type: member.type,
- role: member.role,
- ref: osmEntity.id.toOSM(member.id)
- }
- };
- }, this),
- tag: Object.keys(this.tags).map(function (k) {
- return {
- keyAttributes: {
- k: k,
- v: this.tags[k]
- }
- };
- }, this)
- }
- };
+ /**
+ * Used to reference the data object in the template text.
+ *
+ * @memberOf _.templateSettings
+ * @type {string}
+ */
+ 'variable': '',
- if (changeset_id) {
- r.relation['@changeset'] = changeset_id;
- }
+ /**
+ * Used to import variables into the compiled template.
+ *
+ * @memberOf _.templateSettings
+ * @type {Object}
+ */
+ 'imports': {
+ /**
+ * A reference to the `lodash` function.
+ *
+ * @memberOf _.templateSettings.imports
+ * @type {Function}
+ */
+ '_': lodash
+ }
+ }; // Ensure wrappers are instances of `baseLodash`.
+
+ lodash.prototype = baseLodash.prototype;
+ lodash.prototype.constructor = lodash;
+ LodashWrapper.prototype = baseCreate(baseLodash.prototype);
+ LodashWrapper.prototype.constructor = LodashWrapper;
+ /*------------------------------------------------------------------------*/
- return r;
- },
- asGeoJSON: function asGeoJSON(resolver) {
- return resolver["transient"](this, 'GeoJSON', function () {
- if (this.isMultipolygon()) {
- return {
- type: 'MultiPolygon',
- coordinates: this.multipolygon(resolver)
- };
- } else {
- return {
- type: 'FeatureCollection',
- properties: this.tags,
- features: this.members.map(function (member) {
- return Object.assign({
- role: member.role
- }, resolver.entity(member.id).asGeoJSON(resolver));
- })
- };
+ /**
+ * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
+ *
+ * @private
+ * @constructor
+ * @param {*} value The value to wrap.
+ */
+
+ function LazyWrapper(value) {
+ this.__wrapped__ = value;
+ this.__actions__ = [];
+ this.__dir__ = 1;
+ this.__filtered__ = false;
+ this.__iteratees__ = [];
+ this.__takeCount__ = MAX_ARRAY_LENGTH;
+ this.__views__ = [];
}
- });
- },
- area: function area(resolver) {
- return resolver["transient"](this, 'area', function () {
- return d3_geoArea(this.asGeoJSON(resolver));
- });
- },
- isMultipolygon: function isMultipolygon() {
- return this.tags.type === 'multipolygon';
- },
- isComplete: function isComplete(resolver) {
- for (var i = 0; i < this.members.length; i++) {
- if (!resolver.hasEntity(this.members[i].id)) {
- return false;
+ /**
+ * Creates a clone of the lazy wrapper object.
+ *
+ * @private
+ * @name clone
+ * @memberOf LazyWrapper
+ * @returns {Object} Returns the cloned `LazyWrapper` object.
+ */
+
+
+ function lazyClone() {
+ var result = new LazyWrapper(this.__wrapped__);
+ result.__actions__ = copyArray(this.__actions__);
+ result.__dir__ = this.__dir__;
+ result.__filtered__ = this.__filtered__;
+ result.__iteratees__ = copyArray(this.__iteratees__);
+ result.__takeCount__ = this.__takeCount__;
+ result.__views__ = copyArray(this.__views__);
+ return result;
}
- }
+ /**
+ * Reverses the direction of lazy iteration.
+ *
+ * @private
+ * @name reverse
+ * @memberOf LazyWrapper
+ * @returns {Object} Returns the new reversed `LazyWrapper` object.
+ */
- return true;
- },
- hasFromViaTo: function hasFromViaTo() {
- return this.members.some(function (m) {
- return m.role === 'from';
- }) && this.members.some(function (m) {
- return m.role === 'via';
- }) && this.members.some(function (m) {
- return m.role === 'to';
- });
- },
- isRestriction: function isRestriction() {
- return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
- },
- isValidRestriction: function isValidRestriction() {
- if (!this.isRestriction()) return false;
- var froms = this.members.filter(function (m) {
- return m.role === 'from';
- });
- var vias = this.members.filter(function (m) {
- return m.role === 'via';
- });
- var tos = this.members.filter(function (m) {
- return m.role === 'to';
- });
- if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
- if (froms.some(function (m) {
- return m.type !== 'way';
- })) return false;
- if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
- if (tos.some(function (m) {
- return m.type !== 'way';
- })) return false;
- if (vias.length === 0) return false;
- if (vias.length > 1 && vias.some(function (m) {
- return m.type !== 'way';
- })) return false;
- return true;
- },
- // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
- // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
- //
- // This corresponds to the structure needed for rendering a multipolygon path using a
- // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
- //
- // In the case of invalid geometries, this function will still return a result which
- // includes the nodes of all way members, but some Nds may be unclosed and some inner
- // rings not matched with the intended outer ring.
- //
- multipolygon: function multipolygon(resolver) {
- var outers = this.members.filter(function (m) {
- return 'outer' === (m.role || 'outer');
- });
- var inners = this.members.filter(function (m) {
- return 'inner' === m.role;
- });
- outers = osmJoinWays(outers, resolver);
- inners = osmJoinWays(inners, resolver);
- var sequenceToLineString = function sequenceToLineString(sequence) {
- if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) {
- // close unclosed parts to ensure correct area rendering - #2945
- sequence.nodes.push(sequence.nodes[0]);
+ function lazyReverse() {
+ if (this.__filtered__) {
+ var result = new LazyWrapper(this);
+ result.__dir__ = -1;
+ result.__filtered__ = true;
+ } else {
+ result = this.clone();
+ result.__dir__ *= -1;
+ }
+
+ return result;
}
+ /**
+ * Extracts the unwrapped value from its lazy wrapper.
+ *
+ * @private
+ * @name value
+ * @memberOf LazyWrapper
+ * @returns {*} Returns the unwrapped value.
+ */
- return sequence.nodes.map(function (node) {
- return node.loc;
- });
- };
- outers = outers.map(sequenceToLineString);
- inners = inners.map(sequenceToLineString);
- var result = outers.map(function (o) {
- // Heuristic for detecting counterclockwise winding order. Assumes
- // that OpenStreetMap polygons are not hemisphere-spanning.
- return [d3_geoArea({
- type: 'Polygon',
- coordinates: [o]
- }) > 2 * Math.PI ? o.reverse() : o];
- });
+ function lazyValue() {
+ var array = this.__wrapped__.value(),
+ dir = this.__dir__,
+ isArr = isArray(array),
+ isRight = dir < 0,
+ arrLength = isArr ? array.length : 0,
+ view = getView(0, arrLength, this.__views__),
+ start = view.start,
+ end = view.end,
+ length = end - start,
+ index = isRight ? end : start - 1,
+ iteratees = this.__iteratees__,
+ iterLength = iteratees.length,
+ resIndex = 0,
+ takeCount = nativeMin(length, this.__takeCount__);
- function findOuter(inner) {
- var o, outer;
+ if (!isArr || !isRight && arrLength == length && takeCount == length) {
+ return baseWrapperValue(array, this.__actions__);
+ }
- for (o = 0; o < outers.length; o++) {
- outer = outers[o];
- if (geoPolygonContainsPolygon(outer, inner)) return o;
- }
+ var result = [];
- for (o = 0; o < outers.length; o++) {
- outer = outers[o];
- if (geoPolygonIntersectsPolygon(outer, inner, false)) return o;
- }
- }
+ outer: while (length-- && resIndex < takeCount) {
+ index += dir;
+ var iterIndex = -1,
+ value = array[index];
+
+ while (++iterIndex < iterLength) {
+ var data = iteratees[iterIndex],
+ iteratee = data.iteratee,
+ type = data.type,
+ computed = iteratee(value);
+
+ if (type == LAZY_MAP_FLAG) {
+ value = computed;
+ } else if (!computed) {
+ if (type == LAZY_FILTER_FLAG) {
+ continue outer;
+ } else {
+ break outer;
+ }
+ }
+ }
- for (var i = 0; i < inners.length; i++) {
- var inner = inners[i];
+ result[resIndex++] = value;
+ }
- if (d3_geoArea({
- type: 'Polygon',
- coordinates: [inner]
- }) < 2 * Math.PI) {
- inner = inner.reverse();
- }
+ return result;
+ } // Ensure `LazyWrapper` is an instance of `baseLodash`.
- var o = findOuter(inners[i]);
- if (o !== undefined) {
- result[o].push(inners[i]);
- } else {
- result.push([inners[i]]); // Invalid geometry
- }
- }
+ LazyWrapper.prototype = baseCreate(baseLodash.prototype);
+ LazyWrapper.prototype.constructor = LazyWrapper;
+ /*------------------------------------------------------------------------*/
- return result;
- }
- });
+ /**
+ * Creates a hash object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
- var QAItem = /*#__PURE__*/function () {
- function QAItem(loc, service, itemType, id, props) {
- _classCallCheck(this, QAItem);
+ function Hash(entries) {
+ var index = -1,
+ length = entries == null ? 0 : entries.length;
+ this.clear();
- // Store required properties
- this.loc = loc;
- this.service = service.title;
- this.itemType = itemType; // All issues must have an ID for selection, use generic if none specified
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+ /**
+ * Removes all key-value entries from the hash.
+ *
+ * @private
+ * @name clear
+ * @memberOf Hash
+ */
- this.id = id ? id : "".concat(QAItem.id());
- this.update(props); // Some QA services have marker icons to differentiate issues
- if (service && typeof service.getIcon === 'function') {
- this.icon = service.getIcon(itemType);
- }
- }
+ function hashClear() {
+ this.__data__ = nativeCreate ? nativeCreate(null) : {};
+ this.size = 0;
+ }
+ /**
+ * Removes `key` and its value from the hash.
+ *
+ * @private
+ * @name delete
+ * @memberOf Hash
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
- _createClass(QAItem, [{
- key: "update",
- value: function update(props) {
- var _this = this;
- // You can't override this initial information
- var loc = this.loc,
- service = this.service,
- itemType = this.itemType,
- id = this.id;
- Object.keys(props).forEach(function (prop) {
- return _this[prop] = props[prop];
- });
- this.loc = loc;
- this.service = service;
- this.itemType = itemType;
- this.id = id;
- return this;
- } // Generic handling for newly created QAItems
+ function hashDelete(key) {
+ var result = this.has(key) && delete this.__data__[key];
+ this.size -= result ? 1 : 0;
+ return result;
+ }
+ /**
+ * Gets the hash value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Hash
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
- }], [{
- key: "id",
- value: function id() {
- return this.nextId--;
- }
- }]);
- return QAItem;
- }();
- QAItem.nextId = -1;
+ function hashGet(key) {
+ var data = this.__data__;
- //
- // Optionally, split only the given ways, if multiple ways share
- // the given node.
- //
- // This is the inverse of `iD.actionJoin`.
- //
- // For testing convenience, accepts an ID to assign to the new way.
- // Normally, this will be undefined and the way will automatically
- // be assigned a new ID.
- //
- // Reference:
- // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
- //
+ if (nativeCreate) {
+ var result = data[key];
+ return result === HASH_UNDEFINED ? undefined$1 : result;
+ }
- function actionSplit(nodeIds, newWayIds) {
- // accept single ID for backwards-compatiblity
- if (typeof nodeIds === 'string') nodeIds = [nodeIds];
+ return hasOwnProperty.call(data, key) ? data[key] : undefined$1;
+ }
+ /**
+ * Checks if a hash value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Hash
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+
+
+ function hashHas(key) {
+ var data = this.__data__;
+ return nativeCreate ? data[key] !== undefined$1 : hasOwnProperty.call(data, key);
+ }
+ /**
+ * Sets the hash `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Hash
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the hash instance.
+ */
- var _wayIDs; // the strategy for picking which way will have a new version and which way is newly created
+ function hashSet(key, value) {
+ var data = this.__data__;
+ this.size += this.has(key) ? 0 : 1;
+ data[key] = nativeCreate && value === undefined$1 ? HASH_UNDEFINED : value;
+ return this;
+ } // Add methods to `Hash`.
- var _keepHistoryOn = 'longest'; // 'longest', 'first'
- // The IDs of the ways actually created by running this action
- var _createdWayIDs = [];
+ Hash.prototype.clear = hashClear;
+ Hash.prototype['delete'] = hashDelete;
+ Hash.prototype.get = hashGet;
+ Hash.prototype.has = hashHas;
+ Hash.prototype.set = hashSet;
+ /*------------------------------------------------------------------------*/
- function dist(graph, nA, nB) {
- var locA = graph.entity(nA).loc;
- var locB = graph.entity(nB).loc;
- var epsilon = 1e-6;
- return locA && locB ? geoSphericalDistance(locA, locB) : epsilon;
- } // If the way is closed, we need to search for a partner node
- // to split the way at.
- //
- // The following looks for a node that is both far away from
- // the initial node in terms of way segment length and nearby
- // in terms of beeline-distance. This assures that areas get
- // split on the most "natural" points (independent of the number
- // of nodes).
- // For example: bone-shaped areas get split across their waist
- // line, circles across the diameter.
+ /**
+ * Creates an list cache object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+ function ListCache(entries) {
+ var index = -1,
+ length = entries == null ? 0 : entries.length;
+ this.clear();
- function splitArea(nodes, idxA, graph) {
- var lengths = new Array(nodes.length);
- var length;
- var i;
- var best = 0;
- var idxB;
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+ /**
+ * Removes all key-value entries from the list cache.
+ *
+ * @private
+ * @name clear
+ * @memberOf ListCache
+ */
- function wrap(index) {
- return utilWrap(index, nodes.length);
- } // calculate lengths
+ function listCacheClear() {
+ this.__data__ = [];
+ this.size = 0;
+ }
+ /**
+ * Removes `key` and its value from the list cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf ListCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
- length = 0;
- for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) {
- length += dist(graph, nodes[i], nodes[wrap(i - 1)]);
- lengths[i] = length;
- }
+ function listCacheDelete(key) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
- length = 0;
+ if (index < 0) {
+ return false;
+ }
- for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) {
- length += dist(graph, nodes[i], nodes[wrap(i + 1)]);
+ var lastIndex = data.length - 1;
- if (length < lengths[i]) {
- lengths[i] = length;
+ if (index == lastIndex) {
+ data.pop();
+ } else {
+ splice.call(data, index, 1);
+ }
+
+ --this.size;
+ return true;
}
- } // determine best opposite node to split
+ /**
+ * Gets the list cache value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf ListCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
- for (i = 0; i < nodes.length; i++) {
- var cost = lengths[i] / dist(graph, nodes[idxA], nodes[i]);
+ function listCacheGet(key) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+ return index < 0 ? undefined$1 : data[index][1];
+ }
+ /**
+ * Checks if a list cache value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf ListCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
- if (cost > best) {
- idxB = i;
- best = cost;
+
+ function listCacheHas(key) {
+ return assocIndexOf(this.__data__, key) > -1;
}
- }
+ /**
+ * Sets the list cache `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf ListCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the list cache instance.
+ */
- return idxB;
- }
- function totalLengthBetweenNodes(graph, nodes) {
- var totalLength = 0;
+ function listCacheSet(key, value) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
- for (var i = 0; i < nodes.length - 1; i++) {
- totalLength += dist(graph, nodes[i], nodes[i + 1]);
- }
+ if (index < 0) {
+ ++this.size;
+ data.push([key, value]);
+ } else {
+ data[index][1] = value;
+ }
- return totalLength;
- }
+ return this;
+ } // Add methods to `ListCache`.
- function split(graph, nodeId, wayA, newWayId) {
- var wayB = osmWay({
- id: newWayId,
- tags: wayA.tags
- }); // `wayB` is the NEW way
- var origNodes = wayA.nodes.slice();
- var nodesA;
- var nodesB;
- var isArea = wayA.isArea();
- var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
+ ListCache.prototype.clear = listCacheClear;
+ ListCache.prototype['delete'] = listCacheDelete;
+ ListCache.prototype.get = listCacheGet;
+ ListCache.prototype.has = listCacheHas;
+ ListCache.prototype.set = listCacheSet;
+ /*------------------------------------------------------------------------*/
- if (wayA.isClosed()) {
- var nodes = wayA.nodes.slice(0, -1);
- var idxA = nodes.indexOf(nodeId);
- var idxB = splitArea(nodes, idxA, graph);
+ /**
+ * Creates a map cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
- if (idxB < idxA) {
- nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
- nodesB = nodes.slice(idxB, idxA + 1);
- } else {
- nodesA = nodes.slice(idxA, idxB + 1);
- nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
+ function MapCache(entries) {
+ var index = -1,
+ length = entries == null ? 0 : entries.length;
+ this.clear();
+
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
}
- } else {
- var idx = wayA.nodes.indexOf(nodeId, 1);
- nodesA = wayA.nodes.slice(0, idx + 1);
- nodesB = wayA.nodes.slice(idx);
- }
+ /**
+ * Removes all key-value entries from the map.
+ *
+ * @private
+ * @name clear
+ * @memberOf MapCache
+ */
- var lengthA = totalLengthBetweenNodes(graph, nodesA);
- var lengthB = totalLengthBetweenNodes(graph, nodesB);
- if (_keepHistoryOn === 'longest' && lengthB > lengthA) {
- // keep the history on the longer way, regardless of the node count
- wayA = wayA.update({
- nodes: nodesB
- });
- wayB = wayB.update({
- nodes: nodesA
- });
- var temp = lengthA;
- lengthA = lengthB;
- lengthB = temp;
- } else {
- wayA = wayA.update({
- nodes: nodesA
- });
- wayB = wayB.update({
- nodes: nodesB
- });
- }
+ function mapCacheClear() {
+ this.size = 0;
+ this.__data__ = {
+ 'hash': new Hash(),
+ 'map': new (Map || ListCache)(),
+ 'string': new Hash()
+ };
+ }
+ /**
+ * Removes `key` and its value from the map.
+ *
+ * @private
+ * @name delete
+ * @memberOf MapCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
- if (wayA.tags.step_count) {
- // divide up the the step count proportionally between the two ways
- var stepCount = parseFloat(wayA.tags.step_count);
- if (stepCount && // ensure a number
- isFinite(stepCount) && // ensure positive
- stepCount > 0 && // ensure integer
- Math.round(stepCount) === stepCount) {
- var tagsA = Object.assign({}, wayA.tags);
- var tagsB = Object.assign({}, wayB.tags);
- var ratioA = lengthA / (lengthA + lengthB);
- var countA = Math.round(stepCount * ratioA);
- tagsA.step_count = countA.toString();
- tagsB.step_count = (stepCount - countA).toString();
- wayA = wayA.update({
- tags: tagsA
- });
- wayB = wayB.update({
- tags: tagsB
- });
+ function mapCacheDelete(key) {
+ var result = getMapData(this, key)['delete'](key);
+ this.size -= result ? 1 : 0;
+ return result;
}
- }
-
- graph = graph.replace(wayA);
- graph = graph.replace(wayB);
- graph.parentRelations(wayA).forEach(function (relation) {
- var member; // Turn restrictions - make sure:
- // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
- // (whichever one is connected to the VIA node/ways)
- // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
+ /**
+ * Gets the map value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf MapCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
- if (relation.hasFromViaTo()) {
- var f = relation.memberByRole('from');
- var v = relation.membersByRole('via');
- var t = relation.memberByRole('to');
- var i; // 1. split a FROM/TO
- if (f.id === wayA.id || t.id === wayA.id) {
- var keepB = false;
+ function mapCacheGet(key) {
+ return getMapData(this, key).get(key);
+ }
+ /**
+ * Checks if a map value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf MapCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
- if (v.length === 1 && v[0].type === 'node') {
- // check via node
- keepB = wayB.contains(v[0].id);
- } else {
- // check via way(s)
- for (i = 0; i < v.length; i++) {
- if (v[i].type === 'way') {
- var wayVia = graph.hasEntity(v[i].id);
- if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
- keepB = true;
- break;
- }
- }
- }
- }
+ function mapCacheHas(key) {
+ return getMapData(this, key).has(key);
+ }
+ /**
+ * Sets the map `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf MapCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the map cache instance.
+ */
- if (keepB) {
- relation = relation.replaceMember(wayA, wayB);
- graph = graph.replace(relation);
- } // 2. split a VIA
- } else {
- for (i = 0; i < v.length; i++) {
- if (v[i].type === 'way' && v[i].id === wayA.id) {
- member = {
- id: wayB.id,
- type: 'way',
- role: 'via'
- };
- graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
- break;
- }
- }
- } // All other relations (Routes, Multipolygons, etc):
- // 1. Both `wayA` and `wayB` remain in the relation
- // 2. But must be inserted as a pair (see `actionAddMember` for details)
+ function mapCacheSet(key, value) {
+ var data = getMapData(this, key),
+ size = data.size;
+ data.set(key, value);
+ this.size += data.size == size ? 0 : 1;
+ return this;
+ } // Add methods to `MapCache`.
- } else {
- if (relation === isOuter) {
- graph = graph.replace(relation.mergeTags(wayA.tags));
- graph = graph.replace(wayA.update({
- tags: {}
- }));
- graph = graph.replace(wayB.update({
- tags: {}
- }));
- }
- member = {
- id: wayB.id,
- type: 'way',
- role: relation.memberById(wayA.id).role
- };
- var insertPair = {
- originalID: wayA.id,
- insertedID: wayB.id,
- nodes: origNodes
- };
- graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
- }
- });
+ MapCache.prototype.clear = mapCacheClear;
+ MapCache.prototype['delete'] = mapCacheDelete;
+ MapCache.prototype.get = mapCacheGet;
+ MapCache.prototype.has = mapCacheHas;
+ MapCache.prototype.set = mapCacheSet;
+ /*------------------------------------------------------------------------*/
- if (!isOuter && isArea) {
- var multipolygon = osmRelation({
- tags: Object.assign({}, wayA.tags, {
- type: 'multipolygon'
- }),
- members: [{
- id: wayA.id,
- role: 'outer',
- type: 'way'
- }, {
- id: wayB.id,
- role: 'outer',
- type: 'way'
- }]
- });
- graph = graph.replace(multipolygon);
- graph = graph.replace(wayA.update({
- tags: {}
- }));
- graph = graph.replace(wayB.update({
- tags: {}
- }));
- }
+ /**
+ *
+ * Creates an array cache object to store unique values.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [values] The values to cache.
+ */
- _createdWayIDs.push(wayB.id);
+ function SetCache(values) {
+ var index = -1,
+ length = values == null ? 0 : values.length;
+ this.__data__ = new MapCache();
- return graph;
- }
+ while (++index < length) {
+ this.add(values[index]);
+ }
+ }
+ /**
+ * Adds `value` to the array cache.
+ *
+ * @private
+ * @name add
+ * @memberOf SetCache
+ * @alias push
+ * @param {*} value The value to cache.
+ * @returns {Object} Returns the cache instance.
+ */
- var action = function action(graph) {
- _createdWayIDs = [];
- var newWayIndex = 0;
- for (var i = 0; i < nodeIds.length; i++) {
- var nodeId = nodeIds[i];
- var candidates = action.waysForNode(nodeId, graph);
+ function setCacheAdd(value) {
+ this.__data__.set(value, HASH_UNDEFINED);
- for (var j = 0; j < candidates.length; j++) {
- graph = split(graph, nodeId, candidates[j], newWayIds && newWayIds[newWayIndex]);
- newWayIndex += 1;
+ return this;
}
- }
+ /**
+ * Checks if `value` is in the array cache.
+ *
+ * @private
+ * @name has
+ * @memberOf SetCache
+ * @param {*} value The value to search for.
+ * @returns {number} Returns `true` if `value` is found, else `false`.
+ */
- return graph;
- };
- action.getCreatedWayIDs = function () {
- return _createdWayIDs;
- };
+ function setCacheHas(value) {
+ return this.__data__.has(value);
+ } // Add methods to `SetCache`.
- action.waysForNode = function (nodeId, graph) {
- var node = graph.entity(nodeId);
- var splittableParents = graph.parentWays(node).filter(isSplittable);
- if (!_wayIDs) {
- // If the ways to split aren't specified, only split the lines.
- // If there are no lines to split, split the areas.
- var hasLine = splittableParents.some(function (parent) {
- return parent.geometry(graph) === 'line';
- });
+ SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
+ SetCache.prototype.has = setCacheHas;
+ /*------------------------------------------------------------------------*/
- if (hasLine) {
- return splittableParents.filter(function (parent) {
- return parent.geometry(graph) === 'line';
- });
+ /**
+ * Creates a stack cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+
+ function Stack(entries) {
+ var data = this.__data__ = new ListCache(entries);
+ this.size = data.size;
}
- }
+ /**
+ * Removes all key-value entries from the stack.
+ *
+ * @private
+ * @name clear
+ * @memberOf Stack
+ */
- return splittableParents;
- function isSplittable(parent) {
- // If the ways to split are specified, ignore everything else.
- if (_wayIDs && _wayIDs.indexOf(parent.id) === -1) return false; // We can fake splitting closed ways at their endpoints...
+ function stackClear() {
+ this.__data__ = new ListCache();
+ this.size = 0;
+ }
+ /**
+ * Removes `key` and its value from the stack.
+ *
+ * @private
+ * @name delete
+ * @memberOf Stack
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
- if (parent.isClosed()) return true; // otherwise, we can't split nodes at their endpoints.
- for (var i = 1; i < parent.nodes.length - 1; i++) {
- if (parent.nodes[i] === nodeId) return true;
+ function stackDelete(key) {
+ var data = this.__data__,
+ result = data['delete'](key);
+ this.size = data.size;
+ return result;
}
+ /**
+ * Gets the stack value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Stack
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
- return false;
- }
- };
- action.ways = function (graph) {
- return utilArrayUniq([].concat.apply([], nodeIds.map(function (nodeId) {
- return action.waysForNode(nodeId, graph);
- })));
- };
+ function stackGet(key) {
+ return this.__data__.get(key);
+ }
+ /**
+ * Checks if a stack value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Stack
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
- action.disabled = function (graph) {
- for (var i = 0; i < nodeIds.length; i++) {
- var nodeId = nodeIds[i];
- var candidates = action.waysForNode(nodeId, graph);
- if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) {
- return 'not_eligible';
+ function stackHas(key) {
+ return this.__data__.has(key);
}
- }
- };
-
- action.limitWays = function (val) {
- if (!arguments.length) return _wayIDs;
- _wayIDs = val;
- return action;
- };
+ /**
+ * Sets the stack `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Stack
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the stack cache instance.
+ */
- action.keepHistoryOn = function (val) {
- if (!arguments.length) return _keepHistoryOn;
- _keepHistoryOn = val;
- return action;
- };
- return action;
- }
+ function stackSet(key, value) {
+ var data = this.__data__;
- function coreGraph(other, mutable) {
- if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
+ if (data instanceof ListCache) {
+ var pairs = data.__data__;
- if (other instanceof coreGraph) {
- var base = other.base();
- this.entities = Object.assign(Object.create(base.entities), other.entities);
- this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
- this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
- } else {
- this.entities = Object.create({});
- this._parentWays = Object.create({});
- this._parentRels = Object.create({});
- this.rebase(other || [], [this]);
- }
+ if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {
+ pairs.push([key, value]);
+ this.size = ++data.size;
+ return this;
+ }
- this.transients = {};
- this._childNodes = {};
- this.frozen = !mutable;
- }
- coreGraph.prototype = {
- hasEntity: function hasEntity(id) {
- return this.entities[id];
- },
- entity: function entity(id) {
- var entity = this.entities[id]; //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
+ data = this.__data__ = new MapCache(pairs);
+ }
- if (!entity) {
- entity = this.entities.__proto__[id]; // eslint-disable-line no-proto
- }
+ data.set(key, value);
+ this.size = data.size;
+ return this;
+ } // Add methods to `Stack`.
- if (!entity) {
- throw new Error('entity ' + id + ' not found');
- }
- return entity;
- },
- geometry: function geometry(id) {
- return this.entity(id).geometry(this);
- },
- "transient": function transient(entity, key, fn) {
- var id = entity.id;
- var transients = this.transients[id] || (this.transients[id] = {});
+ Stack.prototype.clear = stackClear;
+ Stack.prototype['delete'] = stackDelete;
+ Stack.prototype.get = stackGet;
+ Stack.prototype.has = stackHas;
+ Stack.prototype.set = stackSet;
+ /*------------------------------------------------------------------------*/
- if (transients[key] !== undefined) {
- return transients[key];
- }
+ /**
+ * Creates an array of the enumerable property names of the array-like `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @param {boolean} inherited Specify returning inherited property names.
+ * @returns {Array} Returns the array of property names.
+ */
- transients[key] = fn.call(entity);
- return transients[key];
- },
- parentWays: function parentWays(entity) {
- var parents = this._parentWays[entity.id];
- var result = [];
+ function arrayLikeKeys(value, inherited) {
+ var isArr = isArray(value),
+ isArg = !isArr && isArguments(value),
+ isBuff = !isArr && !isArg && isBuffer(value),
+ isType = !isArr && !isArg && !isBuff && isTypedArray(value),
+ skipIndexes = isArr || isArg || isBuff || isType,
+ result = skipIndexes ? baseTimes(value.length, String) : [],
+ length = result.length;
+
+ for (var key in value) {
+ if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode.
+ key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers.
+ isBuff && (key == 'offset' || key == 'parent') || // PhantomJS 2 has enumerable non-index properties on typed arrays.
+ isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset') || // Skip index properties.
+ isIndex(key, length)))) {
+ result.push(key);
+ }
+ }
- if (parents) {
- parents.forEach(function (id) {
- result.push(this.entity(id));
- }, this);
- }
+ return result;
+ }
+ /**
+ * A specialized version of `_.sample` for arrays.
+ *
+ * @private
+ * @param {Array} array The array to sample.
+ * @returns {*} Returns the random element.
+ */
- return result;
- },
- isPoi: function isPoi(entity) {
- var parents = this._parentWays[entity.id];
- return !parents || parents.size === 0;
- },
- isShared: function isShared(entity) {
- var parents = this._parentWays[entity.id];
- return parents && parents.size > 1;
- },
- parentRelations: function parentRelations(entity) {
- var parents = this._parentRels[entity.id];
- var result = [];
- if (parents) {
- parents.forEach(function (id) {
- result.push(this.entity(id));
- }, this);
- }
+ function arraySample(array) {
+ var length = array.length;
+ return length ? array[baseRandom(0, length - 1)] : undefined$1;
+ }
+ /**
+ * A specialized version of `_.sampleSize` for arrays.
+ *
+ * @private
+ * @param {Array} array The array to sample.
+ * @param {number} n The number of elements to sample.
+ * @returns {Array} Returns the random elements.
+ */
- return result;
- },
- parentMultipolygons: function parentMultipolygons(entity) {
- return this.parentRelations(entity).filter(function (relation) {
- return relation.isMultipolygon();
- });
- },
- childNodes: function childNodes(entity) {
- if (this._childNodes[entity.id]) return this._childNodes[entity.id];
- if (!entity.nodes) return [];
- var nodes = [];
- for (var i = 0; i < entity.nodes.length; i++) {
- nodes[i] = this.entity(entity.nodes[i]);
- }
- this._childNodes[entity.id] = nodes;
- return this._childNodes[entity.id];
- },
- base: function base() {
- return {
- 'entities': Object.getPrototypeOf(this.entities),
- 'parentWays': Object.getPrototypeOf(this._parentWays),
- 'parentRels': Object.getPrototypeOf(this._parentRels)
- };
- },
- // Unlike other graph methods, rebase mutates in place. This is because it
- // is used only during the history operation that merges newly downloaded
- // data into each state. To external consumers, it should appear as if the
- // graph always contained the newly downloaded data.
- rebase: function rebase(entities, stack, force) {
- var base = this.base();
- var i, j, k, id;
+ function arraySampleSize(array, n) {
+ return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
+ }
+ /**
+ * A specialized version of `_.shuffle` for arrays.
+ *
+ * @private
+ * @param {Array} array The array to shuffle.
+ * @returns {Array} Returns the new shuffled array.
+ */
- for (i = 0; i < entities.length; i++) {
- var entity = entities[i];
- if (!entity.visible || !force && base.entities[entity.id]) continue; // Merging data into the base graph
- base.entities[entity.id] = entity;
+ function arrayShuffle(array) {
+ return shuffleSelf(copyArray(array));
+ }
+ /**
+ * This function is like `assignValue` except that it doesn't assign
+ * `undefined` values.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
- this._updateCalculated(undefined, entity, base.parentWays, base.parentRels); // Restore provisionally-deleted nodes that are discovered to have an extant parent
+ function assignMergeValue(object, key, value) {
+ if (value !== undefined$1 && !eq(object[key], value) || value === undefined$1 && !(key in object)) {
+ baseAssignValue(object, key, value);
+ }
+ }
+ /**
+ * Assigns `value` to `key` of `object` if the existing value is not equivalent
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
- if (entity.type === 'way') {
- for (j = 0; j < entity.nodes.length; j++) {
- id = entity.nodes[j];
- for (k = 1; k < stack.length; k++) {
- var ents = stack[k].entities;
+ function assignValue(object, key, value) {
+ var objValue = object[key];
- if (ents.hasOwnProperty(id) && ents[id] === undefined) {
- delete ents[id];
- }
- }
+ if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || value === undefined$1 && !(key in object)) {
+ baseAssignValue(object, key, value);
}
}
- }
+ /**
+ * Gets the index at which the `key` is found in `array` of key-value pairs.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} key The key to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
- for (i = 0; i < stack.length; i++) {
- stack[i]._updateRebased();
- }
- },
- _updateRebased: function _updateRebased() {
- var base = this.base();
- Object.keys(this._parentWays).forEach(function (child) {
- if (base.parentWays[child]) {
- base.parentWays[child].forEach(function (id) {
- if (!this.entities.hasOwnProperty(id)) {
- this._parentWays[child].add(id);
- }
- }, this);
- }
- }, this);
- Object.keys(this._parentRels).forEach(function (child) {
- if (base.parentRels[child]) {
- base.parentRels[child].forEach(function (id) {
- if (!this.entities.hasOwnProperty(id)) {
- this._parentRels[child].add(id);
+
+ function assocIndexOf(array, key) {
+ var length = array.length;
+
+ while (length--) {
+ if (eq(array[length][0], key)) {
+ return length;
}
- }, this);
+ }
+
+ return -1;
}
- }, this);
- this.transients = {}; // this._childNodes is not updated, under the assumption that
- // ways are always downloaded with their child nodes.
- },
- // Updates calculated properties (parentWays, parentRels) for the specified change
- _updateCalculated: function _updateCalculated(oldentity, entity, parentWays, parentRels) {
- parentWays = parentWays || this._parentWays;
- parentRels = parentRels || this._parentRels;
- var type = entity && entity.type || oldentity && oldentity.type;
- var removed, added, i;
+ /**
+ * Aggregates elements of `collection` on `accumulator` with keys transformed
+ * by `iteratee` and values set by `setter`.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} setter The function to set `accumulator` values.
+ * @param {Function} iteratee The iteratee to transform keys.
+ * @param {Object} accumulator The initial aggregated object.
+ * @returns {Function} Returns `accumulator`.
+ */
- if (type === 'way') {
- // Update parentWays
- if (oldentity && entity) {
- removed = utilArrayDifference(oldentity.nodes, entity.nodes);
- added = utilArrayDifference(entity.nodes, oldentity.nodes);
- } else if (oldentity) {
- removed = oldentity.nodes;
- added = [];
- } else if (entity) {
- removed = [];
- added = entity.nodes;
+
+ function baseAggregator(collection, setter, iteratee, accumulator) {
+ baseEach(collection, function (value, key, collection) {
+ setter(accumulator, value, iteratee(value), collection);
+ });
+ return accumulator;
}
+ /**
+ * The base implementation of `_.assign` without support for multiple sources
+ * or `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
- for (i = 0; i < removed.length; i++) {
- // make a copy of prototype property, store as own property, and update..
- parentWays[removed[i]] = new Set(parentWays[removed[i]]);
- parentWays[removed[i]]["delete"](oldentity.id);
+
+ function baseAssign(object, source) {
+ return object && copyObject(source, keys(source), object);
}
+ /**
+ * The base implementation of `_.assignIn` without support for multiple sources
+ * or `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
- for (i = 0; i < added.length; i++) {
- // make a copy of prototype property, store as own property, and update..
- parentWays[added[i]] = new Set(parentWays[added[i]]);
- parentWays[added[i]].add(entity.id);
+
+ function baseAssignIn(object, source) {
+ return object && copyObject(source, keysIn(source), object);
}
- } else if (type === 'relation') {
- // Update parentRels
- // diff only on the IDs since the same entity can be a member multiple times with different roles
- var oldentityMemberIDs = oldentity ? oldentity.members.map(function (m) {
- return m.id;
- }) : [];
- var entityMemberIDs = entity ? entity.members.map(function (m) {
- return m.id;
- }) : [];
+ /**
+ * The base implementation of `assignValue` and `assignMergeValue` without
+ * value checks.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
- if (oldentity && entity) {
- removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
- added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
- } else if (oldentity) {
- removed = oldentityMemberIDs;
- added = [];
- } else if (entity) {
- removed = [];
- added = entityMemberIDs;
+
+ function baseAssignValue(object, key, value) {
+ if (key == '__proto__' && defineProperty) {
+ defineProperty(object, key, {
+ 'configurable': true,
+ 'enumerable': true,
+ 'value': value,
+ 'writable': true
+ });
+ } else {
+ object[key] = value;
+ }
}
+ /**
+ * The base implementation of `_.at` without support for individual paths.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {string[]} paths The property paths to pick.
+ * @returns {Array} Returns the picked elements.
+ */
- for (i = 0; i < removed.length; i++) {
- // make a copy of prototype property, store as own property, and update..
- parentRels[removed[i]] = new Set(parentRels[removed[i]]);
- parentRels[removed[i]]["delete"](oldentity.id);
+
+ function baseAt(object, paths) {
+ var index = -1,
+ length = paths.length,
+ result = Array(length),
+ skip = object == null;
+
+ while (++index < length) {
+ result[index] = skip ? undefined$1 : get(object, paths[index]);
+ }
+
+ return result;
}
+ /**
+ * The base implementation of `_.clamp` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {number} number The number to clamp.
+ * @param {number} [lower] The lower bound.
+ * @param {number} upper The upper bound.
+ * @returns {number} Returns the clamped number.
+ */
- for (i = 0; i < added.length; i++) {
- // make a copy of prototype property, store as own property, and update..
- parentRels[added[i]] = new Set(parentRels[added[i]]);
- parentRels[added[i]].add(entity.id);
+
+ function baseClamp(number, lower, upper) {
+ if (number === number) {
+ if (upper !== undefined$1) {
+ number = number <= upper ? number : upper;
+ }
+
+ if (lower !== undefined$1) {
+ number = number >= lower ? number : lower;
+ }
+ }
+
+ return number;
}
- }
- },
- replace: function replace(entity) {
- if (this.entities[entity.id] === entity) return this;
- return this.update(function () {
- this._updateCalculated(this.entities[entity.id], entity);
+ /**
+ * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+ * traversed objects.
+ *
+ * @private
+ * @param {*} value The value to clone.
+ * @param {boolean} bitmask The bitmask flags.
+ * 1 - Deep clone
+ * 2 - Flatten inherited properties
+ * 4 - Clone symbols
+ * @param {Function} [customizer] The function to customize cloning.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The parent object of `value`.
+ * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+ * @returns {*} Returns the cloned value.
+ */
- this.entities[entity.id] = entity;
- });
- },
- remove: function remove(entity) {
- return this.update(function () {
- this._updateCalculated(entity, undefined);
- this.entities[entity.id] = undefined;
- });
- },
- revert: function revert(id) {
- var baseEntity = this.base().entities[id];
- var headEntity = this.entities[id];
- if (headEntity === baseEntity) return this;
- return this.update(function () {
- this._updateCalculated(headEntity, baseEntity);
+ function baseClone(value, bitmask, customizer, key, object, stack) {
+ var result,
+ isDeep = bitmask & CLONE_DEEP_FLAG,
+ isFlat = bitmask & CLONE_FLAT_FLAG,
+ isFull = bitmask & CLONE_SYMBOLS_FLAG;
- delete this.entities[id];
- });
- },
- update: function update() {
- var graph = this.frozen ? coreGraph(this, true) : this;
+ if (customizer) {
+ result = object ? customizer(value, key, object, stack) : customizer(value);
+ }
- for (var i = 0; i < arguments.length; i++) {
- arguments[i].call(graph, graph);
- }
+ if (result !== undefined$1) {
+ return result;
+ }
- if (this.frozen) graph.frozen = true;
- return graph;
- },
- // Obliterates any existing entities
- load: function load(entities) {
- var base = this.base();
- this.entities = Object.create(base.entities);
+ if (!isObject(value)) {
+ return value;
+ }
- for (var i in entities) {
- this.entities[i] = entities[i];
+ var isArr = isArray(value);
- this._updateCalculated(base.entities[i], this.entities[i]);
- }
+ if (isArr) {
+ result = initCloneArray(value);
- return this;
- }
- };
+ if (!isDeep) {
+ return copyArray(value, result);
+ }
+ } else {
+ var tag = getTag(value),
+ isFunc = tag == funcTag || tag == genTag;
- function osmTurn(turn) {
- if (!(this instanceof osmTurn)) {
- return new osmTurn(turn);
- }
+ if (isBuffer(value)) {
+ return cloneBuffer(value, isDeep);
+ }
- Object.assign(this, turn);
- }
- function osmIntersection(graph, startVertexId, maxDistance) {
- maxDistance = maxDistance || 30; // in meters
+ if (tag == objectTag || tag == argsTag || isFunc && !object) {
+ result = isFlat || isFunc ? {} : initCloneObject(value);
- var vgraph = coreGraph(); // virtual graph
+ if (!isDeep) {
+ return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value));
+ }
+ } else {
+ if (!cloneableTags[tag]) {
+ return object ? value : {};
+ }
- var i, j, k;
+ result = initCloneByTag(value, tag, isDeep);
+ }
+ } // Check for circular references and return its corresponding clone.
- function memberOfRestriction(entity) {
- return graph.parentRelations(entity).some(function (r) {
- return r.isRestriction();
- });
- }
- function isRoad(way) {
- if (way.isArea() || way.isDegenerate()) return false;
- var roads = {
- 'motorway': true,
- 'motorway_link': true,
- 'trunk': true,
- 'trunk_link': true,
- 'primary': true,
- 'primary_link': true,
- 'secondary': true,
- 'secondary_link': true,
- 'tertiary': true,
- 'tertiary_link': true,
- 'residential': true,
- 'unclassified': true,
- 'living_street': true,
- 'service': true,
- 'road': true,
- 'track': true
- };
- return roads[way.tags.highway];
- }
+ stack || (stack = new Stack());
+ var stacked = stack.get(value);
- var startNode = graph.entity(startVertexId);
- var checkVertices = [startNode];
- var checkWays;
- var vertices = [];
- var vertexIds = [];
- var vertex;
- var ways = [];
- var wayIds = [];
- var way;
- var nodes = [];
- var node;
- var parents = [];
- var parent; // `actions` will store whatever actions must be performed to satisfy
- // preconditions for adding a turn restriction to this intersection.
- // - Remove any existing degenerate turn restrictions (missing from/to, etc)
- // - Reverse oneways so that they are drawn in the forward direction
- // - Split ways on key vertices
+ if (stacked) {
+ return stacked;
+ }
- var actions = []; // STEP 1: walk the graph outwards from starting vertex to search
- // for more key vertices and ways to include in the intersection..
+ stack.set(value, result);
- while (checkVertices.length) {
- vertex = checkVertices.pop(); // check this vertex for parent ways that are roads
+ if (isSet(value)) {
+ value.forEach(function (subValue) {
+ result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
+ });
+ } else if (isMap(value)) {
+ value.forEach(function (subValue, key) {
+ result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
+ });
+ }
- checkWays = graph.parentWays(vertex);
- var hasWays = false;
+ var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
+ var props = isArr ? undefined$1 : keysFunc(value);
+ arrayEach(props || value, function (subValue, key) {
+ if (props) {
+ key = subValue;
+ subValue = value[key];
+ } // Recursively populate clone (susceptible to call stack limits).
- for (i = 0; i < checkWays.length; i++) {
- way = checkWays[i];
- if (!isRoad(way) && !memberOfRestriction(way)) continue;
- ways.push(way); // it's a road, or it's already in a turn restriction
- hasWays = true; // check the way's children for more key vertices
+ assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
+ });
+ return result;
+ }
+ /**
+ * The base implementation of `_.conforms` which doesn't clone `source`.
+ *
+ * @private
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {Function} Returns the new spec function.
+ */
- nodes = utilArrayUniq(graph.childNodes(way));
- for (j = 0; j < nodes.length; j++) {
- node = nodes[j];
- if (node === vertex) continue; // same thing
+ function baseConforms(source) {
+ var props = keys(source);
+ return function (object) {
+ return baseConformsTo(object, source, props);
+ };
+ }
+ /**
+ * The base implementation of `_.conformsTo` which accepts `props` to check.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+ */
- if (vertices.indexOf(node) !== -1) continue; // seen it already
- if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue; // too far from start
- // a key vertex will have parents that are also roads
+ function baseConformsTo(object, source, props) {
+ var length = props.length;
- var hasParents = false;
- parents = graph.parentWays(node);
+ if (object == null) {
+ return !length;
+ }
- for (k = 0; k < parents.length; k++) {
- parent = parents[k];
- if (parent === way) continue; // same thing
+ object = Object(object);
- if (ways.indexOf(parent) !== -1) continue; // seen it already
+ while (length--) {
+ var key = props[length],
+ predicate = source[key],
+ value = object[key];
- if (!isRoad(parent)) continue; // not a road
+ if (value === undefined$1 && !(key in object) || !predicate(value)) {
+ return false;
+ }
+ }
- hasParents = true;
- break;
+ return true;
+ }
+ /**
+ * The base implementation of `_.delay` and `_.defer` which accepts `args`
+ * to provide to `func`.
+ *
+ * @private
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @param {Array} args The arguments to provide to `func`.
+ * @returns {number|Object} Returns the timer id or timeout object.
+ */
+
+
+ function baseDelay(func, wait, args) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
}
- if (hasParents) {
- checkVertices.push(node);
+ return setTimeout(function () {
+ func.apply(undefined$1, args);
+ }, wait);
+ }
+ /**
+ * The base implementation of methods like `_.difference` without support
+ * for excluding multiple arrays or iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Array} values The values to exclude.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ */
+
+
+ function baseDifference(array, values, iteratee, comparator) {
+ var index = -1,
+ includes = arrayIncludes,
+ isCommon = true,
+ length = array.length,
+ result = [],
+ valuesLength = values.length;
+
+ if (!length) {
+ return result;
+ }
+
+ if (iteratee) {
+ values = arrayMap(values, baseUnary(iteratee));
+ }
+
+ if (comparator) {
+ includes = arrayIncludesWith;
+ isCommon = false;
+ } else if (values.length >= LARGE_ARRAY_SIZE) {
+ includes = cacheHas;
+ isCommon = false;
+ values = new SetCache(values);
+ }
+
+ outer: while (++index < length) {
+ var value = array[index],
+ computed = iteratee == null ? value : iteratee(value);
+ value = comparator || value !== 0 ? value : 0;
+
+ if (isCommon && computed === computed) {
+ var valuesIndex = valuesLength;
+
+ while (valuesIndex--) {
+ if (values[valuesIndex] === computed) {
+ continue outer;
+ }
+ }
+
+ result.push(value);
+ } else if (!includes(values, computed, comparator)) {
+ result.push(value);
+ }
}
+
+ return result;
}
- }
+ /**
+ * The base implementation of `_.forEach` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ */
- if (hasWays) {
- vertices.push(vertex);
- }
- }
- vertices = utilArrayUniq(vertices);
- ways = utilArrayUniq(ways); // STEP 2: Build a virtual graph containing only the entities in the intersection..
- // Everything done after this step should act on the virtual graph
- // Any actions that must be performed later to the main graph go in `actions` array
+ var baseEach = createBaseEach(baseForOwn);
+ /**
+ * The base implementation of `_.forEachRight` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ */
- ways.forEach(function (way) {
- graph.childNodes(way).forEach(function (node) {
- vgraph = vgraph.replace(node);
- });
- vgraph = vgraph.replace(way);
- graph.parentRelations(way).forEach(function (relation) {
- if (relation.isRestriction()) {
- if (relation.isValidRestriction(graph)) {
- vgraph = vgraph.replace(relation);
- } else if (relation.isComplete(graph)) {
- actions.push(actionDeleteRelation(relation.id));
+ var baseEachRight = createBaseEach(baseForOwnRight, true);
+ /**
+ * The base implementation of `_.every` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`
+ */
+
+ function baseEvery(collection, predicate) {
+ var result = true;
+ baseEach(collection, function (value, index, collection) {
+ result = !!predicate(value, index, collection);
+ return result;
+ });
+ return result;
+ }
+ /**
+ * The base implementation of methods like `_.max` and `_.min` which accepts a
+ * `comparator` to determine the extremum value.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The iteratee invoked per iteration.
+ * @param {Function} comparator The comparator used to compare values.
+ * @returns {*} Returns the extremum value.
+ */
+
+
+ function baseExtremum(array, iteratee, comparator) {
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ var value = array[index],
+ current = iteratee(value);
+
+ if (current != null && (computed === undefined$1 ? current === current && !isSymbol(current) : comparator(current, computed))) {
+ var computed = current,
+ result = value;
+ }
}
+
+ return result;
}
- });
- }); // STEP 3: Force all oneways to be drawn in the forward direction
+ /**
+ * The base implementation of `_.fill` without an iteratee call guard.
+ *
+ * @private
+ * @param {Array} array The array to fill.
+ * @param {*} value The value to fill `array` with.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns `array`.
+ */
- ways.forEach(function (w) {
- var way = vgraph.entity(w.id);
- if (way.tags.oneway === '-1') {
- var action = actionReverse(way.id, {
- reverseOneway: true
- });
- actions.push(action);
- vgraph = action(vgraph);
- }
- }); // STEP 4: Split ways on key vertices
+ function baseFill(array, value, start, end) {
+ var length = array.length;
+ start = toInteger(start);
- var origCount = osmEntity.id.next.way;
- vertices.forEach(function (v) {
- // This is an odd way to do it, but we need to find all the ways that
- // will be split here, then split them one at a time to ensure that these
- // actions can be replayed on the main graph exactly in the same order.
- // (It is unintuitive, but the order of ways returned from graph.parentWays()
- // is arbitrary, depending on how the main graph and vgraph were built)
- var splitAll = actionSplit([v.id]).keepHistoryOn('first');
+ if (start < 0) {
+ start = -start > length ? 0 : length + start;
+ }
- if (!splitAll.disabled(vgraph)) {
- splitAll.ways(vgraph).forEach(function (way) {
- var splitOne = actionSplit([v.id]).limitWays([way.id]).keepHistoryOn('first');
- actions.push(splitOne);
- vgraph = splitOne(vgraph);
- });
- }
- }); // In here is where we should also split the intersection at nearby junction.
- // for https://github.com/mapbox/iD-internal/issues/31
- // nearbyVertices.forEach(function(v) {
- // });
- // Reasons why we reset the way id count here:
- // 1. Continuity with way ids created by the splits so that we can replay
- // these actions later if the user decides to create a turn restriction
- // 2. Avoids churning way ids just by hovering over a vertex
- // and displaying the turn restriction editor
+ end = end === undefined$1 || end > length ? length : toInteger(end);
- osmEntity.id.next.way = origCount; // STEP 5: Update arrays to point to vgraph entities
+ if (end < 0) {
+ end += length;
+ }
- vertexIds = vertices.map(function (v) {
- return v.id;
- });
- vertices = [];
- ways = [];
- vertexIds.forEach(function (id) {
- var vertex = vgraph.entity(id);
- var parents = vgraph.parentWays(vertex);
- vertices.push(vertex);
- ways = ways.concat(parents);
- });
- vertices = utilArrayUniq(vertices);
- ways = utilArrayUniq(ways);
- vertexIds = vertices.map(function (v) {
- return v.id;
- });
- wayIds = ways.map(function (w) {
- return w.id;
- }); // STEP 6: Update the ways with some metadata that will be useful for
- // walking the intersection graph later and rendering turn arrows.
+ end = start > end ? 0 : toLength(end);
- function withMetadata(way, vertexIds) {
- var __oneWay = way.isOneWay(); // which affixes are key vertices?
+ while (start < end) {
+ array[start++] = value;
+ }
+ return array;
+ }
+ /**
+ * The base implementation of `_.filter` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
- var __first = vertexIds.indexOf(way.first()) !== -1;
- var __last = vertexIds.indexOf(way.last()) !== -1; // what roles is this way eligible for?
+ function baseFilter(collection, predicate) {
+ var result = [];
+ baseEach(collection, function (value, index, collection) {
+ if (predicate(value, index, collection)) {
+ result.push(value);
+ }
+ });
+ return result;
+ }
+ /**
+ * The base implementation of `_.flatten` with support for restricting flattening.
+ *
+ * @private
+ * @param {Array} array The array to flatten.
+ * @param {number} depth The maximum recursion depth.
+ * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
+ * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
+ * @param {Array} [result=[]] The initial result value.
+ * @returns {Array} Returns the new flattened array.
+ */
- var __via = __first && __last;
+ function baseFlatten(array, depth, predicate, isStrict, result) {
+ var index = -1,
+ length = array.length;
+ predicate || (predicate = isFlattenable);
+ result || (result = []);
- var __from = __first && !__oneWay || __last;
+ while (++index < length) {
+ var value = array[index];
- var __to = __first || __last && !__oneWay;
+ if (depth > 0 && predicate(value)) {
+ if (depth > 1) {
+ // Recursively flatten arrays (susceptible to call stack limits).
+ baseFlatten(value, depth - 1, predicate, isStrict, result);
+ } else {
+ arrayPush(result, value);
+ }
+ } else if (!isStrict) {
+ result[result.length] = value;
+ }
+ }
- return way.update({
- __first: __first,
- __last: __last,
- __from: __from,
- __via: __via,
- __to: __to,
- __oneWay: __oneWay
- });
- }
+ return result;
+ }
+ /**
+ * The base implementation of `baseForOwn` which iterates over `object`
+ * properties returned by `keysFunc` and invokes `iteratee` for each property.
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */
- ways = [];
- wayIds.forEach(function (id) {
- var way = withMetadata(vgraph.entity(id), vertexIds);
- vgraph = vgraph.replace(way);
- ways.push(way);
- }); // STEP 7: Simplify - This is an iterative process where we:
- // 1. Find trivial vertices with only 2 parents
- // 2. trim off the leaf way from those vertices and remove from vgraph
- var keepGoing;
- var removeWayIds = [];
- var removeVertexIds = [];
+ var baseFor = createBaseFor();
+ /**
+ * This function is like `baseFor` except that it iterates over properties
+ * in the opposite order.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */
- do {
- keepGoing = false;
- checkVertices = vertexIds.slice();
+ var baseForRight = createBaseFor(true);
+ /**
+ * The base implementation of `_.forOwn` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
- for (i = 0; i < checkVertices.length; i++) {
- var vertexId = checkVertices[i];
- vertex = vgraph.hasEntity(vertexId);
+ function baseForOwn(object, iteratee) {
+ return object && baseFor(object, iteratee, keys);
+ }
+ /**
+ * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
- if (!vertex) {
- if (vertexIds.indexOf(vertexId) !== -1) {
- vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
+
+ function baseForOwnRight(object, iteratee) {
+ return object && baseForRight(object, iteratee, keys);
+ }
+ /**
+ * The base implementation of `_.functions` which creates an array of
+ * `object` function property names filtered from `props`.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Array} props The property names to filter.
+ * @returns {Array} Returns the function names.
+ */
+
+
+ function baseFunctions(object, props) {
+ return arrayFilter(props, function (key) {
+ return isFunction(object[key]);
+ });
+ }
+ /**
+ * The base implementation of `_.get` without support for default values.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @returns {*} Returns the resolved value.
+ */
+
+
+ function baseGet(object, path) {
+ path = castPath(path, object);
+ var index = 0,
+ length = path.length;
+
+ while (object != null && index < length) {
+ object = object[toKey(path[index++])];
}
- removeVertexIds.push(vertexId);
- continue;
+ return index && index == length ? object : undefined$1;
}
+ /**
+ * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+ * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+ * symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @param {Function} symbolsFunc The function to get the symbols of `object`.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
- parents = vgraph.parentWays(vertex);
- if (parents.length < 3) {
- if (vertexIds.indexOf(vertexId) !== -1) {
- vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
- }
+ function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+ var result = keysFunc(object);
+ return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
}
+ /**
+ * The base implementation of `getTag` without fallbacks for buggy environments.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
- if (parents.length === 2) {
- // vertex with 2 parents is trivial
- var a = parents[0];
- var b = parents[1];
- var aIsLeaf = a && !a.__via;
- var bIsLeaf = b && !b.__via;
- var leaf, survivor;
- if (aIsLeaf && !bIsLeaf) {
- leaf = a;
- survivor = b;
- } else if (!aIsLeaf && bIsLeaf) {
- leaf = b;
- survivor = a;
+ function baseGetTag(value) {
+ if (value == null) {
+ return value === undefined$1 ? undefinedTag : nullTag;
}
- if (leaf && survivor) {
- survivor = withMetadata(survivor, vertexIds); // update survivor way
+ return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
+ }
+ /**
+ * The base implementation of `_.gt` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than `other`,
+ * else `false`.
+ */
- vgraph = vgraph.replace(survivor).remove(leaf); // update graph
- removeWayIds.push(leaf.id);
- keepGoing = true;
- }
+ function baseGt(value, other) {
+ return value > other;
}
+ /**
+ * The base implementation of `_.has` without support for deep paths.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {Array|string} key The key to check.
+ * @returns {boolean} Returns `true` if `key` exists, else `false`.
+ */
- parents = vgraph.parentWays(vertex);
- if (parents.length < 2) {
- // vertex is no longer a key vertex
- if (vertexIds.indexOf(vertexId) !== -1) {
- vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
- }
+ function baseHas(object, key) {
+ return object != null && hasOwnProperty.call(object, key);
+ }
+ /**
+ * The base implementation of `_.hasIn` without support for deep paths.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {Array|string} key The key to check.
+ * @returns {boolean} Returns `true` if `key` exists, else `false`.
+ */
- removeVertexIds.push(vertexId);
- keepGoing = true;
+
+ function baseHasIn(object, key) {
+ return object != null && key in Object(object);
}
+ /**
+ * The base implementation of `_.inRange` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {number} number The number to check.
+ * @param {number} start The start of the range.
+ * @param {number} end The end of the range.
+ * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+ */
- if (parents.length < 1) {
- // vertex is no longer attached to anything
- vgraph = vgraph.remove(vertex);
+
+ function baseInRange(number, start, end) {
+ return number >= nativeMin(start, end) && number < nativeMax(start, end);
}
- }
- } while (keepGoing);
+ /**
+ * The base implementation of methods like `_.intersection`, without support
+ * for iteratee shorthands, that accepts an array of arrays to inspect.
+ *
+ * @private
+ * @param {Array} arrays The arrays to inspect.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of shared values.
+ */
- vertices = vertices.filter(function (vertex) {
- return removeVertexIds.indexOf(vertex.id) === -1;
- }).map(function (vertex) {
- return vgraph.entity(vertex.id);
- });
- ways = ways.filter(function (way) {
- return removeWayIds.indexOf(way.id) === -1;
- }).map(function (way) {
- return vgraph.entity(way.id);
- }); // OK! Here is our intersection..
- var intersection = {
- graph: vgraph,
- actions: actions,
- vertices: vertices,
- ways: ways
- }; // Get all the valid turns through this intersection given a starting way id.
- // This operates on the virtual graph for everything.
- //
- // Basically, walk through all possible paths from starting way,
- // honoring the existing turn restrictions as we go (watch out for loops!)
- //
- // For each path found, generate and return a `osmTurn` datastructure.
- //
+ function baseIntersection(arrays, iteratee, comparator) {
+ var includes = comparator ? arrayIncludesWith : arrayIncludes,
+ length = arrays[0].length,
+ othLength = arrays.length,
+ othIndex = othLength,
+ caches = Array(othLength),
+ maxLength = Infinity,
+ result = [];
- intersection.turns = function (fromWayId, maxViaWay) {
- if (!fromWayId) return [];
- if (!maxViaWay) maxViaWay = 0;
- var vgraph = intersection.graph;
- var keyVertexIds = intersection.vertices.map(function (v) {
- return v.id;
- });
- var start = vgraph.entity(fromWayId);
- if (!start || !(start.__from || start.__via)) return []; // maxViaWay=0 from-*-to (0 vias)
- // maxViaWay=1 from-*-via-*-to (1 via max)
- // maxViaWay=2 from-*-via-*-via-*-to (2 vias max)
+ while (othIndex--) {
+ var array = arrays[othIndex];
- var maxPathLength = maxViaWay * 2 + 3;
- var turns = [];
- step(start);
- return turns; // traverse the intersection graph and find all the valid paths
+ if (othIndex && iteratee) {
+ array = arrayMap(array, baseUnary(iteratee));
+ }
- function step(entity, currPath, currRestrictions, matchedRestriction) {
- currPath = (currPath || []).slice(); // shallow copy
+ maxLength = nativeMin(array.length, maxLength);
+ caches[othIndex] = !comparator && (iteratee || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined$1;
+ }
- if (currPath.length >= maxPathLength) return;
- currPath.push(entity.id);
- currRestrictions = (currRestrictions || []).slice(); // shallow copy
+ array = arrays[0];
+ var index = -1,
+ seen = caches[0];
- var i, j;
+ outer: while (++index < length && result.length < maxLength) {
+ var value = array[index],
+ computed = iteratee ? iteratee(value) : value;
+ value = comparator || value !== 0 ? value : 0;
- if (entity.type === 'node') {
- var parents = vgraph.parentWays(entity);
- var nextWays = []; // which ways can we step into?
+ if (!(seen ? cacheHas(seen, computed) : includes(result, computed, comparator))) {
+ othIndex = othLength;
- for (i = 0; i < parents.length; i++) {
- var way = parents[i]; // if next way is a oneway incoming to this vertex, skip
+ while (--othIndex) {
+ var cache = caches[othIndex];
- if (way.__oneWay && way.nodes[0] !== entity.id) continue; // if we have seen it before (allowing for an initial u-turn), skip
+ if (!(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator))) {
+ continue outer;
+ }
+ }
- if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue; // Check all "current" restrictions (where we've already walked the `FROM`)
+ if (seen) {
+ seen.push(computed);
+ }
- var restrict = null;
+ result.push(value);
+ }
+ }
- for (j = 0; j < currRestrictions.length; j++) {
- var restriction = currRestrictions[j];
- var f = restriction.memberByRole('from');
- var v = restriction.membersByRole('via');
- var t = restriction.memberByRole('to');
- var isOnly = /^only_/.test(restriction.tags.restriction); // Does the current path match this turn restriction?
+ return result;
+ }
+ /**
+ * The base implementation of `_.invert` and `_.invertBy` which inverts
+ * `object` with values transformed by `iteratee` and set by `setter`.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} setter The function to set `accumulator` values.
+ * @param {Function} iteratee The iteratee to transform values.
+ * @param {Object} accumulator The initial inverted object.
+ * @returns {Function} Returns `accumulator`.
+ */
- var matchesFrom = f.id === fromWayId;
- var matchesViaTo = false;
- var isAlongOnlyPath = false;
- if (t.id === way.id) {
- // match TO
- if (v.length === 1 && v[0].type === 'node') {
- // match VIA node
- matchesViaTo = v[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2);
- } else {
- // match all VIA ways
- var pathVias = [];
+ function baseInverter(object, setter, iteratee, accumulator) {
+ baseForOwn(object, function (value, key, object) {
+ setter(accumulator, iteratee(value), key, object);
+ });
+ return accumulator;
+ }
+ /**
+ * The base implementation of `_.invoke` without support for individual
+ * method arguments.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the method to invoke.
+ * @param {Array} args The arguments to invoke the method with.
+ * @returns {*} Returns the result of the invoked method.
+ */
- for (k = 2; k < currPath.length; k += 2) {
- // k = 2 skips FROM
- pathVias.push(currPath[k]); // (path goes way-node-way...)
- }
- var restrictionVias = [];
+ function baseInvoke(object, path, args) {
+ path = castPath(path, object);
+ object = parent(object, path);
+ var func = object == null ? object : object[toKey(last(path))];
+ return func == null ? undefined$1 : apply(func, object, args);
+ }
+ /**
+ * The base implementation of `_.isArguments`.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ */
- for (k = 0; k < v.length; k++) {
- if (v[k].type === 'way') {
- restrictionVias.push(v[k].id);
- }
- }
- var diff = utilArrayDifference(pathVias, restrictionVias);
- matchesViaTo = !diff.length;
- }
- } else if (isOnly) {
- for (k = 0; k < v.length; k++) {
- // way doesn't match TO, but is one of the via ways along the path of an "only"
- if (v[k].type === 'way' && v[k].id === way.id) {
- isAlongOnlyPath = true;
- break;
- }
- }
- }
+ function baseIsArguments(value) {
+ return isObjectLike(value) && baseGetTag(value) == argsTag;
+ }
+ /**
+ * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+ */
- if (matchesViaTo) {
- if (isOnly) {
- restrict = {
- id: restriction.id,
- direct: matchesFrom,
- from: f.id,
- only: true,
- end: true
- };
- } else {
- restrict = {
- id: restriction.id,
- direct: matchesFrom,
- from: f.id,
- no: true,
- end: true
- };
- }
- } else {
- // indirect - caused by a different nearby restriction
- if (isAlongOnlyPath) {
- restrict = {
- id: restriction.id,
- direct: false,
- from: f.id,
- only: true,
- end: false
- };
- } else if (isOnly) {
- restrict = {
- id: restriction.id,
- direct: false,
- from: f.id,
- no: true,
- end: true
- };
- }
- } // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
+ function baseIsArrayBuffer(value) {
+ return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
+ }
+ /**
+ * The base implementation of `_.isDate` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+ */
- if (restrict && restrict.direct) break;
- }
- nextWays.push({
- way: way,
- restrict: restrict
- });
+ function baseIsDate(value) {
+ return isObjectLike(value) && baseGetTag(value) == dateTag;
+ }
+ /**
+ * The base implementation of `_.isEqual` which supports partial comparisons
+ * and tracks traversed objects.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {boolean} bitmask The bitmask flags.
+ * 1 - Unordered comparison
+ * 2 - Partial comparison
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @param {Object} [stack] Tracks traversed `value` and `other` objects.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ */
+
+
+ function baseIsEqual(value, other, bitmask, customizer, stack) {
+ if (value === other) {
+ return true;
}
- nextWays.forEach(function (nextWay) {
- step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
- });
- } else {
- // entity.type === 'way'
- if (currPath.length >= 3) {
- // this is a "complete" path..
- var turnPath = currPath.slice(); // shallow copy
- // an indirect restriction - only include the partial path (starting at FROM)
+ if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {
+ return value !== value && other !== other;
+ }
- if (matchedRestriction && matchedRestriction.direct === false) {
- for (i = 0; i < turnPath.length; i++) {
- if (turnPath[i] === matchedRestriction.from) {
- turnPath = turnPath.slice(i);
- break;
- }
- }
- }
+ return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
+ }
+ /**
+ * A specialized version of `baseIsEqual` for arrays and objects which performs
+ * deep comparisons and tracks traversed objects enabling objects with circular
+ * references to be compared.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} [stack] Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
- var turn = pathToTurn(turnPath);
- if (turn) {
- if (matchedRestriction) {
- turn.restrictionID = matchedRestriction.id;
- turn.no = matchedRestriction.no;
- turn.only = matchedRestriction.only;
- turn.direct = matchedRestriction.direct;
- }
+ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
+ var objIsArr = isArray(object),
+ othIsArr = isArray(other),
+ objTag = objIsArr ? arrayTag : getTag(object),
+ othTag = othIsArr ? arrayTag : getTag(other);
+ objTag = objTag == argsTag ? objectTag : objTag;
+ othTag = othTag == argsTag ? objectTag : othTag;
+ var objIsObj = objTag == objectTag,
+ othIsObj = othTag == objectTag,
+ isSameTag = objTag == othTag;
- turns.push(osmTurn(turn));
+ if (isSameTag && isBuffer(object)) {
+ if (!isBuffer(other)) {
+ return false;
}
- if (currPath[0] === currPath[2]) return; // if we made a u-turn - stop here
+ objIsArr = true;
+ objIsObj = false;
}
- if (matchedRestriction && matchedRestriction.end) return; // don't advance any further
- // which nodes can we step into?
-
- var n1 = vgraph.entity(entity.first());
- var n2 = vgraph.entity(entity.last());
- var dist = geoSphericalDistance(n1.loc, n2.loc);
- var nextNodes = [];
-
- if (currPath.length > 1) {
- if (dist > maxDistance) return; // the next node is too far
-
- if (!entity.__via) return; // this way is a leaf / can't be a via
+ if (isSameTag && !objIsObj) {
+ stack || (stack = new Stack());
+ return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
}
- if (!entity.__oneWay && // bidirectional..
- keyVertexIds.indexOf(n1.id) !== -1 && // key vertex..
- currPath.indexOf(n1.id) === -1) {
- // haven't seen it yet..
- nextNodes.push(n1); // can advance to first node
+ if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
+ var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+ othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+
+ if (objIsWrapped || othIsWrapped) {
+ var objUnwrapped = objIsWrapped ? object.value() : object,
+ othUnwrapped = othIsWrapped ? other.value() : other;
+ stack || (stack = new Stack());
+ return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
+ }
}
- if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex..
- currPath.indexOf(n2.id) === -1) {
- // haven't seen it yet..
- nextNodes.push(n2); // can advance to last node
+ if (!isSameTag) {
+ return false;
}
- nextNodes.forEach(function (nextNode) {
- // gather restrictions FROM this way
- var fromRestrictions = vgraph.parentRelations(entity).filter(function (r) {
- if (!r.isRestriction()) return false;
- var f = r.memberByRole('from');
- if (!f || f.id !== entity.id) return false;
- var isOnly = /^only_/.test(r.tags.restriction);
- if (!isOnly) return true; // `only_` restrictions only matter along the direction of the VIA - #4849
+ stack || (stack = new Stack());
+ return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
+ }
+ /**
+ * The base implementation of `_.isMap` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+ */
- var isOnlyVia = false;
- var v = r.membersByRole('via');
- if (v.length === 1 && v[0].type === 'node') {
- // via node
- isOnlyVia = v[0].id === nextNode.id;
- } else {
- // via way(s)
- for (var i = 0; i < v.length; i++) {
- if (v[i].type !== 'way') continue;
- var viaWay = vgraph.entity(v[i].id);
+ function baseIsMap(value) {
+ return isObjectLike(value) && getTag(value) == mapTag;
+ }
+ /**
+ * The base implementation of `_.isMatch` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property values to match.
+ * @param {Array} matchData The property names, values, and compare flags to match.
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ */
- if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
- isOnlyVia = true;
- break;
- }
- }
- }
- return isOnlyVia;
- });
- step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
- });
- }
- } // assumes path is alternating way-node-way of odd length
+ function baseIsMatch(object, source, matchData, customizer) {
+ var index = matchData.length,
+ length = index,
+ noCustomizer = !customizer;
+ if (object == null) {
+ return !length;
+ }
- function pathToTurn(path) {
- if (path.length < 3) return;
- var fromWayId, fromNodeId, fromVertexId;
- var toWayId, toNodeId, toVertexId;
- var viaWayIds, viaNodeId, isUturn;
- fromWayId = path[0];
- toWayId = path[path.length - 1];
+ object = Object(object);
- if (path.length === 3 && fromWayId === toWayId) {
- // u turn
- var way = vgraph.entity(fromWayId);
- if (way.__oneWay) return null;
- isUturn = true;
- viaNodeId = fromVertexId = toVertexId = path[1];
- fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
- } else {
- isUturn = false;
- fromVertexId = path[1];
- fromNodeId = adjacentNode(fromWayId, fromVertexId);
- toVertexId = path[path.length - 2];
- toNodeId = adjacentNode(toWayId, toVertexId);
+ while (index--) {
+ var data = matchData[index];
- if (path.length === 3) {
- viaNodeId = path[1];
- } else {
- viaWayIds = path.filter(function (entityId) {
- return entityId[0] === 'w';
- });
- viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last
+ if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
+ return false;
+ }
}
- }
- return {
- key: path.join('_'),
- path: path,
- from: {
- node: fromNodeId,
- way: fromWayId,
- vertex: fromVertexId
- },
- via: {
- node: viaNodeId,
- ways: viaWayIds
- },
- to: {
- node: toNodeId,
- way: toWayId,
- vertex: toVertexId
- },
- u: isUturn
- };
+ while (++index < length) {
+ data = matchData[index];
+ var key = data[0],
+ objValue = object[key],
+ srcValue = data[1];
- function adjacentNode(wayId, affixId) {
- var nodes = vgraph.entity(wayId).nodes;
- return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
- }
- }
- };
+ if (noCustomizer && data[2]) {
+ if (objValue === undefined$1 && !(key in object)) {
+ return false;
+ }
+ } else {
+ var stack = new Stack();
- return intersection;
- }
- function osmInferRestriction(graph, turn, projection) {
- var fromWay = graph.entity(turn.from.way);
- var fromNode = graph.entity(turn.from.node);
- var fromVertex = graph.entity(turn.from.vertex);
- var toWay = graph.entity(turn.to.way);
- var toNode = graph.entity(turn.to.node);
- var toVertex = graph.entity(turn.to.vertex);
- var fromOneWay = fromWay.tags.oneway === 'yes';
- var toOneWay = toWay.tags.oneway === 'yes';
- var angle = (geoAngle(fromVertex, fromNode, projection) - geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
+ if (customizer) {
+ var result = customizer(objValue, srcValue, key, object, source, stack);
+ }
- while (angle < 0) {
- angle += 360;
- }
+ if (!(result === undefined$1 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result)) {
+ return false;
+ }
+ }
+ }
- if (fromNode === toNode) return 'no_u_turn';
- if ((angle < 23 || angle > 336) && fromOneWay && toOneWay) return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway
+ return true;
+ }
+ /**
+ * The base implementation of `_.isNative` without bad shim checks.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function,
+ * else `false`.
+ */
- if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to)
- if (angle < 158) return 'no_right_turn';
- if (angle > 202) return 'no_left_turn';
- return 'no_straight_on';
- }
+ function baseIsNative(value) {
+ if (!isObject(value) || isMasked(value)) {
+ return false;
+ }
- function actionMergePolygon(ids, newRelationId) {
- function groupEntities(graph) {
- var entities = ids.map(function (id) {
- return graph.entity(id);
- });
- var geometryGroups = utilArrayGroupBy(entities, function (entity) {
- if (entity.type === 'way' && entity.isClosed()) {
- return 'closedWay';
- } else if (entity.type === 'relation' && entity.isMultipolygon()) {
- return 'multipolygon';
- } else {
- return 'other';
+ var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
+ return pattern.test(toSource(value));
}
- });
- return Object.assign({
- closedWay: [],
- multipolygon: [],
- other: []
- }, geometryGroups);
- }
+ /**
+ * The base implementation of `_.isRegExp` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+ */
- var action = function action(graph) {
- var entities = groupEntities(graph); // An array representing all the polygons that are part of the multipolygon.
- //
- // Each element is itself an array of objects with an id property, and has a
- // locs property which is an array of the locations forming the polygon.
- var polygons = entities.multipolygon.reduce(function (polygons, m) {
- return polygons.concat(osmJoinWays(m.members, graph));
- }, []).concat(entities.closedWay.map(function (d) {
- var member = [{
- id: d.id
- }];
- member.nodes = graph.childNodes(d);
- return member;
- })); // contained is an array of arrays of boolean values,
- // where contained[j][k] is true iff the jth way is
- // contained by the kth way.
+ function baseIsRegExp(value) {
+ return isObjectLike(value) && baseGetTag(value) == regexpTag;
+ }
+ /**
+ * The base implementation of `_.isSet` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+ */
- var contained = polygons.map(function (w, i) {
- return polygons.map(function (d, n) {
- if (i === n) return null;
- return geoPolygonContainsPolygon(d.nodes.map(function (n) {
- return n.loc;
- }), w.nodes.map(function (n) {
- return n.loc;
- }));
- });
- }); // Sort all polygons as either outer or inner ways
- var members = [];
- var outer = true;
+ function baseIsSet(value) {
+ return isObjectLike(value) && getTag(value) == setTag;
+ }
+ /**
+ * The base implementation of `_.isTypedArray` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ */
- while (polygons.length) {
- extractUncontained(polygons);
- polygons = polygons.filter(isContained);
- contained = contained.filter(isContained).map(filterContained);
- }
- function isContained(d, i) {
- return contained[i].some(function (val) {
- return val;
- });
- }
+ function baseIsTypedArray(value) {
+ return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
+ }
+ /**
+ * The base implementation of `_.iteratee`.
+ *
+ * @private
+ * @param {*} [value=_.identity] The value to convert to an iteratee.
+ * @returns {Function} Returns the iteratee.
+ */
- function filterContained(d) {
- return d.filter(isContained);
- }
- function extractUncontained(polygons) {
- polygons.forEach(function (d, i) {
- if (!isContained(d, i)) {
- d.forEach(function (member) {
- members.push({
- type: 'way',
- id: member.id,
- role: outer ? 'outer' : 'inner'
- });
- });
+ function baseIteratee(value) {
+ // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
+ // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
+ if (typeof value == 'function') {
+ return value;
+ }
+
+ if (value == null) {
+ return identity;
+ }
+
+ if (_typeof(value) == 'object') {
+ return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
+ }
+
+ return property(value);
+ }
+ /**
+ * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+
+
+ function baseKeys(object) {
+ if (!isPrototype(object)) {
+ return nativeKeys(object);
}
- });
- outer = !outer;
- } // Move all tags to one relation
+ var result = [];
- var relation = entities.multipolygon[0] || osmRelation({
- id: newRelationId,
- tags: {
- type: 'multipolygon'
- }
- });
- entities.multipolygon.slice(1).forEach(function (m) {
- relation = relation.mergeTags(m.tags);
- graph = graph.remove(m);
- });
- entities.closedWay.forEach(function (way) {
- function isThisOuter(m) {
- return m.id === way.id && m.role !== 'inner';
- }
+ for (var key in Object(object)) {
+ if (hasOwnProperty.call(object, key) && key != 'constructor') {
+ result.push(key);
+ }
+ }
- if (members.some(isThisOuter)) {
- relation = relation.mergeTags(way.tags);
- graph = graph.replace(way.update({
- tags: {}
- }));
+ return result;
}
- });
- return graph.replace(relation.update({
- members: members,
- tags: utilObjectOmit(relation.tags, ['area'])
- }));
- };
+ /**
+ * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
- action.disabled = function (graph) {
- var entities = groupEntities(graph);
- if (entities.other.length > 0 || entities.closedWay.length + entities.multipolygon.length < 2) {
- return 'not_eligible';
- }
+ function baseKeysIn(object) {
+ if (!isObject(object)) {
+ return nativeKeysIn(object);
+ }
- if (!entities.multipolygon.every(function (r) {
- return r.isComplete(graph);
- })) {
- return 'incomplete_relation';
- }
+ var isProto = isPrototype(object),
+ result = [];
- if (!entities.multipolygon.length) {
- var sharedMultipolygons = [];
- entities.closedWay.forEach(function (way, i) {
- if (i === 0) {
- sharedMultipolygons = graph.parentMultipolygons(way);
- } else {
- sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way));
+ for (var key in object) {
+ if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+ result.push(key);
+ }
}
- });
- sharedMultipolygons = sharedMultipolygons.filter(function (relation) {
- return relation.members.length === entities.closedWay.length;
- });
- if (sharedMultipolygons.length) {
- // don't create a new multipolygon if it'd be redundant
- return 'not_eligible';
+ return result;
}
- } else if (entities.closedWay.some(function (way) {
- return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length;
- })) {
- // don't add a way to a multipolygon again if it's already a member
- return 'not_eligible';
- }
- };
+ /**
+ * The base implementation of `_.lt` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than `other`,
+ * else `false`.
+ */
- return action;
- }
- var UNSUPPORTED_Y$3 = regexpStickyHelpers.UNSUPPORTED_Y;
+ function baseLt(value, other) {
+ return value < other;
+ }
+ /**
+ * The base implementation of `_.map` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
- // `RegExp.prototype.flags` getter
- // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
- if (descriptors && (/./g.flags != 'g' || UNSUPPORTED_Y$3)) {
- objectDefineProperty.f(RegExp.prototype, 'flags', {
- configurable: true,
- get: regexpFlags
- });
- }
- var fastDeepEqual = function equal(a, b) {
- if (a === b) return true;
+ function baseMap(collection, iteratee) {
+ var index = -1,
+ result = isArrayLike(collection) ? Array(collection.length) : [];
+ baseEach(collection, function (value, key, collection) {
+ result[++index] = iteratee(value, key, collection);
+ });
+ return result;
+ }
+ /**
+ * The base implementation of `_.matches` which doesn't clone `source`.
+ *
+ * @private
+ * @param {Object} source The object of property values to match.
+ * @returns {Function} Returns the new spec function.
+ */
- if (a && b && _typeof(a) == 'object' && _typeof(b) == 'object') {
- if (a.constructor !== b.constructor) return false;
- var length, i, keys;
- if (Array.isArray(a)) {
- length = a.length;
- if (length != b.length) return false;
+ function baseMatches(source) {
+ var matchData = getMatchData(source);
- for (i = length; i-- !== 0;) {
- if (!equal(a[i], b[i])) return false;
+ if (matchData.length == 1 && matchData[0][2]) {
+ return matchesStrictComparable(matchData[0][0], matchData[0][1]);
+ }
+
+ return function (object) {
+ return object === source || baseIsMatch(object, source, matchData);
+ };
}
+ /**
+ * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
+ *
+ * @private
+ * @param {string} path The path of the property to get.
+ * @param {*} srcValue The value to match.
+ * @returns {Function} Returns the new spec function.
+ */
- return true;
- }
- if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
- if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
- if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
- keys = Object.keys(a);
- length = keys.length;
- if (length !== Object.keys(b).length) return false;
+ function baseMatchesProperty(path, srcValue) {
+ if (isKey(path) && isStrictComparable(srcValue)) {
+ return matchesStrictComparable(toKey(path), srcValue);
+ }
- for (i = length; i-- !== 0;) {
- if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
- }
+ return function (object) {
+ var objValue = get(object, path);
+ return objValue === undefined$1 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+ };
+ }
+ /**
+ * The base implementation of `_.merge` without support for multiple sources.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {number} srcIndex The index of `source`.
+ * @param {Function} [customizer] The function to customize merged values.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ * counterparts.
+ */
- for (i = length; i-- !== 0;) {
- var key = keys[i];
- if (!equal(a[key], b[key])) return false;
- }
- return true;
- } // true if both NaN, false otherwise
+ function baseMerge(object, source, srcIndex, customizer, stack) {
+ if (object === source) {
+ return;
+ }
+ baseFor(source, function (srcValue, key) {
+ stack || (stack = new Stack());
- return a !== a && b !== b;
- };
+ if (isObject(srcValue)) {
+ baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
+ } else {
+ var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + '', object, source, stack) : undefined$1;
- // J. W. Hunt and M. D. McIlroy, An algorithm for differential buffer
- // comparison, Bell Telephone Laboratories CSTR #41 (1976)
- // http://www.cs.dartmouth.edu/~doug/
- // https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
- //
- // Expects two arrays, finds longest common sequence
+ if (newValue === undefined$1) {
+ newValue = srcValue;
+ }
- function LCS(buffer1, buffer2) {
- var equivalenceClasses = {};
+ assignMergeValue(object, key, newValue);
+ }
+ }, keysIn);
+ }
+ /**
+ * A specialized version of `baseMerge` for arrays and objects which performs
+ * deep merges and tracks traversed objects enabling objects with circular
+ * references to be merged.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {string} key The key of the value to merge.
+ * @param {number} srcIndex The index of `source`.
+ * @param {Function} mergeFunc The function to merge values.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ * counterparts.
+ */
- for (var j = 0; j < buffer2.length; j++) {
- var item = buffer2[j];
- if (equivalenceClasses[item]) {
- equivalenceClasses[item].push(j);
- } else {
- equivalenceClasses[item] = [j];
- }
- }
+ function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
+ var objValue = safeGet(object, key),
+ srcValue = safeGet(source, key),
+ stacked = stack.get(srcValue);
- var NULLRESULT = {
- buffer1index: -1,
- buffer2index: -1,
- chain: null
- };
- var candidates = [NULLRESULT];
+ if (stacked) {
+ assignMergeValue(object, key, stacked);
+ return;
+ }
- for (var i = 0; i < buffer1.length; i++) {
- var _item = buffer1[i];
- var buffer2indices = equivalenceClasses[_item] || [];
- var r = 0;
- var c = candidates[0];
+ var newValue = customizer ? customizer(objValue, srcValue, key + '', object, source, stack) : undefined$1;
+ var isCommon = newValue === undefined$1;
+
+ if (isCommon) {
+ var isArr = isArray(srcValue),
+ isBuff = !isArr && isBuffer(srcValue),
+ isTyped = !isArr && !isBuff && isTypedArray(srcValue);
+ newValue = srcValue;
+
+ if (isArr || isBuff || isTyped) {
+ if (isArray(objValue)) {
+ newValue = objValue;
+ } else if (isArrayLikeObject(objValue)) {
+ newValue = copyArray(objValue);
+ } else if (isBuff) {
+ isCommon = false;
+ newValue = cloneBuffer(srcValue, true);
+ } else if (isTyped) {
+ isCommon = false;
+ newValue = cloneTypedArray(srcValue, true);
+ } else {
+ newValue = [];
+ }
+ } else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+ newValue = objValue;
- for (var jx = 0; jx < buffer2indices.length; jx++) {
- var _j = buffer2indices[jx];
- var s = void 0;
+ if (isArguments(objValue)) {
+ newValue = toPlainObject(objValue);
+ } else if (!isObject(objValue) || isFunction(objValue)) {
+ newValue = initCloneObject(srcValue);
+ }
+ } else {
+ isCommon = false;
+ }
+ }
- for (s = r; s < candidates.length; s++) {
- if (candidates[s].buffer2index < _j && (s === candidates.length - 1 || candidates[s + 1].buffer2index > _j)) {
- break;
+ if (isCommon) {
+ // Recursively merge objects and arrays (susceptible to call stack limits).
+ stack.set(srcValue, newValue);
+ mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+ stack['delete'](srcValue);
}
+
+ assignMergeValue(object, key, newValue);
}
+ /**
+ * The base implementation of `_.nth` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {number} n The index of the element to return.
+ * @returns {*} Returns the nth element of `array`.
+ */
- if (s < candidates.length) {
- var newCandidate = {
- buffer1index: i,
- buffer2index: _j,
- chain: candidates[s]
- };
- if (r === candidates.length) {
- candidates.push(c);
- } else {
- candidates[r] = c;
+ function baseNth(array, n) {
+ var length = array.length;
+
+ if (!length) {
+ return;
}
- r = s + 1;
- c = newCandidate;
+ n += n < 0 ? length : 0;
+ return isIndex(n, length) ? array[n] : undefined$1;
+ }
+ /**
+ * The base implementation of `_.orderBy` without param guards.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+ * @param {string[]} orders The sort orders of `iteratees`.
+ * @returns {Array} Returns the new sorted array.
+ */
- if (r === candidates.length) {
- break; // no point in examining further (j)s
+
+ function baseOrderBy(collection, iteratees, orders) {
+ if (iteratees.length) {
+ iteratees = arrayMap(iteratees, function (iteratee) {
+ if (isArray(iteratee)) {
+ return function (value) {
+ return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
+ };
+ }
+
+ return iteratee;
+ });
+ } else {
+ iteratees = [identity];
}
- }
- }
- candidates[r] = c;
- } // At this point, we know the LCS: it's in the reverse of the
- // linked-list through .chain of candidates[candidates.length - 1].
+ var index = -1;
+ iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
+ var result = baseMap(collection, function (value, key, collection) {
+ var criteria = arrayMap(iteratees, function (iteratee) {
+ return iteratee(value);
+ });
+ return {
+ 'criteria': criteria,
+ 'index': ++index,
+ 'value': value
+ };
+ });
+ return baseSortBy(result, function (object, other) {
+ return compareMultiple(object, other, orders);
+ });
+ }
+ /**
+ * The base implementation of `_.pick` without support for individual
+ * property identifiers.
+ *
+ * @private
+ * @param {Object} object The source object.
+ * @param {string[]} paths The property paths to pick.
+ * @returns {Object} Returns the new object.
+ */
- return candidates[candidates.length - 1];
- } // We apply the LCS to build a 'comm'-style picture of the
- // offsets and lengths of mismatched chunks in the input
- // buffers. This is used by diff3MergeRegions.
+ function basePick(object, paths) {
+ return basePickBy(object, paths, function (value, path) {
+ return hasIn(object, path);
+ });
+ }
+ /**
+ * The base implementation of `_.pickBy` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The source object.
+ * @param {string[]} paths The property paths to pick.
+ * @param {Function} predicate The function invoked per property.
+ * @returns {Object} Returns the new object.
+ */
- function diffIndices(buffer1, buffer2) {
- var lcs = LCS(buffer1, buffer2);
- var result = [];
- var tail1 = buffer1.length;
- var tail2 = buffer2.length;
+ function basePickBy(object, paths, predicate) {
+ var index = -1,
+ length = paths.length,
+ result = {};
- for (var candidate = lcs; candidate !== null; candidate = candidate.chain) {
- var mismatchLength1 = tail1 - candidate.buffer1index - 1;
- var mismatchLength2 = tail2 - candidate.buffer2index - 1;
- tail1 = candidate.buffer1index;
- tail2 = candidate.buffer2index;
+ while (++index < length) {
+ var path = paths[index],
+ value = baseGet(object, path);
- if (mismatchLength1 || mismatchLength2) {
- result.push({
- buffer1: [tail1 + 1, mismatchLength1],
- buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1),
- buffer2: [tail2 + 1, mismatchLength2],
- buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2)
- });
- }
- }
+ if (predicate(value, path)) {
+ baseSet(result, castPath(path, object), value);
+ }
+ }
- result.reverse();
- return result;
- } // We apply the LCS to build a JSON representation of a
- // independently derived from O, returns a fairly complicated
- // internal representation of merge decisions it's taken. The
- // interested reader may wish to consult
- //
- // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
- // 'A Formal Investigation of ' In Arvind and Prasad,
- // editors, Foundations of Software Technology and Theoretical
- // Computer Science (FSTTCS), December 2007.
- //
- // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
- //
+ return result;
+ }
+ /**
+ * A specialized version of `baseProperty` which supports deep paths.
+ *
+ * @private
+ * @param {Array|string} path The path of the property to get.
+ * @returns {Function} Returns the new accessor function.
+ */
- function diff3MergeRegions(a, o, b) {
- // "hunks" are array subsets where `a` or `b` are different from `o`
- // https://www.gnu.org/software/diffutils/manual/html_node/diff3-Hunks.html
- var hunks = [];
+ function basePropertyDeep(path) {
+ return function (object) {
+ return baseGet(object, path);
+ };
+ }
+ /**
+ * The base implementation of `_.pullAllBy` without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to remove.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns `array`.
+ */
- function addHunk(h, ab) {
- hunks.push({
- ab: ab,
- oStart: h.buffer1[0],
- oLength: h.buffer1[1],
- // length of o to remove
- abStart: h.buffer2[0],
- abLength: h.buffer2[1] // length of a/b to insert
- // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1])
- });
- }
+ function basePullAll(array, values, iteratee, comparator) {
+ var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
+ index = -1,
+ length = values.length,
+ seen = array;
- diffIndices(o, a).forEach(function (item) {
- return addHunk(item, 'a');
- });
- diffIndices(o, b).forEach(function (item) {
- return addHunk(item, 'b');
- });
- hunks.sort(function (x, y) {
- return x.oStart - y.oStart;
- });
- var results = [];
- var currOffset = 0;
+ if (array === values) {
+ values = copyArray(values);
+ }
- function advanceTo(endOffset) {
- if (endOffset > currOffset) {
- results.push({
- stable: true,
- buffer: 'o',
- bufferStart: currOffset,
- bufferLength: endOffset - currOffset,
- bufferContent: o.slice(currOffset, endOffset)
- });
- currOffset = endOffset;
- }
- }
+ if (iteratee) {
+ seen = arrayMap(array, baseUnary(iteratee));
+ }
- while (hunks.length) {
- var hunk = hunks.shift();
- var regionStart = hunk.oStart;
- var regionEnd = hunk.oStart + hunk.oLength;
- var regionHunks = [hunk];
- advanceTo(regionStart); // Try to pull next overlapping hunk into this region
+ while (++index < length) {
+ var fromIndex = 0,
+ value = values[index],
+ computed = iteratee ? iteratee(value) : value;
- while (hunks.length) {
- var nextHunk = hunks[0];
- var nextHunkStart = nextHunk.oStart;
- if (nextHunkStart > regionEnd) break; // no overlap
+ while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
+ if (seen !== array) {
+ splice.call(seen, fromIndex, 1);
+ }
- regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength);
- regionHunks.push(hunks.shift());
- }
+ splice.call(array, fromIndex, 1);
+ }
+ }
- if (regionHunks.length === 1) {
- // Only one hunk touches this region, meaning that there is no conflict here.
- // Either `a` or `b` is inserting into a region of `o` unchanged by the other.
- if (hunk.abLength > 0) {
- var buffer = hunk.ab === 'a' ? a : b;
- results.push({
- stable: true,
- buffer: hunk.ab,
- bufferStart: hunk.abStart,
- bufferLength: hunk.abLength,
- bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength)
- });
+ return array;
}
- } else {
- // A true a/b conflict. Determine the bounds involved from `a`, `o`, and `b`.
- // Effectively merge all the `a` hunks into one giant hunk, then do the
- // same for the `b` hunks; then, correct for skew in the regions of `o`
- // that each side changed, and report appropriate spans for the three sides.
- var bounds = {
- a: [a.length, -1, o.length, -1],
- b: [b.length, -1, o.length, -1]
- };
+ /**
+ * The base implementation of `_.pullAt` without support for individual
+ * indexes or capturing the removed elements.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {number[]} indexes The indexes of elements to remove.
+ * @returns {Array} Returns `array`.
+ */
- while (regionHunks.length) {
- hunk = regionHunks.shift();
- var oStart = hunk.oStart;
- var oEnd = oStart + hunk.oLength;
- var abStart = hunk.abStart;
- var abEnd = abStart + hunk.abLength;
- var _b = bounds[hunk.ab];
- _b[0] = Math.min(abStart, _b[0]);
- _b[1] = Math.max(abEnd, _b[1]);
- _b[2] = Math.min(oStart, _b[2]);
- _b[3] = Math.max(oEnd, _b[3]);
+
+ function basePullAt(array, indexes) {
+ var length = array ? indexes.length : 0,
+ lastIndex = length - 1;
+
+ while (length--) {
+ var index = indexes[length];
+
+ if (length == lastIndex || index !== previous) {
+ var previous = index;
+
+ if (isIndex(index)) {
+ splice.call(array, index, 1);
+ } else {
+ baseUnset(array, index);
+ }
+ }
+ }
+
+ return array;
}
+ /**
+ * The base implementation of `_.random` without support for returning
+ * floating-point numbers.
+ *
+ * @private
+ * @param {number} lower The lower bound.
+ * @param {number} upper The upper bound.
+ * @returns {number} Returns the random number.
+ */
- var aStart = bounds.a[0] + (regionStart - bounds.a[2]);
- var aEnd = bounds.a[1] + (regionEnd - bounds.a[3]);
- var bStart = bounds.b[0] + (regionStart - bounds.b[2]);
- var bEnd = bounds.b[1] + (regionEnd - bounds.b[3]);
- var result = {
- stable: false,
- aStart: aStart,
- aLength: aEnd - aStart,
- aContent: a.slice(aStart, aEnd),
- oStart: regionStart,
- oLength: regionEnd - regionStart,
- oContent: o.slice(regionStart, regionEnd),
- bStart: bStart,
- bLength: bEnd - bStart,
- bContent: b.slice(bStart, bEnd)
- };
- results.push(result);
- }
- currOffset = regionEnd;
- }
+ function baseRandom(lower, upper) {
+ return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
+ }
+ /**
+ * The base implementation of `_.range` and `_.rangeRight` which doesn't
+ * coerce arguments.
+ *
+ * @private
+ * @param {number} start The start of the range.
+ * @param {number} end The end of the range.
+ * @param {number} step The value to increment or decrement by.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the range of numbers.
+ */
- advanceTo(o.length);
- return results;
- } // Applies the output of diff3MergeRegions to actually
- // construct the merged buffer; the returned result alternates
- // between 'ok' and 'conflict' blocks.
- // A "false conflict" is where `a` and `b` both change the same from `o`
+ function baseRange(start, end, step, fromRight) {
+ var index = -1,
+ length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
+ result = Array(length);
- function diff3Merge(a, o, b, options) {
- var defaults = {
- excludeFalseConflicts: true,
- stringSeparator: /\s+/
- };
- options = Object.assign(defaults, options);
- var aString = typeof a === 'string';
- var oString = typeof o === 'string';
- var bString = typeof b === 'string';
- if (aString) a = a.split(options.stringSeparator);
- if (oString) o = o.split(options.stringSeparator);
- if (bString) b = b.split(options.stringSeparator);
- var results = [];
- var regions = diff3MergeRegions(a, o, b);
- var okBuffer = [];
+ while (length--) {
+ result[fromRight ? length : ++index] = start;
+ start += step;
+ }
- function flushOk() {
- if (okBuffer.length) {
- results.push({
- ok: okBuffer
- });
- }
+ return result;
+ }
+ /**
+ * The base implementation of `_.repeat` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {string} string The string to repeat.
+ * @param {number} n The number of times to repeat the string.
+ * @returns {string} Returns the repeated string.
+ */
- okBuffer = [];
- }
- function isFalseConflict(a, b) {
- if (a.length !== b.length) return false;
+ function baseRepeat(string, n) {
+ var result = '';
- for (var i = 0; i < a.length; i++) {
- if (a[i] !== b[i]) return false;
- }
+ if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
+ return result;
+ } // Leverage the exponentiation by squaring algorithm for a faster repeat.
+ // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
- return true;
- }
- regions.forEach(function (region) {
- if (region.stable) {
- var _okBuffer;
+ do {
+ if (n % 2) {
+ result += string;
+ }
- (_okBuffer = okBuffer).push.apply(_okBuffer, _toConsumableArray(region.bufferContent));
- } else {
- if (options.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) {
- var _okBuffer2;
+ n = nativeFloor(n / 2);
- (_okBuffer2 = okBuffer).push.apply(_okBuffer2, _toConsumableArray(region.aContent));
- } else {
- flushOk();
- results.push({
- conflict: {
- a: region.aContent,
- aIndex: region.aStart,
- o: region.oContent,
- oIndex: region.oStart,
- b: region.bContent,
- bIndex: region.bStart
+ if (n) {
+ string += string;
}
- });
- }
- }
- });
- flushOk();
- return results;
- }
+ } while (n);
- function actionMergeRemoteChanges(id, localGraph, remoteGraph, discardTags, formatUser) {
- discardTags = discardTags || {};
- var _option = 'safe'; // 'safe', 'force_local', 'force_remote'
+ return result;
+ }
+ /**
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ */
- var _conflicts = [];
- function user(d) {
- return typeof formatUser === 'function' ? formatUser(d) : d;
- }
+ function baseRest(func, start) {
+ return setToString(overRest(func, start, identity), func + '');
+ }
+ /**
+ * The base implementation of `_.sample`.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to sample.
+ * @returns {*} Returns the random element.
+ */
- function mergeLocation(remote, target) {
- function pointEqual(a, b) {
- var epsilon = 1e-6;
- return Math.abs(a[0] - b[0]) < epsilon && Math.abs(a[1] - b[1]) < epsilon;
- }
- if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
- return target;
- }
+ function baseSample(collection) {
+ return arraySample(values(collection));
+ }
+ /**
+ * The base implementation of `_.sampleSize` without param guards.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to sample.
+ * @param {number} n The number of elements to sample.
+ * @returns {Array} Returns the random elements.
+ */
- if (_option === 'force_remote') {
- return target.update({
- loc: remote.loc
- });
- }
- _conflicts.push(_t('merge_remote_changes.conflict.location', {
- user: user(remote.user)
- }));
+ function baseSampleSize(collection, n) {
+ var array = values(collection);
+ return shuffleSelf(array, baseClamp(n, 0, array.length));
+ }
+ /**
+ * The base implementation of `_.set`.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @param {Function} [customizer] The function to customize path creation.
+ * @returns {Object} Returns `object`.
+ */
- return target;
- }
- function mergeNodes(base, remote, target) {
- if (_option === 'force_local' || fastDeepEqual(target.nodes, remote.nodes)) {
- return target;
- }
+ function baseSet(object, path, value, customizer) {
+ if (!isObject(object)) {
+ return object;
+ }
- if (_option === 'force_remote') {
- return target.update({
- nodes: remote.nodes
- });
- }
+ path = castPath(path, object);
+ var index = -1,
+ length = path.length,
+ lastIndex = length - 1,
+ nested = object;
- var ccount = _conflicts.length;
- var o = base.nodes || [];
- var a = target.nodes || [];
- var b = remote.nodes || [];
- var nodes = [];
- var hunks = diff3Merge(a, o, b, {
- excludeFalseConflicts: true
- });
+ while (nested != null && ++index < length) {
+ var key = toKey(path[index]),
+ newValue = value;
- for (var i = 0; i < hunks.length; i++) {
- var hunk = hunks[i];
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
+ return object;
+ }
- if (hunk.ok) {
- nodes.push.apply(nodes, hunk.ok);
- } else {
- // for all conflicts, we can assume c.a !== c.b
- // because `diff3Merge` called with `true` option to exclude false conflicts..
- var c = hunk.conflict;
+ if (index != lastIndex) {
+ var objValue = nested[key];
+ newValue = customizer ? customizer(objValue, key, nested) : undefined$1;
- if (fastDeepEqual(c.o, c.a)) {
- // only changed remotely
- nodes.push.apply(nodes, c.b);
- } else if (fastDeepEqual(c.o, c.b)) {
- // only changed locally
- nodes.push.apply(nodes, c.a);
- } else {
- // changed both locally and remotely
- _conflicts.push(_t('merge_remote_changes.conflict.nodelist', {
- user: user(remote.user)
- }));
+ if (newValue === undefined$1) {
+ newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};
+ }
+ }
- break;
+ assignValue(nested, key, newValue);
+ nested = nested[key];
}
- }
- }
- return _conflicts.length === ccount ? target.update({
- nodes: nodes
- }) : target;
- }
+ return object;
+ }
+ /**
+ * The base implementation of `setData` without support for hot loop shorting.
+ *
+ * @private
+ * @param {Function} func The function to associate metadata with.
+ * @param {*} data The metadata.
+ * @returns {Function} Returns `func`.
+ */
- function mergeChildren(targetWay, children, updates, graph) {
- function isUsed(node, targetWay) {
- var hasInterestingParent = graph.parentWays(node).some(function (way) {
- return way.id !== targetWay.id;
- });
- return node.hasInterestingTags() || hasInterestingParent || graph.parentRelations(node).length > 0;
- }
- var ccount = _conflicts.length;
+ var baseSetData = !metaMap ? identity : function (func, data) {
+ metaMap.set(func, data);
+ return func;
+ };
+ /**
+ * The base implementation of `setToString` without support for hot loop shorting.
+ *
+ * @private
+ * @param {Function} func The function to modify.
+ * @param {Function} string The `toString` result.
+ * @returns {Function} Returns `func`.
+ */
- for (var i = 0; i < children.length; i++) {
- var id = children[i];
- var node = graph.hasEntity(id); // remove unused childNodes..
+ var baseSetToString = !defineProperty ? identity : function (func, string) {
+ return defineProperty(func, 'toString', {
+ 'configurable': true,
+ 'enumerable': false,
+ 'value': constant(string),
+ 'writable': true
+ });
+ };
+ /**
+ * The base implementation of `_.shuffle`.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to shuffle.
+ * @returns {Array} Returns the new shuffled array.
+ */
- if (targetWay.nodes.indexOf(id) === -1) {
- if (node && !isUsed(node, targetWay)) {
- updates.removeIds.push(id);
- }
+ function baseShuffle(collection) {
+ return shuffleSelf(values(collection));
+ }
+ /**
+ * The base implementation of `_.slice` without an iteratee call guard.
+ *
+ * @private
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */
- continue;
- } // restore used childNodes..
+ function baseSlice(array, start, end) {
+ var index = -1,
+ length = array.length;
- var local = localGraph.hasEntity(id);
- var remote = remoteGraph.hasEntity(id);
- var target;
+ if (start < 0) {
+ start = -start > length ? 0 : length + start;
+ }
- if (_option === 'force_remote' && remote && remote.visible) {
- updates.replacements.push(remote);
- } else if (_option === 'force_local' && local) {
- target = osmEntity(local);
+ end = end > length ? length : end;
- if (remote) {
- target = target.update({
- version: remote.version
- });
+ if (end < 0) {
+ end += length;
}
- updates.replacements.push(target);
- } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
- target = osmEntity(local, {
- version: remote.version
- });
+ length = start > end ? 0 : end - start >>> 0;
+ start >>>= 0;
+ var result = Array(length);
- if (remote.visible) {
- target = mergeLocation(remote, target);
- } else {
- _conflicts.push(_t('merge_remote_changes.conflict.deleted', {
- user: user(remote.user)
- }));
+ while (++index < length) {
+ result[index] = array[index + start];
}
- if (_conflicts.length !== ccount) break;
- updates.replacements.push(target);
+ return result;
}
- }
-
- return targetWay;
- }
-
- function updateChildren(updates, graph) {
- for (var i = 0; i < updates.replacements.length; i++) {
- graph = graph.replace(updates.replacements[i]);
- }
+ /**
+ * The base implementation of `_.some` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ */
- if (updates.removeIds.length) {
- graph = actionDeleteMultiple(updates.removeIds)(graph);
- }
- return graph;
- }
+ function baseSome(collection, predicate) {
+ var result;
+ baseEach(collection, function (value, index, collection) {
+ result = predicate(value, index, collection);
+ return !result;
+ });
+ return !!result;
+ }
+ /**
+ * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
+ * performs a binary search of `array` to determine the index at which `value`
+ * should be inserted into `array` in order to maintain its sort order.
+ *
+ * @private
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ */
- function mergeMembers(remote, target) {
- if (_option === 'force_local' || fastDeepEqual(target.members, remote.members)) {
- return target;
- }
- if (_option === 'force_remote') {
- return target.update({
- members: remote.members
- });
- }
+ function baseSortedIndex(array, value, retHighest) {
+ var low = 0,
+ high = array == null ? low : array.length;
- _conflicts.push(_t('merge_remote_changes.conflict.memberlist', {
- user: user(remote.user)
- }));
+ if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
+ while (low < high) {
+ var mid = low + high >>> 1,
+ computed = array[mid];
- return target;
- }
+ if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
- function mergeTags(base, remote, target) {
- if (_option === 'force_local' || fastDeepEqual(target.tags, remote.tags)) {
- return target;
- }
+ return high;
+ }
- if (_option === 'force_remote') {
- return target.update({
- tags: remote.tags
- });
- }
+ return baseSortedIndexBy(array, value, identity, retHighest);
+ }
+ /**
+ * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
+ * which invokes `iteratee` for `value` and each element of `array` to compute
+ * their sort ranking. The iteratee is invoked with one argument; (value).
+ *
+ * @private
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function} iteratee The iteratee invoked per element.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ */
- var ccount = _conflicts.length;
- var o = base.tags || {};
- var a = target.tags || {};
- var b = remote.tags || {};
- var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b)).filter(function (k) {
- return !discardTags[k];
- });
- var tags = Object.assign({}, a); // shallow copy
- var changed = false;
+ function baseSortedIndexBy(array, value, iteratee, retHighest) {
+ var low = 0,
+ high = array == null ? 0 : array.length;
- for (var i = 0; i < keys.length; i++) {
- var k = keys[i];
+ if (high === 0) {
+ return 0;
+ }
- if (o[k] !== b[k] && a[k] !== b[k]) {
- // changed remotely..
- if (o[k] !== a[k]) {
- // changed locally..
- _conflicts.push(_t('merge_remote_changes.conflict.tags', {
- tag: k,
- local: a[k],
- remote: b[k],
- user: user(remote.user)
- }));
- } else {
- // unchanged locally, accept remote change..
- if (b.hasOwnProperty(k)) {
- tags[k] = b[k];
+ value = iteratee(value);
+ var valIsNaN = value !== value,
+ valIsNull = value === null,
+ valIsSymbol = isSymbol(value),
+ valIsUndefined = value === undefined$1;
+
+ while (low < high) {
+ var mid = nativeFloor((low + high) / 2),
+ computed = iteratee(array[mid]),
+ othIsDefined = computed !== undefined$1,
+ othIsNull = computed === null,
+ othIsReflexive = computed === computed,
+ othIsSymbol = isSymbol(computed);
+
+ if (valIsNaN) {
+ var setLow = retHighest || othIsReflexive;
+ } else if (valIsUndefined) {
+ setLow = othIsReflexive && (retHighest || othIsDefined);
+ } else if (valIsNull) {
+ setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
+ } else if (valIsSymbol) {
+ setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
+ } else if (othIsNull || othIsSymbol) {
+ setLow = false;
} else {
- delete tags[k];
+ setLow = retHighest ? computed <= value : computed < value;
}
- changed = true;
+ if (setLow) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
}
+
+ return nativeMin(high, MAX_ARRAY_INDEX);
}
- }
+ /**
+ * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
+ * support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ */
- return changed && _conflicts.length === ccount ? target.update({
- tags: tags
- }) : target;
- } // `graph.base()` is the common ancestor of the two graphs.
- // `localGraph` contains user's edits up to saving
- // `remoteGraph` contains remote edits to modified nodes
- // `graph` must be a descendent of `localGraph` and may include
- // some conflict resolution actions performed on it.
- //
- // --- ... --- `localGraph` -- ... -- `graph`
- // /
- // `graph.base()` --- ... --- `remoteGraph`
- //
+ function baseSortedUniq(array, iteratee) {
+ var index = -1,
+ length = array.length,
+ resIndex = 0,
+ result = [];
- var action = function action(graph) {
- var updates = {
- replacements: [],
- removeIds: []
- };
- var base = graph.base().entities[id];
- var local = localGraph.entity(id);
- var remote = remoteGraph.entity(id);
- var target = osmEntity(local, {
- version: remote.version
- }); // delete/undelete
+ while (++index < length) {
+ var value = array[index],
+ computed = iteratee ? iteratee(value) : value;
- if (!remote.visible) {
- if (_option === 'force_remote') {
- return actionDeleteMultiple([id])(graph);
- } else if (_option === 'force_local') {
- if (target.type === 'way') {
- target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
- graph = updateChildren(updates, graph);
+ if (!index || !eq(computed, seen)) {
+ var seen = computed;
+ result[resIndex++] = value === 0 ? 0 : value;
+ }
}
- return graph.replace(target);
- } else {
- _conflicts.push(_t('merge_remote_changes.conflict.deleted', {
- user: user(remote.user)
- }));
-
- return graph; // do nothing
+ return result;
}
- } // merge
-
+ /**
+ * The base implementation of `_.toNumber` which doesn't ensure correct
+ * conversions of binary, hexadecimal, or octal string values.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ */
- if (target.type === 'node') {
- target = mergeLocation(remote, target);
- } else if (target.type === 'way') {
- // pull in any child nodes that may not be present locally..
- graph.rebase(remoteGraph.childNodes(remote), [graph], false);
- target = mergeNodes(base, remote, target);
- target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
- } else if (target.type === 'relation') {
- target = mergeMembers(remote, target);
- }
- target = mergeTags(base, remote, target);
+ function baseToNumber(value) {
+ if (typeof value == 'number') {
+ return value;
+ }
- if (!_conflicts.length) {
- graph = updateChildren(updates, graph).replace(target);
- }
+ if (isSymbol(value)) {
+ return NAN;
+ }
- return graph;
- };
+ return +value;
+ }
+ /**
+ * The base implementation of `_.toString` which doesn't convert nullish
+ * values to empty strings.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ */
- action.withOption = function (opt) {
- _option = opt;
- return action;
- };
- action.conflicts = function () {
- return _conflicts;
- };
+ function baseToString(value) {
+ // Exit early for strings to avoid a performance hit in some environments.
+ if (typeof value == 'string') {
+ return value;
+ }
- return action;
- }
+ if (isArray(value)) {
+ // Recursively convert values (susceptible to call stack limits).
+ return arrayMap(value, baseToString) + '';
+ }
- // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
+ if (isSymbol(value)) {
+ return symbolToString ? symbolToString.call(value) : '';
+ }
- function actionMove(moveIDs, tryDelta, projection, cache) {
- var _delta = tryDelta;
+ var result = value + '';
+ return result == '0' && 1 / value == -INFINITY ? '-0' : result;
+ }
+ /**
+ * The base implementation of `_.uniqBy` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ */
- function setupCache(graph) {
- function canMove(nodeID) {
- // Allow movement of any node that is in the selectedIDs list..
- if (moveIDs.indexOf(nodeID) !== -1) return true; // Allow movement of a vertex where 2 ways meet..
- var parents = graph.parentWays(graph.entity(nodeID));
- if (parents.length < 3) return true; // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
+ function baseUniq(array, iteratee, comparator) {
+ var index = -1,
+ includes = arrayIncludes,
+ length = array.length,
+ isCommon = true,
+ result = [],
+ seen = result;
- var parentsMoving = parents.every(function (way) {
- return cache.moving[way.id];
- });
- if (!parentsMoving) delete cache.moving[nodeID];
- return parentsMoving;
- }
+ if (comparator) {
+ isCommon = false;
+ includes = arrayIncludesWith;
+ } else if (length >= LARGE_ARRAY_SIZE) {
+ var set = iteratee ? null : createSet(array);
- function cacheEntities(ids) {
- for (var i = 0; i < ids.length; i++) {
- var id = ids[i];
- if (cache.moving[id]) continue;
- cache.moving[id] = true;
- var entity = graph.hasEntity(id);
- if (!entity) continue;
+ if (set) {
+ return setToArray(set);
+ }
- if (entity.type === 'node') {
- cache.nodes.push(id);
- cache.startLoc[id] = entity.loc;
- } else if (entity.type === 'way') {
- cache.ways.push(id);
- cacheEntities(entity.nodes);
+ isCommon = false;
+ includes = cacheHas;
+ seen = new SetCache();
} else {
- cacheEntities(entity.members.map(function (member) {
- return member.id;
- }));
+ seen = iteratee ? [] : result;
}
- }
- }
-
- function cacheIntersections(ids) {
- function isEndpoint(way, id) {
- return !way.isClosed() && !!way.affix(id);
- }
-
- for (var i = 0; i < ids.length; i++) {
- var id = ids[i]; // consider only intersections with 1 moved and 1 unmoved way.
- var childNodes = graph.childNodes(graph.entity(id));
+ outer: while (++index < length) {
+ var value = array[index],
+ computed = iteratee ? iteratee(value) : value;
+ value = comparator || value !== 0 ? value : 0;
- for (var j = 0; j < childNodes.length; j++) {
- var node = childNodes[j];
- var parents = graph.parentWays(node);
- if (parents.length !== 2) continue;
- var moved = graph.entity(id);
- var unmoved = null;
+ if (isCommon && computed === computed) {
+ var seenIndex = seen.length;
- for (var k = 0; k < parents.length; k++) {
- var way = parents[k];
+ while (seenIndex--) {
+ if (seen[seenIndex] === computed) {
+ continue outer;
+ }
+ }
- if (!cache.moving[way.id]) {
- unmoved = way;
- break;
+ if (iteratee) {
+ seen.push(computed);
}
- }
- if (!unmoved) continue; // exclude ways that are overly connected..
+ result.push(value);
+ } else if (!includes(seen, computed, comparator)) {
+ if (seen !== result) {
+ seen.push(computed);
+ }
- if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) continue;
- if (moved.isArea() || unmoved.isArea()) continue;
- cache.intersections.push({
- nodeId: node.id,
- movedId: moved.id,
- unmovedId: unmoved.id,
- movedIsEP: isEndpoint(moved, node.id),
- unmovedIsEP: isEndpoint(unmoved, node.id)
- });
+ result.push(value);
+ }
}
- }
- }
- if (!cache) {
- cache = {};
- }
+ return result;
+ }
+ /**
+ * The base implementation of `_.unset`.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The property path to unset.
+ * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+ */
- if (!cache.ok) {
- cache.moving = {};
- cache.intersections = [];
- cache.replacedVertex = {};
- cache.startLoc = {};
- cache.nodes = [];
- cache.ways = [];
- cacheEntities(moveIDs);
- cacheIntersections(cache.ways);
- cache.nodes = cache.nodes.filter(canMove);
- cache.ok = true;
- }
- } // Place a vertex where the moved vertex used to be, to preserve way shape..
- //
- // Start:
- // b ---- e
- // / \
- // / \
- // / \
- // a c
- //
- // * node '*' added to preserve shape
- // / \
- // / b ---- e way `b,e` moved here:
- // / \
- // a c
- //
- //
+ function baseUnset(object, path) {
+ path = castPath(path, object);
+ object = parent(object, path);
+ return object == null || delete object[toKey(last(path))];
+ }
+ /**
+ * The base implementation of `_.update`.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to update.
+ * @param {Function} updater The function to produce the updated value.
+ * @param {Function} [customizer] The function to customize path creation.
+ * @returns {Object} Returns `object`.
+ */
- function replaceMovedVertex(nodeId, wayId, graph, delta) {
- var way = graph.entity(wayId);
- var moved = graph.entity(nodeId);
- var movedIndex = way.nodes.indexOf(nodeId);
- var len, prevIndex, nextIndex;
- if (way.isClosed()) {
- len = way.nodes.length - 1;
- prevIndex = (movedIndex + len - 1) % len;
- nextIndex = (movedIndex + len + 1) % len;
- } else {
- len = way.nodes.length;
- prevIndex = movedIndex - 1;
- nextIndex = movedIndex + 1;
- }
+ function baseUpdate(object, path, updater, customizer) {
+ return baseSet(object, path, updater(baseGet(object, path)), customizer);
+ }
+ /**
+ * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
+ * without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the slice of `array`.
+ */
- var prev = graph.hasEntity(way.nodes[prevIndex]);
- var next = graph.hasEntity(way.nodes[nextIndex]); // Don't add orig vertex at endpoint..
- if (!prev || !next) return graph;
- var key = wayId + '_' + nodeId;
- var orig = cache.replacedVertex[key];
+ function baseWhile(array, predicate, isDrop, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
- if (!orig) {
- orig = osmNode();
- cache.replacedVertex[key] = orig;
- cache.startLoc[orig.id] = cache.startLoc[nodeId];
- }
+ while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
- var start, end;
+ return isDrop ? baseSlice(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array, fromRight ? index + 1 : 0, fromRight ? length : index);
+ }
+ /**
+ * The base implementation of `wrapperValue` which returns the result of
+ * performing a sequence of actions on the unwrapped `value`, where each
+ * successive action is supplied the return value of the previous.
+ *
+ * @private
+ * @param {*} value The unwrapped value.
+ * @param {Array} actions Actions to perform to resolve the unwrapped value.
+ * @returns {*} Returns the resolved value.
+ */
- if (delta) {
- start = projection(cache.startLoc[nodeId]);
- end = projection.invert(geoVecAdd(start, delta));
- } else {
- end = cache.startLoc[nodeId];
- }
- orig = orig.move(end);
- var angle = Math.abs(geoAngle(orig, prev, projection) - geoAngle(orig, next, projection)) * 180 / Math.PI; // Don't add orig vertex if it would just make a straight line..
+ function baseWrapperValue(value, actions) {
+ var result = value;
- if (angle > 175 && angle < 185) return graph; // moving forward or backward along way?
+ if (result instanceof LazyWrapper) {
+ result = result.value();
+ }
- var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
- var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
- var d1 = geoPathLength(p1);
- var d2 = geoPathLength(p2);
- var insertAt = d1 <= d2 ? movedIndex : nextIndex; // moving around closed loop?
+ return arrayReduce(actions, function (result, action) {
+ return action.func.apply(action.thisArg, arrayPush([result], action.args));
+ }, result);
+ }
+ /**
+ * The base implementation of methods like `_.xor`, without support for
+ * iteratee shorthands, that accepts an array of arrays to inspect.
+ *
+ * @private
+ * @param {Array} arrays The arrays to inspect.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of values.
+ */
- if (way.isClosed() && insertAt === 0) insertAt = len;
- way = way.addNode(orig.id, insertAt);
- return graph.replace(orig).replace(way);
- } // Remove duplicate vertex that might have been added by
- // replaceMovedVertex. This is done after the unzorro checks.
+ function baseXor(arrays, iteratee, comparator) {
+ var length = arrays.length;
- function removeDuplicateVertices(wayId, graph) {
- var way = graph.entity(wayId);
- var epsilon = 1e-6;
- var prev, curr;
+ if (length < 2) {
+ return length ? baseUniq(arrays[0]) : [];
+ }
- function isInteresting(node, graph) {
- return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags();
- }
+ var index = -1,
+ result = Array(length);
- for (var i = 0; i < way.nodes.length; i++) {
- curr = graph.entity(way.nodes[i]);
+ while (++index < length) {
+ var array = arrays[index],
+ othIndex = -1;
- if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
- if (!isInteresting(prev, graph)) {
- way = way.removeNode(prev.id);
- graph = graph.replace(way).remove(prev);
- } else if (!isInteresting(curr, graph)) {
- way = way.removeNode(curr.id);
- graph = graph.replace(way).remove(curr);
+ while (++othIndex < length) {
+ if (othIndex != index) {
+ result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
+ }
+ }
}
+
+ return baseUniq(baseFlatten(result, 1), iteratee, comparator);
}
+ /**
+ * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
+ *
+ * @private
+ * @param {Array} props The property identifiers.
+ * @param {Array} values The property values.
+ * @param {Function} assignFunc The function to assign values.
+ * @returns {Object} Returns the new object.
+ */
- prev = curr;
- }
- return graph;
- } // Reorder nodes around intersections that have moved..
- //
- // Start: way1.nodes: b,e (moving)
- // a - b - c ----- d way2.nodes: a,b,c,d (static)
- // | vertex: b
- // e isEP1: true, isEP2, false
- //
- // way1 `b,e` moved here:
- // a ----- c = b - d
- // |
- // e
- //
- // reorder nodes way1.nodes: b,e
- // a ----- c - b - d way2.nodes: a,c,b,d
- // |
- // e
- //
+ function baseZipObject(props, values, assignFunc) {
+ var index = -1,
+ length = props.length,
+ valsLength = values.length,
+ result = {};
+ while (++index < length) {
+ var value = index < valsLength ? values[index] : undefined$1;
+ assignFunc(result, props[index], value);
+ }
- function unZorroIntersection(intersection, graph) {
- var vertex = graph.entity(intersection.nodeId);
- var way1 = graph.entity(intersection.movedId);
- var way2 = graph.entity(intersection.unmovedId);
- var isEP1 = intersection.movedIsEP;
- var isEP2 = intersection.unmovedIsEP; // don't move the vertex if it is the endpoint of both ways.
+ return result;
+ }
+ /**
+ * Casts `value` to an empty array if it's not an array like object.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @returns {Array|Object} Returns the cast array-like object.
+ */
- if (isEP1 && isEP2) return graph;
- var nodes1 = graph.childNodes(way1).filter(function (n) {
- return n !== vertex;
- });
- var nodes2 = graph.childNodes(way2).filter(function (n) {
- return n !== vertex;
- });
- if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
- if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
- var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
- var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
- var loc; // snap vertex to nearest edge (or some point between them)..
- if (!isEP1 && !isEP2) {
- var epsilon = 1e-6,
- maxIter = 10;
+ function castArrayLikeObject(value) {
+ return isArrayLikeObject(value) ? value : [];
+ }
+ /**
+ * Casts `value` to `identity` if it's not a function.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @returns {Function} Returns cast function.
+ */
- for (var i = 0; i < maxIter; i++) {
- loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
- edge1 = geoChooseEdge(nodes1, projection(loc), projection);
- edge2 = geoChooseEdge(nodes2, projection(loc), projection);
- if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
+
+ function castFunction(value) {
+ return typeof value == 'function' ? value : identity;
}
- } else if (!isEP1) {
- loc = edge1.loc;
- } else {
- loc = edge2.loc;
- }
+ /**
+ * Casts `value` to a path array if it's not one.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {Array} Returns the cast property path array.
+ */
- graph = graph.replace(vertex.move(loc)); // if zorro happened, reorder nodes..
- if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
- way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
- graph = graph.replace(way1);
- }
+ function castPath(value, object) {
+ if (isArray(value)) {
+ return value;
+ }
- if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
- way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
- graph = graph.replace(way2);
- }
+ return isKey(value, object) ? [value] : stringToPath(toString(value));
+ }
+ /**
+ * A `baseRest` alias which can be replaced with `identity` by module
+ * replacement plugins.
+ *
+ * @private
+ * @type {Function}
+ * @param {Function} func The function to apply a rest parameter to.
+ * @returns {Function} Returns the new function.
+ */
- return graph;
- }
- function cleanupIntersections(graph) {
- for (var i = 0; i < cache.intersections.length; i++) {
- var obj = cache.intersections[i];
- graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
- graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
- graph = unZorroIntersection(obj, graph);
- graph = removeDuplicateVertices(obj.movedId, graph);
- graph = removeDuplicateVertices(obj.unmovedId, graph);
- }
+ var castRest = baseRest;
+ /**
+ * Casts `array` to a slice if it's needed.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {number} start The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the cast slice.
+ */
- return graph;
- } // check if moving way endpoint can cross an unmoved way, if so limit delta..
+ function castSlice(array, start, end) {
+ var length = array.length;
+ end = end === undefined$1 ? length : end;
+ return !start && end >= length ? array : baseSlice(array, start, end);
+ }
+ /**
+ * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
+ *
+ * @private
+ * @param {number|Object} id The timer id or timeout object of the timer to clear.
+ */
- function limitDelta(graph) {
- function moveNode(loc) {
- return geoVecAdd(projection(loc), _delta);
- }
+ var clearTimeout = ctxClearTimeout || function (id) {
+ return root.clearTimeout(id);
+ };
+ /**
+ * Creates a clone of `buffer`.
+ *
+ * @private
+ * @param {Buffer} buffer The buffer to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Buffer} Returns the cloned buffer.
+ */
- for (var i = 0; i < cache.intersections.length; i++) {
- var obj = cache.intersections[i]; // Don't limit movement if this is vertex joins 2 endpoints..
- if (obj.movedIsEP && obj.unmovedIsEP) continue; // Don't limit movement if this vertex is not an endpoint anyway..
+ function cloneBuffer(buffer, isDeep) {
+ if (isDeep) {
+ return buffer.slice();
+ }
- if (!obj.movedIsEP) continue;
- var node = graph.entity(obj.nodeId);
- var start = projection(node.loc);
- var end = geoVecAdd(start, _delta);
- var movedNodes = graph.childNodes(graph.entity(obj.movedId));
- var movedPath = movedNodes.map(function (n) {
- return moveNode(n.loc);
- });
- var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
- var unmovedPath = unmovedNodes.map(function (n) {
- return projection(n.loc);
- });
- var hits = geoPathIntersections(movedPath, unmovedPath);
+ var length = buffer.length,
+ result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
+ buffer.copy(result);
+ return result;
+ }
+ /**
+ * Creates a clone of `arrayBuffer`.
+ *
+ * @private
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
+ */
- for (var j = 0; i < hits.length; i++) {
- if (geoVecEqual(hits[j], end)) continue;
- var edge = geoChooseEdge(unmovedNodes, end, projection);
- _delta = geoVecSubtract(projection(edge.loc), start);
+
+ function cloneArrayBuffer(arrayBuffer) {
+ var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+ new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+ return result;
}
- }
- }
+ /**
+ * Creates a clone of `dataView`.
+ *
+ * @private
+ * @param {Object} dataView The data view to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned data view.
+ */
- var action = function action(graph) {
- if (_delta[0] === 0 && _delta[1] === 0) return graph;
- setupCache(graph);
- if (cache.intersections.length) {
- limitDelta(graph);
- }
+ function cloneDataView(dataView, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+ return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
+ }
+ /**
+ * Creates a clone of `regexp`.
+ *
+ * @private
+ * @param {Object} regexp The regexp to clone.
+ * @returns {Object} Returns the cloned regexp.
+ */
- for (var i = 0; i < cache.nodes.length; i++) {
- var node = graph.entity(cache.nodes[i]);
- var start = projection(node.loc);
- var end = geoVecAdd(start, _delta);
- graph = graph.replace(node.move(projection.invert(end)));
- }
- if (cache.intersections.length) {
- graph = cleanupIntersections(graph);
- }
+ function cloneRegExp(regexp) {
+ var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+ result.lastIndex = regexp.lastIndex;
+ return result;
+ }
+ /**
+ * Creates a clone of the `symbol` object.
+ *
+ * @private
+ * @param {Object} symbol The symbol object to clone.
+ * @returns {Object} Returns the cloned symbol object.
+ */
- return graph;
- };
- action.delta = function () {
- return _delta;
- };
+ function cloneSymbol(symbol) {
+ return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
+ }
+ /**
+ * Creates a clone of `typedArray`.
+ *
+ * @private
+ * @param {Object} typedArray The typed array to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned typed array.
+ */
- return action;
- }
- function actionMoveMember(relationId, fromIndex, toIndex) {
- return function (graph) {
- return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
- };
- }
+ function cloneTypedArray(typedArray, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+ return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+ }
+ /**
+ * Compares values to sort them in ascending order.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {number} Returns the sort order indicator for `value`.
+ */
- function actionMoveNode(nodeID, toLoc) {
- var action = function action(graph, t) {
- if (t === null || !isFinite(t)) t = 1;
- t = Math.min(Math.max(+t, 0), 1);
- var node = graph.entity(nodeID);
- return graph.replace(node.move(geoVecInterp(node.loc, toLoc, t)));
- };
- action.transitionable = true;
- return action;
- }
+ function compareAscending(value, other) {
+ if (value !== other) {
+ var valIsDefined = value !== undefined$1,
+ valIsNull = value === null,
+ valIsReflexive = value === value,
+ valIsSymbol = isSymbol(value);
+ var othIsDefined = other !== undefined$1,
+ othIsNull = other === null,
+ othIsReflexive = other === other,
+ othIsSymbol = isSymbol(other);
- function actionNoop() {
- return function (graph) {
- return graph;
- };
- }
+ if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {
+ return 1;
+ }
- function actionOrthogonalize(wayID, projection, vertexID, degThresh, ep) {
- var epsilon = ep || 1e-4;
- var threshold = degThresh || 13; // degrees within right or straight to alter
- // We test normalized dot products so we can compare as cos(angle)
+ if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {
+ return -1;
+ }
+ }
- var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
- var upperThreshold = Math.cos(threshold * Math.PI / 180);
+ return 0;
+ }
+ /**
+ * Used by `_.orderBy` to compare multiple properties of a value to another
+ * and stable sort them.
+ *
+ * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
+ * specify an order of "desc" for descending or "asc" for ascending sort order
+ * of corresponding values.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {boolean[]|string[]} orders The order to sort by for each property.
+ * @returns {number} Returns the sort order indicator for `object`.
+ */
- var action = function action(graph, t) {
- if (t === null || !isFinite(t)) t = 1;
- t = Math.min(Math.max(+t, 0), 1);
- var way = graph.entity(wayID);
- way = way.removeNode(''); // sanity check - remove any consecutive duplicates
- if (way.tags.nonsquare) {
- var tags = Object.assign({}, way.tags); // since we're squaring, remove indication that this is physically unsquare
+ function compareMultiple(object, other, orders) {
+ var index = -1,
+ objCriteria = object.criteria,
+ othCriteria = other.criteria,
+ length = objCriteria.length,
+ ordersLength = orders.length;
- delete tags.nonsquare;
- way = way.update({
- tags: tags
- });
- }
+ while (++index < length) {
+ var result = compareAscending(objCriteria[index], othCriteria[index]);
- graph = graph.replace(way);
- var isClosed = way.isClosed();
- var nodes = graph.childNodes(way).slice(); // shallow copy
+ if (result) {
+ if (index >= ordersLength) {
+ return result;
+ }
- if (isClosed) nodes.pop();
+ var order = orders[index];
+ return result * (order == 'desc' ? -1 : 1);
+ }
+ } // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
+ // that causes it, under certain circumstances, to provide the same value for
+ // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
+ // for more details.
+ //
+ // This also ensures a stable sort in V8 and other engines.
+ // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
- if (vertexID !== undefined) {
- nodes = nodeSubset(nodes, vertexID, isClosed);
- if (nodes.length !== 3) return graph;
- } // note: all geometry functions here use the unclosed node/point/coord list
+ return object.index - other.index;
+ }
+ /**
+ * Creates an array that is the composition of partially applied arguments,
+ * placeholders, and provided arguments into a single array of arguments.
+ *
+ * @private
+ * @param {Array} args The provided arguments.
+ * @param {Array} partials The arguments to prepend to those provided.
+ * @param {Array} holders The `partials` placeholder indexes.
+ * @params {boolean} [isCurried] Specify composing for a curried function.
+ * @returns {Array} Returns the new array of composed arguments.
+ */
- var nodeCount = {};
- var points = [];
- var corner = {
- i: 0,
- dotp: 1
- };
- var node, point, loc, score, motions, i, j;
- for (i = 0; i < nodes.length; i++) {
- node = nodes[i];
- nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
- points.push({
- id: node.id,
- coord: projection(node.loc)
- });
- }
+ function composeArgs(args, partials, holders, isCurried) {
+ var argsIndex = -1,
+ argsLength = args.length,
+ holdersLength = holders.length,
+ leftIndex = -1,
+ leftLength = partials.length,
+ rangeLength = nativeMax(argsLength - holdersLength, 0),
+ result = Array(leftLength + rangeLength),
+ isUncurried = !isCurried;
- if (points.length === 3) {
- // move only one vertex for right triangle
- for (i = 0; i < 1000; i++) {
- motions = points.map(calcMotion);
- points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
- score = corner.dotp;
+ while (++leftIndex < leftLength) {
+ result[leftIndex] = partials[leftIndex];
+ }
- if (score < epsilon) {
- break;
+ while (++argsIndex < holdersLength) {
+ if (isUncurried || argsIndex < argsLength) {
+ result[holders[argsIndex]] = args[argsIndex];
+ }
}
+
+ while (rangeLength--) {
+ result[leftIndex++] = args[argsIndex++];
+ }
+
+ return result;
}
+ /**
+ * This function is like `composeArgs` except that the arguments composition
+ * is tailored for `_.partialRight`.
+ *
+ * @private
+ * @param {Array} args The provided arguments.
+ * @param {Array} partials The arguments to append to those provided.
+ * @param {Array} holders The `partials` placeholder indexes.
+ * @params {boolean} [isCurried] Specify composing for a curried function.
+ * @returns {Array} Returns the new array of composed arguments.
+ */
- node = graph.entity(nodes[corner.i].id);
- loc = projection.invert(points[corner.i].coord);
- graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
- } else {
- var straights = [];
- var simplified = []; // Remove points from nearly straight sections..
- // This produces a simplified shape to orthogonalize
- for (i = 0; i < points.length; i++) {
- point = points[i];
- var dotp = 0;
+ function composeArgsRight(args, partials, holders, isCurried) {
+ var argsIndex = -1,
+ argsLength = args.length,
+ holdersIndex = -1,
+ holdersLength = holders.length,
+ rightIndex = -1,
+ rightLength = partials.length,
+ rangeLength = nativeMax(argsLength - holdersLength, 0),
+ result = Array(rangeLength + rightLength),
+ isUncurried = !isCurried;
- if (isClosed || i > 0 && i < points.length - 1) {
- var a = points[(i - 1 + points.length) % points.length];
- var b = points[(i + 1) % points.length];
- dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord));
+ while (++argsIndex < rangeLength) {
+ result[argsIndex] = args[argsIndex];
}
- if (dotp > upperThreshold) {
- straights.push(point);
- } else {
- simplified.push(point);
+ var offset = argsIndex;
+
+ while (++rightIndex < rightLength) {
+ result[offset + rightIndex] = partials[rightIndex];
}
- } // Orthogonalize the simplified shape
+ while (++holdersIndex < holdersLength) {
+ if (isUncurried || argsIndex < argsLength) {
+ result[offset + holders[holdersIndex]] = args[argsIndex++];
+ }
+ }
- var bestPoints = clonePoints(simplified);
- var originalPoints = clonePoints(simplified);
- score = Infinity;
+ return result;
+ }
+ /**
+ * Copies the values of `source` to `array`.
+ *
+ * @private
+ * @param {Array} source The array to copy values from.
+ * @param {Array} [array=[]] The array to copy values to.
+ * @returns {Array} Returns `array`.
+ */
- for (i = 0; i < 1000; i++) {
- motions = simplified.map(calcMotion);
- for (j = 0; j < motions.length; j++) {
- simplified[j].coord = geoVecAdd(simplified[j].coord, motions[j]);
+ function copyArray(source, array) {
+ var index = -1,
+ length = source.length;
+ array || (array = Array(length));
+
+ while (++index < length) {
+ array[index] = source[index];
}
- var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon, threshold);
+ return array;
+ }
+ /**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property identifiers to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @param {Function} [customizer] The function to customize copied values.
+ * @returns {Object} Returns `object`.
+ */
- if (newScore < score) {
- bestPoints = clonePoints(simplified);
- score = newScore;
- }
- if (score < epsilon) {
- break;
+ function copyObject(source, props, object, customizer) {
+ var isNew = !object;
+ object || (object = {});
+ var index = -1,
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index];
+ var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined$1;
+
+ if (newValue === undefined$1) {
+ newValue = source[key];
+ }
+
+ if (isNew) {
+ baseAssignValue(object, key, newValue);
+ } else {
+ assignValue(object, key, newValue);
+ }
}
+
+ return object;
}
+ /**
+ * Copies own symbols of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
+ * @returns {Object} Returns `object`.
+ */
- var bestCoords = bestPoints.map(function (p) {
- return p.coord;
- });
- if (isClosed) bestCoords.push(bestCoords[0]); // move the nodes that should move
- for (i = 0; i < bestPoints.length; i++) {
- point = bestPoints[i];
+ function copySymbols(source, object) {
+ return copyObject(source, getSymbols(source), object);
+ }
+ /**
+ * Copies own and inherited symbols of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
+ * @returns {Object} Returns `object`.
+ */
- if (!geoVecEqual(originalPoints[i].coord, point.coord)) {
- node = graph.entity(point.id);
- loc = projection.invert(point.coord);
- graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
- }
- } // move the nodes along straight segments
+ function copySymbolsIn(source, object) {
+ return copyObject(source, getSymbolsIn(source), object);
+ }
+ /**
+ * Creates a function like `_.groupBy`.
+ *
+ * @private
+ * @param {Function} setter The function to set accumulator values.
+ * @param {Function} [initializer] The accumulator object initializer.
+ * @returns {Function} Returns the new aggregator function.
+ */
- for (i = 0; i < straights.length; i++) {
- point = straights[i];
- if (nodeCount[point.id] > 1) continue; // skip self-intersections
- node = graph.entity(point.id);
+ function createAggregator(setter, initializer) {
+ return function (collection, iteratee) {
+ var func = isArray(collection) ? arrayAggregator : baseAggregator,
+ accumulator = initializer ? initializer() : {};
+ return func(collection, setter, getIteratee(iteratee, 2), accumulator);
+ };
+ }
+ /**
+ * Creates a function like `_.assign`.
+ *
+ * @private
+ * @param {Function} assigner The function to assign values.
+ * @returns {Function} Returns the new assigner function.
+ */
- if (t === 1 && graph.parentWays(node).length === 1 && graph.parentRelations(node).length === 0 && !node.hasInterestingTags()) {
- // remove uninteresting points..
- graph = actionDeleteNode(node.id)(graph);
- } else {
- // move interesting points to the nearest edge..
- var choice = geoVecProject(point.coord, bestCoords);
- if (choice) {
- loc = projection.invert(choice.target);
- graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
+ function createAssigner(assigner) {
+ return baseRest(function (object, sources) {
+ var index = -1,
+ length = sources.length,
+ customizer = length > 1 ? sources[length - 1] : undefined$1,
+ guard = length > 2 ? sources[2] : undefined$1;
+ customizer = assigner.length > 3 && typeof customizer == 'function' ? (length--, customizer) : undefined$1;
+
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+ customizer = length < 3 ? undefined$1 : customizer;
+ length = 1;
}
- }
+
+ object = Object(object);
+
+ while (++index < length) {
+ var source = sources[index];
+
+ if (source) {
+ assigner(object, source, index, customizer);
+ }
+ }
+
+ return object;
+ });
}
- }
+ /**
+ * Creates a `baseEach` or `baseEachRight` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
- return graph;
- function clonePoints(array) {
- return array.map(function (p) {
- return {
- id: p.id,
- coord: [p.coord[0], p.coord[1]]
+ function createBaseEach(eachFunc, fromRight) {
+ return function (collection, iteratee) {
+ if (collection == null) {
+ return collection;
+ }
+
+ if (!isArrayLike(collection)) {
+ return eachFunc(collection, iteratee);
+ }
+
+ var length = collection.length,
+ index = fromRight ? length : -1,
+ iterable = Object(collection);
+
+ while (fromRight ? index-- : ++index < length) {
+ if (iteratee(iterable[index], index, iterable) === false) {
+ break;
+ }
+ }
+
+ return collection;
};
- });
- }
+ }
+ /**
+ * Creates a base function for methods like `_.forIn` and `_.forOwn`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
- function calcMotion(point, i, array) {
- // don't try to move the endpoints of a non-closed way.
- if (!isClosed && (i === 0 || i === array.length - 1)) return [0, 0]; // don't try to move a node that appears more than once (self intersection)
- if (nodeCount[array[i].id] > 1) return [0, 0];
- var a = array[(i - 1 + array.length) % array.length].coord;
- var origin = point.coord;
- var b = array[(i + 1) % array.length].coord;
- var p = geoVecSubtract(a, origin);
- var q = geoVecSubtract(b, origin);
- var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
- p = geoVecNormalize(p);
- q = geoVecNormalize(q);
- var dotp = p[0] * q[0] + p[1] * q[1];
- var val = Math.abs(dotp);
+ function createBaseFor(fromRight) {
+ return function (object, iteratee, keysFunc) {
+ var index = -1,
+ iterable = Object(object),
+ props = keysFunc(object),
+ length = props.length;
- if (val < lowerThreshold) {
- // nearly orthogonal
- corner.i = i;
- corner.dotp = val;
- var vec = geoVecNormalize(geoVecAdd(p, q));
- return geoVecScale(vec, 0.1 * dotp * scale);
+ while (length--) {
+ var key = props[fromRight ? length : ++index];
+
+ if (iteratee(iterable[key], key, iterable) === false) {
+ break;
+ }
+ }
+
+ return object;
+ };
}
+ /**
+ * Creates a function that wraps `func` to invoke it with the optional `this`
+ * binding of `thisArg`.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
- return [0, 0]; // do nothing
- }
- }; // if we are only orthogonalizing one vertex,
- // get that vertex and the previous and next
+ function createBind(func, bitmask, thisArg) {
+ var isBind = bitmask & WRAP_BIND_FLAG,
+ Ctor = createCtor(func);
- function nodeSubset(nodes, vertexID, isClosed) {
- var first = isClosed ? 0 : 1;
- var last = isClosed ? nodes.length : nodes.length - 1;
+ function wrapper() {
+ var fn = this && this !== root && this instanceof wrapper ? Ctor : func;
+ return fn.apply(isBind ? thisArg : this, arguments);
+ }
- for (var i = first; i < last; i++) {
- if (nodes[i].id === vertexID) {
- return [nodes[(i - 1 + nodes.length) % nodes.length], nodes[i], nodes[(i + 1) % nodes.length]];
+ return wrapper;
}
- }
+ /**
+ * Creates a function like `_.lowerFirst`.
+ *
+ * @private
+ * @param {string} methodName The name of the `String` case method to use.
+ * @returns {Function} Returns the new case function.
+ */
- return [];
- }
- action.disabled = function (graph) {
- var way = graph.entity(wayID);
- way = way.removeNode(''); // sanity check - remove any consecutive duplicates
+ function createCaseFirst(methodName) {
+ return function (string) {
+ string = toString(string);
+ var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined$1;
+ var chr = strSymbols ? strSymbols[0] : string.charAt(0);
+ var trailing = strSymbols ? castSlice(strSymbols, 1).join('') : string.slice(1);
+ return chr[methodName]() + trailing;
+ };
+ }
+ /**
+ * Creates a function like `_.camelCase`.
+ *
+ * @private
+ * @param {Function} callback The function to combine each word.
+ * @returns {Function} Returns the new compounder function.
+ */
- graph = graph.replace(way);
- var isClosed = way.isClosed();
- var nodes = graph.childNodes(way).slice(); // shallow copy
- if (isClosed) nodes.pop();
- var allowStraightAngles = false;
+ function createCompounder(callback) {
+ return function (string) {
+ return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
+ };
+ }
+ /**
+ * Creates a function that produces an instance of `Ctor` regardless of
+ * whether it was invoked as part of a `new` expression or by `call` or `apply`.
+ *
+ * @private
+ * @param {Function} Ctor The constructor to wrap.
+ * @returns {Function} Returns the new wrapped function.
+ */
- if (vertexID !== undefined) {
- allowStraightAngles = true;
- nodes = nodeSubset(nodes, vertexID, isClosed);
- if (nodes.length !== 3) return 'end_vertex';
- }
- var coords = nodes.map(function (n) {
- return projection(n.loc);
- });
- var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles);
+ function createCtor(Ctor) {
+ return function () {
+ // Use a `switch` statement to work with class constructors. See
+ // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
+ // for more details.
+ var args = arguments;
- if (score === null) {
- return 'not_squarish';
- } else if (score === 0) {
- return 'square_enough';
- } else {
- return false;
- }
- };
+ switch (args.length) {
+ case 0:
+ return new Ctor();
- action.transitionable = true;
- return action;
- }
+ case 1:
+ return new Ctor(args[0]);
- //
- // `turn` must be an `osmTurn` object
- // see osm/intersection.js, pathToTurn()
- //
- // This specifies a restriction of type `restriction` when traveling from
- // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
- // (The action does not check that these entities form a valid intersection.)
- //
- // From, to, and via ways should be split before calling this action.
- // (old versions of the code would split the ways here, but we no longer do it)
- //
- // For testing convenience, accepts a restrictionID to assign to the new
- // relation. Normally, this will be undefined and the relation will
- // automatically be assigned a new ID.
- //
+ case 2:
+ return new Ctor(args[0], args[1]);
- function actionRestrictTurn(turn, restrictionType, restrictionID) {
- return function (graph) {
- var fromWay = graph.entity(turn.from.way);
- var toWay = graph.entity(turn.to.way);
- var viaNode = turn.via.node && graph.entity(turn.via.node);
- var viaWays = turn.via.ways && turn.via.ways.map(function (id) {
- return graph.entity(id);
- });
- var members = [];
- members.push({
- id: fromWay.id,
- type: 'way',
- role: 'from'
- });
+ case 3:
+ return new Ctor(args[0], args[1], args[2]);
- if (viaNode) {
- members.push({
- id: viaNode.id,
- type: 'node',
- role: 'via'
- });
- } else if (viaWays) {
- viaWays.forEach(function (viaWay) {
- members.push({
- id: viaWay.id,
- type: 'way',
- role: 'via'
- });
- });
- }
+ case 4:
+ return new Ctor(args[0], args[1], args[2], args[3]);
- members.push({
- id: toWay.id,
- type: 'way',
- role: 'to'
- });
- return graph.replace(osmRelation({
- id: restrictionID,
- tags: {
- type: 'restriction',
- restriction: restrictionType
- },
- members: members
- }));
- };
- }
+ case 5:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4]);
- function actionRevert(id) {
- var action = function action(graph) {
- var entity = graph.hasEntity(id),
- base = graph.base().entities[id];
+ case 6:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
- if (entity && !base) {
- // entity will be removed..
- if (entity.type === 'node') {
- graph.parentWays(entity).forEach(function (parent) {
- parent = parent.removeNode(id);
- graph = graph.replace(parent);
+ case 7:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+ }
+
+ var thisBinding = baseCreate(Ctor.prototype),
+ result = Ctor.apply(thisBinding, args); // Mimic the constructor's `return` behavior.
+ // See https://es5.github.io/#x13.2.2 for more details.
+
+ return isObject(result) ? result : thisBinding;
+ };
+ }
+ /**
+ * Creates a function that wraps `func` to enable currying.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @param {number} arity The arity of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
- if (parent.isDegenerate()) {
- graph = actionDeleteWay(parent.id)(graph);
+
+ function createCurry(func, bitmask, arity) {
+ var Ctor = createCtor(func);
+
+ function wrapper() {
+ var length = arguments.length,
+ args = Array(length),
+ index = length,
+ placeholder = getHolder(wrapper);
+
+ while (index--) {
+ args[index] = arguments[index];
}
- });
- }
- graph.parentRelations(entity).forEach(function (parent) {
- parent = parent.removeMembersWithID(id);
- graph = graph.replace(parent);
+ var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder);
+ length -= holders.length;
- if (parent.isDegenerate()) {
- graph = actionDeleteRelation(parent.id)(graph);
+ if (length < arity) {
+ return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, undefined$1, args, holders, undefined$1, undefined$1, arity - length);
+ }
+
+ var fn = this && this !== root && this instanceof wrapper ? Ctor : func;
+ return apply(fn, this, args);
}
- });
- }
- return graph.revert(id);
- };
+ return wrapper;
+ }
+ /**
+ * Creates a `_.find` or `_.findLast` function.
+ *
+ * @private
+ * @param {Function} findIndexFunc The function to find the collection index.
+ * @returns {Function} Returns the new find function.
+ */
- return action;
- }
- function actionRotate(rotateIds, pivot, angle, projection) {
- var action = function action(graph) {
- return graph.update(function (graph) {
- utilGetAllNodes(rotateIds, graph).forEach(function (node) {
- var point = geoRotate([projection(node.loc)], angle, pivot)[0];
- graph = graph.replace(node.move(projection.invert(point)));
- });
- });
- };
+ function createFind(findIndexFunc) {
+ return function (collection, predicate, fromIndex) {
+ var iterable = Object(collection);
- return action;
- }
+ if (!isArrayLike(collection)) {
+ var iteratee = getIteratee(predicate, 3);
+ collection = keys(collection);
- function actionScale(ids, pivotLoc, scaleFactor, projection) {
- return function (graph) {
- return graph.update(function (graph) {
- var point, radial;
- utilGetAllNodes(ids, graph).forEach(function (node) {
- point = projection(node.loc);
- radial = [point[0] - pivotLoc[0], point[1] - pivotLoc[1]];
- point = [pivotLoc[0] + scaleFactor * radial[0], pivotLoc[1] + scaleFactor * radial[1]];
- graph = graph.replace(node.move(projection.invert(point)));
- });
- });
- };
- }
+ predicate = function predicate(key) {
+ return iteratee(iterable[key], key, iterable);
+ };
+ }
- /* Align nodes along their common axis */
+ var index = findIndexFunc(collection, predicate, fromIndex);
+ return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined$1;
+ };
+ }
+ /**
+ * Creates a `_.flow` or `_.flowRight` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new flow function.
+ */
- function actionStraightenNodes(nodeIDs, projection) {
- function positionAlongWay(a, o, b) {
- return geoVecDot(a, b, o) / geoVecDot(b, b, o);
- } // returns the endpoints of the long axis of symmetry of the `points` bounding rect
+ function createFlow(fromRight) {
+ return flatRest(function (funcs) {
+ var length = funcs.length,
+ index = length,
+ prereq = LodashWrapper.prototype.thru;
- function getEndpoints(points) {
- var ssr = geoGetSmallestSurroundingRectangle(points); // Choose line pq = axis of symmetry.
- // The shape's surrounding rectangle has 2 axes of symmetry.
- // Snap points to the long axis
+ if (fromRight) {
+ funcs.reverse();
+ }
- var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
- var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
- var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
- var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
- var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
+ while (index--) {
+ var func = funcs[index];
- if (isLong) {
- return [p1, q1];
- }
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
- return [p2, q2];
- }
+ if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
+ var wrapper = new LodashWrapper([], true);
+ }
+ }
- var action = function action(graph, t) {
- if (t === null || !isFinite(t)) t = 1;
- t = Math.min(Math.max(+t, 0), 1);
- var nodes = nodeIDs.map(function (id) {
- return graph.entity(id);
- });
- var points = nodes.map(function (n) {
- return projection(n.loc);
- });
- var endpoints = getEndpoints(points);
- var startPoint = endpoints[0];
- var endPoint = endpoints[1]; // Move points onto the line connecting the endpoints
+ index = wrapper ? index : length;
- for (var i = 0; i < points.length; i++) {
- var node = nodes[i];
- var point = points[i];
- var u = positionAlongWay(point, startPoint, endPoint);
- var point2 = geoVecInterp(startPoint, endPoint, u);
- var loc2 = projection.invert(point2);
- graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
- }
+ while (++index < length) {
+ func = funcs[index];
+ var funcName = getFuncName(func),
+ data = funcName == 'wrapper' ? getData(func) : undefined$1;
- return graph;
- };
+ 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) {
+ wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
+ } else {
+ wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func);
+ }
+ }
- action.disabled = function (graph) {
- var nodes = nodeIDs.map(function (id) {
- return graph.entity(id);
- });
- var points = nodes.map(function (n) {
- return projection(n.loc);
- });
- var endpoints = getEndpoints(points);
- var startPoint = endpoints[0];
- var endPoint = endpoints[1];
- var maxDistance = 0;
+ return function () {
+ var args = arguments,
+ value = args[0];
- for (var i = 0; i < points.length; i++) {
- var point = points[i];
- var u = positionAlongWay(point, startPoint, endPoint);
- var p = geoVecInterp(startPoint, endPoint, u);
- var dist = geoVecLength(p, point);
+ if (wrapper && args.length == 1 && isArray(value)) {
+ return wrapper.plant(value).value();
+ }
- if (!isNaN(dist) && dist > maxDistance) {
- maxDistance = dist;
+ var index = 0,
+ result = length ? funcs[index].apply(this, args) : value;
+
+ while (++index < length) {
+ result = funcs[index].call(this, result);
+ }
+
+ return result;
+ };
+ });
}
- }
+ /**
+ * Creates a function that wraps `func` to invoke it with optional `this`
+ * binding of `thisArg`, partial application, and currying.
+ *
+ * @private
+ * @param {Function|string} func The function or method name to wrap.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {Array} [partials] The arguments to prepend to those provided to
+ * the new function.
+ * @param {Array} [holders] The `partials` placeholder indexes.
+ * @param {Array} [partialsRight] The arguments to append to those provided
+ * to the new function.
+ * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
+ * @param {Array} [argPos] The argument positions of the new function.
+ * @param {number} [ary] The arity cap of `func`.
+ * @param {number} [arity] The arity of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
- if (maxDistance < 0.0001) {
- return 'straight_enough';
- }
- };
- action.transitionable = true;
- return action;
- }
+ function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
+ 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 ? undefined$1 : createCtor(func);
- /*
- * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
- */
+ function wrapper() {
+ var length = arguments.length,
+ args = Array(length),
+ index = length;
- function actionStraightenWay(selectedIDs, projection) {
- function positionAlongWay(a, o, b) {
- return geoVecDot(a, b, o) / geoVecDot(b, b, o);
- } // Return all selected ways as a continuous, ordered array of nodes
+ while (index--) {
+ args[index] = arguments[index];
+ }
+ if (isCurried) {
+ var placeholder = getHolder(wrapper),
+ holdersCount = countHolders(args, placeholder);
+ }
- function allNodes(graph) {
- var nodes = [];
- var startNodes = [];
- var endNodes = [];
- var remainingWays = [];
- var selectedWays = selectedIDs.filter(function (w) {
- return graph.entity(w).type === 'way';
- });
- var selectedNodes = selectedIDs.filter(function (n) {
- return graph.entity(n).type === 'node';
- });
+ if (partials) {
+ args = composeArgs(args, partials, holders, isCurried);
+ }
- for (var i = 0; i < selectedWays.length; i++) {
- var way = graph.entity(selectedWays[i]);
- nodes = way.nodes.slice(0);
- remainingWays.push(nodes);
- startNodes.push(nodes[0]);
- endNodes.push(nodes[nodes.length - 1]);
- } // Remove duplicate end/startNodes (duplicate nodes cannot be at the line end,
- // and need to be removed so currNode difference calculation below works)
- // i.e. ["n-1", "n-1", "n-2"] => ["n-2"]
+ if (partialsRight) {
+ args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
+ }
+ length -= holdersCount;
- startNodes = startNodes.filter(function (n) {
- return startNodes.indexOf(n) === startNodes.lastIndexOf(n);
- });
- endNodes = endNodes.filter(function (n) {
- return endNodes.indexOf(n) === endNodes.lastIndexOf(n);
- }); // Choose the initial endpoint to start from
+ if (isCurried && length < arity) {
+ var newHolders = replaceHolders(args, placeholder);
+ return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary, arity - length);
+ }
- var currNode = utilArrayDifference(startNodes, endNodes).concat(utilArrayDifference(endNodes, startNodes))[0];
- var nextWay = [];
- nodes = []; // Create nested function outside of loop to avoid "function in loop" lint error
+ var thisBinding = isBind ? thisArg : this,
+ fn = isBindKey ? thisBinding[func] : func;
+ length = args.length;
- var getNextWay = function getNextWay(currNode, remainingWays) {
- return remainingWays.filter(function (way) {
- return way[0] === currNode || way[way.length - 1] === currNode;
- })[0];
- }; // Add nodes to end of nodes array, until all ways are added
+ if (argPos) {
+ args = reorder(args, argPos);
+ } else if (isFlip && length > 1) {
+ args.reverse();
+ }
+ if (isAry && ary < length) {
+ args.length = ary;
+ }
- while (remainingWays.length) {
- nextWay = getNextWay(currNode, remainingWays);
- remainingWays = utilArrayDifference(remainingWays, [nextWay]);
+ if (this && this !== root && this instanceof wrapper) {
+ fn = Ctor || createCtor(fn);
+ }
- if (nextWay[0] !== currNode) {
- nextWay.reverse();
+ return fn.apply(thisBinding, args);
+ }
+
+ return wrapper;
}
+ /**
+ * Creates a function like `_.invertBy`.
+ *
+ * @private
+ * @param {Function} setter The function to set accumulator values.
+ * @param {Function} toIteratee The function to resolve iteratees.
+ * @returns {Function} Returns the new inverter function.
+ */
- nodes = nodes.concat(nextWay);
- currNode = nodes[nodes.length - 1];
- } // If user selected 2 nodes to straighten between, then slice nodes array to those nodes
+ function createInverter(setter, toIteratee) {
+ return function (object, iteratee) {
+ return baseInverter(object, setter, toIteratee(iteratee), {});
+ };
+ }
+ /**
+ * Creates a function that performs a mathematical operation on two values.
+ *
+ * @private
+ * @param {Function} operator The function to perform the operation.
+ * @param {number} [defaultValue] The value used for `undefined` arguments.
+ * @returns {Function} Returns the new mathematical operation function.
+ */
- if (selectedNodes.length === 2) {
- var startNodeIdx = nodes.indexOf(selectedNodes[0]);
- var endNodeIdx = nodes.indexOf(selectedNodes[1]);
- var sortedStartEnd = [startNodeIdx, endNodeIdx];
- sortedStartEnd.sort(function (a, b) {
- return a - b;
- });
- nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1] + 1);
- }
- return nodes.map(function (n) {
- return graph.entity(n);
- });
- }
+ function createMathOperation(operator, defaultValue) {
+ return function (value, other) {
+ var result;
- function shouldKeepNode(node, graph) {
- return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags();
- }
+ if (value === undefined$1 && other === undefined$1) {
+ return defaultValue;
+ }
- var action = function action(graph, t) {
- if (t === null || !isFinite(t)) t = 1;
- t = Math.min(Math.max(+t, 0), 1);
- var nodes = allNodes(graph);
- var points = nodes.map(function (n) {
- return projection(n.loc);
- });
- var startPoint = points[0];
- var endPoint = points[points.length - 1];
- var toDelete = [];
- var i;
+ if (value !== undefined$1) {
+ result = value;
+ }
- for (i = 1; i < points.length - 1; i++) {
- var node = nodes[i];
- var point = points[i];
+ if (other !== undefined$1) {
+ if (result === undefined$1) {
+ return other;
+ }
- if (t < 1 || shouldKeepNode(node, graph)) {
- var u = positionAlongWay(point, startPoint, endPoint);
- var p = geoVecInterp(startPoint, endPoint, u);
- var loc2 = projection.invert(p);
- graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
- } else {
- // safe to delete
- if (toDelete.indexOf(node) === -1) {
- toDelete.push(node);
+ if (typeof value == 'string' || typeof other == 'string') {
+ value = baseToString(value);
+ other = baseToString(other);
+ } else {
+ value = baseToNumber(value);
+ other = baseToNumber(other);
+ }
+
+ result = operator(value, other);
+ }
+
+ return result;
+ };
+ }
+ /**
+ * Creates a function like `_.over`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over iteratees.
+ * @returns {Function} Returns the new over function.
+ */
+
+
+ function createOver(arrayFunc) {
+ return flatRest(function (iteratees) {
+ iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
+ return baseRest(function (args) {
+ var thisArg = this;
+ return arrayFunc(iteratees, function (iteratee) {
+ return apply(iteratee, thisArg, args);
+ });
+ });
+ });
+ }
+ /**
+ * Creates the padding for `string` based on `length`. The `chars` string
+ * is truncated if the number of characters exceeds `length`.
+ *
+ * @private
+ * @param {number} length The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padding for `string`.
+ */
+
+
+ function createPadding(length, chars) {
+ chars = chars === undefined$1 ? ' ' : baseToString(chars);
+ var charsLength = chars.length;
+
+ if (charsLength < 2) {
+ return charsLength ? baseRepeat(chars, length) : chars;
}
+
+ var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
+ return hasUnicode(chars) ? castSlice(stringToArray(result), 0, length).join('') : result.slice(0, length);
}
- }
+ /**
+ * Creates a function that wraps `func` to invoke it with the `this` binding
+ * of `thisArg` and `partials` prepended to the arguments it receives.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} partials The arguments to prepend to those provided to
+ * the new function.
+ * @returns {Function} Returns the new wrapped function.
+ */
- for (i = 0; i < toDelete.length; i++) {
- graph = actionDeleteNode(toDelete[i].id)(graph);
- }
- return graph;
- };
+ function createPartial(func, bitmask, thisArg, partials) {
+ var isBind = bitmask & WRAP_BIND_FLAG,
+ Ctor = createCtor(func);
- action.disabled = function (graph) {
- // check way isn't too bendy
- var nodes = allNodes(graph);
- var points = nodes.map(function (n) {
- return projection(n.loc);
- });
- var startPoint = points[0];
- var endPoint = points[points.length - 1];
- var threshold = 0.2 * geoVecLength(startPoint, endPoint);
- var i;
+ function wrapper() {
+ var argsIndex = -1,
+ argsLength = arguments.length,
+ leftIndex = -1,
+ leftLength = partials.length,
+ args = Array(leftLength + argsLength),
+ fn = this && this !== root && this instanceof wrapper ? Ctor : func;
- if (threshold === 0) {
- return 'too_bendy';
- }
+ while (++leftIndex < leftLength) {
+ args[leftIndex] = partials[leftIndex];
+ }
- var maxDistance = 0;
+ while (argsLength--) {
+ args[leftIndex++] = arguments[++argsIndex];
+ }
- for (i = 1; i < points.length - 1; i++) {
- var point = points[i];
- var u = positionAlongWay(point, startPoint, endPoint);
- var p = geoVecInterp(startPoint, endPoint, u);
- var dist = geoVecLength(p, point); // to bendy if point is off by 20% of total start/end distance in projected space
+ return apply(fn, isBind ? thisArg : this, args);
+ }
- if (isNaN(dist) || dist > threshold) {
- return 'too_bendy';
- } else if (dist > maxDistance) {
- maxDistance = dist;
+ return wrapper;
}
- }
+ /**
+ * Creates a `_.range` or `_.rangeRight` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new range function.
+ */
- var keepingAllNodes = nodes.every(function (node, i) {
- return i === 0 || i === nodes.length - 1 || shouldKeepNode(node, graph);
- });
- if (maxDistance < 0.0001 && // Allow straightening even if already straight in order to remove extraneous nodes
- keepingAllNodes) {
- return 'straight_enough';
- }
- };
+ function createRange(fromRight) {
+ return function (start, end, step) {
+ if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
+ end = step = undefined$1;
+ } // Ensure the sign of `-0` is preserved.
- action.transitionable = true;
- return action;
- }
- //
- // `turn` must be an `osmTurn` object with a `restrictionID` property.
- // see osm/intersection.js, pathToTurn()
- //
+ start = toFinite(start);
- function actionUnrestrictTurn(turn) {
- return function (graph) {
- return actionDeleteRelation(turn.restrictionID)(graph);
- };
- }
+ if (end === undefined$1) {
+ end = start;
+ start = 0;
+ } else {
+ end = toFinite(end);
+ }
- /* Reflect the given area around its axis of symmetry */
+ step = step === undefined$1 ? start < end ? 1 : -1 : toFinite(step);
+ return baseRange(start, end, step, fromRight);
+ };
+ }
+ /**
+ * Creates a function that performs a relational operation on two values.
+ *
+ * @private
+ * @param {Function} operator The function to perform the operation.
+ * @returns {Function} Returns the new relational operation function.
+ */
- function actionReflect(reflectIds, projection) {
- var _useLongAxis = true;
- var action = function action(graph, t) {
- if (t === null || !isFinite(t)) t = 1;
- t = Math.min(Math.max(+t, 0), 1);
- var nodes = utilGetAllNodes(reflectIds, graph);
- var points = nodes.map(function (n) {
- return projection(n.loc);
- });
- var ssr = geoGetSmallestSurroundingRectangle(points); // Choose line pq = axis of symmetry.
- // The shape's surrounding rectangle has 2 axes of symmetry.
- // Reflect across the longer axis by default.
+ function createRelationalOperation(operator) {
+ return function (value, other) {
+ if (!(typeof value == 'string' && typeof other == 'string')) {
+ value = toNumber(value);
+ other = toNumber(other);
+ }
- var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
- var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
- var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
- var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
- var p, q;
- var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
+ return operator(value, other);
+ };
+ }
+ /**
+ * Creates a function that wraps `func` to continue currying.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @param {Function} wrapFunc The function to create the `func` wrapper.
+ * @param {*} placeholder The placeholder value.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {Array} [partials] The arguments to prepend to those provided to
+ * the new function.
+ * @param {Array} [holders] The `partials` placeholder indexes.
+ * @param {Array} [argPos] The argument positions of the new function.
+ * @param {number} [ary] The arity cap of `func`.
+ * @param {number} [arity] The arity of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
- if (_useLongAxis && isLong || !_useLongAxis && !isLong) {
- p = p1;
- q = q1;
- } else {
- p = p2;
- q = q2;
- } // reflect c across pq
- // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
+ function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
+ var isCurry = bitmask & WRAP_CURRY_FLAG,
+ newHolders = isCurry ? holders : undefined$1,
+ newHoldersRight = isCurry ? undefined$1 : holders,
+ newPartials = isCurry ? partials : undefined$1,
+ newPartialsRight = isCurry ? undefined$1 : partials;
+ bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG;
+ bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
- var dx = q[0] - p[0];
- var dy = q[1] - p[1];
- var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
- var b = 2 * dx * dy / (dx * dx + dy * dy);
+ if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
+ bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
+ }
- for (var i = 0; i < nodes.length; i++) {
- var node = nodes[i];
- var c = projection(node.loc);
- var c2 = [a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0], b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]];
- var loc2 = projection.invert(c2);
- node = node.move(geoVecInterp(node.loc, loc2, t));
- graph = graph.replace(node);
- }
+ var newData = [func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity];
+ var result = wrapFunc.apply(undefined$1, newData);
- return graph;
- };
+ if (isLaziable(func)) {
+ setData(result, newData);
+ }
- action.useLongAxis = function (val) {
- if (!arguments.length) return _useLongAxis;
- _useLongAxis = val;
- return action;
- };
+ result.placeholder = placeholder;
+ return setWrapToString(result, func, bitmask);
+ }
+ /**
+ * Creates a function like `_.round`.
+ *
+ * @private
+ * @param {string} methodName The name of the `Math` method to use when rounding.
+ * @returns {Function} Returns the new round function.
+ */
- action.transitionable = true;
- return action;
- }
- function actionUpgradeTags(entityId, oldTags, replaceTags) {
- return function (graph) {
- var entity = graph.entity(entityId);
- var tags = Object.assign({}, entity.tags); // shallow copy
+ function createRound(methodName) {
+ var func = Math[methodName];
+ return function (number, precision) {
+ number = toNumber(number);
+ precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
- var transferValue;
- var semiIndex;
+ if (precision && nativeIsFinite(number)) {
+ // Shift with exponential notation to avoid floating-point issues.
+ // See [MDN](https://mdn.io/round#Examples) for more details.
+ var pair = (toString(number) + 'e').split('e'),
+ value = func(pair[0] + 'e' + (+pair[1] + precision));
+ pair = (toString(value) + 'e').split('e');
+ return +(pair[0] + 'e' + (+pair[1] - precision));
+ }
- for (var oldTagKey in oldTags) {
- if (!(oldTagKey in tags)) continue; // wildcard match
+ return func(number);
+ };
+ }
+ /**
+ * Creates a set object of `values`.
+ *
+ * @private
+ * @param {Array} values The values to add to the set.
+ * @returns {Object} Returns the new set.
+ */
- if (oldTags[oldTagKey] === '*') {
- // note the value since we might need to transfer it
- transferValue = tags[oldTagKey];
- delete tags[oldTagKey]; // exact match
- } else if (oldTags[oldTagKey] === tags[oldTagKey]) {
- delete tags[oldTagKey]; // match is within semicolon-delimited values
- } else {
- var vals = tags[oldTagKey].split(';').filter(Boolean);
- var oldIndex = vals.indexOf(oldTags[oldTagKey]);
- if (vals.length === 1 || oldIndex === -1) {
- delete tags[oldTagKey];
- } else {
- if (replaceTags && replaceTags[oldTagKey]) {
- // replacing a value within a semicolon-delimited value, note the index
- semiIndex = oldIndex;
+ var createSet = !(Set && 1 / setToArray(new Set([, -0]))[1] == INFINITY) ? noop : function (values) {
+ return new Set(values);
+ };
+ /**
+ * Creates a `_.toPairs` or `_.toPairsIn` function.
+ *
+ * @private
+ * @param {Function} keysFunc The function to get the keys of a given object.
+ * @returns {Function} Returns the new pairs function.
+ */
+
+ function createToPairs(keysFunc) {
+ return function (object) {
+ var tag = getTag(object);
+
+ if (tag == mapTag) {
+ return mapToArray(object);
}
- vals.splice(oldIndex, 1);
- tags[oldTagKey] = vals.join(';');
- }
+ if (tag == setTag) {
+ return setToPairs(object);
+ }
+
+ return baseToPairs(object, keysFunc(object));
+ };
}
- }
+ /**
+ * Creates a function that either curries or invokes `func` with optional
+ * `this` binding and partially applied arguments.
+ *
+ * @private
+ * @param {Function|string} func The function or method name to wrap.
+ * @param {number} bitmask The bitmask flags.
+ * 1 - `_.bind`
+ * 2 - `_.bindKey`
+ * 4 - `_.curry` or `_.curryRight` of a bound function
+ * 8 - `_.curry`
+ * 16 - `_.curryRight`
+ * 32 - `_.partial`
+ * 64 - `_.partialRight`
+ * 128 - `_.rearg`
+ * 256 - `_.ary`
+ * 512 - `_.flip`
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {Array} [partials] The arguments to be partially applied.
+ * @param {Array} [holders] The `partials` placeholder indexes.
+ * @param {Array} [argPos] The argument positions of the new function.
+ * @param {number} [ary] The arity cap of `func`.
+ * @param {number} [arity] The arity of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
- if (replaceTags) {
- for (var replaceKey in replaceTags) {
- var replaceValue = replaceTags[replaceKey];
- if (replaceValue === '*') {
- if (tags[replaceKey] && tags[replaceKey] !== 'no') {
- // allow any pre-existing value except `no` (troll tag)
- continue;
- } else {
- // otherwise assume `yes` is okay
- tags[replaceKey] = 'yes';
- }
- } else if (replaceValue === '$1') {
- tags[replaceKey] = transferValue;
+ function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
+ var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
+
+ if (!isBindKey && typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+
+ var length = partials ? partials.length : 0;
+
+ if (!length) {
+ bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
+ partials = holders = undefined$1;
+ }
+
+ ary = ary === undefined$1 ? ary : nativeMax(toInteger(ary), 0);
+ arity = arity === undefined$1 ? arity : toInteger(arity);
+ length -= holders ? holders.length : 0;
+
+ if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
+ var partialsRight = partials,
+ holdersRight = holders;
+ partials = holders = undefined$1;
+ }
+
+ var data = isBindKey ? undefined$1 : getData(func);
+ var newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
+
+ if (data) {
+ mergeData(newData, data);
+ }
+
+ func = newData[0];
+ bitmask = newData[1];
+ thisArg = newData[2];
+ partials = newData[3];
+ holders = newData[4];
+ arity = newData[9] = newData[9] === undefined$1 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0);
+
+ if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
+ bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
+ }
+
+ if (!bitmask || bitmask == WRAP_BIND_FLAG) {
+ var result = createBind(func, bitmask, thisArg);
+ } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
+ result = createCurry(func, bitmask, arity);
+ } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
+ result = createPartial(func, bitmask, thisArg, partials);
} else {
- if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== undefined) {
- // don't override preexisting values
- var existingVals = tags[replaceKey].split(';').filter(Boolean);
+ result = createHybrid.apply(undefined$1, newData);
+ }
- if (existingVals.indexOf(replaceValue) === -1) {
- existingVals.splice(semiIndex, 0, replaceValue);
- tags[replaceKey] = existingVals.join(';');
- }
- } else {
- tags[replaceKey] = replaceValue;
- }
+ var setter = data ? baseSetData : setData;
+ return setWrapToString(setter(result, newData), func, bitmask);
+ }
+ /**
+ * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
+ * of source objects to the destination object for all destination properties
+ * that resolve to `undefined`.
+ *
+ * @private
+ * @param {*} objValue The destination value.
+ * @param {*} srcValue The source value.
+ * @param {string} key The key of the property to assign.
+ * @param {Object} object The parent object of `objValue`.
+ * @returns {*} Returns the value to assign.
+ */
+
+
+ function customDefaultsAssignIn(objValue, srcValue, key, object) {
+ if (objValue === undefined$1 || eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key)) {
+ return srcValue;
}
+
+ return objValue;
}
- }
+ /**
+ * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
+ * objects into destination objects that are passed thru.
+ *
+ * @private
+ * @param {*} objValue The destination value.
+ * @param {*} srcValue The source value.
+ * @param {string} key The key of the property to merge.
+ * @param {Object} object The parent object of `objValue`.
+ * @param {Object} source The parent object of `srcValue`.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ * counterparts.
+ * @returns {*} Returns the value to assign.
+ */
+
+
+ function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
+ if (isObject(objValue) && isObject(srcValue)) {
+ // Recursively merge objects and arrays (susceptible to call stack limits).
+ stack.set(srcValue, objValue);
+ baseMerge(objValue, srcValue, undefined$1, customDefaultsMerge, stack);
+ stack['delete'](srcValue);
+ }
+
+ return objValue;
+ }
+ /**
+ * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
+ * objects.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @param {string} key The key of the property to inspect.
+ * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
+ */
+
+
+ function customOmitClone(value) {
+ return isPlainObject(value) ? undefined$1 : value;
+ }
+ /**
+ * A specialized version of `baseIsEqualDeep` for arrays with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Array} array The array to compare.
+ * @param {Array} other The other array to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `array` and `other` objects.
+ * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
+ */
- return graph.replace(entity.update({
- tags: tags
- }));
- };
- }
- function behaviorEdit(context) {
- function behavior() {
- context.map().minzoom(context.minEditableZoom());
- }
+ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+ arrLength = array.length,
+ othLength = other.length;
- behavior.off = function () {
- context.map().minzoom(0);
- };
+ if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
+ return false;
+ } // Check that cyclic values are equal.
- return behavior;
- }
- /*
- The hover behavior adds the `.hover` class on pointerover to all elements to which
- the identical datum is bound, and removes it on pointerout.
+ var arrStacked = stack.get(array);
+ var othStacked = stack.get(other);
- The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
- representation may consist of several elements scattered throughout the DOM hierarchy.
- Only one of these elements can have the :hover pseudo-class, but all of them will
- have the .hover class.
- */
+ if (arrStacked && othStacked) {
+ return arrStacked == other && othStacked == array;
+ }
- function behaviorHover(context) {
- var dispatch$1 = dispatch('hover');
+ var index = -1,
+ result = true,
+ seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined$1;
+ stack.set(array, other);
+ stack.set(other, array); // Ignore non-index properties.
- var _selection = select(null);
+ while (++index < arrLength) {
+ var arrValue = array[index],
+ othValue = other[index];
- var _newNodeId = null;
- var _initialNodeID = null;
+ if (customizer) {
+ var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);
+ }
- var _altDisables;
+ if (compared !== undefined$1) {
+ if (compared) {
+ continue;
+ }
- var _ignoreVertex;
+ result = false;
+ break;
+ } // Recursively compare arrays (susceptible to call stack limits).
- var _targets = []; // use pointer events on supported platforms; fallback to mouse events
- var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+ if (seen) {
+ if (!arraySome(other, function (othValue, othIndex) {
+ if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+ return seen.push(othIndex);
+ }
+ })) {
+ result = false;
+ break;
+ }
+ } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+ result = false;
+ break;
+ }
+ }
- function keydown(d3_event) {
- if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
- _selection.selectAll('.hover').classed('hover-suppressed', true).classed('hover', false);
+ stack['delete'](array);
+ stack['delete'](other);
+ return result;
+ }
+ /**
+ * A specialized version of `baseIsEqualDeep` for comparing objects of
+ * the same `toStringTag`.
+ *
+ * **Note:** This function only supports comparing values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {string} tag The `toStringTag` of the objects to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
- _selection.classed('hover-disabled', true);
- dispatch$1.call('hover', this, null);
- }
- }
+ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
+ switch (tag) {
+ case dataViewTag:
+ if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
+ return false;
+ }
- function keyup(d3_event) {
- if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
- _selection.selectAll('.hover-suppressed').classed('hover-suppressed', false).classed('hover', true);
+ object = object.buffer;
+ other = other.buffer;
- _selection.classed('hover-disabled', false);
+ case arrayBufferTag:
+ if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
+ return false;
+ }
- dispatch$1.call('hover', this, _targets);
- }
- }
+ return true;
- function behavior(selection) {
- _selection = selection;
- _targets = [];
+ case boolTag:
+ case dateTag:
+ case numberTag:
+ // Coerce booleans to `1` or `0` and dates to milliseconds.
+ // Invalid dates are coerced to `NaN`.
+ return eq(+object, +other);
- if (_initialNodeID) {
- _newNodeId = _initialNodeID;
- _initialNodeID = null;
- } else {
- _newNodeId = null;
- }
+ case errorTag:
+ return object.name == other.name && object.message == other.message;
- _selection.on(_pointerPrefix + 'over.hover', pointerover).on(_pointerPrefix + 'out.hover', pointerout) // treat pointerdown as pointerover for touch devices
- .on(_pointerPrefix + 'down.hover', pointerover);
+ case regexpTag:
+ case stringTag:
+ // Coerce regexes to strings and treat strings, primitives and objects,
+ // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
+ // for more details.
+ return object == other + '';
- select(window).on(_pointerPrefix + 'up.hover pointercancel.hover', pointerout, true).on('keydown.hover', keydown).on('keyup.hover', keyup);
+ case mapTag:
+ var convert = mapToArray;
- function eventTarget(d3_event) {
- var datum = d3_event.target && d3_event.target.__data__;
- if (_typeof(datum) !== 'object') return null;
+ case setTag:
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
+ convert || (convert = setToArray);
- if (!(datum instanceof osmEntity) && datum.properties && datum.properties.entity instanceof osmEntity) {
- return datum.properties.entity;
- }
+ if (object.size != other.size && !isPartial) {
+ return false;
+ } // Assume cyclic values are equal.
- return datum;
- }
- function pointerover(d3_event) {
- // ignore mouse hovers with buttons pressed unless dragging
- if (context.mode().id.indexOf('drag') === -1 && (!d3_event.pointerType || d3_event.pointerType === 'mouse') && d3_event.buttons) return;
- var target = eventTarget(d3_event);
+ var stacked = stack.get(object);
- if (target && _targets.indexOf(target) === -1) {
- _targets.push(target);
+ if (stacked) {
+ return stacked == other;
+ }
- updateHover(d3_event, _targets);
- }
- }
+ bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits).
- function pointerout(d3_event) {
- var target = eventTarget(d3_event);
+ stack.set(object, other);
+ var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
+ stack['delete'](object);
+ return result;
- var index = _targets.indexOf(target);
+ case symbolTag:
+ if (symbolValueOf) {
+ return symbolValueOf.call(object) == symbolValueOf.call(other);
+ }
- if (index !== -1) {
- _targets.splice(index);
+ }
- updateHover(d3_event, _targets);
+ return false;
}
- }
+ /**
+ * A specialized version of `baseIsEqualDeep` for objects with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
- function allowsVertex(d) {
- return d.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(d, context.graph());
- }
- function modeAllowsHover(target) {
- var mode = context.mode();
+ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+ objProps = getAllKeys(object),
+ objLength = objProps.length,
+ othProps = getAllKeys(other),
+ othLength = othProps.length;
- if (mode.id === 'add-point') {
- return mode.preset.matchGeometry('vertex') || target.type !== 'way' && target.geometry(context.graph()) !== 'vertex';
- }
+ if (objLength != othLength && !isPartial) {
+ return false;
+ }
- return true;
- }
+ var index = objLength;
- function updateHover(d3_event, targets) {
- _selection.selectAll('.hover').classed('hover', false);
+ while (index--) {
+ var key = objProps[index];
- _selection.selectAll('.hover-suppressed').classed('hover-suppressed', false);
+ if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
+ return false;
+ }
+ } // Check that cyclic values are equal.
- var mode = context.mode();
- if (!_newNodeId && (mode.id === 'draw-line' || mode.id === 'draw-area')) {
- var node = targets.find(function (target) {
- return target instanceof osmEntity && target.type === 'node';
- });
- _newNodeId = node && node.id;
- }
+ var objStacked = stack.get(object);
+ var othStacked = stack.get(other);
- targets = targets.filter(function (datum) {
- if (datum instanceof osmEntity) {
- // If drawing a way, don't hover on a node that was just placed. #3974
- return datum.id !== _newNodeId && (datum.type !== 'node' || !_ignoreVertex || allowsVertex(datum)) && modeAllowsHover(datum);
+ if (objStacked && othStacked) {
+ return objStacked == other && othStacked == object;
}
- return true;
- });
- var selector = '';
+ var result = true;
+ stack.set(object, other);
+ stack.set(other, object);
+ var skipCtor = isPartial;
- for (var i in targets) {
- var datum = targets[i]; // What are we hovering over?
+ while (++index < objLength) {
+ key = objProps[index];
+ var objValue = object[key],
+ othValue = other[key];
- if (datum.__featurehash__) {
- // hovering custom data
- selector += ', .data' + datum.__featurehash__;
- } else if (datum instanceof QAItem) {
- selector += ', .' + datum.service + '.itemId-' + datum.id;
- } else if (datum instanceof osmNote) {
- selector += ', .note-' + datum.id;
- } else if (datum instanceof osmEntity) {
- selector += ', .' + datum.id;
+ if (customizer) {
+ var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
+ } // Recursively compare objects (susceptible to call stack limits).
- if (datum.type === 'relation') {
- for (var j in datum.members) {
- selector += ', .' + datum.members[j].id;
- }
+
+ if (!(compared === undefined$1 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
+ result = false;
+ break;
}
+
+ skipCtor || (skipCtor = key == 'constructor');
}
- }
- var suppressed = _altDisables && d3_event && d3_event.altKey;
+ if (result && !skipCtor) {
+ var objCtor = object.constructor,
+ othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal.
- if (selector.trim().length) {
- // remove the first comma
- selector = selector.slice(1);
+ if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {
+ result = false;
+ }
+ }
- _selection.selectAll(selector).classed(suppressed ? 'hover-suppressed' : 'hover', true);
+ stack['delete'](object);
+ stack['delete'](other);
+ return result;
}
+ /**
+ * A specialized version of `baseRest` which flattens the rest array.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @returns {Function} Returns the new function.
+ */
- dispatch$1.call('hover', this, !suppressed && targets);
- }
- }
-
- behavior.off = function (selection) {
- selection.selectAll('.hover').classed('hover', false);
- selection.selectAll('.hover-suppressed').classed('hover-suppressed', false);
- selection.classed('hover-disabled', false);
- selection.on(_pointerPrefix + 'over.hover', null).on(_pointerPrefix + 'out.hover', null).on(_pointerPrefix + 'down.hover', null);
- select(window).on(_pointerPrefix + 'up.hover pointercancel.hover', null, true).on('keydown.hover', null).on('keyup.hover', null);
- };
- behavior.altDisables = function (val) {
- if (!arguments.length) return _altDisables;
- _altDisables = val;
- return behavior;
- };
+ function flatRest(func) {
+ return setToString(overRest(func, undefined$1, flatten), func + '');
+ }
+ /**
+ * Creates an array of own enumerable property names and symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
- behavior.ignoreVertex = function (val) {
- if (!arguments.length) return _ignoreVertex;
- _ignoreVertex = val;
- return behavior;
- };
- behavior.initialNodeID = function (nodeId) {
- _initialNodeID = nodeId;
- return behavior;
- };
+ function getAllKeys(object) {
+ return baseGetAllKeys(object, keys, getSymbols);
+ }
+ /**
+ * Creates an array of own and inherited enumerable property names and
+ * symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
- return utilRebind(behavior, dispatch$1, 'on');
- }
- var _disableSpace = false;
- var _lastSpace = null;
- function behaviorDraw(context) {
- var dispatch$1 = dispatch('move', 'down', 'downcancel', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish');
- var keybinding = utilKeybinding('draw');
+ function getAllKeysIn(object) {
+ return baseGetAllKeys(object, keysIn, getSymbolsIn);
+ }
+ /**
+ * Gets metadata for `func`.
+ *
+ * @private
+ * @param {Function} func The function to query.
+ * @returns {*} Returns the metadata for `func`.
+ */
- var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true).on('hover', context.ui().sidebar.hover);
- var _edit = behaviorEdit(context);
+ var getData = !metaMap ? noop : function (func) {
+ return metaMap.get(func);
+ };
+ /**
+ * Gets the name of `func`.
+ *
+ * @private
+ * @param {Function} func The function to query.
+ * @returns {string} Returns the function name.
+ */
- var _closeTolerance = 4;
- var _tolerance = 12;
- var _mouseLeave = false;
- var _lastMouse = null;
+ function getFuncName(func) {
+ var result = func.name + '',
+ array = realNames[result],
+ length = hasOwnProperty.call(realNames, result) ? array.length : 0;
- var _lastPointerUpEvent;
+ while (length--) {
+ var data = array[length],
+ otherFunc = data.func;
- var _downPointer; // use pointer events on supported platforms; fallback to mouse events
+ if (otherFunc == null || otherFunc == func) {
+ return data.name;
+ }
+ }
+ return result;
+ }
+ /**
+ * Gets the argument placeholder value for `func`.
+ *
+ * @private
+ * @param {Function} func The function to inspect.
+ * @returns {*} Returns the placeholder value.
+ */
- var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; // related code
- // - `mode/drag_node.js` `datum()`
+ function getHolder(func) {
+ var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
+ return object.placeholder;
+ }
+ /**
+ * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
+ * this function returns the custom method, otherwise it returns `baseIteratee`.
+ * If arguments are provided, the chosen function is invoked with them and
+ * its result is returned.
+ *
+ * @private
+ * @param {*} [value] The value to convert to an iteratee.
+ * @param {number} [arity] The arity of the created iteratee.
+ * @returns {Function} Returns the chosen function or its result.
+ */
- function datum(d3_event) {
- var mode = context.mode();
- var isNote = mode && mode.id.indexOf('note') !== -1;
- if (d3_event.altKey || isNote) return {};
- var element;
- if (d3_event.type === 'keydown') {
- element = _lastMouse && _lastMouse.target;
- } else {
- element = d3_event.target;
- } // When drawing, snap only to touch targets..
- // (this excludes area fills and active drawing elements)
+ function getIteratee() {
+ var result = lodash.iteratee || iteratee;
+ result = result === iteratee ? baseIteratee : result;
+ return arguments.length ? result(arguments[0], arguments[1]) : result;
+ }
+ /**
+ * Gets the data for `map`.
+ *
+ * @private
+ * @param {Object} map The map to query.
+ * @param {string} key The reference key.
+ * @returns {*} Returns the map data.
+ */
- var d = element.__data__;
- return d && d.properties && d.properties.target ? d : {};
- }
+ function getMapData(map, key) {
+ var data = map.__data__;
+ return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;
+ }
+ /**
+ * Gets the property names, values, and compare flags of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the match data of `object`.
+ */
- function pointerdown(d3_event) {
- if (_downPointer) return;
- var pointerLocGetter = utilFastMouse(this);
- _downPointer = {
- id: d3_event.pointerId || 'mouse',
- pointerLocGetter: pointerLocGetter,
- downTime: +new Date(),
- downLoc: pointerLocGetter(d3_event)
- };
- dispatch$1.call('down', this, d3_event, datum(d3_event));
- }
- function pointerup(d3_event) {
- if (!_downPointer || _downPointer.id !== (d3_event.pointerId || 'mouse')) return;
- var downPointer = _downPointer;
- _downPointer = null;
- _lastPointerUpEvent = d3_event;
- if (downPointer.isCancelled) return;
- var t2 = +new Date();
- var p2 = downPointer.pointerLocGetter(d3_event);
- var dist = geoVecLength(downPointer.downLoc, p2);
+ function getMatchData(object) {
+ var result = keys(object),
+ length = result.length;
- if (dist < _closeTolerance || dist < _tolerance && t2 - downPointer.downTime < 500) {
- // Prevent a quick second click
- select(window).on('click.draw-block', function () {
- d3_event.stopPropagation();
- }, true);
- context.map().dblclickZoomEnable(false);
- window.setTimeout(function () {
- context.map().dblclickZoomEnable(true);
- select(window).on('click.draw-block', null);
- }, 500);
- click(d3_event, p2);
- }
- }
+ while (length--) {
+ var key = result[length],
+ value = object[key];
+ result[length] = [key, value, isStrictComparable(value)];
+ }
- function pointermove(d3_event) {
- if (_downPointer && _downPointer.id === (d3_event.pointerId || 'mouse') && !_downPointer.isCancelled) {
- var p2 = _downPointer.pointerLocGetter(d3_event);
+ return result;
+ }
+ /**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
- var dist = geoVecLength(_downPointer.downLoc, p2);
- if (dist >= _closeTolerance) {
- _downPointer.isCancelled = true;
- dispatch$1.call('downcancel', this);
+ function getNative(object, key) {
+ var value = getValue(object, key);
+ return baseIsNative(value) ? value : undefined$1;
}
- }
+ /**
+ * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the raw `toStringTag`.
+ */
- if (d3_event.pointerType && d3_event.pointerType !== 'mouse' || d3_event.buttons || _downPointer) return; // HACK: Mobile Safari likes to send one or more `mouse` type pointermove
- // events immediately after non-mouse pointerup events; detect and ignore them.
- if (_lastPointerUpEvent && _lastPointerUpEvent.pointerType !== 'mouse' && d3_event.timeStamp - _lastPointerUpEvent.timeStamp < 100) return;
- _lastMouse = d3_event;
- dispatch$1.call('move', this, d3_event, datum(d3_event));
- }
+ function getRawTag(value) {
+ var isOwn = hasOwnProperty.call(value, symToStringTag),
+ tag = value[symToStringTag];
- function pointercancel(d3_event) {
- if (_downPointer && _downPointer.id === (d3_event.pointerId || 'mouse')) {
- if (!_downPointer.isCancelled) {
- dispatch$1.call('downcancel', this);
- }
+ try {
+ value[symToStringTag] = undefined$1;
+ var unmasked = true;
+ } catch (e) {}
- _downPointer = null;
- }
- }
+ var result = nativeObjectToString.call(value);
- function mouseenter() {
- _mouseLeave = false;
- }
+ if (unmasked) {
+ if (isOwn) {
+ value[symToStringTag] = tag;
+ } else {
+ delete value[symToStringTag];
+ }
+ }
- function mouseleave() {
- _mouseLeave = true;
- }
+ return result;
+ }
+ /**
+ * Creates an array of the own enumerable symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
+ */
- function allowsVertex(d) {
- return d.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(d, context.graph());
- } // related code
- // - `mode/drag_node.js` `doMove()`
- // - `behavior/draw.js` `click()`
- // - `behavior/draw_way.js` `move()`
+ var getSymbols = !nativeGetSymbols ? stubArray : function (object) {
+ if (object == null) {
+ return [];
+ }
- function click(d3_event, loc) {
- var d = datum(d3_event);
- var target = d && d.properties && d.properties.entity;
- var mode = context.mode();
+ object = Object(object);
+ return arrayFilter(nativeGetSymbols(object), function (symbol) {
+ return propertyIsEnumerable.call(object, symbol);
+ });
+ };
+ /**
+ * Creates an array of the own and inherited enumerable symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
+ */
- if (target && target.type === 'node' && allowsVertex(target)) {
- // Snap to a node
- dispatch$1.call('clickNode', this, target, d);
- return;
- } else if (target && target.type === 'way' && (mode.id !== 'add-point' || mode.preset.matchGeometry('vertex'))) {
- // Snap to a way
- var choice = geoChooseEdge(context.graph().childNodes(target), loc, context.projection, context.activeID());
+ var getSymbolsIn = !nativeGetSymbols ? stubArray : function (object) {
+ var result = [];
- if (choice) {
- var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
- dispatch$1.call('clickWay', this, choice.loc, edge, d);
- return;
- }
- } else if (mode.id !== 'add-point' || mode.preset.matchGeometry('point')) {
- var locLatLng = context.projection.invert(loc);
- dispatch$1.call('click', this, locLatLng, d);
- }
- } // treat a spacebar press like a click
+ while (object) {
+ arrayPush(result, getSymbols(object));
+ object = getPrototype(object);
+ }
+ return result;
+ };
+ /**
+ * Gets the `toStringTag` of `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
- function space(d3_event) {
- d3_event.preventDefault();
- d3_event.stopPropagation();
- var currSpace = context.map().mouse();
+ var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
- if (_disableSpace && _lastSpace) {
- var dist = geoVecLength(_lastSpace, currSpace);
+ if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise && getTag(Promise.resolve()) != promiseTag || Set && getTag(new Set()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {
+ getTag = function getTag(value) {
+ var result = baseGetTag(value),
+ Ctor = result == objectTag ? value.constructor : undefined$1,
+ ctorString = Ctor ? toSource(Ctor) : '';
- if (dist > _tolerance) {
- _disableSpace = false;
- }
- }
+ if (ctorString) {
+ switch (ctorString) {
+ case dataViewCtorString:
+ return dataViewTag;
- if (_disableSpace || _mouseLeave || !_lastMouse) return; // user must move mouse or release space bar to allow another click
+ case mapCtorString:
+ return mapTag;
- _lastSpace = currSpace;
- _disableSpace = true;
- select(window).on('keyup.space-block', function () {
- d3_event.preventDefault();
- d3_event.stopPropagation();
- _disableSpace = false;
- select(window).on('keyup.space-block', null);
- }); // get the current mouse position
+ case promiseCtorString:
+ return promiseTag;
- var loc = context.map().mouse() || // or the map center if the mouse has never entered the map
- context.projection(context.map().center());
- click(d3_event, loc);
- }
+ case setCtorString:
+ return setTag;
- function backspace(d3_event) {
- d3_event.preventDefault();
- dispatch$1.call('undo');
- }
+ case weakMapCtorString:
+ return weakMapTag;
+ }
+ }
- function del(d3_event) {
- d3_event.preventDefault();
- dispatch$1.call('cancel');
- }
+ return result;
+ };
+ }
+ /**
+ * Gets the view, applying any `transforms` to the `start` and `end` positions.
+ *
+ * @private
+ * @param {number} start The start of the view.
+ * @param {number} end The end of the view.
+ * @param {Array} transforms The transformations to apply to the view.
+ * @returns {Object} Returns an object containing the `start` and `end`
+ * positions of the view.
+ */
- function ret(d3_event) {
- d3_event.preventDefault();
- dispatch$1.call('finish');
- }
- function behavior(selection) {
- context.install(_hover);
- context.install(_edit);
- _downPointer = null;
- keybinding.on('â«', backspace).on('â¦', del).on('â', ret).on('â©', ret).on('space', space).on('â¥space', space);
- selection.on('mouseenter.draw', mouseenter).on('mouseleave.draw', mouseleave).on(_pointerPrefix + 'down.draw', pointerdown).on(_pointerPrefix + 'move.draw', pointermove);
- select(window).on(_pointerPrefix + 'up.draw', pointerup, true).on('pointercancel.draw', pointercancel, true);
- select(document).call(keybinding);
- return behavior;
- }
+ function getView(start, end, transforms) {
+ var index = -1,
+ length = transforms.length;
- behavior.off = function (selection) {
- context.ui().sidebar.hover.cancel();
- context.uninstall(_hover);
- context.uninstall(_edit);
- selection.on('mouseenter.draw', null).on('mouseleave.draw', null).on(_pointerPrefix + 'down.draw', null).on(_pointerPrefix + 'move.draw', null);
- select(window).on(_pointerPrefix + 'up.draw', null).on('pointercancel.draw', null); // note: keyup.space-block, click.draw-block should remain
+ while (++index < length) {
+ var data = transforms[index],
+ size = data.size;
- select(document).call(keybinding.unbind);
- };
+ switch (data.type) {
+ case 'drop':
+ start += size;
+ break;
- behavior.hover = function () {
- return _hover;
- };
+ case 'dropRight':
+ end -= size;
+ break;
- return utilRebind(behavior, dispatch$1, 'on');
- }
+ case 'take':
+ end = nativeMin(end, start + size);
+ break;
- function initRange(domain, range) {
- switch (arguments.length) {
- case 0:
- break;
+ case 'takeRight':
+ start = nativeMax(start, end - size);
+ break;
+ }
+ }
- case 1:
- this.range(domain);
- break;
+ return {
+ 'start': start,
+ 'end': end
+ };
+ }
+ /**
+ * Extracts wrapper details from the `source` body comment.
+ *
+ * @private
+ * @param {string} source The source to inspect.
+ * @returns {Array} Returns the wrapper details.
+ */
- default:
- this.range(range).domain(domain);
- break;
- }
- return this;
- }
+ function getWrapDetails(source) {
+ var match = source.match(reWrapDetails);
+ return match ? match[1].split(reSplitDetails) : [];
+ }
+ /**
+ * Checks if `path` exists on `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @param {Function} hasFunc The function to check properties.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ */
- function constants(x) {
- return function () {
- return x;
- };
- }
- function number$1(x) {
- return +x;
- }
+ function hasPath(object, path, hasFunc) {
+ path = castPath(path, object);
+ var index = -1,
+ length = path.length,
+ result = false;
- var unit = [0, 1];
- function identity$3(x) {
- return x;
- }
+ while (++index < length) {
+ var key = toKey(path[index]);
- function normalize$1(a, b) {
- return (b -= a = +a) ? function (x) {
- return (x - a) / b;
- } : constants(isNaN(b) ? NaN : 0.5);
- }
+ if (!(result = object != null && hasFunc(object, key))) {
+ break;
+ }
- function clamper(a, b) {
- var t;
- if (a > b) t = a, a = b, b = t;
- return function (x) {
- return Math.max(a, Math.min(b, x));
- };
- } // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
- // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
+ object = object[key];
+ }
+ if (result || ++index != length) {
+ return result;
+ }
- function bimap(domain, range, interpolate) {
- var d0 = domain[0],
- d1 = domain[1],
- r0 = range[0],
- r1 = range[1];
- if (d1 < d0) d0 = normalize$1(d1, d0), r0 = interpolate(r1, r0);else d0 = normalize$1(d0, d1), r0 = interpolate(r0, r1);
- return function (x) {
- return r0(d0(x));
- };
- }
+ length = object == null ? 0 : object.length;
+ return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));
+ }
+ /**
+ * Initializes an array clone.
+ *
+ * @private
+ * @param {Array} array The array to clone.
+ * @returns {Array} Returns the initialized clone.
+ */
- function polymap(domain, range, interpolate) {
- var j = Math.min(domain.length, range.length) - 1,
- d = new Array(j),
- r = new Array(j),
- i = -1; // Reverse descending domains.
- if (domain[j] < domain[0]) {
- domain = domain.slice().reverse();
- range = range.slice().reverse();
- }
+ function initCloneArray(array) {
+ var length = array.length,
+ result = new array.constructor(length); // Add properties assigned by `RegExp#exec`.
- while (++i < j) {
- d[i] = normalize$1(domain[i], domain[i + 1]);
- r[i] = interpolate(range[i], range[i + 1]);
- }
+ if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+ result.index = array.index;
+ result.input = array.input;
+ }
- return function (x) {
- var i = bisectRight(domain, x, 1, j) - 1;
- return r[i](d[i](x));
- };
- }
+ return result;
+ }
+ /**
+ * Initializes an object clone.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @returns {Object} Returns the initialized clone.
+ */
- function copy(source, target) {
- return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
- }
- function transformer$1() {
- var domain = unit,
- range = unit,
- interpolate$1 = interpolate,
- transform,
- untransform,
- unknown,
- clamp = identity$3,
- piecewise,
- output,
- input;
- function rescale() {
- var n = Math.min(domain.length, range.length);
- if (clamp !== identity$3) clamp = clamper(domain[0], domain[n - 1]);
- piecewise = n > 2 ? polymap : bimap;
- output = input = null;
- return scale;
- }
+ function initCloneObject(object) {
+ return typeof object.constructor == 'function' && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
+ }
+ /**
+ * Initializes an object clone based on its `toStringTag`.
+ *
+ * **Note:** This function only supports cloning values with tags of
+ * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @param {string} tag The `toStringTag` of the object to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the initialized clone.
+ */
- function scale(x) {
- return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate$1)))(transform(clamp(x)));
- }
- scale.invert = function (y) {
- return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolateNumber)))(y)));
- };
+ function initCloneByTag(object, tag, isDeep) {
+ var Ctor = object.constructor;
- scale.domain = function (_) {
- return arguments.length ? (domain = Array.from(_, number$1), rescale()) : domain.slice();
- };
+ switch (tag) {
+ case arrayBufferTag:
+ return cloneArrayBuffer(object);
- scale.range = function (_) {
- return arguments.length ? (range = Array.from(_), rescale()) : range.slice();
- };
+ case boolTag:
+ case dateTag:
+ return new Ctor(+object);
- scale.rangeRound = function (_) {
- return range = Array.from(_), interpolate$1 = interpolateRound, rescale();
- };
+ case dataViewTag:
+ return cloneDataView(object, isDeep);
- scale.clamp = function (_) {
- return arguments.length ? (clamp = _ ? true : identity$3, rescale()) : clamp !== identity$3;
- };
+ case float32Tag:
+ case float64Tag:
+ case int8Tag:
+ case int16Tag:
+ case int32Tag:
+ case uint8Tag:
+ case uint8ClampedTag:
+ case uint16Tag:
+ case uint32Tag:
+ return cloneTypedArray(object, isDeep);
- scale.interpolate = function (_) {
- return arguments.length ? (interpolate$1 = _, rescale()) : interpolate$1;
- };
+ case mapTag:
+ return new Ctor();
- scale.unknown = function (_) {
- return arguments.length ? (unknown = _, scale) : unknown;
- };
+ case numberTag:
+ case stringTag:
+ return new Ctor(object);
- return function (t, u) {
- transform = t, untransform = u;
- return rescale();
- };
- }
- function continuous() {
- return transformer$1()(identity$3, identity$3);
- }
+ case regexpTag:
+ return cloneRegExp(object);
- function formatDecimal (x) {
- return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString("en").replace(/,/g, "") : x.toString(10);
- } // Computes the decimal coefficient and exponent of the specified number x with
- // significant digits p, where x is positive and p is in [1, 21] or undefined.
- // For example, formatDecimalParts(1.23) returns ["123", 0].
+ case setTag:
+ return new Ctor();
- function formatDecimalParts(x, p) {
- if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
+ case symbolTag:
+ return cloneSymbol(object);
+ }
+ }
+ /**
+ * Inserts wrapper `details` in a comment at the top of the `source` body.
+ *
+ * @private
+ * @param {string} source The source to modify.
+ * @returns {Array} details The details to insert.
+ * @returns {string} Returns the modified source.
+ */
- var i,
- coefficient = x.slice(0, i); // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
- // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
- return [coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, +x.slice(i + 1)];
- }
+ function insertWrapDetails(source, details) {
+ var length = details.length;
- function exponent (x) {
- return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;
- }
+ if (!length) {
+ return source;
+ }
- function formatGroup (grouping, thousands) {
- return function (value, width) {
- var i = value.length,
- t = [],
- j = 0,
- g = grouping[0],
- length = 0;
+ var lastIndex = length - 1;
+ details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
+ details = details.join(length > 2 ? ', ' : ' ');
+ return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
+ }
+ /**
+ * Checks if `value` is a flattenable `arguments` object or array.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
+ */
- while (i > 0 && g > 0) {
- if (length + g + 1 > width) g = Math.max(1, width - length);
- t.push(value.substring(i -= g, i + g));
- if ((length += g + 1) > width) break;
- g = grouping[j = (j + 1) % grouping.length];
- }
- return t.reverse().join(thousands);
- };
- }
+ function isFlattenable(value) {
+ return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
+ }
+ /**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
- function formatNumerals (numerals) {
- return function (value) {
- return value.replace(/[0-9]/g, function (i) {
- return numerals[+i];
- });
- };
- }
- // [[fill]align][sign][symbol][0][width][,][.precision][~][type]
- var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
- function formatSpecifier(specifier) {
- if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
- var match;
- return new FormatSpecifier({
- fill: match[1],
- align: match[2],
- sign: match[3],
- symbol: match[4],
- zero: match[5],
- width: match[6],
- comma: match[7],
- precision: match[8] && match[8].slice(1),
- trim: match[9],
- type: match[10]
- });
- }
- formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
+ function isIndex(value, length) {
+ var type = _typeof(value);
- function FormatSpecifier(specifier) {
- this.fill = specifier.fill === undefined ? " " : specifier.fill + "";
- this.align = specifier.align === undefined ? ">" : specifier.align + "";
- this.sign = specifier.sign === undefined ? "-" : specifier.sign + "";
- this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + "";
- this.zero = !!specifier.zero;
- this.width = specifier.width === undefined ? undefined : +specifier.width;
- this.comma = !!specifier.comma;
- this.precision = specifier.precision === undefined ? undefined : +specifier.precision;
- this.trim = !!specifier.trim;
- this.type = specifier.type === undefined ? "" : specifier.type + "";
- }
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return !!length && (type == 'number' || type != 'symbol' && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;
+ }
+ /**
+ * Checks if the given arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
+ * else `false`.
+ */
- FormatSpecifier.prototype.toString = function () {
- return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type;
- };
- // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.
- function formatTrim (s) {
- out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
- switch (s[i]) {
- case ".":
- i0 = i1 = i;
- break;
+ function isIterateeCall(value, index, object) {
+ if (!isObject(object)) {
+ return false;
+ }
- case "0":
- if (i0 === 0) i0 = i;
- i1 = i;
- break;
+ var type = _typeof(index);
- default:
- if (!+s[i]) break out;
- if (i0 > 0) i0 = 0;
- break;
- }
- }
+ if (type == 'number' ? isArrayLike(object) && isIndex(index, object.length) : type == 'string' && index in object) {
+ return eq(object[index], value);
+ }
- return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
- }
+ return false;
+ }
+ /**
+ * Checks if `value` is a property name and not a property path.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+ */
- // `thisNumberValue` abstract operation
- // https://tc39.es/ecma262/#sec-thisnumbervalue
- var thisNumberValue = function (value) {
- if (typeof value != 'number' && classofRaw(value) != 'Number') {
- throw TypeError('Incorrect invocation');
- }
- return +value;
- };
- // `String.prototype.repeat` method implementation
- // https://tc39.es/ecma262/#sec-string.prototype.repeat
- var stringRepeat = ''.repeat || function repeat(count) {
- var str = String(requireObjectCoercible(this));
- var result = '';
- var n = toInteger(count);
- if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');
- for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;
- return result;
- };
+ function isKey(value, object) {
+ if (isArray(value)) {
+ return false;
+ }
- var nativeToFixed = 1.0.toFixed;
- var floor$6 = Math.floor;
+ var type = _typeof(value);
- var pow$2 = function (x, n, acc) {
- return n === 0 ? acc : n % 2 === 1 ? pow$2(x, n - 1, acc * x) : pow$2(x * x, n / 2, acc);
- };
+ if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) {
+ return true;
+ }
- var log$2 = function (x) {
- var n = 0;
- var x2 = x;
- while (x2 >= 4096) {
- n += 12;
- x2 /= 4096;
- }
- while (x2 >= 2) {
- n += 1;
- x2 /= 2;
- } return n;
- };
+ return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object);
+ }
+ /**
+ * Checks if `value` is suitable for use as unique object key.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ */
- var multiply = function (data, n, c) {
- var index = -1;
- var c2 = c;
- while (++index < 6) {
- c2 += n * data[index];
- data[index] = c2 % 1e7;
- c2 = floor$6(c2 / 1e7);
- }
- };
- var divide = function (data, n) {
- var index = 6;
- var c = 0;
- while (--index >= 0) {
- c += data[index];
- data[index] = floor$6(c / n);
- c = (c % n) * 1e7;
- }
- };
+ function isKeyable(value) {
+ var type = _typeof(value);
- var dataToString = function (data) {
- var index = 6;
- var s = '';
- while (--index >= 0) {
- if (s !== '' || index === 0 || data[index] !== 0) {
- var t = String(data[index]);
- s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;
- }
- } return s;
- };
+ return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null;
+ }
+ /**
+ * Checks if `func` has a lazy counterpart.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
+ * else `false`.
+ */
- var FORCED$c = nativeToFixed && (
- 0.00008.toFixed(3) !== '0.000' ||
- 0.9.toFixed(0) !== '1' ||
- 1.255.toFixed(2) !== '1.25' ||
- 1000000000000000128.0.toFixed(0) !== '1000000000000000128'
- ) || !fails(function () {
- // V8 ~ Android 4.3-
- nativeToFixed.call({});
- });
- // `Number.prototype.toFixed` method
- // https://tc39.es/ecma262/#sec-number.prototype.tofixed
- _export({ target: 'Number', proto: true, forced: FORCED$c }, {
- toFixed: function toFixed(fractionDigits) {
- var number = thisNumberValue(this);
- var fractDigits = toInteger(fractionDigits);
- var data = [0, 0, 0, 0, 0, 0];
- var sign = '';
- var result = '0';
- var e, z, j, k;
+ function isLaziable(func) {
+ var funcName = getFuncName(func),
+ other = lodash[funcName];
- if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');
- // eslint-disable-next-line no-self-compare -- NaN check
- if (number != number) return 'NaN';
- if (number <= -1e21 || number >= 1e21) return String(number);
- if (number < 0) {
- sign = '-';
- number = -number;
- }
- if (number > 1e-21) {
- e = log$2(number * pow$2(2, 69, 1)) - 69;
- z = e < 0 ? number * pow$2(2, -e, 1) : number / pow$2(2, e, 1);
- z *= 0x10000000000000;
- e = 52 - e;
- if (e > 0) {
- multiply(data, 0, z);
- j = fractDigits;
- while (j >= 7) {
- multiply(data, 1e7, 0);
- j -= 7;
+ if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
+ return false;
}
- multiply(data, pow$2(10, j, 1), 0);
- j = e - 1;
- while (j >= 23) {
- divide(data, 1 << 23);
- j -= 23;
+
+ if (func === other) {
+ return true;
}
- divide(data, 1 << j);
- multiply(data, 1, 1);
- divide(data, 2);
- result = dataToString(data);
- } else {
- multiply(data, 0, z);
- multiply(data, 1 << -e, 0);
- result = dataToString(data) + stringRepeat.call('0', fractDigits);
+
+ var data = getData(other);
+ return !!data && func === data[0];
}
- }
- if (fractDigits > 0) {
- k = result.length;
- result = sign + (k <= fractDigits
- ? '0.' + stringRepeat.call('0', fractDigits - k) + result
- : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));
- } else {
- result = sign + result;
- } return result;
- }
- });
+ /**
+ * Checks if `func` has its source masked.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+ */
- var nativeToPrecision = 1.0.toPrecision;
- var FORCED$d = fails(function () {
- // IE7-
- return nativeToPrecision.call(1, undefined) !== '1';
- }) || !fails(function () {
- // V8 ~ Android 4.3-
- nativeToPrecision.call({});
- });
+ function isMasked(func) {
+ return !!maskSrcKey && maskSrcKey in func;
+ }
+ /**
+ * Checks if `func` is capable of being masked.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
+ */
- // `Number.prototype.toPrecision` method
- // https://tc39.es/ecma262/#sec-number.prototype.toprecision
- _export({ target: 'Number', proto: true, forced: FORCED$d }, {
- toPrecision: function toPrecision(precision) {
- return precision === undefined
- ? nativeToPrecision.call(thisNumberValue(this))
- : nativeToPrecision.call(thisNumberValue(this), precision);
- }
- });
- var prefixExponent;
- function formatPrefixAuto (x, p) {
- var d = formatDecimalParts(x, p);
- if (!d) return x + "";
- var coefficient = d[0],
- exponent = d[1],
- i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
- n = coefficient.length;
- return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!
- }
+ var isMaskable = coreJsData ? isFunction : stubFalse;
+ /**
+ * Checks if `value` is likely a prototype object.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+ */
- function formatRounded (x, p) {
- var d = formatDecimalParts(x, p);
- if (!d) return x + "";
- var coefficient = d[0],
- exponent = d[1];
- 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");
- }
+ function isPrototype(value) {
+ var Ctor = value && value.constructor,
+ proto = typeof Ctor == 'function' && Ctor.prototype || objectProto;
+ return value === proto;
+ }
+ /**
+ * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` if suitable for strict
+ * equality comparisons, else `false`.
+ */
- var formatTypes = {
- "%": function _(x, p) {
- return (x * 100).toFixed(p);
- },
- "b": function b(x) {
- return Math.round(x).toString(2);
- },
- "c": function c(x) {
- return x + "";
- },
- "d": formatDecimal,
- "e": function e(x, p) {
- return x.toExponential(p);
- },
- "f": function f(x, p) {
- return x.toFixed(p);
- },
- "g": function g(x, p) {
- return x.toPrecision(p);
- },
- "o": function o(x) {
- return Math.round(x).toString(8);
- },
- "p": function p(x, _p) {
- return formatRounded(x * 100, _p);
- },
- "r": formatRounded,
- "s": formatPrefixAuto,
- "X": function X(x) {
- return Math.round(x).toString(16).toUpperCase();
- },
- "x": function x(_x) {
- return Math.round(_x).toString(16);
- }
- };
- function identity$4 (x) {
- return x;
- }
+ function isStrictComparable(value) {
+ return value === value && !isObject(value);
+ }
+ /**
+ * A specialized version of `matchesProperty` for source values suitable
+ * for strict equality comparisons, i.e. `===`.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @param {*} srcValue The value to match.
+ * @returns {Function} Returns the new spec function.
+ */
- var map = Array.prototype.map,
- prefixes = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
- function formatLocale (locale) {
- var group = locale.grouping === undefined || locale.thousands === undefined ? identity$4 : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""),
- currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "",
- currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "",
- decimal = locale.decimal === undefined ? "." : locale.decimal + "",
- numerals = locale.numerals === undefined ? identity$4 : formatNumerals(map.call(locale.numerals, String)),
- percent = locale.percent === undefined ? "%" : locale.percent + "",
- minus = locale.minus === undefined ? "â" : locale.minus + "",
- nan = locale.nan === undefined ? "NaN" : locale.nan + "";
- function newFormat(specifier) {
- specifier = formatSpecifier(specifier);
- var fill = specifier.fill,
- align = specifier.align,
- sign = specifier.sign,
- symbol = specifier.symbol,
- zero = specifier.zero,
- width = specifier.width,
- comma = specifier.comma,
- precision = specifier.precision,
- trim = specifier.trim,
- type = specifier.type; // The "n" type is an alias for ",g".
+ function matchesStrictComparable(key, srcValue) {
+ return function (object) {
+ if (object == null) {
+ return false;
+ }
- if (type === "n") comma = true, type = "g"; // The "" type, and any invalid type, is an alias for ".12~g".
- else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; // If zero fill is specified, padding goes after sign and before digits.
+ return object[key] === srcValue && (srcValue !== undefined$1 || key in Object(object));
+ };
+ }
+ /**
+ * A specialized version of `_.memoize` which clears the memoized function's
+ * cache when it exceeds `MAX_MEMOIZE_SIZE`.
+ *
+ * @private
+ * @param {Function} func The function to have its output memoized.
+ * @returns {Function} Returns the new memoized function.
+ */
- if (zero || fill === "0" && align === "=") zero = true, fill = "0", align = "="; // Compute the prefix and suffix.
- // For SI-prefix, the suffix is lazily computed.
- var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
- suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; // What format function should we use?
- // Is this an integer type?
- // Can this type generate exponential notation?
+ function memoizeCapped(func) {
+ var result = memoize(func, function (key) {
+ if (cache.size === MAX_MEMOIZE_SIZE) {
+ cache.clear();
+ }
- var formatType = formatTypes[type],
- maybeSuffix = /[defgprs%]/.test(type); // Set the default precision if not specified,
- // or clamp the specified precision to the supported range.
- // For significant precision, it must be in [1, 21].
- // For fixed precision, it must be in [0, 20].
+ return key;
+ });
+ var cache = result.cache;
+ return result;
+ }
+ /**
+ * Merges the function metadata of `source` into `data`.
+ *
+ * Merging metadata reduces the number of wrappers used to invoke a function.
+ * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
+ * may be applied regardless of execution order. Methods like `_.ary` and
+ * `_.rearg` modify function arguments, making the order in which they are
+ * executed important, preventing the merging of metadata. However, we make
+ * an exception for a safe combined case where curried functions have `_.ary`
+ * and or `_.rearg` applied.
+ *
+ * @private
+ * @param {Array} data The destination metadata.
+ * @param {Array} source The source metadata.
+ * @returns {Array} Returns `data`.
+ */
- precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));
- function format(value) {
- var valuePrefix = prefix,
- valueSuffix = suffix,
- i,
- n,
- c;
+ function mergeData(data, source) {
+ var bitmask = data[1],
+ srcBitmask = source[1],
+ newBitmask = bitmask | srcBitmask,
+ isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
+ 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; // Exit early if metadata can't be merged.
- if (type === "c") {
- valueSuffix = formatType(value) + valueSuffix;
- value = "";
- } else {
- value = +value; // Determine the sign. -0 is not less than 0, but 1 / -0 is!
+ if (!(isCommon || isCombo)) {
+ return data;
+ } // Use source `thisArg` if available.
- var valueNegative = value < 0 || 1 / value < 0; // Perform the initial formatting.
- value = isNaN(value) ? nan : formatType(Math.abs(value), precision); // Trim insignificant zeros.
+ if (srcBitmask & WRAP_BIND_FLAG) {
+ data[2] = source[2]; // Set when currying a bound function.
- if (trim) value = formatTrim(value); // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.
+ newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
+ } // Compose partial arguments.
- if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; // Compute the prefix and suffix.
- valuePrefix = (valueNegative ? sign === "(" ? sign : minus : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
- valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); // Break the formatted value into the integer âvalueâ part that can be
- // grouped, and fractional or exponential âsuffixâ part that is not.
+ var value = source[3];
- if (maybeSuffix) {
- i = -1, n = value.length;
+ if (value) {
+ var partials = data[3];
+ data[3] = partials ? composeArgs(partials, value, source[4]) : value;
+ data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
+ } // Compose partial right arguments.
- while (++i < n) {
- if (c = value.charCodeAt(i), 48 > c || c > 57) {
- valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
- value = value.slice(0, i);
- break;
- }
- }
- }
- } // If the fill character is not "0", grouping is applied before padding.
+ value = source[5];
- if (comma && !zero) value = group(value, Infinity); // Compute the padding.
+ if (value) {
+ partials = data[5];
+ data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
+ data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
+ } // Use source `argPos` if available.
- var length = valuePrefix.length + value.length + valueSuffix.length,
- padding = length < width ? new Array(width - length + 1).join(fill) : ""; // If the fill character is "0", grouping is applied after padding.
- if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; // Reconstruct the final output based on the desired alignment.
+ value = source[7];
- switch (align) {
- case "<":
- value = valuePrefix + value + valueSuffix + padding;
- break;
+ if (value) {
+ data[7] = value;
+ } // Use source `ary` if it's smaller.
- case "=":
- value = valuePrefix + padding + value + valueSuffix;
- break;
- case "^":
- value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
- break;
+ if (srcBitmask & WRAP_ARY_FLAG) {
+ data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
+ } // Use source `arity` if one is not provided.
- default:
- value = padding + valuePrefix + value + valueSuffix;
- break;
+
+ if (data[9] == null) {
+ data[9] = source[9];
+ } // Use source `func` and merge bitmasks.
+
+
+ data[0] = source[0];
+ data[1] = newBitmask;
+ return data;
}
+ /**
+ * This function is like
+ * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * except that it includes inherited enumerable properties.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
- return numerals(value);
- }
- format.toString = function () {
- return specifier + "";
- };
+ function nativeKeysIn(object) {
+ var result = [];
- return format;
- }
+ if (object != null) {
+ for (var key in Object(object)) {
+ result.push(key);
+ }
+ }
- function formatPrefix(specifier, value) {
- var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
- e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,
- k = Math.pow(10, -e),
- prefix = prefixes[8 + e / 3];
- return function (value) {
- return f(k * value) + prefix;
- };
- }
+ return result;
+ }
+ /**
+ * Converts `value` to a string using `Object.prototype.toString`.
+ *
+ * @private
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ */
- return {
- format: newFormat,
- formatPrefix: formatPrefix
- };
- }
- var locale;
- var format;
- var formatPrefix;
- defaultLocale({
- thousands: ",",
- grouping: [3],
- currency: ["$", ""]
- });
- function defaultLocale(definition) {
- locale = formatLocale(definition);
- format = locale.format;
- formatPrefix = locale.formatPrefix;
- return locale;
- }
+ function objectToString(value) {
+ return nativeObjectToString.call(value);
+ }
+ /**
+ * A specialized version of `baseRest` which transforms the rest array.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @param {Function} transform The rest array transform.
+ * @returns {Function} Returns the new function.
+ */
- function precisionFixed (step) {
- return Math.max(0, -exponent(Math.abs(step)));
- }
- function precisionPrefix (step, value) {
- return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));
- }
+ function overRest(func, start, transform) {
+ start = nativeMax(start === undefined$1 ? func.length - 1 : start, 0);
+ return function () {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ array = Array(length);
- function precisionRound (step, max) {
- step = Math.abs(step), max = Math.abs(max) - step;
- return Math.max(0, exponent(max) - exponent(step)) + 1;
- }
+ while (++index < length) {
+ array[index] = args[start + index];
+ }
- function tickFormat(start, stop, count, specifier) {
- var step = tickStep(start, stop, count),
- precision;
- specifier = formatSpecifier(specifier == null ? ",f" : specifier);
+ index = -1;
+ var otherArgs = Array(start + 1);
- switch (specifier.type) {
- case "s":
- {
- var value = Math.max(Math.abs(start), Math.abs(stop));
- if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
- return formatPrefix(specifier, value);
- }
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
- case "":
- case "e":
- case "g":
- case "p":
- case "r":
- {
- if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
- break;
+ otherArgs[start] = transform(array);
+ return apply(func, this, otherArgs);
+ };
}
+ /**
+ * Gets the parent value at `path` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} path The path to get the parent value of.
+ * @returns {*} Returns the parent value.
+ */
- case "f":
- case "%":
- {
- if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
- break;
+
+ function parent(object, path) {
+ return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
}
- }
+ /**
+ * Reorder `array` according to the specified indexes where the element at
+ * the first index is assigned as the first element, the element at
+ * the second index is assigned as the second element, and so on.
+ *
+ * @private
+ * @param {Array} array The array to reorder.
+ * @param {Array} indexes The arranged array indexes.
+ * @returns {Array} Returns `array`.
+ */
- return format(specifier);
- }
- function linearish(scale) {
- var domain = scale.domain;
+ function reorder(array, indexes) {
+ var arrLength = array.length,
+ length = nativeMin(indexes.length, arrLength),
+ oldArray = copyArray(array);
- scale.ticks = function (count) {
- var d = domain();
- return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
- };
+ while (length--) {
+ var index = indexes[length];
+ array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined$1;
+ }
- scale.tickFormat = function (count, specifier) {
- var d = domain();
- return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
- };
+ return array;
+ }
+ /**
+ * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the property to get.
+ * @returns {*} Returns the property value.
+ */
- scale.nice = function (count) {
- if (count == null) count = 10;
- var d = domain();
- var i0 = 0;
- var i1 = d.length - 1;
- var start = d[i0];
- var stop = d[i1];
- var prestep;
- var step;
- var maxIter = 10;
- if (stop < start) {
- step = start, start = stop, stop = step;
- step = i0, i0 = i1, i1 = step;
- }
+ function safeGet(object, key) {
+ if (key === 'constructor' && typeof object[key] === 'function') {
+ return;
+ }
- while (maxIter-- > 0) {
- step = tickIncrement(start, stop, count);
+ if (key == '__proto__') {
+ return;
+ }
- if (step === prestep) {
- d[i0] = start;
- d[i1] = stop;
- return domain(d);
- } else if (step > 0) {
- start = Math.floor(start / step) * step;
- stop = Math.ceil(stop / step) * step;
- } else if (step < 0) {
- start = Math.ceil(start * step) / step;
- stop = Math.floor(stop * step) / step;
- } else {
- break;
+ return object[key];
}
+ /**
+ * Sets metadata for `func`.
+ *
+ * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
+ * period of time, it will trip its breaker and transition to an identity
+ * function to avoid garbage collection pauses in V8. See
+ * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
+ * for more details.
+ *
+ * @private
+ * @param {Function} func The function to associate metadata with.
+ * @param {*} data The metadata.
+ * @returns {Function} Returns `func`.
+ */
- prestep = step;
- }
- return scale;
- };
+ var setData = shortOut(baseSetData);
+ /**
+ * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
+ *
+ * @private
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @returns {number|Object} Returns the timer id or timeout object.
+ */
- return scale;
- }
- function linear$2() {
- var scale = continuous();
+ var setTimeout = ctxSetTimeout || function (func, wait) {
+ return root.setTimeout(func, wait);
+ };
+ /**
+ * Sets the `toString` method of `func` to return `string`.
+ *
+ * @private
+ * @param {Function} func The function to modify.
+ * @param {Function} string The `toString` result.
+ * @returns {Function} Returns `func`.
+ */
- scale.copy = function () {
- return copy(scale, linear$2());
- };
- initRange.apply(scale, arguments);
- return linearish(scale);
- }
+ var setToString = shortOut(baseSetToString);
+ /**
+ * Sets the `toString` method of `wrapper` to mimic the source of `reference`
+ * with wrapper details in a comment at the top of the source body.
+ *
+ * @private
+ * @param {Function} wrapper The function to modify.
+ * @param {Function} reference The reference function.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @returns {Function} Returns `wrapper`.
+ */
- var nativeExpm1 = Math.expm1;
- var exp$1 = Math.exp;
+ function setWrapToString(wrapper, reference, bitmask) {
+ var source = reference + '';
+ return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
+ }
+ /**
+ * Creates a function that'll short out and invoke `identity` instead
+ * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
+ * milliseconds.
+ *
+ * @private
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new shortable function.
+ */
- // `Math.expm1` method implementation
- // https://tc39.es/ecma262/#sec-math.expm1
- var mathExpm1 = (!nativeExpm1
- // Old FF bug
- || nativeExpm1(10) > 22025.465794806719 || nativeExpm1(10) < 22025.4657948067165168
- // Tor Browser bug
- || nativeExpm1(-2e-17) != -2e-17
- ) ? function expm1(x) {
- return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : exp$1(x) - 1;
- } : nativeExpm1;
- function quantize() {
- var x0 = 0,
- x1 = 1,
- n = 1,
- domain = [0.5],
- range = [0, 1],
- unknown;
+ function shortOut(func) {
+ var count = 0,
+ lastCalled = 0;
+ return function () {
+ var stamp = nativeNow(),
+ remaining = HOT_SPAN - (stamp - lastCalled);
+ lastCalled = stamp;
- function scale(x) {
- return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
- }
+ if (remaining > 0) {
+ if (++count >= HOT_COUNT) {
+ return arguments[0];
+ }
+ } else {
+ count = 0;
+ }
- function rescale() {
- var i = -1;
- domain = new Array(n);
+ return func.apply(undefined$1, arguments);
+ };
+ }
+ /**
+ * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
+ *
+ * @private
+ * @param {Array} array The array to shuffle.
+ * @param {number} [size=array.length] The size of `array`.
+ * @returns {Array} Returns `array`.
+ */
- while (++i < n) {
- domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
- }
- return scale;
- }
+ function shuffleSelf(array, size) {
+ var index = -1,
+ length = array.length,
+ lastIndex = length - 1;
+ size = size === undefined$1 ? length : size;
- scale.domain = function (_) {
- var _ref, _ref2;
+ while (++index < size) {
+ var rand = baseRandom(index, lastIndex),
+ value = array[rand];
+ array[rand] = array[index];
+ array[index] = value;
+ }
- return arguments.length ? ((_ref = _, _ref2 = _slicedToArray(_ref, 2), x0 = _ref2[0], x1 = _ref2[1], _ref), x0 = +x0, x1 = +x1, rescale()) : [x0, x1];
- };
+ array.length = size;
+ return array;
+ }
+ /**
+ * Converts `string` to a property path array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the property path array.
+ */
- scale.range = function (_) {
- return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();
- };
- scale.invertExtent = function (y) {
- var i = range.indexOf(y);
- return i < 0 ? [NaN, NaN] : i < 1 ? [x0, domain[0]] : i >= n ? [domain[n - 1], x1] : [domain[i - 1], domain[i]];
- };
+ var stringToPath = memoizeCapped(function (string) {
+ var result = [];
- scale.unknown = function (_) {
- return arguments.length ? (unknown = _, scale) : scale;
- };
+ if (string.charCodeAt(0) === 46
+ /* . */
+ ) {
+ result.push('');
+ }
- scale.thresholds = function () {
- return domain.slice();
- };
+ string.replace(rePropName, function (match, number, quote, subString) {
+ result.push(quote ? subString.replace(reEscapeChar, '$1') : number || match);
+ });
+ return result;
+ });
+ /**
+ * Converts `value` to a string key if it's not a string or symbol.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @returns {string|symbol} Returns the key.
+ */
- scale.copy = function () {
- return quantize().domain([x0, x1]).range(range).unknown(unknown);
- };
+ function toKey(value) {
+ if (typeof value == 'string' || isSymbol(value)) {
+ return value;
+ }
- return initRange.apply(linearish(scale), arguments);
- }
+ var result = value + '';
+ return result == '0' && 1 / value == -INFINITY ? '-0' : result;
+ }
+ /**
+ * Converts `func` to its source code.
+ *
+ * @private
+ * @param {Function} func The function to convert.
+ * @returns {string} Returns the source code.
+ */
- // https://github.com/tc39/proposal-string-pad-start-end
+ function toSource(func) {
+ if (func != null) {
+ try {
+ return funcToString.call(func);
+ } catch (e) {}
+ try {
+ return func + '';
+ } catch (e) {}
+ }
+ return '';
+ }
+ /**
+ * Updates wrapper `details` based on `bitmask` flags.
+ *
+ * @private
+ * @returns {Array} details The details to modify.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @returns {Array} Returns `details`.
+ */
- var ceil$1 = Math.ceil;
- // `String.prototype.{ padStart, padEnd }` methods implementation
- var createMethod$6 = function (IS_END) {
- return function ($this, maxLength, fillString) {
- var S = String(requireObjectCoercible($this));
- var stringLength = S.length;
- var fillStr = fillString === undefined ? ' ' : String(fillString);
- var intMaxLength = toLength(maxLength);
- var fillLen, stringFiller;
- if (intMaxLength <= stringLength || fillStr == '') return S;
- fillLen = intMaxLength - stringLength;
- stringFiller = stringRepeat.call(fillStr, ceil$1(fillLen / fillStr.length));
- if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
- return IS_END ? S + stringFiller : stringFiller + S;
- };
- };
+ function updateWrapDetails(details, bitmask) {
+ arrayEach(wrapFlags, function (pair) {
+ var value = '_.' + pair[0];
- var stringPad = {
- // `String.prototype.padStart` method
- // https://tc39.es/ecma262/#sec-string.prototype.padstart
- start: createMethod$6(false),
- // `String.prototype.padEnd` method
- // https://tc39.es/ecma262/#sec-string.prototype.padend
- end: createMethod$6(true)
- };
+ if (bitmask & pair[1] && !arrayIncludes(details, value)) {
+ details.push(value);
+ }
+ });
+ return details.sort();
+ }
+ /**
+ * Creates a clone of `wrapper`.
+ *
+ * @private
+ * @param {Object} wrapper The wrapper to clone.
+ * @returns {Object} Returns the cloned wrapper.
+ */
- var padStart = stringPad.start;
- var abs$3 = Math.abs;
- var DatePrototype$1 = Date.prototype;
- var getTime$1 = DatePrototype$1.getTime;
- var nativeDateToISOString = DatePrototype$1.toISOString;
+ function wrapperClone(wrapper) {
+ if (wrapper instanceof LazyWrapper) {
+ return wrapper.clone();
+ }
- // `Date.prototype.toISOString` method implementation
- // https://tc39.es/ecma262/#sec-date.prototype.toisostring
- // PhantomJS / old WebKit fails here:
- var dateToIsoString = (fails(function () {
- return nativeDateToISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';
- }) || !fails(function () {
- nativeDateToISOString.call(new Date(NaN));
- })) ? function toISOString() {
- if (!isFinite(getTime$1.call(this))) throw RangeError('Invalid time value');
- var date = this;
- var year = date.getUTCFullYear();
- var milliseconds = date.getUTCMilliseconds();
- var sign = year < 0 ? '-' : year > 9999 ? '+' : '';
- return sign + padStart(abs$3(year), sign ? 6 : 4, 0) +
- '-' + padStart(date.getUTCMonth() + 1, 2, 0) +
- '-' + padStart(date.getUTCDate(), 2, 0) +
- 'T' + padStart(date.getUTCHours(), 2, 0) +
- ':' + padStart(date.getUTCMinutes(), 2, 0) +
- ':' + padStart(date.getUTCSeconds(), 2, 0) +
- '.' + padStart(milliseconds, 3, 0) +
- 'Z';
- } : nativeDateToISOString;
+ var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
+ result.__actions__ = copyArray(wrapper.__actions__);
+ result.__index__ = wrapper.__index__;
+ result.__values__ = wrapper.__values__;
+ return result;
+ }
+ /*------------------------------------------------------------------------*/
- // `Date.prototype.toISOString` method
- // https://tc39.es/ecma262/#sec-date.prototype.toisostring
- // PhantomJS / old WebKit has a broken implementations
- _export({ target: 'Date', proto: true, forced: Date.prototype.toISOString !== dateToIsoString }, {
- toISOString: dateToIsoString
- });
+ /**
+ * Creates an array of elements split into groups the length of `size`.
+ * If `array` can't be split evenly, the final chunk will be the remaining
+ * elements.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to process.
+ * @param {number} [size=1] The length of each chunk
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the new array of chunks.
+ * @example
+ *
+ * _.chunk(['a', 'b', 'c', 'd'], 2);
+ * // => [['a', 'b'], ['c', 'd']]
+ *
+ * _.chunk(['a', 'b', 'c', 'd'], 3);
+ * // => [['a', 'b', 'c'], ['d']]
+ */
- function behaviorBreathe() {
- var duration = 800;
- var steps = 4;
- var selector = '.selected.shadow, .selected .shadow';
- var _selected = select(null);
+ function chunk(array, size, guard) {
+ if (guard ? isIterateeCall(array, size, guard) : size === undefined$1) {
+ size = 1;
+ } else {
+ size = nativeMax(toInteger(size), 0);
+ }
- var _classed = '';
- var _params = {};
- var _done = false;
+ var length = array == null ? 0 : array.length;
- var _timer;
+ if (!length || size < 1) {
+ return [];
+ }
- function ratchetyInterpolator(a, b, steps, units) {
- a = parseFloat(a);
- b = parseFloat(b);
- var sample = quantize().domain([0, 1]).range(d3_quantize(d3_interpolateNumber(a, b), steps));
- return function (t) {
- return String(sample(t)) + (units || '');
- };
- }
+ var index = 0,
+ resIndex = 0,
+ result = Array(nativeCeil(length / size));
- function reset(selection) {
- selection.style('stroke-opacity', null).style('stroke-width', null).style('fill-opacity', null).style('r', null);
- }
+ while (index < length) {
+ result[resIndex++] = baseSlice(array, index, index += size);
+ }
- function setAnimationParams(transition, fromTo) {
- var toFrom = fromTo === 'from' ? 'to' : 'from';
- transition.styleTween('stroke-opacity', function (d) {
- return ratchetyInterpolator(_params[d.id][toFrom].opacity, _params[d.id][fromTo].opacity, steps);
- }).styleTween('stroke-width', function (d) {
- return ratchetyInterpolator(_params[d.id][toFrom].width, _params[d.id][fromTo].width, steps, 'px');
- }).styleTween('fill-opacity', function (d) {
- return ratchetyInterpolator(_params[d.id][toFrom].opacity, _params[d.id][fromTo].opacity, steps);
- }).styleTween('r', function (d) {
- return ratchetyInterpolator(_params[d.id][toFrom].width, _params[d.id][fromTo].width, steps, 'px');
- });
- }
+ return result;
+ }
+ /**
+ * Creates an array with all falsey values removed. The values `false`, `null`,
+ * `0`, `""`, `undefined`, and `NaN` are falsey.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to compact.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.compact([0, 1, false, 2, '', 3]);
+ * // => [1, 2, 3]
+ */
- function calcAnimationParams(selection) {
- selection.call(reset).each(function (d) {
- var s = select(this);
- var tag = s.node().tagName;
- var p = {
- 'from': {},
- 'to': {}
- };
- var opacity;
- var width; // determine base opacity and width
- if (tag === 'circle') {
- opacity = parseFloat(s.style('fill-opacity') || 0.5);
- width = parseFloat(s.style('r') || 15.5);
- } else {
- opacity = parseFloat(s.style('stroke-opacity') || 0.7);
- width = parseFloat(s.style('stroke-width') || 10);
- } // calculate from/to interpolation params..
+ function compact(array) {
+ var index = -1,
+ length = array == null ? 0 : array.length,
+ resIndex = 0,
+ result = [];
+ while (++index < length) {
+ var value = array[index];
- p.tag = tag;
- p.from.opacity = opacity * 0.6;
- p.to.opacity = opacity * 1.25;
- p.from.width = width * 0.7;
- p.to.width = width * (tag === 'circle' ? 1.5 : 1);
- _params[d.id] = p;
- });
- }
+ if (value) {
+ result[resIndex++] = value;
+ }
+ }
- function run(surface, fromTo) {
- var toFrom = fromTo === 'from' ? 'to' : 'from';
- var currSelected = surface.selectAll(selector);
- var currClassed = surface.attr('class');
+ return result;
+ }
+ /**
+ * Creates a new array concatenating `array` with any additional arrays
+ * and/or values.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to concatenate.
+ * @param {...*} [values] The values to concatenate.
+ * @returns {Array} Returns the new concatenated array.
+ * @example
+ *
+ * var array = [1];
+ * var other = _.concat(array, 2, [3], [[4]]);
+ *
+ * console.log(other);
+ * // => [1, 2, 3, [4]]
+ *
+ * console.log(array);
+ * // => [1]
+ */
- if (_done || currSelected.empty()) {
- _selected.call(reset);
- _selected = select(null);
- return;
- }
+ function concat() {
+ var length = arguments.length;
- if (!fastDeepEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
- _selected.call(reset);
+ if (!length) {
+ return [];
+ }
- _classed = currClassed;
- _selected = currSelected.call(calcAnimationParams);
- }
+ var args = Array(length - 1),
+ array = arguments[0],
+ index = length;
- var didCallNextRun = false;
+ while (index--) {
+ args[index - 1] = arguments[index];
+ }
- _selected.transition().duration(duration).call(setAnimationParams, fromTo).on('end', function () {
- // `end` event is called for each selected element, but we want
- // it to run only once
- if (!didCallNextRun) {
- surface.call(run, toFrom);
- didCallNextRun = true;
- } // if entity was deselected, remove breathe styling
+ return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
+ }
+ /**
+ * Creates an array of `array` values not included in the other given arrays
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons. The order and references of result values are
+ * determined by the first array.
+ *
+ * **Note:** Unlike `_.pullAll`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...Array} [values] The values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ * @see _.without, _.xor
+ * @example
+ *
+ * _.difference([2, 1], [2, 3]);
+ * // => [1]
+ */
- if (!select(this).classed('selected')) {
- reset(select(this));
- }
- });
- }
+ var difference = baseRest(function (array, values) {
+ return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) : [];
+ });
+ /**
+ * This method is like `_.difference` except that it accepts `iteratee` which
+ * is invoked for each element of `array` and `values` to generate the criterion
+ * by which they're compared. The order and references of result values are
+ * determined by the first array. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...Array} [values] The values to exclude.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+ * // => [1.2]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
+ * // => [{ 'x': 2 }]
+ */
- function behavior(surface) {
- _done = false;
- _timer = timer(function () {
- // wait for elements to actually become selected
- if (surface.selectAll(selector).empty()) {
- return false;
- }
+ var differenceBy = baseRest(function (array, values) {
+ var iteratee = last(values);
- surface.call(run, 'from');
+ if (isArrayLikeObject(iteratee)) {
+ iteratee = undefined$1;
+ }
- _timer.stop();
+ return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) : [];
+ });
+ /**
+ * This method is like `_.difference` except that it accepts `comparator`
+ * which is invoked to compare elements of `array` to `values`. The order and
+ * references of result values are determined by the first array. The comparator
+ * is invoked with two arguments: (arrVal, othVal).
+ *
+ * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...Array} [values] The values to exclude.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+ *
+ * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
+ * // => [{ 'x': 2, 'y': 1 }]
+ */
- return true;
- }, 20);
- }
+ var differenceWith = baseRest(function (array, values) {
+ var comparator = last(values);
- behavior.restartIfNeeded = function (surface) {
- if (_selected.empty()) {
- surface.call(run, 'from');
+ if (isArrayLikeObject(comparator)) {
+ comparator = undefined$1;
+ }
- if (_timer) {
- _timer.stop();
+ return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined$1, comparator) : [];
+ });
+ /**
+ * Creates a slice of `array` with `n` elements dropped from the beginning.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to drop.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.drop([1, 2, 3]);
+ * // => [2, 3]
+ *
+ * _.drop([1, 2, 3], 2);
+ * // => [3]
+ *
+ * _.drop([1, 2, 3], 5);
+ * // => []
+ *
+ * _.drop([1, 2, 3], 0);
+ * // => [1, 2, 3]
+ */
+
+ function drop(array, n, guard) {
+ var length = array == null ? 0 : array.length;
+
+ if (!length) {
+ return [];
+ }
+
+ n = guard || n === undefined$1 ? 1 : toInteger(n);
+ return baseSlice(array, n < 0 ? 0 : n, length);
}
- }
- };
+ /**
+ * Creates a slice of `array` with `n` elements dropped from the end.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to drop.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.dropRight([1, 2, 3]);
+ * // => [1, 2]
+ *
+ * _.dropRight([1, 2, 3], 2);
+ * // => [1]
+ *
+ * _.dropRight([1, 2, 3], 5);
+ * // => []
+ *
+ * _.dropRight([1, 2, 3], 0);
+ * // => [1, 2, 3]
+ */
- behavior.off = function () {
- _done = true;
- if (_timer) {
- _timer.stop();
- }
+ function dropRight(array, n, guard) {
+ var length = array == null ? 0 : array.length;
- _selected.interrupt().call(reset);
- };
+ if (!length) {
+ return [];
+ }
- return behavior;
- }
+ n = guard || n === undefined$1 ? 1 : toInteger(n);
+ n = length - n;
+ return baseSlice(array, 0, n < 0 ? 0 : n);
+ }
+ /**
+ * Creates a slice of `array` excluding elements dropped from the end.
+ * Elements are dropped until `predicate` returns falsey. The predicate is
+ * invoked with three arguments: (value, index, array).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * _.dropRightWhile(users, function(o) { return !o.active; });
+ * // => objects for ['barney']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
+ * // => objects for ['barney', 'fred']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.dropRightWhile(users, ['active', false]);
+ * // => objects for ['barney']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.dropRightWhile(users, 'active');
+ * // => objects for ['barney', 'fred', 'pebbles']
+ */
- /* Creates a keybinding behavior for an operation */
- function behaviorOperation(context) {
- var _operation;
- function keypress(d3_event) {
- // prevent operations during low zoom selection
- if (!context.map().withinEditableZoom()) return;
- if (_operation.availableForKeypress && !_operation.availableForKeypress()) return;
- d3_event.preventDefault();
+ function dropRightWhile(array, predicate) {
+ return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : [];
+ }
+ /**
+ * Creates a slice of `array` excluding elements dropped from the beginning.
+ * Elements are dropped until `predicate` returns falsey. The predicate is
+ * invoked with three arguments: (value, index, array).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.dropWhile(users, function(o) { return !o.active; });
+ * // => objects for ['pebbles']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.dropWhile(users, { 'user': 'barney', 'active': false });
+ * // => objects for ['fred', 'pebbles']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.dropWhile(users, ['active', false]);
+ * // => objects for ['pebbles']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.dropWhile(users, 'active');
+ * // => objects for ['barney', 'fred', 'pebbles']
+ */
- var disabled = _operation.disabled();
- if (disabled) {
- context.ui().flash.duration(4000).iconName('#iD-operation-' + _operation.id).iconClass('operation disabled').label(_operation.tooltip)();
- } else {
- context.ui().flash.duration(2000).iconName('#iD-operation-' + _operation.id).iconClass('operation').label(_operation.annotation() || _operation.title)();
- if (_operation.point) _operation.point(null);
+ function dropWhile(array, predicate) {
+ return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : [];
+ }
+ /**
+ * Fills elements of `array` with `value` from `start` up to, but not
+ * including, `end`.
+ *
+ * **Note:** This method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.2.0
+ * @category Array
+ * @param {Array} array The array to fill.
+ * @param {*} value The value to fill `array` with.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _.fill(array, 'a');
+ * console.log(array);
+ * // => ['a', 'a', 'a']
+ *
+ * _.fill(Array(3), 2);
+ * // => [2, 2, 2]
+ *
+ * _.fill([4, 6, 8, 10], '*', 1, 3);
+ * // => [4, '*', '*', 10]
+ */
- _operation();
- }
- }
- function behavior() {
- if (_operation && _operation.available()) {
- context.keybinding().on(_operation.keys, keypress);
- }
+ function fill(array, value, start, end) {
+ var length = array == null ? 0 : array.length;
- return behavior;
- }
+ if (!length) {
+ return [];
+ }
- behavior.off = function () {
- context.keybinding().off(_operation.keys);
- };
+ if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
+ start = 0;
+ end = length;
+ }
- behavior.which = function (_) {
- if (!arguments.length) return _operation;
- _operation = _;
- return behavior;
- };
+ return baseFill(array, value, start, end);
+ }
+ /**
+ * This method is like `_.find` except that it returns the index of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.findIndex(users, function(o) { return o.user == 'barney'; });
+ * // => 0
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findIndex(users, { 'user': 'fred', 'active': false });
+ * // => 1
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findIndex(users, ['active', false]);
+ * // => 0
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findIndex(users, 'active');
+ * // => 2
+ */
- return behavior;
- }
- function operationCircularize(context, selectedIDs) {
- var _extent;
+ function findIndex(array, predicate, fromIndex) {
+ var length = array == null ? 0 : array.length;
+
+ if (!length) {
+ return -1;
+ }
- var _actions = selectedIDs.map(getAction).filter(Boolean);
+ var index = fromIndex == null ? 0 : toInteger(fromIndex);
- var _amount = _actions.length === 1 ? 'single' : 'multiple';
+ if (index < 0) {
+ index = nativeMax(length + index, 0);
+ }
- var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function (n) {
- return n.loc;
- });
+ return baseFindIndex(array, getIteratee(predicate, 3), index);
+ }
+ /**
+ * This method is like `_.findIndex` except that it iterates over elements
+ * of `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=array.length-1] The index to search from.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
+ * // => 2
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findLastIndex(users, { 'user': 'barney', 'active': true });
+ * // => 0
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findLastIndex(users, ['active', false]);
+ * // => 2
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findLastIndex(users, 'active');
+ * // => 0
+ */
- function getAction(entityID) {
- var entity = context.entity(entityID);
- if (entity.type !== 'way' || new Set(entity.nodes).size <= 1) return null;
- if (!_extent) {
- _extent = entity.extent(context.graph());
- } else {
- _extent = _extent.extend(entity.extent(context.graph()));
- }
+ function findLastIndex(array, predicate, fromIndex) {
+ var length = array == null ? 0 : array.length;
- return actionCircularize(entityID, context.projection);
- }
+ if (!length) {
+ return -1;
+ }
- var operation = function operation() {
- if (!_actions.length) return;
+ var index = length - 1;
- var combinedAction = function combinedAction(graph, t) {
- _actions.forEach(function (action) {
- if (!action.disabled(graph)) {
- graph = action(graph, t);
+ if (fromIndex !== undefined$1) {
+ index = toInteger(fromIndex);
+ index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
}
- });
- return graph;
- };
+ return baseFindIndex(array, getIteratee(predicate, 3), index, true);
+ }
+ /**
+ * Flattens `array` a single level deep.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flatten([1, [2, [3, [4]], 5]]);
+ * // => [1, 2, [3, [4]], 5]
+ */
- combinedAction.transitionable = true;
- context.perform(combinedAction, operation.annotation());
- window.setTimeout(function () {
- context.validator().validate();
- }, 300); // after any transition
- };
- operation.available = function () {
- return _actions.length && selectedIDs.length === _actions.length;
- }; // don't cache this because the visible extent could change
+ function flatten(array) {
+ var length = array == null ? 0 : array.length;
+ return length ? baseFlatten(array, 1) : [];
+ }
+ /**
+ * Recursively flattens `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flattenDeep([1, [2, [3, [4]], 5]]);
+ * // => [1, 2, 3, 4, 5]
+ */
- operation.disabled = function () {
- if (!_actions.length) return '';
+ function flattenDeep(array) {
+ var length = array == null ? 0 : array.length;
+ return length ? baseFlatten(array, INFINITY) : [];
+ }
+ /**
+ * Recursively flatten `array` up to `depth` times.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.4.0
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @param {number} [depth=1] The maximum recursion depth.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * var array = [1, [2, [3, [4]], 5]];
+ *
+ * _.flattenDepth(array, 1);
+ * // => [1, 2, [3, [4]], 5]
+ *
+ * _.flattenDepth(array, 2);
+ * // => [1, 2, 3, [4], 5]
+ */
- var actionDisableds = _actions.map(function (action) {
- return action.disabled(context.graph());
- }).filter(Boolean);
- if (actionDisableds.length === _actions.length) {
- // none of the features can be circularized
- if (new Set(actionDisableds).size > 1) {
- return 'multiple_blockers';
- }
+ function flattenDepth(array, depth) {
+ var length = array == null ? 0 : array.length;
- return actionDisableds[0];
- } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
- return 'too_large';
- } else if (someMissing()) {
- return 'not_downloaded';
- } else if (selectedIDs.some(context.hasHiddenConnections)) {
- return 'connected_to_hidden';
- }
+ if (!length) {
+ return [];
+ }
- return false;
+ depth = depth === undefined$1 ? 1 : toInteger(depth);
+ return baseFlatten(array, depth);
+ }
+ /**
+ * The inverse of `_.toPairs`; this method returns an object composed
+ * from key-value `pairs`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} pairs The key-value pairs.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.fromPairs([['a', 1], ['b', 2]]);
+ * // => { 'a': 1, 'b': 2 }
+ */
- function someMissing() {
- if (context.inIntro()) return false;
- var osm = context.connection();
- if (osm) {
- var missing = _coords.filter(function (loc) {
- return !osm.isDataLoaded(loc);
- });
+ function fromPairs(pairs) {
+ var index = -1,
+ length = pairs == null ? 0 : pairs.length,
+ result = {};
- if (missing.length) {
- missing.forEach(function (loc) {
- context.loadTileAtLoc(loc);
- });
- return true;
+ while (++index < length) {
+ var pair = pairs[index];
+ result[pair[0]] = pair[1];
}
+
+ return result;
}
+ /**
+ * Gets the first element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @alias first
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the first element of `array`.
+ * @example
+ *
+ * _.head([1, 2, 3]);
+ * // => 1
+ *
+ * _.head([]);
+ * // => undefined
+ */
- return false;
- }
- };
- operation.tooltip = function () {
- var disable = operation.disabled();
- return disable ? _t('operations.circularize.' + disable + '.' + _amount) : _t('operations.circularize.description.' + _amount);
- };
+ function head(array) {
+ return array && array.length ? array[0] : undefined$1;
+ }
+ /**
+ * Gets the index at which the first occurrence of `value` is found in `array`
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons. If `fromIndex` is negative, it's used as the
+ * offset from the end of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.indexOf([1, 2, 1, 2], 2);
+ * // => 1
+ *
+ * // Search from the `fromIndex`.
+ * _.indexOf([1, 2, 1, 2], 2, 2);
+ * // => 3
+ */
- operation.annotation = function () {
- return _t('operations.circularize.annotation.feature', {
- n: _actions.length
- });
- };
- operation.id = 'circularize';
- operation.keys = [_t('operations.circularize.key')];
- operation.title = _t('operations.circularize.title');
- operation.behavior = behaviorOperation(context).which(operation);
- return operation;
- }
+ function indexOf(array, value, fromIndex) {
+ var length = array == null ? 0 : array.length;
- // For example, âZ -> Ctrl+Z
+ if (!length) {
+ return -1;
+ }
- var uiCmd = function uiCmd(code) {
- var detected = utilDetect();
+ var index = fromIndex == null ? 0 : toInteger(fromIndex);
- if (detected.os === 'mac') {
- return code;
- }
+ if (index < 0) {
+ index = nativeMax(length + index, 0);
+ }
- if (detected.os === 'win') {
- if (code === 'ââ§Z') return 'Ctrl+Y';
- }
+ return baseIndexOf(array, value, index);
+ }
+ /**
+ * Gets all but the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.initial([1, 2, 3]);
+ * // => [1, 2]
+ */
- var result = '',
- replacements = {
- 'â': 'Ctrl',
- 'â§': 'Shift',
- 'â¥': 'Alt',
- 'â«': 'Backspace',
- 'â¦': 'Delete'
- };
- for (var i = 0; i < code.length; i++) {
- if (code[i] in replacements) {
- result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
- } else {
- result += code[i];
- }
- }
+ function initial(array) {
+ var length = array == null ? 0 : array.length;
+ return length ? baseSlice(array, 0, -1) : [];
+ }
+ /**
+ * Creates an array of unique values that are included in all given arrays
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons. The order and references of result values are
+ * determined by the first array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of intersecting values.
+ * @example
+ *
+ * _.intersection([2, 1], [2, 3]);
+ * // => [2]
+ */
- return result;
- }; // return a display-focused string for a given keyboard code
- uiCmd.display = function (code) {
- if (code.length !== 1) return code;
- var detected = utilDetect();
- var mac = detected.os === 'mac';
- var replacements = {
- 'â': mac ? 'â ' + _t('shortcuts.key.cmd') : _t('shortcuts.key.ctrl'),
- 'â§': mac ? '⧠' + _t('shortcuts.key.shift') : _t('shortcuts.key.shift'),
- 'â¥': mac ? '⥠' + _t('shortcuts.key.option') : _t('shortcuts.key.alt'),
- 'â': mac ? 'â ' + _t('shortcuts.key.ctrl') : _t('shortcuts.key.ctrl'),
- 'â«': mac ? 'â« ' + _t('shortcuts.key.delete') : _t('shortcuts.key.backspace'),
- 'â¦': mac ? '⦠' + _t('shortcuts.key.del') : _t('shortcuts.key.del'),
- 'â': mac ? 'â ' + _t('shortcuts.key.pgup') : _t('shortcuts.key.pgup'),
- 'â': mac ? 'â ' + _t('shortcuts.key.pgdn') : _t('shortcuts.key.pgdn'),
- 'â': mac ? 'â ' + _t('shortcuts.key.home') : _t('shortcuts.key.home'),
- 'â': mac ? 'â ' + _t('shortcuts.key.end') : _t('shortcuts.key.end'),
- 'âµ': mac ? 'â ' + _t('shortcuts.key.return') : _t('shortcuts.key.enter'),
- 'â': mac ? 'â ' + _t('shortcuts.key.esc') : _t('shortcuts.key.esc'),
- 'â°': mac ? 'â° ' + _t('shortcuts.key.menu') : _t('shortcuts.key.menu')
- };
- return replacements[code] || code;
- };
+ var intersection = baseRest(function (arrays) {
+ var mapped = arrayMap(arrays, castArrayLikeObject);
+ return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];
+ });
+ /**
+ * This method is like `_.intersection` except that it accepts `iteratee`
+ * which is invoked for each element of each `arrays` to generate the criterion
+ * by which they're compared. The order and references of result values are
+ * determined by the first array. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new array of intersecting values.
+ * @example
+ *
+ * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+ * // => [2.1]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }]
+ */
- function operationDelete(context, selectedIDs) {
- var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
- var action = actionDeleteMultiple(selectedIDs);
- var nodes = utilGetAllNodes(selectedIDs, context.graph());
- var coords = nodes.map(function (n) {
- return n.loc;
- });
- var extent = utilTotalExtent(selectedIDs, context.graph());
+ var intersectionBy = baseRest(function (arrays) {
+ var iteratee = last(arrays),
+ mapped = arrayMap(arrays, castArrayLikeObject);
- var operation = function operation() {
- var nextSelectedID;
- var nextSelectedLoc;
+ if (iteratee === last(mapped)) {
+ iteratee = undefined$1;
+ } else {
+ mapped.pop();
+ }
- if (selectedIDs.length === 1) {
- var id = selectedIDs[0];
- var entity = context.entity(id);
- var geometry = entity.geometry(context.graph());
- var parents = context.graph().parentWays(entity);
- var parent = parents[0]; // Select the next closest node in the way.
+ return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee, 2)) : [];
+ });
+ /**
+ * This method is like `_.intersection` except that it accepts `comparator`
+ * which is invoked to compare elements of `arrays`. The order and references
+ * of result values are determined by the first array. The comparator is
+ * invoked with two arguments: (arrVal, othVal).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of intersecting values.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+ * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+ *
+ * _.intersectionWith(objects, others, _.isEqual);
+ * // => [{ 'x': 1, 'y': 2 }]
+ */
- if (geometry === 'vertex') {
- var nodes = parent.nodes;
- var i = nodes.indexOf(id);
+ var intersectionWith = baseRest(function (arrays) {
+ var comparator = last(arrays),
+ mapped = arrayMap(arrays, castArrayLikeObject);
+ comparator = typeof comparator == 'function' ? comparator : undefined$1;
- if (i === 0) {
- i++;
- } else if (i === nodes.length - 1) {
- i--;
- } else {
- var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc);
- var b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
- i = a < b ? i - 1 : i + 1;
+ if (comparator) {
+ mapped.pop();
}
- nextSelectedID = nodes[i];
- nextSelectedLoc = context.entity(nextSelectedID).loc;
+ return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined$1, comparator) : [];
+ });
+ /**
+ * Converts all elements in `array` into a string separated by `separator`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to convert.
+ * @param {string} [separator=','] The element separator.
+ * @returns {string} Returns the joined string.
+ * @example
+ *
+ * _.join(['a', 'b', 'c'], '~');
+ * // => 'a~b~c'
+ */
+
+ function join(array, separator) {
+ return array == null ? '' : nativeJoin.call(array, separator);
}
- }
+ /**
+ * Gets the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the last element of `array`.
+ * @example
+ *
+ * _.last([1, 2, 3]);
+ * // => 3
+ */
- context.perform(action, operation.annotation());
- context.validator().validate();
- if (nextSelectedID && nextSelectedLoc) {
- if (context.hasEntity(nextSelectedID)) {
- context.enter(modeSelect(context, [nextSelectedID]).follow(true));
- } else {
- context.map().centerEase(nextSelectedLoc);
- context.enter(modeBrowse(context));
+ function last(array) {
+ var length = array == null ? 0 : array.length;
+ return length ? array[length - 1] : undefined$1;
}
- } else {
- context.enter(modeBrowse(context));
- }
- };
-
- operation.available = function () {
- return true;
- };
+ /**
+ * This method is like `_.indexOf` except that it iterates over elements of
+ * `array` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} [fromIndex=array.length-1] The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.lastIndexOf([1, 2, 1, 2], 2);
+ * // => 3
+ *
+ * // Search from the `fromIndex`.
+ * _.lastIndexOf([1, 2, 1, 2], 2, 2);
+ * // => 1
+ */
- operation.disabled = function () {
- if (extent.percentContainedIn(context.map().extent()) < 0.8) {
- return 'too_large';
- } else if (someMissing()) {
- return 'not_downloaded';
- } else if (selectedIDs.some(context.hasHiddenConnections)) {
- return 'connected_to_hidden';
- } else if (selectedIDs.some(protectedMember)) {
- return 'part_of_relation';
- } else if (selectedIDs.some(incompleteRelation)) {
- return 'incomplete_relation';
- } else if (selectedIDs.some(hasWikidataTag)) {
- return 'has_wikidata_tag';
- }
- return false;
+ function lastIndexOf(array, value, fromIndex) {
+ var length = array == null ? 0 : array.length;
- function someMissing() {
- if (context.inIntro()) return false;
- var osm = context.connection();
+ if (!length) {
+ return -1;
+ }
- if (osm) {
- var missing = coords.filter(function (loc) {
- return !osm.isDataLoaded(loc);
- });
+ var index = length;
- if (missing.length) {
- missing.forEach(function (loc) {
- context.loadTileAtLoc(loc);
- });
- return true;
+ if (fromIndex !== undefined$1) {
+ index = toInteger(fromIndex);
+ index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
}
+
+ return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true);
}
+ /**
+ * Gets the element at index `n` of `array`. If `n` is negative, the nth
+ * element from the end is returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.11.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=0] The index of the element to return.
+ * @returns {*} Returns the nth element of `array`.
+ * @example
+ *
+ * var array = ['a', 'b', 'c', 'd'];
+ *
+ * _.nth(array, 1);
+ * // => 'b'
+ *
+ * _.nth(array, -2);
+ * // => 'c';
+ */
- return false;
- }
- function hasWikidataTag(id) {
- var entity = context.entity(id);
- return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
- }
+ function nth(array, n) {
+ return array && array.length ? baseNth(array, toInteger(n)) : undefined$1;
+ }
+ /**
+ * Removes all given values from `array` using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
+ * to remove elements from an array by predicate.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {...*} [values] The values to remove.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+ *
+ * _.pull(array, 'a', 'c');
+ * console.log(array);
+ * // => ['b', 'b']
+ */
- function incompleteRelation(id) {
- var entity = context.entity(id);
- return entity.type === 'relation' && !entity.isComplete(context.graph());
- }
- function protectedMember(id) {
- var entity = context.entity(id);
- if (entity.type !== 'way') return false;
- var parents = context.graph().parentRelations(entity);
+ var pull = baseRest(pullAll);
+ /**
+ * This method is like `_.pull` except that it accepts an array of values to remove.
+ *
+ * **Note:** Unlike `_.difference`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to remove.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+ *
+ * _.pullAll(array, ['a', 'c']);
+ * console.log(array);
+ * // => ['b', 'b']
+ */
- for (var i = 0; i < parents.length; i++) {
- var parent = parents[i];
- var type = parent.tags.type;
- var role = parent.memberById(id).role || 'outer';
+ function pullAll(array, values) {
+ return array && array.length && values && values.length ? basePullAll(array, values) : array;
+ }
+ /**
+ * This method is like `_.pullAll` except that it accepts `iteratee` which is
+ * invoked for each element of `array` and `values` to generate the criterion
+ * by which they're compared. The iteratee is invoked with one argument: (value).
+ *
+ * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to remove.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
+ *
+ * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
+ * console.log(array);
+ * // => [{ 'x': 2 }]
+ */
- if (type === 'route' || type === 'boundary' || type === 'multipolygon' && role === 'outer') {
- return true;
- }
+
+ function pullAllBy(array, values, iteratee) {
+ return array && array.length && values && values.length ? basePullAll(array, values, getIteratee(iteratee, 2)) : array;
}
+ /**
+ * This method is like `_.pullAll` except that it accepts `comparator` which
+ * is invoked to compare elements of `array` to `values`. The comparator is
+ * invoked with two arguments: (arrVal, othVal).
+ *
+ * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.6.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to remove.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
+ *
+ * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
+ * console.log(array);
+ * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
+ */
- return false;
- }
- };
- operation.tooltip = function () {
- var disable = operation.disabled();
- return disable ? _t('operations.delete.' + disable + '.' + multi) : _t('operations.delete.description.' + multi);
- };
+ function pullAllWith(array, values, comparator) {
+ return array && array.length && values && values.length ? basePullAll(array, values, undefined$1, comparator) : array;
+ }
+ /**
+ * Removes elements from `array` corresponding to `indexes` and returns an
+ * array of removed elements.
+ *
+ * **Note:** Unlike `_.at`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {...(number|number[])} [indexes] The indexes of elements to remove.
+ * @returns {Array} Returns the new array of removed elements.
+ * @example
+ *
+ * var array = ['a', 'b', 'c', 'd'];
+ * var pulled = _.pullAt(array, [1, 3]);
+ *
+ * console.log(array);
+ * // => ['a', 'c']
+ *
+ * console.log(pulled);
+ * // => ['b', 'd']
+ */
- operation.annotation = function () {
- return selectedIDs.length === 1 ? _t('operations.delete.annotation.' + context.graph().geometry(selectedIDs[0])) : _t('operations.delete.annotation.feature', {
- n: selectedIDs.length
- });
- };
- operation.id = 'delete';
- operation.keys = [uiCmd('ââ«'), uiCmd('ââ¦'), uiCmd('â¦')];
- operation.title = _t('operations.delete.title');
- operation.behavior = behaviorOperation(context).which(operation);
- return operation;
- }
+ var pullAt = flatRest(function (array, indexes) {
+ var length = array == null ? 0 : array.length,
+ result = baseAt(array, indexes);
+ basePullAt(array, arrayMap(indexes, function (index) {
+ return isIndex(index, length) ? +index : index;
+ }).sort(compareAscending));
+ return result;
+ });
+ /**
+ * Removes all elements from `array` that `predicate` returns truthy for
+ * and returns an array of the removed elements. The predicate is invoked
+ * with three arguments: (value, index, array).
+ *
+ * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
+ * to pull elements from an array by value.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new array of removed elements.
+ * @example
+ *
+ * var array = [1, 2, 3, 4];
+ * var evens = _.remove(array, function(n) {
+ * return n % 2 == 0;
+ * });
+ *
+ * console.log(array);
+ * // => [1, 3]
+ *
+ * console.log(evens);
+ * // => [2, 4]
+ */
- function operationOrthogonalize(context, selectedIDs) {
- var _extent;
+ function remove(array, predicate) {
+ var result = [];
- var _type;
+ if (!(array && array.length)) {
+ return result;
+ }
- var _actions = selectedIDs.map(chooseAction).filter(Boolean);
+ var index = -1,
+ indexes = [],
+ length = array.length;
+ predicate = getIteratee(predicate, 3);
- var _amount = _actions.length === 1 ? 'single' : 'multiple';
+ while (++index < length) {
+ var value = array[index];
- var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function (n) {
- return n.loc;
- });
+ if (predicate(value, index, array)) {
+ result.push(value);
+ indexes.push(index);
+ }
+ }
- function chooseAction(entityID) {
- var entity = context.entity(entityID);
- var geometry = entity.geometry(context.graph());
+ basePullAt(array, indexes);
+ return result;
+ }
+ /**
+ * Reverses `array` so that the first element becomes the last, the second
+ * element becomes the second to last, and so on.
+ *
+ * **Note:** This method mutates `array` and is based on
+ * [`Array#reverse`](https://mdn.io/Array/reverse).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _.reverse(array);
+ * // => [3, 2, 1]
+ *
+ * console.log(array);
+ * // => [3, 2, 1]
+ */
- if (!_extent) {
- _extent = entity.extent(context.graph());
- } else {
- _extent = _extent.extend(entity.extent(context.graph()));
- } // square a line/area
+ function reverse(array) {
+ return array == null ? array : nativeReverse.call(array);
+ }
+ /**
+ * Creates a slice of `array` from `start` up to, but not including, `end`.
+ *
+ * **Note:** This method is used instead of
+ * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
+ * returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */
- if (entity.type === 'way' && new Set(entity.nodes).size > 2) {
- if (_type && _type !== 'feature') return null;
- _type = 'feature';
- return actionOrthogonalize(entityID, context.projection); // square a single vertex
- } else if (geometry === 'vertex') {
- if (_type && _type !== 'corner') return null;
- _type = 'corner';
- var graph = context.graph();
- var parents = graph.parentWays(entity);
- if (parents.length === 1) {
- var way = parents[0];
+ function slice(array, start, end) {
+ var length = array == null ? 0 : array.length;
- if (way.nodes.indexOf(entityID) !== -1) {
- return actionOrthogonalize(way.id, context.projection, entityID);
+ if (!length) {
+ return [];
+ }
+
+ if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
+ start = 0;
+ end = length;
+ } else {
+ start = start == null ? 0 : toInteger(start);
+ end = end === undefined$1 ? length : toInteger(end);
}
+
+ return baseSlice(array, start, end);
}
- }
+ /**
+ * Uses a binary search to determine the lowest index at which `value`
+ * should be inserted into `array` in order to maintain its sort order.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * _.sortedIndex([30, 50], 40);
+ * // => 1
+ */
- return null;
- }
- var operation = function operation() {
- if (!_actions.length) return;
+ function sortedIndex(array, value) {
+ return baseSortedIndex(array, value);
+ }
+ /**
+ * This method is like `_.sortedIndex` except that it accepts `iteratee`
+ * which is invoked for `value` and each element of `array` to compute their
+ * sort ranking. The iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * var objects = [{ 'x': 4 }, { 'x': 5 }];
+ *
+ * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+ * // => 0
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
+ * // => 0
+ */
- var combinedAction = function combinedAction(graph, t) {
- _actions.forEach(function (action) {
- if (!action.disabled(graph)) {
- graph = action(graph, t);
- }
- });
- return graph;
- };
+ function sortedIndexBy(array, value, iteratee) {
+ return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
+ }
+ /**
+ * This method is like `_.indexOf` except that it performs a binary
+ * search on a sorted `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
+ * // => 1
+ */
- combinedAction.transitionable = true;
- context.perform(combinedAction, operation.annotation());
- window.setTimeout(function () {
- context.validator().validate();
- }, 300); // after any transition
- };
- operation.available = function () {
- return _actions.length && selectedIDs.length === _actions.length;
- }; // don't cache this because the visible extent could change
+ function sortedIndexOf(array, value) {
+ var length = array == null ? 0 : array.length;
+ if (length) {
+ var index = baseSortedIndex(array, value);
- operation.disabled = function () {
- if (!_actions.length) return '';
+ if (index < length && eq(array[index], value)) {
+ return index;
+ }
+ }
+
+ return -1;
+ }
+ /**
+ * This method is like `_.sortedIndex` except that it returns the highest
+ * index at which `value` should be inserted into `array` in order to
+ * maintain its sort order.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
+ * // => 4
+ */
- var actionDisableds = _actions.map(function (action) {
- return action.disabled(context.graph());
- }).filter(Boolean);
- if (actionDisableds.length === _actions.length) {
- // none of the features can be squared
- if (new Set(actionDisableds).size > 1) {
- return 'multiple_blockers';
+ function sortedLastIndex(array, value) {
+ return baseSortedIndex(array, value, true);
}
+ /**
+ * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
+ * which is invoked for `value` and each element of `array` to compute their
+ * sort ranking. The iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * var objects = [{ 'x': 4 }, { 'x': 5 }];
+ *
+ * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+ * // => 1
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
+ * // => 1
+ */
- return actionDisableds[0];
- } else if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
- return 'too_large';
- } else if (someMissing()) {
- return 'not_downloaded';
- } else if (selectedIDs.some(context.hasHiddenConnections)) {
- return 'connected_to_hidden';
- }
- return false;
+ function sortedLastIndexBy(array, value, iteratee) {
+ return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
+ }
+ /**
+ * This method is like `_.lastIndexOf` except that it performs a binary
+ * search on a sorted `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
+ * // => 3
+ */
- function someMissing() {
- if (context.inIntro()) return false;
- var osm = context.connection();
- if (osm) {
- var missing = _coords.filter(function (loc) {
- return !osm.isDataLoaded(loc);
- });
+ function sortedLastIndexOf(array, value) {
+ var length = array == null ? 0 : array.length;
- if (missing.length) {
- missing.forEach(function (loc) {
- context.loadTileAtLoc(loc);
- });
- return true;
+ if (length) {
+ var index = baseSortedIndex(array, value, true) - 1;
+
+ if (eq(array[index], value)) {
+ return index;
+ }
}
- }
- return false;
- }
- };
+ return -1;
+ }
+ /**
+ * This method is like `_.uniq` except that it's designed and optimized
+ * for sorted arrays.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.sortedUniq([1, 1, 2]);
+ * // => [1, 2]
+ */
- operation.tooltip = function () {
- var disable = operation.disabled();
- return disable ? _t('operations.orthogonalize.' + disable + '.' + _amount) : _t('operations.orthogonalize.description.' + _type + '.' + _amount);
- };
- operation.annotation = function () {
- return _t('operations.orthogonalize.annotation.' + _type, {
- n: _actions.length
- });
- };
+ function sortedUniq(array) {
+ return array && array.length ? baseSortedUniq(array) : [];
+ }
+ /**
+ * This method is like `_.uniqBy` except that it's designed and optimized
+ * for sorted arrays.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
+ * // => [1.1, 2.3]
+ */
- operation.id = 'orthogonalize';
- operation.keys = [_t('operations.orthogonalize.key')];
- operation.title = _t('operations.orthogonalize.title');
- operation.behavior = behaviorOperation(context).which(operation);
- return operation;
- }
- function operationReflectShort(context, selectedIDs) {
- return operationReflect(context, selectedIDs, 'short');
- }
- function operationReflectLong(context, selectedIDs) {
- return operationReflect(context, selectedIDs, 'long');
- }
- function operationReflect(context, selectedIDs, axis) {
- axis = axis || 'long';
- var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
- var nodes = utilGetAllNodes(selectedIDs, context.graph());
- var coords = nodes.map(function (n) {
- return n.loc;
- });
- var extent = utilTotalExtent(selectedIDs, context.graph());
+ function sortedUniqBy(array, iteratee) {
+ return array && array.length ? baseSortedUniq(array, getIteratee(iteratee, 2)) : [];
+ }
+ /**
+ * Gets all but the first element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.tail([1, 2, 3]);
+ * // => [2, 3]
+ */
- var operation = function operation() {
- var action = actionReflect(selectedIDs, context.projection).useLongAxis(Boolean(axis === 'long'));
- context.perform(action, operation.annotation());
- window.setTimeout(function () {
- context.validator().validate();
- }, 300); // after any transition
- };
- operation.available = function () {
- return nodes.length >= 3;
- }; // don't cache this because the visible extent could change
+ function tail(array) {
+ var length = array == null ? 0 : array.length;
+ return length ? baseSlice(array, 1, length) : [];
+ }
+ /**
+ * Creates a slice of `array` with `n` elements taken from the beginning.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to take.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.take([1, 2, 3]);
+ * // => [1]
+ *
+ * _.take([1, 2, 3], 2);
+ * // => [1, 2]
+ *
+ * _.take([1, 2, 3], 5);
+ * // => [1, 2, 3]
+ *
+ * _.take([1, 2, 3], 0);
+ * // => []
+ */
- operation.disabled = function () {
- if (extent.percentContainedIn(context.map().extent()) < 0.8) {
- return 'too_large';
- } else if (someMissing()) {
- return 'not_downloaded';
- } else if (selectedIDs.some(context.hasHiddenConnections)) {
- return 'connected_to_hidden';
- } else if (selectedIDs.some(incompleteRelation)) {
- return 'incomplete_relation';
- }
+ function take(array, n, guard) {
+ if (!(array && array.length)) {
+ return [];
+ }
- return false;
+ n = guard || n === undefined$1 ? 1 : toInteger(n);
+ return baseSlice(array, 0, n < 0 ? 0 : n);
+ }
+ /**
+ * Creates a slice of `array` with `n` elements taken from the end.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to take.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.takeRight([1, 2, 3]);
+ * // => [3]
+ *
+ * _.takeRight([1, 2, 3], 2);
+ * // => [2, 3]
+ *
+ * _.takeRight([1, 2, 3], 5);
+ * // => [1, 2, 3]
+ *
+ * _.takeRight([1, 2, 3], 0);
+ * // => []
+ */
- function someMissing() {
- if (context.inIntro()) return false;
- var osm = context.connection();
- if (osm) {
- var missing = coords.filter(function (loc) {
- return !osm.isDataLoaded(loc);
- });
+ function takeRight(array, n, guard) {
+ var length = array == null ? 0 : array.length;
- if (missing.length) {
- missing.forEach(function (loc) {
- context.loadTileAtLoc(loc);
- });
- return true;
+ if (!length) {
+ return [];
}
+
+ n = guard || n === undefined$1 ? 1 : toInteger(n);
+ n = length - n;
+ return baseSlice(array, n < 0 ? 0 : n, length);
}
+ /**
+ * Creates a slice of `array` with elements taken from the end. Elements are
+ * taken until `predicate` returns falsey. The predicate is invoked with
+ * three arguments: (value, index, array).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * _.takeRightWhile(users, function(o) { return !o.active; });
+ * // => objects for ['fred', 'pebbles']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
+ * // => objects for ['pebbles']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.takeRightWhile(users, ['active', false]);
+ * // => objects for ['fred', 'pebbles']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.takeRightWhile(users, 'active');
+ * // => []
+ */
- return false;
- }
- function incompleteRelation(id) {
- var entity = context.entity(id);
- return entity.type === 'relation' && !entity.isComplete(context.graph());
- }
- };
+ function takeRightWhile(array, predicate) {
+ return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : [];
+ }
+ /**
+ * Creates a slice of `array` with elements taken from the beginning. Elements
+ * are taken until `predicate` returns falsey. The predicate is invoked with
+ * three arguments: (value, index, array).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.takeWhile(users, function(o) { return !o.active; });
+ * // => objects for ['barney', 'fred']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.takeWhile(users, { 'user': 'barney', 'active': false });
+ * // => objects for ['barney']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.takeWhile(users, ['active', false]);
+ * // => objects for ['barney', 'fred']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.takeWhile(users, 'active');
+ * // => []
+ */
- operation.tooltip = function () {
- var disable = operation.disabled();
- return disable ? _t('operations.reflect.' + disable + '.' + multi) : _t('operations.reflect.description.' + axis + '.' + multi);
- };
- operation.annotation = function () {
- return _t('operations.reflect.annotation.' + axis + '.feature', {
- n: selectedIDs.length
- });
- };
+ function takeWhile(array, predicate) {
+ return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : [];
+ }
+ /**
+ * Creates an array of unique values, in order, from all given arrays using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * _.union([2], [1, 2]);
+ * // => [2, 1]
+ */
- operation.id = 'reflect-' + axis;
- operation.keys = [_t('operations.reflect.key.' + axis)];
- operation.title = _t('operations.reflect.title.' + axis);
- operation.behavior = behaviorOperation(context).which(operation);
- return operation;
- }
- function operationMove(context, selectedIDs) {
- var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
- var nodes = utilGetAllNodes(selectedIDs, context.graph());
- var coords = nodes.map(function (n) {
- return n.loc;
- });
- var extent = utilTotalExtent(selectedIDs, context.graph());
+ var union = baseRest(function (arrays) {
+ return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
+ });
+ /**
+ * This method is like `_.union` except that it accepts `iteratee` which is
+ * invoked for each element of each `arrays` to generate the criterion by
+ * which uniqueness is computed. Result values are chosen from the first
+ * array in which the value occurs. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * _.unionBy([2.1], [1.2, 2.3], Math.floor);
+ * // => [2.1, 1.2]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }, { 'x': 2 }]
+ */
- var operation = function operation() {
- context.enter(modeMove(context, selectedIDs));
- };
+ var unionBy = baseRest(function (arrays) {
+ var iteratee = last(arrays);
- operation.available = function () {
- return selectedIDs.length > 1 || context.entity(selectedIDs[0]).type !== 'node';
- };
+ if (isArrayLikeObject(iteratee)) {
+ iteratee = undefined$1;
+ }
- operation.disabled = function () {
- if (extent.percentContainedIn(context.map().extent()) < 0.8) {
- return 'too_large';
- } else if (someMissing()) {
- return 'not_downloaded';
- } else if (selectedIDs.some(context.hasHiddenConnections)) {
- return 'connected_to_hidden';
- } else if (selectedIDs.some(incompleteRelation)) {
- return 'incomplete_relation';
- }
+ return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
+ });
+ /**
+ * This method is like `_.union` except that it accepts `comparator` which
+ * is invoked to compare elements of `arrays`. Result values are chosen from
+ * the first array in which the value occurs. The comparator is invoked
+ * with two arguments: (arrVal, othVal).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+ * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+ *
+ * _.unionWith(objects, others, _.isEqual);
+ * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+ */
- return false;
+ var unionWith = baseRest(function (arrays) {
+ var comparator = last(arrays);
+ comparator = typeof comparator == 'function' ? comparator : undefined$1;
+ return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined$1, comparator);
+ });
+ /**
+ * Creates a duplicate-free version of an array, using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons, in which only the first occurrence of each element
+ * is kept. The order of result values is determined by the order they occur
+ * in the array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.uniq([2, 1, 2]);
+ * // => [2, 1]
+ */
- function someMissing() {
- if (context.inIntro()) return false;
- var osm = context.connection();
+ function uniq(array) {
+ return array && array.length ? baseUniq(array) : [];
+ }
+ /**
+ * This method is like `_.uniq` except that it accepts `iteratee` which is
+ * invoked for each element in `array` to generate the criterion by which
+ * uniqueness is computed. The order of result values is determined by the
+ * order they occur in the array. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
+ * // => [2.1, 1.2]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }, { 'x': 2 }]
+ */
- if (osm) {
- var missing = coords.filter(function (loc) {
- return !osm.isDataLoaded(loc);
- });
- if (missing.length) {
- missing.forEach(function (loc) {
- context.loadTileAtLoc(loc);
- });
- return true;
- }
+ function uniqBy(array, iteratee) {
+ return array && array.length ? baseUniq(array, getIteratee(iteratee, 2)) : [];
}
+ /**
+ * This method is like `_.uniq` except that it accepts `comparator` which
+ * is invoked to compare elements of `array`. The order of result values is
+ * determined by the order they occur in the array.The comparator is invoked
+ * with two arguments: (arrVal, othVal).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
+ *
+ * _.uniqWith(objects, _.isEqual);
+ * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
+ */
- return false;
- }
- function incompleteRelation(id) {
- var entity = context.entity(id);
- return entity.type === 'relation' && !entity.isComplete(context.graph());
- }
- };
+ function uniqWith(array, comparator) {
+ comparator = typeof comparator == 'function' ? comparator : undefined$1;
+ return array && array.length ? baseUniq(array, undefined$1, comparator) : [];
+ }
+ /**
+ * This method is like `_.zip` except that it accepts an array of grouped
+ * elements and creates an array regrouping the elements to their pre-zip
+ * configuration.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.2.0
+ * @category Array
+ * @param {Array} array The array of grouped elements to process.
+ * @returns {Array} Returns the new array of regrouped elements.
+ * @example
+ *
+ * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
+ * // => [['a', 1, true], ['b', 2, false]]
+ *
+ * _.unzip(zipped);
+ * // => [['a', 'b'], [1, 2], [true, false]]
+ */
- operation.tooltip = function () {
- var disable = operation.disabled();
- return disable ? _t('operations.move.' + disable + '.' + multi) : _t('operations.move.description.' + multi);
- };
- operation.annotation = function () {
- return selectedIDs.length === 1 ? _t('operations.move.annotation.' + context.graph().geometry(selectedIDs[0])) : _t('operations.move.annotation.feature', {
- n: selectedIDs.length
- });
- };
+ function unzip(array) {
+ if (!(array && array.length)) {
+ return [];
+ }
- operation.id = 'move';
- operation.keys = [_t('operations.move.key')];
- operation.title = _t('operations.move.title');
- operation.behavior = behaviorOperation(context).which(operation);
- operation.mouseOnly = true;
- return operation;
- }
+ var length = 0;
+ array = arrayFilter(array, function (group) {
+ if (isArrayLikeObject(group)) {
+ length = nativeMax(group.length, length);
+ return true;
+ }
+ });
+ return baseTimes(length, function (index) {
+ return arrayMap(array, baseProperty(index));
+ });
+ }
+ /**
+ * This method is like `_.unzip` except that it accepts `iteratee` to specify
+ * how regrouped values should be combined. The iteratee is invoked with the
+ * elements of each group: (...group).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.8.0
+ * @category Array
+ * @param {Array} array The array of grouped elements to process.
+ * @param {Function} [iteratee=_.identity] The function to combine
+ * regrouped values.
+ * @returns {Array} Returns the new array of regrouped elements.
+ * @example
+ *
+ * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
+ * // => [[1, 10, 100], [2, 20, 200]]
+ *
+ * _.unzipWith(zipped, _.add);
+ * // => [3, 30, 300]
+ */
- function modeRotate(context, entityIDs) {
- var mode = {
- id: 'rotate',
- button: 'browse'
- };
- var keybinding = utilKeybinding('rotate');
- var behaviors = [behaviorEdit(context), operationCircularize(context, entityIDs).behavior, operationDelete(context, entityIDs).behavior, operationMove(context, entityIDs).behavior, operationOrthogonalize(context, entityIDs).behavior, operationReflectLong(context, entityIDs).behavior, operationReflectShort(context, entityIDs).behavior];
- var annotation = entityIDs.length === 1 ? _t('operations.rotate.annotation.' + context.graph().geometry(entityIDs[0])) : _t('operations.rotate.annotation.feature', {
- n: entityIDs.length
- });
- var _prevGraph;
+ function unzipWith(array, iteratee) {
+ if (!(array && array.length)) {
+ return [];
+ }
- var _prevAngle;
+ var result = unzip(array);
- var _prevTransform;
+ if (iteratee == null) {
+ return result;
+ }
- var _pivot;
+ return arrayMap(result, function (group) {
+ return apply(iteratee, undefined$1, group);
+ });
+ }
+ /**
+ * Creates an array excluding all given values using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * **Note:** Unlike `_.pull`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...*} [values] The values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ * @see _.difference, _.xor
+ * @example
+ *
+ * _.without([2, 1, 2, 3], 1, 2);
+ * // => [3]
+ */
- function doRotate() {
- var fn;
- if (context.graph() !== _prevGraph) {
- fn = context.perform;
- } else {
- fn = context.replace;
- } // projection changed, recalculate _pivot
+ var without = baseRest(function (array, values) {
+ return isArrayLikeObject(array) ? baseDifference(array, values) : [];
+ });
+ /**
+ * Creates an array of unique values that is the
+ * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+ * of the given arrays. The order of result values is determined by the order
+ * they occur in the arrays.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of filtered values.
+ * @see _.difference, _.without
+ * @example
+ *
+ * _.xor([2, 1], [2, 3]);
+ * // => [1, 3]
+ */
+ var xor = baseRest(function (arrays) {
+ return baseXor(arrayFilter(arrays, isArrayLikeObject));
+ });
+ /**
+ * This method is like `_.xor` except that it accepts `iteratee` which is
+ * invoked for each element of each `arrays` to generate the criterion by
+ * which by which they're compared. The order of result values is determined
+ * by the order they occur in the arrays. The iteratee is invoked with one
+ * argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+ * // => [1.2, 3.4]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 2 }]
+ */
- var projection = context.projection;
- var currTransform = projection.transform();
+ var xorBy = baseRest(function (arrays) {
+ var iteratee = last(arrays);
- if (!_prevTransform || currTransform.k !== _prevTransform.k || currTransform.x !== _prevTransform.x || currTransform.y !== _prevTransform.y) {
- var nodes = utilGetAllNodes(entityIDs, context.graph());
- var points = nodes.map(function (n) {
- return projection(n.loc);
+ if (isArrayLikeObject(iteratee)) {
+ iteratee = undefined$1;
+ }
+
+ return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
});
- _pivot = getPivot(points);
- _prevAngle = undefined;
- }
+ /**
+ * This method is like `_.xor` except that it accepts `comparator` which is
+ * invoked to compare elements of `arrays`. The order of result values is
+ * determined by the order they occur in the arrays. The comparator is invoked
+ * with two arguments: (arrVal, othVal).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+ * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+ *
+ * _.xorWith(objects, others, _.isEqual);
+ * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+ */
- var currMouse = context.map().mouse();
- var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
- if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
- var delta = currAngle - _prevAngle;
- fn(actionRotate(entityIDs, _pivot, delta, projection));
- _prevTransform = currTransform;
- _prevAngle = currAngle;
- _prevGraph = context.graph();
- }
+ var xorWith = baseRest(function (arrays) {
+ var comparator = last(arrays);
+ comparator = typeof comparator == 'function' ? comparator : undefined$1;
+ return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined$1, comparator);
+ });
+ /**
+ * Creates an array of grouped elements, the first of which contains the
+ * first elements of the given arrays, the second of which contains the
+ * second elements of the given arrays, and so on.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to process.
+ * @returns {Array} Returns the new array of grouped elements.
+ * @example
+ *
+ * _.zip(['a', 'b'], [1, 2], [true, false]);
+ * // => [['a', 1, true], ['b', 2, false]]
+ */
- function getPivot(points) {
- var _pivot;
+ var zip = baseRest(unzip);
+ /**
+ * This method is like `_.fromPairs` except that it accepts two arrays,
+ * one of property identifiers and one of corresponding values.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.4.0
+ * @category Array
+ * @param {Array} [props=[]] The property identifiers.
+ * @param {Array} [values=[]] The property values.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.zipObject(['a', 'b'], [1, 2]);
+ * // => { 'a': 1, 'b': 2 }
+ */
- if (points.length === 1) {
- _pivot = points[0];
- } else if (points.length === 2) {
- _pivot = geoVecInterp(points[0], points[1], 0.5);
- } else {
- var polygonHull = d3_polygonHull(points);
+ function zipObject(props, values) {
+ return baseZipObject(props || [], values || [], assignValue);
+ }
+ /**
+ * This method is like `_.zipObject` except that it supports property paths.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.1.0
+ * @category Array
+ * @param {Array} [props=[]] The property identifiers.
+ * @param {Array} [values=[]] The property values.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
+ * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
+ */
- if (polygonHull.length === 2) {
- _pivot = geoVecInterp(points[0], points[1], 0.5);
- } else {
- _pivot = d3_polygonCentroid(d3_polygonHull(points));
+
+ function zipObjectDeep(props, values) {
+ return baseZipObject(props || [], values || [], baseSet);
}
- }
+ /**
+ * This method is like `_.zip` except that it accepts `iteratee` to specify
+ * how grouped values should be combined. The iteratee is invoked with the
+ * elements of each group: (...group).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.8.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to process.
+ * @param {Function} [iteratee=_.identity] The function to combine
+ * grouped values.
+ * @returns {Array} Returns the new array of grouped elements.
+ * @example
+ *
+ * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
+ * return a + b + c;
+ * });
+ * // => [111, 222]
+ */
- return _pivot;
- }
- function finish(d3_event) {
- d3_event.stopPropagation();
- context.replace(actionNoop(), annotation);
- context.enter(modeSelect(context, entityIDs));
- }
+ var zipWith = baseRest(function (arrays) {
+ var length = arrays.length,
+ iteratee = length > 1 ? arrays[length - 1] : undefined$1;
+ iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined$1;
+ return unzipWith(arrays, iteratee);
+ });
+ /*------------------------------------------------------------------------*/
- function cancel() {
- context.pop();
- context.enter(modeSelect(context, entityIDs));
- }
+ /**
+ * Creates a `lodash` wrapper instance that wraps `value` with explicit method
+ * chain sequences enabled. The result of such sequences must be unwrapped
+ * with `_#value`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.3.0
+ * @category Seq
+ * @param {*} value The value to wrap.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 },
+ * { 'user': 'pebbles', 'age': 1 }
+ * ];
+ *
+ * var youngest = _
+ * .chain(users)
+ * .sortBy('age')
+ * .map(function(o) {
+ * return o.user + ' is ' + o.age;
+ * })
+ * .head()
+ * .value();
+ * // => 'pebbles is 1'
+ */
- function undone() {
- context.enter(modeBrowse(context));
- }
+ function chain(value) {
+ var result = lodash(value);
+ result.__chain__ = true;
+ return result;
+ }
+ /**
+ * This method invokes `interceptor` and returns `value`. The interceptor
+ * is invoked with one argument; (value). The purpose of this method is to
+ * "tap into" a method chain sequence in order to modify intermediate results.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Seq
+ * @param {*} value The value to provide to `interceptor`.
+ * @param {Function} interceptor The function to invoke.
+ * @returns {*} Returns `value`.
+ * @example
+ *
+ * _([1, 2, 3])
+ * .tap(function(array) {
+ * // Mutate input array.
+ * array.pop();
+ * })
+ * .reverse()
+ * .value();
+ * // => [2, 1]
+ */
- mode.enter = function () {
- context.features().forceVisible(entityIDs);
- behaviors.forEach(context.install);
- context.surface().on('mousemove.rotate', doRotate).on('click.rotate', finish);
- context.history().on('undone.rotate', undone);
- keybinding.on('â', cancel).on('â©', finish);
- select(document).call(keybinding);
- };
- mode.exit = function () {
- behaviors.forEach(context.uninstall);
- context.surface().on('mousemove.rotate', null).on('click.rotate', null);
- context.history().on('undone.rotate', null);
- select(document).call(keybinding.unbind);
- context.features().forceVisible([]);
- };
+ function tap(value, interceptor) {
+ interceptor(value);
+ return value;
+ }
+ /**
+ * This method is like `_.tap` except that it returns the result of `interceptor`.
+ * The purpose of this method is to "pass thru" values replacing intermediate
+ * results in a method chain sequence.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Seq
+ * @param {*} value The value to provide to `interceptor`.
+ * @param {Function} interceptor The function to invoke.
+ * @returns {*} Returns the result of `interceptor`.
+ * @example
+ *
+ * _(' abc ')
+ * .chain()
+ * .trim()
+ * .thru(function(value) {
+ * return [value];
+ * })
+ * .value();
+ * // => ['abc']
+ */
- mode.selectedIDs = function () {
- if (!arguments.length) return entityIDs; // no assign
- return mode;
- };
+ function thru(value, interceptor) {
+ return interceptor(value);
+ }
+ /**
+ * This method is the wrapper version of `_.at`.
+ *
+ * @name at
+ * @memberOf _
+ * @since 1.0.0
+ * @category Seq
+ * @param {...(string|string[])} [paths] The property paths to pick.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+ *
+ * _(object).at(['a[0].b.c', 'a[1]']).value();
+ * // => [3, 4]
+ */
- return mode;
- }
- function operationRotate(context, selectedIDs) {
- var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
- var nodes = utilGetAllNodes(selectedIDs, context.graph());
- var coords = nodes.map(function (n) {
- return n.loc;
- });
- var extent = utilTotalExtent(selectedIDs, context.graph());
+ var wrapperAt = flatRest(function (paths) {
+ var length = paths.length,
+ start = length ? paths[0] : 0,
+ value = this.__wrapped__,
+ interceptor = function interceptor(object) {
+ return baseAt(object, paths);
+ };
- var operation = function operation() {
- context.enter(modeRotate(context, selectedIDs));
- };
+ if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start)) {
+ return this.thru(interceptor);
+ }
- operation.available = function () {
- return nodes.length >= 2;
- };
+ value = value.slice(start, +start + (length ? 1 : 0));
- operation.disabled = function () {
- if (extent.percentContainedIn(context.map().extent()) < 0.8) {
- return 'too_large';
- } else if (someMissing()) {
- return 'not_downloaded';
- } else if (selectedIDs.some(context.hasHiddenConnections)) {
- return 'connected_to_hidden';
- } else if (selectedIDs.some(incompleteRelation)) {
- return 'incomplete_relation';
- }
+ value.__actions__.push({
+ 'func': thru,
+ 'args': [interceptor],
+ 'thisArg': undefined$1
+ });
- return false;
+ return new LodashWrapper(value, this.__chain__).thru(function (array) {
+ if (length && !array.length) {
+ array.push(undefined$1);
+ }
- function someMissing() {
- if (context.inIntro()) return false;
- var osm = context.connection();
+ return array;
+ });
+ });
+ /**
+ * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
+ *
+ * @name chain
+ * @memberOf _
+ * @since 0.1.0
+ * @category Seq
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * // A sequence without explicit chaining.
+ * _(users).head();
+ * // => { 'user': 'barney', 'age': 36 }
+ *
+ * // A sequence with explicit chaining.
+ * _(users)
+ * .chain()
+ * .head()
+ * .pick('user')
+ * .value();
+ * // => { 'user': 'barney' }
+ */
+
+ function wrapperChain() {
+ return chain(this);
+ }
+ /**
+ * Executes the chain sequence and returns the wrapped result.
+ *
+ * @name commit
+ * @memberOf _
+ * @since 3.2.0
+ * @category Seq
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2];
+ * var wrapped = _(array).push(3);
+ *
+ * console.log(array);
+ * // => [1, 2]
+ *
+ * wrapped = wrapped.commit();
+ * console.log(array);
+ * // => [1, 2, 3]
+ *
+ * wrapped.last();
+ * // => 3
+ *
+ * console.log(array);
+ * // => [1, 2, 3]
+ */
- if (osm) {
- var missing = coords.filter(function (loc) {
- return !osm.isDataLoaded(loc);
- });
- if (missing.length) {
- missing.forEach(function (loc) {
- context.loadTileAtLoc(loc);
- });
- return true;
- }
+ function wrapperCommit() {
+ return new LodashWrapper(this.value(), this.__chain__);
}
+ /**
+ * Gets the next value on a wrapped object following the
+ * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
+ *
+ * @name next
+ * @memberOf _
+ * @since 4.0.0
+ * @category Seq
+ * @returns {Object} Returns the next iterator value.
+ * @example
+ *
+ * var wrapped = _([1, 2]);
+ *
+ * wrapped.next();
+ * // => { 'done': false, 'value': 1 }
+ *
+ * wrapped.next();
+ * // => { 'done': false, 'value': 2 }
+ *
+ * wrapped.next();
+ * // => { 'done': true, 'value': undefined }
+ */
- return false;
- }
- function incompleteRelation(id) {
- var entity = context.entity(id);
- return entity.type === 'relation' && !entity.isComplete(context.graph());
- }
- };
+ function wrapperNext() {
+ if (this.__values__ === undefined$1) {
+ this.__values__ = toArray(this.value());
+ }
- operation.tooltip = function () {
- var disable = operation.disabled();
- return disable ? _t('operations.rotate.' + disable + '.' + multi) : _t('operations.rotate.description.' + multi);
- };
+ var done = this.__index__ >= this.__values__.length,
+ value = done ? undefined$1 : this.__values__[this.__index__++];
+ return {
+ 'done': done,
+ 'value': value
+ };
+ }
+ /**
+ * Enables the wrapper to be iterable.
+ *
+ * @name Symbol.iterator
+ * @memberOf _
+ * @since 4.0.0
+ * @category Seq
+ * @returns {Object} Returns the wrapper object.
+ * @example
+ *
+ * var wrapped = _([1, 2]);
+ *
+ * wrapped[Symbol.iterator]() === wrapped;
+ * // => true
+ *
+ * Array.from(wrapped);
+ * // => [1, 2]
+ */
- operation.annotation = function () {
- return selectedIDs.length === 1 ? _t('operations.rotate.annotation.' + context.graph().geometry(selectedIDs[0])) : _t('operations.rotate.annotation.feature', {
- n: selectedIDs.length
- });
- };
- operation.id = 'rotate';
- operation.keys = [_t('operations.rotate.key')];
- operation.title = _t('operations.rotate.title');
- operation.behavior = behaviorOperation(context).which(operation);
- operation.mouseOnly = true;
- return operation;
- }
+ function wrapperToIterator() {
+ return this;
+ }
+ /**
+ * Creates a clone of the chain sequence planting `value` as the wrapped value.
+ *
+ * @name plant
+ * @memberOf _
+ * @since 3.2.0
+ * @category Seq
+ * @param {*} value The value to plant.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var wrapped = _([1, 2]).map(square);
+ * var other = wrapped.plant([3, 4]);
+ *
+ * other.value();
+ * // => [9, 16]
+ *
+ * wrapped.value();
+ * // => [1, 4]
+ */
- function modeMove(context, entityIDs, baseGraph) {
- var mode = {
- id: 'move',
- button: 'browse'
- };
- var keybinding = utilKeybinding('move');
- var behaviors = [behaviorEdit(context), operationCircularize(context, entityIDs).behavior, operationDelete(context, entityIDs).behavior, operationOrthogonalize(context, entityIDs).behavior, operationReflectLong(context, entityIDs).behavior, operationReflectShort(context, entityIDs).behavior, operationRotate(context, entityIDs).behavior];
- var annotation = entityIDs.length === 1 ? _t('operations.move.annotation.' + context.graph().geometry(entityIDs[0])) : _t('operations.move.annotation.feature', {
- n: entityIDs.length
- });
- var _prevGraph;
+ function wrapperPlant(value) {
+ var result,
+ parent = this;
- var _cache;
+ while (parent instanceof baseLodash) {
+ var clone = wrapperClone(parent);
+ clone.__index__ = 0;
+ clone.__values__ = undefined$1;
- var _origin;
+ if (result) {
+ previous.__wrapped__ = clone;
+ } else {
+ result = clone;
+ }
- var _nudgeInterval;
+ var previous = clone;
+ parent = parent.__wrapped__;
+ }
- function doMove(nudge) {
- nudge = nudge || [0, 0];
- var fn;
+ previous.__wrapped__ = value;
+ return result;
+ }
+ /**
+ * This method is the wrapper version of `_.reverse`.
+ *
+ * **Note:** This method mutates the wrapped array.
+ *
+ * @name reverse
+ * @memberOf _
+ * @since 0.1.0
+ * @category Seq
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _(array).reverse().value()
+ * // => [3, 2, 1]
+ *
+ * console.log(array);
+ * // => [3, 2, 1]
+ */
- if (_prevGraph !== context.graph()) {
- _cache = {};
- _origin = context.map().mouseCoordinates();
- fn = context.perform;
- } else {
- fn = context.overwrite;
- }
- var currMouse = context.map().mouse();
- var origMouse = context.projection(_origin);
- var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
- fn(actionMove(entityIDs, delta, context.projection, _cache));
- _prevGraph = context.graph();
- }
+ function wrapperReverse() {
+ var value = this.__wrapped__;
- function startNudge(nudge) {
- if (_nudgeInterval) window.clearInterval(_nudgeInterval);
- _nudgeInterval = window.setInterval(function () {
- context.map().pan(nudge);
- doMove(nudge);
- }, 50);
- }
+ if (value instanceof LazyWrapper) {
+ var wrapped = value;
- function stopNudge() {
- if (_nudgeInterval) {
- window.clearInterval(_nudgeInterval);
- _nudgeInterval = null;
- }
- }
+ if (this.__actions__.length) {
+ wrapped = new LazyWrapper(this);
+ }
- function move() {
- doMove();
- var nudge = geoViewportEdge(context.map().mouse(), context.map().dimensions());
+ wrapped = wrapped.reverse();
- if (nudge) {
- startNudge(nudge);
- } else {
- stopNudge();
- }
- }
+ wrapped.__actions__.push({
+ 'func': thru,
+ 'args': [reverse],
+ 'thisArg': undefined$1
+ });
- function finish(d3_event) {
- d3_event.stopPropagation();
- context.replace(actionNoop(), annotation);
- context.enter(modeSelect(context, entityIDs));
- stopNudge();
- }
+ return new LodashWrapper(wrapped, this.__chain__);
+ }
- function cancel() {
- if (baseGraph) {
- while (context.graph() !== baseGraph) {
- context.pop();
+ return this.thru(reverse);
}
+ /**
+ * Executes the chain sequence to resolve the unwrapped value.
+ *
+ * @name value
+ * @memberOf _
+ * @since 0.1.0
+ * @alias toJSON, valueOf
+ * @category Seq
+ * @returns {*} Returns the resolved unwrapped value.
+ * @example
+ *
+ * _([1, 2, 3]).value();
+ * // => [1, 2, 3]
+ */
- context.enter(modeBrowse(context));
- } else {
- context.pop();
- context.enter(modeSelect(context, entityIDs));
- }
- stopNudge();
- }
+ function wrapperValue() {
+ return baseWrapperValue(this.__wrapped__, this.__actions__);
+ }
+ /*------------------------------------------------------------------------*/
- function undone() {
- context.enter(modeBrowse(context));
- }
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` thru `iteratee`. The corresponding value of
+ * each key is the number of times the key was returned by `iteratee`. The
+ * iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * _.countBy([6.1, 4.2, 6.3], Math.floor);
+ * // => { '4': 1, '6': 2 }
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.countBy(['one', 'two', 'three'], 'length');
+ * // => { '3': 2, '5': 1 }
+ */
- mode.enter = function () {
- _origin = context.map().mouseCoordinates();
- _prevGraph = null;
- _cache = {};
- context.features().forceVisible(entityIDs);
- behaviors.forEach(context.install);
- context.surface().on('mousemove.move', move).on('click.move', finish);
- context.history().on('undone.move', undone);
- keybinding.on('â', cancel).on('â©', finish);
- select(document).call(keybinding);
- };
- mode.exit = function () {
- stopNudge();
- behaviors.forEach(function (behavior) {
- context.uninstall(behavior);
- });
- context.surface().on('mousemove.move', null).on('click.move', null);
- context.history().on('undone.move', null);
- select(document).call(keybinding.unbind);
- context.features().forceVisible([]);
- };
+ var countBy = createAggregator(function (result, value, key) {
+ if (hasOwnProperty.call(result, key)) {
+ ++result[key];
+ } else {
+ baseAssignValue(result, key, 1);
+ }
+ });
+ /**
+ * Checks if `predicate` returns truthy for **all** elements of `collection`.
+ * Iteration is stopped once `predicate` returns falsey. The predicate is
+ * invoked with three arguments: (value, index|key, collection).
+ *
+ * **Note:** This method returns `true` for
+ * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
+ * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
+ * elements of empty collections.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`.
+ * @example
+ *
+ * _.every([true, 1, null, 'yes'], Boolean);
+ * // => false
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.every(users, { 'user': 'barney', 'active': false });
+ * // => false
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.every(users, ['active', false]);
+ * // => true
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.every(users, 'active');
+ * // => false
+ */
- mode.selectedIDs = function () {
- if (!arguments.length) return entityIDs; // no assign
+ function every(collection, predicate, guard) {
+ var func = isArray(collection) ? arrayEvery : baseEvery;
- return mode;
- };
+ if (guard && isIterateeCall(collection, predicate, guard)) {
+ predicate = undefined$1;
+ }
- return mode;
- }
+ return func(collection, getIteratee(predicate, 3));
+ }
+ /**
+ * Iterates over elements of `collection`, returning an array of all elements
+ * `predicate` returns truthy for. The predicate is invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * **Note:** Unlike `_.remove`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ * @see _.reject
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * _.filter(users, function(o) { return !o.active; });
+ * // => objects for ['fred']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.filter(users, { 'age': 36, 'active': true });
+ * // => objects for ['barney']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.filter(users, ['active', false]);
+ * // => objects for ['fred']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.filter(users, 'active');
+ * // => objects for ['barney']
+ *
+ * // Combining several predicates using `_.overEvery` or `_.overSome`.
+ * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
+ * // => objects for ['fred', 'barney']
+ */
- function behaviorPaste(context) {
- function doPaste(d3_event) {
- // prevent paste during low zoom selection
- if (!context.map().withinEditableZoom()) return;
- d3_event.preventDefault();
- var baseGraph = context.graph();
- var mouse = context.map().mouse();
- var projection = context.projection;
- var viewport = geoExtent(projection.clipExtent()).polygon();
- if (!geoPointInPolygon(mouse, viewport)) return;
- var oldIDs = context.copyIDs();
- if (!oldIDs.length) return;
- var extent = geoExtent();
- var oldGraph = context.copyGraph();
- var newIDs = [];
- var action = actionCopyEntities(oldIDs, oldGraph);
- context.perform(action);
- var copies = action.copies();
- var originals = new Set();
- Object.values(copies).forEach(function (entity) {
- originals.add(entity.id);
- });
- for (var id in copies) {
- var oldEntity = oldGraph.entity(id);
- var newEntity = copies[id];
+ function filter(collection, predicate) {
+ var func = isArray(collection) ? arrayFilter : baseFilter;
+ return func(collection, getIteratee(predicate, 3));
+ }
+ /**
+ * Iterates over elements of `collection`, returning the first element
+ * `predicate` returns truthy for. The predicate is invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false },
+ * { 'user': 'pebbles', 'age': 1, 'active': true }
+ * ];
+ *
+ * _.find(users, function(o) { return o.age < 40; });
+ * // => object for 'barney'
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.find(users, { 'age': 1, 'active': true });
+ * // => object for 'pebbles'
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.find(users, ['active', false]);
+ * // => object for 'fred'
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.find(users, 'active');
+ * // => object for 'barney'
+ */
- extent._extend(oldEntity.extent(oldGraph)); // Exclude child nodes from newIDs if their parent way was also copied.
+ var find = createFind(findIndex);
+ /**
+ * This method is like `_.find` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=collection.length-1] The index to search from.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * _.findLast([1, 2, 3, 4], function(n) {
+ * return n % 2 == 1;
+ * });
+ * // => 3
+ */
- var parents = context.graph().parentWays(newEntity);
- var parentCopied = parents.some(function (parent) {
- return originals.has(parent.id);
- });
+ var findLast = createFind(findLastIndex);
+ /**
+ * Creates a flattened array of values by running each element in `collection`
+ * thru `iteratee` and flattening the mapped results. The iteratee is invoked
+ * with three arguments: (value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * function duplicate(n) {
+ * return [n, n];
+ * }
+ *
+ * _.flatMap([1, 2], duplicate);
+ * // => [1, 1, 2, 2]
+ */
- if (!parentCopied) {
- newIDs.push(newEntity.id);
+ function flatMap(collection, iteratee) {
+ return baseFlatten(map(collection, iteratee), 1);
}
- } // Put pasted objects where mouse pointer is..
-
+ /**
+ * This method is like `_.flatMap` except that it recursively flattens the
+ * mapped results.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.7.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * function duplicate(n) {
+ * return [[[n, n]]];
+ * }
+ *
+ * _.flatMapDeep([1, 2], duplicate);
+ * // => [1, 1, 2, 2]
+ */
- var copyPoint = context.copyLonLat() && projection(context.copyLonLat()) || projection(extent.center());
- var delta = geoVecSubtract(mouse, copyPoint);
- context.perform(actionMove(newIDs, delta, projection));
- context.enter(modeMove(context, newIDs, baseGraph));
- }
- function behavior() {
- context.keybinding().on(uiCmd('âV'), doPaste);
- return behavior;
- }
+ function flatMapDeep(collection, iteratee) {
+ return baseFlatten(map(collection, iteratee), INFINITY);
+ }
+ /**
+ * This method is like `_.flatMap` except that it recursively flattens the
+ * mapped results up to `depth` times.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.7.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {number} [depth=1] The maximum recursion depth.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * function duplicate(n) {
+ * return [[[n, n]]];
+ * }
+ *
+ * _.flatMapDepth([1, 2], duplicate, 2);
+ * // => [[1, 1], [2, 2]]
+ */
- behavior.off = function () {
- context.keybinding().off(uiCmd('âV'));
- };
- return behavior;
- }
+ function flatMapDepth(collection, iteratee, depth) {
+ depth = depth === undefined$1 ? 1 : toInteger(depth);
+ return baseFlatten(map(collection, iteratee), depth);
+ }
+ /**
+ * Iterates over elements of `collection` and invokes `iteratee` for each element.
+ * The iteratee is invoked with three arguments: (value, index|key, collection).
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * **Note:** As with other "Collections" methods, objects with a "length"
+ * property are iterated like arrays. To avoid this behavior use `_.forIn`
+ * or `_.forOwn` for object iteration.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @alias each
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ * @see _.forEachRight
+ * @example
+ *
+ * _.forEach([1, 2], function(value) {
+ * console.log(value);
+ * });
+ * // => Logs `1` then `2`.
+ *
+ * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+ */
- // `String.prototype.repeat` method
- // https://tc39.es/ecma262/#sec-string.prototype.repeat
- _export({ target: 'String', proto: true }, {
- repeat: stringRepeat
- });
- /*
- `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
+ function forEach(collection, iteratee) {
+ var func = isArray(collection) ? arrayEach : baseEach;
+ return func(collection, getIteratee(iteratee, 3));
+ }
+ /**
+ * This method is like `_.forEach` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @alias eachRight
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ * @see _.forEach
+ * @example
+ *
+ * _.forEachRight([1, 2], function(value) {
+ * console.log(value);
+ * });
+ * // => Logs `2` then `1`.
+ */
- * The `origin` function is expected to return an [x, y] tuple rather than an
- {x, y} object.
- * The events are `start`, `move`, and `end`.
- (https://github.com/mbostock/d3/issues/563)
- * The `start` event is not dispatched until the first cursor movement occurs.
- (https://github.com/mbostock/d3/pull/368)
- * The `move` event has a `point` and `delta` [x, y] tuple properties rather
- than `x`, `y`, `dx`, and `dy` properties.
- * The `end` event is not dispatched if no movement occurs.
- * An `off` function is available that unbinds the drag's internal event handlers.
- */
- function behaviorDrag() {
- var dispatch$1 = dispatch('start', 'move', 'end'); // see also behaviorSelect
+ function forEachRight(collection, iteratee) {
+ var func = isArray(collection) ? arrayEachRight : baseEachRight;
+ return func(collection, getIteratee(iteratee, 3));
+ }
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` thru `iteratee`. The order of grouped values
+ * is determined by the order they occur in `collection`. The corresponding
+ * value of each key is an array of elements responsible for generating the
+ * key. The iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * _.groupBy([6.1, 4.2, 6.3], Math.floor);
+ * // => { '4': [4.2], '6': [6.1, 6.3] }
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.groupBy(['one', 'two', 'three'], 'length');
+ * // => { '3': ['one', 'two'], '5': ['three'] }
+ */
- var _tolerancePx = 1; // keep this low to facilitate pixel-perfect micromapping
- var _penTolerancePx = 4; // styluses can be touchy so require greater movement - #1981
+ var groupBy = createAggregator(function (result, value, key) {
+ if (hasOwnProperty.call(result, key)) {
+ result[key].push(value);
+ } else {
+ baseAssignValue(result, key, [value]);
+ }
+ });
+ /**
+ * Checks if `value` is in `collection`. If `collection` is a string, it's
+ * checked for a substring of `value`, otherwise
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * is used for equality comparisons. If `fromIndex` is negative, it's used as
+ * the offset from the end of `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+ * @returns {boolean} Returns `true` if `value` is found, else `false`.
+ * @example
+ *
+ * _.includes([1, 2, 3], 1);
+ * // => true
+ *
+ * _.includes([1, 2, 3], 1, 2);
+ * // => false
+ *
+ * _.includes({ 'a': 1, 'b': 2 }, 1);
+ * // => true
+ *
+ * _.includes('abcd', 'bc');
+ * // => true
+ */
- var _origin = null;
- var _selector = '';
+ function includes(collection, value, fromIndex, guard) {
+ collection = isArrayLike(collection) ? collection : values(collection);
+ fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
+ var length = collection.length;
- var _targetNode;
+ if (fromIndex < 0) {
+ fromIndex = nativeMax(length + fromIndex, 0);
+ }
- var _targetEntity;
+ return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
+ }
+ /**
+ * Invokes the method at `path` of each element in `collection`, returning
+ * an array of the results of each invoked method. Any additional arguments
+ * are provided to each invoked method. If `path` is a function, it's invoked
+ * for, and `this` bound to, each element in `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Array|Function|string} path The path of the method to invoke or
+ * the function invoked per iteration.
+ * @param {...*} [args] The arguments to invoke each method with.
+ * @returns {Array} Returns the array of results.
+ * @example
+ *
+ * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
+ * // => [[1, 5, 7], [1, 2, 3]]
+ *
+ * _.invokeMap([123, 456], String.prototype.split, '');
+ * // => [['1', '2', '3'], ['4', '5', '6']]
+ */
- var _surface;
- var _pointerId; // use pointer events on supported platforms; fallback to mouse events
+ var invokeMap = baseRest(function (collection, path, args) {
+ var index = -1,
+ isFunc = typeof path == 'function',
+ result = isArrayLike(collection) ? Array(collection.length) : [];
+ baseEach(collection, function (value) {
+ result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
+ });
+ return result;
+ });
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` thru `iteratee`. The corresponding value of
+ * each key is the last element responsible for generating the key. The
+ * iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * var array = [
+ * { 'dir': 'left', 'code': 97 },
+ * { 'dir': 'right', 'code': 100 }
+ * ];
+ *
+ * _.keyBy(array, function(o) {
+ * return String.fromCharCode(o.code);
+ * });
+ * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+ *
+ * _.keyBy(array, 'dir');
+ * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
+ */
+ var keyBy = createAggregator(function (result, value, key) {
+ baseAssignValue(result, key, value);
+ });
+ /**
+ * Creates an array of values by running each element in `collection` thru
+ * `iteratee`. The iteratee is invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+ *
+ * The guarded methods are:
+ * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
+ * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
+ * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
+ * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * _.map([4, 8], square);
+ * // => [16, 64]
+ *
+ * _.map({ 'a': 4, 'b': 8 }, square);
+ * // => [16, 64] (iteration order is not guaranteed)
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.map(users, 'user');
+ * // => ['barney', 'fred']
+ */
- var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+ function map(collection, iteratee) {
+ var func = isArray(collection) ? arrayMap : baseMap;
+ return func(collection, getIteratee(iteratee, 3));
+ }
+ /**
+ * This method is like `_.sortBy` except that it allows specifying the sort
+ * orders of the iteratees to sort by. If `orders` is unspecified, all values
+ * are sorted in ascending order. Otherwise, specify an order of "desc" for
+ * descending or "asc" for ascending sort order of corresponding values.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
+ * The iteratees to sort by.
+ * @param {string[]} [orders] The sort orders of `iteratees`.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'fred', 'age': 48 },
+ * { 'user': 'barney', 'age': 34 },
+ * { 'user': 'fred', 'age': 40 },
+ * { 'user': 'barney', 'age': 36 }
+ * ];
+ *
+ * // Sort by `user` in ascending order and by `age` in descending order.
+ * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
+ * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
+ */
- var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
- var d3_event_userSelectSuppress = function d3_event_userSelectSuppress() {
- var selection$1 = selection();
- var select = selection$1.style(d3_event_userSelectProperty);
- selection$1.style(d3_event_userSelectProperty, 'none');
- return function () {
- selection$1.style(d3_event_userSelectProperty, select);
- };
- };
+ function orderBy(collection, iteratees, orders, guard) {
+ if (collection == null) {
+ return [];
+ }
- function pointerdown(d3_event) {
- if (_pointerId) return;
- _pointerId = d3_event.pointerId || 'mouse';
- _targetNode = this; // only force reflow once per drag
+ if (!isArray(iteratees)) {
+ iteratees = iteratees == null ? [] : [iteratees];
+ }
- var pointerLocGetter = utilFastMouse(_surface || _targetNode.parentNode);
- var offset;
- var startOrigin = pointerLocGetter(d3_event);
- var started = false;
- var selectEnable = d3_event_userSelectSuppress();
- select(window).on(_pointerPrefix + 'move.drag', pointermove).on(_pointerPrefix + 'up.drag pointercancel.drag', pointerup, true);
+ orders = guard ? undefined$1 : orders;
- if (_origin) {
- offset = _origin.call(_targetNode, _targetEntity);
- offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
- } else {
- offset = [0, 0];
- }
+ if (!isArray(orders)) {
+ orders = orders == null ? [] : [orders];
+ }
- d3_event.stopPropagation();
+ return baseOrderBy(collection, iteratees, orders);
+ }
+ /**
+ * Creates an array of elements split into two groups, the first of which
+ * contains elements `predicate` returns truthy for, the second of which
+ * contains elements `predicate` returns falsey for. The predicate is
+ * invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the array of grouped elements.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': true },
+ * { 'user': 'pebbles', 'age': 1, 'active': false }
+ * ];
+ *
+ * _.partition(users, function(o) { return o.active; });
+ * // => objects for [['fred'], ['barney', 'pebbles']]
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.partition(users, { 'age': 1, 'active': false });
+ * // => objects for [['pebbles'], ['barney', 'fred']]
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.partition(users, ['active', false]);
+ * // => objects for [['barney', 'pebbles'], ['fred']]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.partition(users, 'active');
+ * // => objects for [['fred'], ['barney', 'pebbles']]
+ */
- function pointermove(d3_event) {
- if (_pointerId !== (d3_event.pointerId || 'mouse')) return;
- var p = pointerLocGetter(d3_event);
- if (!started) {
- var dist = geoVecLength(startOrigin, p);
- var tolerance = d3_event.pointerType === 'pen' ? _penTolerancePx : _tolerancePx; // don't start until the drag has actually moved somewhat
+ var partition = createAggregator(function (result, value, key) {
+ result[key ? 0 : 1].push(value);
+ }, function () {
+ return [[], []];
+ });
+ /**
+ * Reduces `collection` to a value which is the accumulated result of running
+ * each element in `collection` thru `iteratee`, where each successive
+ * invocation is supplied the return value of the previous. If `accumulator`
+ * is not given, the first element of `collection` is used as the initial
+ * value. The iteratee is invoked with four arguments:
+ * (accumulator, value, index|key, collection).
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.reduce`, `_.reduceRight`, and `_.transform`.
+ *
+ * The guarded methods are:
+ * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
+ * and `sortBy`
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @returns {*} Returns the accumulated value.
+ * @see _.reduceRight
+ * @example
+ *
+ * _.reduce([1, 2], function(sum, n) {
+ * return sum + n;
+ * }, 0);
+ * // => 3
+ *
+ * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+ * (result[value] || (result[value] = [])).push(key);
+ * return result;
+ * }, {});
+ * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
+ */
- if (dist < tolerance) return;
- started = true;
- dispatch$1.call('start', this, d3_event, _targetEntity); // Don't send a `move` event in the same cycle as `start` since dragging
- // a midpoint will convert the target to a node.
- } else {
- startOrigin = p;
- d3_event.stopPropagation();
- d3_event.preventDefault();
- var dx = p[0] - startOrigin[0];
- var dy = p[1] - startOrigin[1];
- dispatch$1.call('move', this, d3_event, _targetEntity, [p[0] + offset[0], p[1] + offset[1]], [dx, dy]);
+ function reduce(collection, iteratee, accumulator) {
+ var func = isArray(collection) ? arrayReduce : baseReduce,
+ initAccum = arguments.length < 3;
+ return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
}
- }
+ /**
+ * This method is like `_.reduce` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @returns {*} Returns the accumulated value.
+ * @see _.reduce
+ * @example
+ *
+ * var array = [[0, 1], [2, 3], [4, 5]];
+ *
+ * _.reduceRight(array, function(flattened, other) {
+ * return flattened.concat(other);
+ * }, []);
+ * // => [4, 5, 2, 3, 0, 1]
+ */
- function pointerup(d3_event) {
- if (_pointerId !== (d3_event.pointerId || 'mouse')) return;
- _pointerId = null;
- if (started) {
- dispatch$1.call('end', this, d3_event, _targetEntity);
- d3_event.preventDefault();
+ function reduceRight(collection, iteratee, accumulator) {
+ var func = isArray(collection) ? arrayReduceRight : baseReduce,
+ initAccum = arguments.length < 3;
+ return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
}
+ /**
+ * The opposite of `_.filter`; this method returns the elements of `collection`
+ * that `predicate` does **not** return truthy for.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ * @see _.filter
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': true }
+ * ];
+ *
+ * _.reject(users, function(o) { return !o.active; });
+ * // => objects for ['fred']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.reject(users, { 'age': 40, 'active': true });
+ * // => objects for ['barney']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.reject(users, ['active', false]);
+ * // => objects for ['fred']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.reject(users, 'active');
+ * // => objects for ['barney']
+ */
- select(window).on(_pointerPrefix + 'move.drag', null).on(_pointerPrefix + 'up.drag pointercancel.drag', null);
- selectEnable();
- }
- }
-
- function behavior(selection) {
- var matchesSelector = utilPrefixDOMProperty('matchesSelector');
- var delegate = pointerdown;
-
- if (_selector) {
- delegate = function delegate(d3_event) {
- var root = this;
- var target = d3_event.target;
-
- for (; target && target !== root; target = target.parentNode) {
- var datum = target.__data__;
- _targetEntity = datum instanceof osmNote ? datum : datum && datum.properties && datum.properties.entity;
- if (_targetEntity && target[matchesSelector](_selector)) {
- return pointerdown.call(target, d3_event);
- }
- }
- };
- }
+ function reject(collection, predicate) {
+ var func = isArray(collection) ? arrayFilter : baseFilter;
+ return func(collection, negate(getIteratee(predicate, 3)));
+ }
+ /**
+ * Gets a random element from `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to sample.
+ * @returns {*} Returns the random element.
+ * @example
+ *
+ * _.sample([1, 2, 3, 4]);
+ * // => 2
+ */
- selection.on(_pointerPrefix + 'down.drag' + _selector, delegate);
- }
- behavior.off = function (selection) {
- selection.on(_pointerPrefix + 'down.drag' + _selector, null);
- };
+ function sample(collection) {
+ var func = isArray(collection) ? arraySample : baseSample;
+ return func(collection);
+ }
+ /**
+ * Gets `n` random elements at unique keys from `collection` up to the
+ * size of `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to sample.
+ * @param {number} [n=1] The number of elements to sample.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the random elements.
+ * @example
+ *
+ * _.sampleSize([1, 2, 3], 2);
+ * // => [3, 1]
+ *
+ * _.sampleSize([1, 2, 3], 4);
+ * // => [2, 3, 1]
+ */
- behavior.selector = function (_) {
- if (!arguments.length) return _selector;
- _selector = _;
- return behavior;
- };
- behavior.origin = function (_) {
- if (!arguments.length) return _origin;
- _origin = _;
- return behavior;
- };
+ function sampleSize(collection, n, guard) {
+ if (guard ? isIterateeCall(collection, n, guard) : n === undefined$1) {
+ n = 1;
+ } else {
+ n = toInteger(n);
+ }
- behavior.cancel = function () {
- select(window).on(_pointerPrefix + 'move.drag', null).on(_pointerPrefix + 'up.drag pointercancel.drag', null);
- return behavior;
- };
+ var func = isArray(collection) ? arraySampleSize : baseSampleSize;
+ return func(collection, n);
+ }
+ /**
+ * Creates an array of shuffled values, using a version of the
+ * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to shuffle.
+ * @returns {Array} Returns the new shuffled array.
+ * @example
+ *
+ * _.shuffle([1, 2, 3, 4]);
+ * // => [4, 1, 3, 2]
+ */
- behavior.targetNode = function (_) {
- if (!arguments.length) return _targetNode;
- _targetNode = _;
- return behavior;
- };
- behavior.targetEntity = function (_) {
- if (!arguments.length) return _targetEntity;
- _targetEntity = _;
- return behavior;
- };
+ function shuffle(collection) {
+ var func = isArray(collection) ? arrayShuffle : baseShuffle;
+ return func(collection);
+ }
+ /**
+ * Gets the size of `collection` by returning its length for array-like
+ * values or the number of own enumerable string keyed properties for objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to inspect.
+ * @returns {number} Returns the collection size.
+ * @example
+ *
+ * _.size([1, 2, 3]);
+ * // => 3
+ *
+ * _.size({ 'a': 1, 'b': 2 });
+ * // => 2
+ *
+ * _.size('pebbles');
+ * // => 7
+ */
- behavior.surface = function (_) {
- if (!arguments.length) return _surface;
- _surface = _;
- return behavior;
- };
- return utilRebind(behavior, dispatch$1, 'on');
- }
+ function size(collection) {
+ if (collection == null) {
+ return 0;
+ }
- function modeDragNode(context) {
- var mode = {
- id: 'drag-node',
- button: 'browse'
- };
- var hover = behaviorHover(context).altDisables(true).on('hover', context.ui().sidebar.hover);
- var edit = behaviorEdit(context);
+ if (isArrayLike(collection)) {
+ return isString(collection) ? stringSize(collection) : collection.length;
+ }
- var _nudgeInterval;
+ var tag = getTag(collection);
- var _restoreSelectedIDs = [];
- var _wasMidpoint = false;
- var _isCancelled = false;
+ if (tag == mapTag || tag == setTag) {
+ return collection.size;
+ }
- var _activeEntity;
+ return baseKeys(collection).length;
+ }
+ /**
+ * Checks if `predicate` returns truthy for **any** element of `collection`.
+ * Iteration is stopped once `predicate` returns truthy. The predicate is
+ * invoked with three arguments: (value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ * @example
+ *
+ * _.some([null, 0, 'yes', false], Boolean);
+ * // => true
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false }
+ * ];
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.some(users, { 'user': 'barney', 'active': false });
+ * // => false
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.some(users, ['active', false]);
+ * // => true
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.some(users, 'active');
+ * // => true
+ */
- var _startLoc;
- var _lastLoc;
+ function some(collection, predicate, guard) {
+ var func = isArray(collection) ? arraySome : baseSome;
- function startNudge(d3_event, entity, nudge) {
- if (_nudgeInterval) window.clearInterval(_nudgeInterval);
- _nudgeInterval = window.setInterval(function () {
- context.map().pan(nudge);
- doMove(d3_event, entity, nudge);
- }, 50);
- }
+ if (guard && isIterateeCall(collection, predicate, guard)) {
+ predicate = undefined$1;
+ }
- function stopNudge() {
- if (_nudgeInterval) {
- window.clearInterval(_nudgeInterval);
- _nudgeInterval = null;
- }
- }
+ return func(collection, getIteratee(predicate, 3));
+ }
+ /**
+ * Creates an array of elements, sorted in ascending order by the results of
+ * running each element in a collection thru each iteratee. This method
+ * performs a stable sort, that is, it preserves the original sort order of
+ * equal elements. The iteratees are invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {...(Function|Function[])} [iteratees=[_.identity]]
+ * The iteratees to sort by.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'fred', 'age': 48 },
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 30 },
+ * { 'user': 'barney', 'age': 34 }
+ * ];
+ *
+ * _.sortBy(users, [function(o) { return o.user; }]);
+ * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
+ *
+ * _.sortBy(users, ['user', 'age']);
+ * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
+ */
- function moveAnnotation(entity) {
- return _t('operations.move.annotation.' + entity.geometry(context.graph()));
- }
- function connectAnnotation(nodeEntity, targetEntity) {
- var nodeGeometry = nodeEntity.geometry(context.graph());
- var targetGeometry = targetEntity.geometry(context.graph());
+ var sortBy = baseRest(function (collection, iteratees) {
+ if (collection == null) {
+ return [];
+ }
- if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
- var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
- var targetParentWayIDs = context.graph().parentWays(targetEntity);
- var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs); // if both vertices are part of the same way
+ var length = iteratees.length;
- if (sharedParentWays.length !== 0) {
- // if the nodes are next to each other, they are merged
- if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
- return _t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
+ if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
+ iteratees = [];
+ } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
+ iteratees = [iteratees[0]];
}
- return _t('operations.connect.annotation.from_vertex.to_sibling_vertex');
- }
- }
+ return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
+ });
+ /*------------------------------------------------------------------------*/
- return _t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
- }
+ /**
+ * Gets the timestamp of the number of milliseconds that have elapsed since
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Date
+ * @returns {number} Returns the timestamp.
+ * @example
+ *
+ * _.defer(function(stamp) {
+ * console.log(_.now() - stamp);
+ * }, _.now());
+ * // => Logs the number of milliseconds it took for the deferred invocation.
+ */
- function shouldSnapToNode(target) {
- if (!_activeEntity) return false;
- return _activeEntity.geometry(context.graph()) !== 'vertex' || target.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(target, context.graph());
- }
+ var now = ctxNow || function () {
+ return root.Date.now();
+ };
+ /*------------------------------------------------------------------------*/
- function origin(entity) {
- return context.projection(entity.loc);
- }
+ /**
+ * The opposite of `_.before`; this method creates a function that invokes
+ * `func` once it's called `n` or more times.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {number} n The number of calls before `func` is invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var saves = ['profile', 'settings'];
+ *
+ * var done = _.after(saves.length, function() {
+ * console.log('done saving!');
+ * });
+ *
+ * _.forEach(saves, function(type) {
+ * asyncSave({ 'type': type, 'complete': done });
+ * });
+ * // => Logs 'done saving!' after the two async saves have completed.
+ */
- function keydown(d3_event) {
- if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
- if (context.surface().classed('nope')) {
- context.surface().classed('nope-suppressed', true);
- }
- context.surface().classed('nope', false).classed('nope-disabled', true);
- }
- }
+ function after(n, func) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
- function keyup(d3_event) {
- if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
- if (context.surface().classed('nope-suppressed')) {
- context.surface().classed('nope', true);
+ n = toInteger(n);
+ return function () {
+ if (--n < 1) {
+ return func.apply(this, arguments);
+ }
+ };
}
+ /**
+ * Creates a function that invokes `func`, with up to `n` arguments,
+ * ignoring any additional arguments.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {Function} func The function to cap arguments for.
+ * @param {number} [n=func.length] The arity cap.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Function} Returns the new capped function.
+ * @example
+ *
+ * _.map(['6', '8', '10'], _.ary(parseInt, 1));
+ * // => [6, 8, 10]
+ */
- context.surface().classed('nope-suppressed', false).classed('nope-disabled', false);
- }
- }
-
- function start(d3_event, entity) {
- _wasMidpoint = entity.type === 'midpoint';
- var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
- _isCancelled = !context.editable() || d3_event.shiftKey || hasHidden;
- if (_isCancelled) {
- if (hasHidden) {
- context.ui().flash.duration(4000).iconName('#iD-icon-no').label(_t('modes.drag_node.connected_to_hidden'))();
+ function ary(func, n, guard) {
+ n = guard ? undefined$1 : n;
+ n = func && n == null ? func.length : n;
+ return createWrap(func, WRAP_ARY_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, n);
}
+ /**
+ * Creates a function that invokes `func`, with the `this` binding and arguments
+ * of the created function, while it's called less than `n` times. Subsequent
+ * calls to the created function return the result of the last `func` invocation.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {number} n The number of calls at which `func` is no longer invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * jQuery(element).on('click', _.before(5, addContactToList));
+ * // => Allows adding up to 4 contacts to the list.
+ */
- return drag.cancel();
- }
- if (_wasMidpoint) {
- var midpoint = entity;
- entity = osmNode();
- context.perform(actionAddMidpoint(midpoint, entity));
- entity = context.entity(entity.id); // get post-action entity
+ function before(n, func) {
+ var result;
- var vertex = context.surface().selectAll('.' + entity.id);
- drag.targetNode(vertex.node()).targetEntity(entity);
- } else {
- context.perform(actionNoop());
- }
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
- _activeEntity = entity;
- _startLoc = entity.loc;
- hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
- context.surface().selectAll('.' + _activeEntity.id).classed('active', true);
- context.enter(mode);
- } // related code
- // - `behavior/draw.js` `datum()`
+ n = toInteger(n);
+ return function () {
+ if (--n > 0) {
+ result = func.apply(this, arguments);
+ }
+ if (n <= 1) {
+ func = undefined$1;
+ }
- function datum(d3_event) {
- if (!d3_event || d3_event.altKey) {
- return {};
- } else {
- // When dragging, snap only to touch targets..
- // (this excludes area fills and active drawing elements)
- var d = d3_event.target.__data__;
- return d && d.properties && d.properties.target ? d : {};
- }
- }
+ return result;
+ };
+ }
+ /**
+ * Creates a function that invokes `func` with the `this` binding of `thisArg`
+ * and `partials` prepended to the arguments it receives.
+ *
+ * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
+ * may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
+ * property of bound functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to bind.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new bound function.
+ * @example
+ *
+ * function greet(greeting, punctuation) {
+ * return greeting + ' ' + this.user + punctuation;
+ * }
+ *
+ * var object = { 'user': 'fred' };
+ *
+ * var bound = _.bind(greet, object, 'hi');
+ * bound('!');
+ * // => 'hi fred!'
+ *
+ * // Bound with placeholders.
+ * var bound = _.bind(greet, object, _, '!');
+ * bound('hi');
+ * // => 'hi fred!'
+ */
- function doMove(d3_event, entity, nudge) {
- nudge = nudge || [0, 0];
- var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
- var currMouse = geoVecSubtract(currPoint, nudge);
- var loc = context.projection.invert(currMouse);
- var target, edge;
- if (!_nudgeInterval) {
- // If not nudging at the edge of the viewport, try to snap..
- // related code
- // - `mode/drag_node.js` `doMove()`
- // - `behavior/draw.js` `click()`
- // - `behavior/draw_way.js` `move()`
- var d = datum(d3_event);
- target = d && d.properties && d.properties.entity;
- var targetLoc = target && target.loc;
- var targetNodes = d && d.properties && d.properties.nodes;
+ var bind = baseRest(function (func, thisArg, partials) {
+ var bitmask = WRAP_BIND_FLAG;
- if (targetLoc) {
- // snap to node/vertex - a point target with `.loc`
- if (shouldSnapToNode(target)) {
- loc = targetLoc;
+ if (partials.length) {
+ var holders = replaceHolders(partials, getHolder(bind));
+ bitmask |= WRAP_PARTIAL_FLAG;
}
- } else if (targetNodes) {
- // snap to way - a line target with `.nodes`
- edge = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, end.id);
- if (edge) {
- loc = edge.loc;
+ return createWrap(func, bitmask, thisArg, partials, holders);
+ });
+ /**
+ * Creates a function that invokes the method at `object[key]` with `partials`
+ * prepended to the arguments it receives.
+ *
+ * This method differs from `_.bind` by allowing bound functions to reference
+ * methods that may be redefined or don't yet exist. See
+ * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
+ * for more details.
+ *
+ * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.10.0
+ * @category Function
+ * @param {Object} object The object to invoke the method on.
+ * @param {string} key The key of the method.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new bound function.
+ * @example
+ *
+ * var object = {
+ * 'user': 'fred',
+ * 'greet': function(greeting, punctuation) {
+ * return greeting + ' ' + this.user + punctuation;
+ * }
+ * };
+ *
+ * var bound = _.bindKey(object, 'greet', 'hi');
+ * bound('!');
+ * // => 'hi fred!'
+ *
+ * object.greet = function(greeting, punctuation) {
+ * return greeting + 'ya ' + this.user + punctuation;
+ * };
+ *
+ * bound('!');
+ * // => 'hiya fred!'
+ *
+ * // Bound with placeholders.
+ * var bound = _.bindKey(object, 'greet', _, '!');
+ * bound('hi');
+ * // => 'hiya fred!'
+ */
+
+ var bindKey = baseRest(function (object, key, partials) {
+ var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
+
+ if (partials.length) {
+ var holders = replaceHolders(partials, getHolder(bindKey));
+ bitmask |= WRAP_PARTIAL_FLAG;
}
- }
- }
- context.replace(actionMoveNode(entity.id, loc)); // Below here: validations
+ return createWrap(key, bitmask, object, partials, holders);
+ });
+ /**
+ * Creates a function that accepts arguments of `func` and either invokes
+ * `func` returning its result, if at least `arity` number of arguments have
+ * been provided, or returns a function that accepts the remaining `func`
+ * arguments, and so on. The arity of `func` may be specified if `func.length`
+ * is not sufficient.
+ *
+ * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
+ * may be used as a placeholder for provided arguments.
+ *
+ * **Note:** This method doesn't set the "length" property of curried functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Function
+ * @param {Function} func The function to curry.
+ * @param {number} [arity=func.length] The arity of `func`.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Function} Returns the new curried function.
+ * @example
+ *
+ * var abc = function(a, b, c) {
+ * return [a, b, c];
+ * };
+ *
+ * var curried = _.curry(abc);
+ *
+ * curried(1)(2)(3);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2)(3);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2, 3);
+ * // => [1, 2, 3]
+ *
+ * // Curried with placeholders.
+ * curried(1)(_, 3)(2);
+ * // => [1, 2, 3]
+ */
- var isInvalid = false; // Check if this connection to `target` could cause relations to break..
+ function curry(func, arity, guard) {
+ arity = guard ? undefined$1 : arity;
+ var result = createWrap(func, WRAP_CURRY_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, undefined$1, arity);
+ result.placeholder = curry.placeholder;
+ return result;
+ }
+ /**
+ * This method is like `_.curry` except that arguments are applied to `func`
+ * in the manner of `_.partialRight` instead of `_.partial`.
+ *
+ * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for provided arguments.
+ *
+ * **Note:** This method doesn't set the "length" property of curried functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {Function} func The function to curry.
+ * @param {number} [arity=func.length] The arity of `func`.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Function} Returns the new curried function.
+ * @example
+ *
+ * var abc = function(a, b, c) {
+ * return [a, b, c];
+ * };
+ *
+ * var curried = _.curryRight(abc);
+ *
+ * curried(3)(2)(1);
+ * // => [1, 2, 3]
+ *
+ * curried(2, 3)(1);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2, 3);
+ * // => [1, 2, 3]
+ *
+ * // Curried with placeholders.
+ * curried(3)(1, _)(2);
+ * // => [1, 2, 3]
+ */
- if (target) {
- isInvalid = hasRelationConflict(entity, target, edge, context.graph());
- } // Check if this drag causes the geometry to break..
+ function curryRight(func, arity, guard) {
+ arity = guard ? undefined$1 : arity;
+ var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, undefined$1, arity);
+ result.placeholder = curryRight.placeholder;
+ return result;
+ }
+ /**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
+ * Provide `options` to indicate whether `func` should be invoked on the
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+ * with the last arguments provided to the debounced function. Subsequent
+ * calls to the debounced function return the result of the last `func`
+ * invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ * The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }));
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', debounced);
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel);
+ */
- if (!isInvalid) {
- isInvalid = hasInvalidGeometry(entity, context.graph());
- }
- var nope = context.surface().classed('nope');
+ function debounce(func, wait, options) {
+ var lastArgs,
+ lastThis,
+ maxWait,
+ result,
+ timerId,
+ lastCallTime,
+ lastInvokeTime = 0,
+ leading = false,
+ maxing = false,
+ trailing = true;
- if (isInvalid === 'relation' || isInvalid === 'restriction') {
- if (!nope) {
- // about to nope - show hint
- context.ui().flash.duration(4000).iconName('#iD-icon-no').label(_t('operations.connect.' + isInvalid, {
- relation: _mainPresetIndex.item('type/restriction').name()
- }))();
- }
- } else if (isInvalid) {
- var errorID = isInvalid === 'line' ? 'lines' : 'areas';
- context.ui().flash.duration(3000).iconName('#iD-icon-no').label(_t('self_intersection.error.' + errorID))();
- } else {
- if (nope) {
- // about to un-nope, remove hint
- context.ui().flash.duration(1).label('')();
- }
- }
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
- var nopeDisabled = context.surface().classed('nope-disabled');
+ wait = toNumber(wait) || 0;
- if (nopeDisabled) {
- context.surface().classed('nope', false).classed('nope-suppressed', isInvalid);
- } else {
- context.surface().classed('nope', isInvalid).classed('nope-suppressed', false);
- }
+ if (isObject(options)) {
+ leading = !!options.leading;
+ maxing = 'maxWait' in options;
+ maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
+ }
- _lastLoc = loc;
- } // Uses `actionConnect.disabled()` to know whether this connection is ok..
+ function invokeFunc(time) {
+ var args = lastArgs,
+ thisArg = lastThis;
+ lastArgs = lastThis = undefined$1;
+ lastInvokeTime = time;
+ result = func.apply(thisArg, args);
+ return result;
+ }
+ function leadingEdge(time) {
+ // Reset any `maxWait` timer.
+ lastInvokeTime = time; // Start the timer for the trailing edge.
- function hasRelationConflict(entity, target, edge, graph) {
- var testGraph = graph.update(); // copy
- // if snapping to way - add midpoint there and consider that the target..
+ timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.
- if (edge) {
- var midpoint = osmNode();
- var action = actionAddMidpoint({
- loc: edge.loc,
- edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
- }, midpoint);
- testGraph = action(testGraph);
- target = midpoint;
- } // can we connect to it?
+ return leading ? invokeFunc(time) : result;
+ }
+ function remainingWait(time) {
+ var timeSinceLastCall = time - lastCallTime,
+ timeSinceLastInvoke = time - lastInvokeTime,
+ timeWaiting = wait - timeSinceLastCall;
+ return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
+ }
- var ids = [entity.id, target.id];
- return actionConnect(ids).disabled(testGraph);
- }
+ function shouldInvoke(time) {
+ var timeSinceLastCall = time - lastCallTime,
+ timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
+ // trailing edge, the system time has gone backwards and we're treating
+ // it as the trailing edge, or we've hit the `maxWait` limit.
- function hasInvalidGeometry(entity, graph) {
- var parents = graph.parentWays(entity);
- var i, j, k;
+ return lastCallTime === undefined$1 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
+ }
- for (i = 0; i < parents.length; i++) {
- var parent = parents[i];
- var nodes = [];
- var activeIndex = null; // which multipolygon ring contains node being dragged
- // test any parent multipolygons for valid geometry
+ function timerExpired() {
+ var time = now();
- var relations = graph.parentRelations(parent);
+ if (shouldInvoke(time)) {
+ return trailingEdge(time);
+ } // Restart the timer.
- for (j = 0; j < relations.length; j++) {
- if (!relations[j].isMultipolygon()) continue;
- var rings = osmJoinWays(relations[j].members, graph); // find active ring and test it for self intersections
- for (k = 0; k < rings.length; k++) {
- nodes = rings[k].nodes;
+ timerId = setTimeout(timerExpired, remainingWait(time));
+ }
- if (nodes.find(function (n) {
- return n.id === entity.id;
- })) {
- activeIndex = k;
+ function trailingEdge(time) {
+ timerId = undefined$1; // Only invoke if we have `lastArgs` which means `func` has been
+ // debounced at least once.
- if (geoHasSelfIntersections(nodes, entity.id)) {
- return 'multipolygonMember';
- }
+ if (trailing && lastArgs) {
+ return invokeFunc(time);
}
- rings[k].coords = nodes.map(function (n) {
- return n.loc;
- });
- } // test active ring for intersections with other rings in the multipolygon
+ lastArgs = lastThis = undefined$1;
+ return result;
+ }
+ function cancel() {
+ if (timerId !== undefined$1) {
+ clearTimeout(timerId);
+ }
- for (k = 0; k < rings.length; k++) {
- if (k === activeIndex) continue; // make sure active ring doesn't cross passive rings
+ lastInvokeTime = 0;
+ lastArgs = lastCallTime = lastThis = timerId = undefined$1;
+ }
- if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
- return 'multipolygonRing';
- }
+ function flush() {
+ return timerId === undefined$1 ? result : trailingEdge(now());
}
- } // If we still haven't tested this node's parent way for self-intersections.
- // (because it's not a member of a multipolygon), test it now.
+ function debounced() {
+ var time = now(),
+ isInvoking = shouldInvoke(time);
+ lastArgs = arguments;
+ lastThis = this;
+ lastCallTime = time;
- if (activeIndex === null) {
- nodes = parent.nodes.map(function (nodeID) {
- return graph.entity(nodeID);
- });
+ if (isInvoking) {
+ if (timerId === undefined$1) {
+ return leadingEdge(lastCallTime);
+ }
- if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
- return parent.geometry(graph);
- }
- }
- }
+ if (maxing) {
+ // Handle invocations in a tight loop.
+ clearTimeout(timerId);
+ timerId = setTimeout(timerExpired, wait);
+ return invokeFunc(lastCallTime);
+ }
+ }
- return false;
- }
+ if (timerId === undefined$1) {
+ timerId = setTimeout(timerExpired, wait);
+ }
- function move(d3_event, entity, point) {
- if (_isCancelled) return;
- d3_event.stopPropagation();
- context.surface().classed('nope-disabled', d3_event.altKey);
- _lastLoc = context.projection.invert(point);
- doMove(d3_event, entity);
- var nudge = geoViewportEdge(point, context.map().dimensions());
+ return result;
+ }
- if (nudge) {
- startNudge(d3_event, entity, nudge);
- } else {
- stopNudge();
- }
- }
+ debounced.cancel = cancel;
+ debounced.flush = flush;
+ return debounced;
+ }
+ /**
+ * Defers invoking the `func` until the current call stack has cleared. Any
+ * additional arguments are provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to defer.
+ * @param {...*} [args] The arguments to invoke `func` with.
+ * @returns {number} Returns the timer id.
+ * @example
+ *
+ * _.defer(function(text) {
+ * console.log(text);
+ * }, 'deferred');
+ * // => Logs 'deferred' after one millisecond.
+ */
- function end(d3_event, entity) {
- if (_isCancelled) return;
- var wasPoint = entity.geometry(context.graph()) === 'point';
- var d = datum(d3_event);
- var nope = d && d.properties && d.properties.nope || context.surface().classed('nope');
- var target = d && d.properties && d.properties.entity; // entity to snap to
- if (nope) {
- // bounce back
- context.perform(_actionBounceBack(entity.id, _startLoc));
- } else if (target && target.type === 'way') {
- var choice = geoChooseEdge(context.graph().childNodes(target), context.map().mouse(), context.projection, entity.id);
- context.replace(actionAddMidpoint({
- loc: choice.loc,
- edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
- }, entity), connectAnnotation(entity, target));
- } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
- context.replace(actionConnect([target.id, entity.id]), connectAnnotation(entity, target));
- } else if (_wasMidpoint) {
- context.replace(actionNoop(), _t('operations.add.annotation.vertex'));
- } else {
- context.replace(actionNoop(), moveAnnotation(entity));
- }
+ var defer = baseRest(function (func, args) {
+ return baseDelay(func, 1, args);
+ });
+ /**
+ * Invokes `func` after `wait` milliseconds. Any additional arguments are
+ * provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @param {...*} [args] The arguments to invoke `func` with.
+ * @returns {number} Returns the timer id.
+ * @example
+ *
+ * _.delay(function(text) {
+ * console.log(text);
+ * }, 1000, 'later');
+ * // => Logs 'later' after one second.
+ */
- if (wasPoint) {
- context.enter(modeSelect(context, [entity.id]));
- } else {
- var reselection = _restoreSelectedIDs.filter(function (id) {
- return context.graph().hasEntity(id);
+ var delay = baseRest(function (func, wait, args) {
+ return baseDelay(func, toNumber(wait) || 0, args);
});
+ /**
+ * Creates a function that invokes `func` with arguments reversed.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Function
+ * @param {Function} func The function to flip arguments for.
+ * @returns {Function} Returns the new flipped function.
+ * @example
+ *
+ * var flipped = _.flip(function() {
+ * return _.toArray(arguments);
+ * });
+ *
+ * flipped('a', 'b', 'c', 'd');
+ * // => ['d', 'c', 'b', 'a']
+ */
- if (reselection.length) {
- context.enter(modeSelect(context, reselection));
- } else {
- context.enter(modeBrowse(context));
+ function flip(func) {
+ return createWrap(func, WRAP_FLIP_FLAG);
}
- }
- }
+ /**
+ * Creates a function that memoizes the result of `func`. If `resolver` is
+ * provided, it determines the cache key for storing the result based on the
+ * arguments provided to the memoized function. By default, the first argument
+ * provided to the memoized function is used as the map cache key. The `func`
+ * is invoked with the `this` binding of the memoized function.
+ *
+ * **Note:** The cache is exposed as the `cache` property on the memoized
+ * function. Its creation may be customized by replacing the `_.memoize.Cache`
+ * constructor with one whose instances implement the
+ * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
+ * method interface of `clear`, `delete`, `get`, `has`, and `set`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to have its output memoized.
+ * @param {Function} [resolver] The function to resolve the cache key.
+ * @returns {Function} Returns the new memoized function.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ * var other = { 'c': 3, 'd': 4 };
+ *
+ * var values = _.memoize(_.values);
+ * values(object);
+ * // => [1, 2]
+ *
+ * values(other);
+ * // => [3, 4]
+ *
+ * object.a = 2;
+ * values(object);
+ * // => [1, 2]
+ *
+ * // Modify the result cache.
+ * values.cache.set(object, ['a', 'b']);
+ * values(object);
+ * // => ['a', 'b']
+ *
+ * // Replace `_.memoize.Cache`.
+ * _.memoize.Cache = WeakMap;
+ */
- function _actionBounceBack(nodeID, toLoc) {
- var moveNode = actionMoveNode(nodeID, toLoc);
- var action = function action(graph, t) {
- // last time through, pop off the bounceback perform.
- // it will then overwrite the initial perform with a moveNode that does nothing
- if (t === 1) context.pop();
- return moveNode(graph, t);
- };
+ function memoize(func, resolver) {
+ if (typeof func != 'function' || resolver != null && typeof resolver != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
- action.transitionable = true;
- return action;
- }
+ var memoized = function memoized() {
+ var args = arguments,
+ key = resolver ? resolver.apply(this, args) : args[0],
+ cache = memoized.cache;
- function cancel() {
- drag.cancel();
- context.enter(modeBrowse(context));
- }
+ if (cache.has(key)) {
+ return cache.get(key);
+ }
- var drag = behaviorDrag().selector('.layer-touch.points .target').surface(context.container().select('.main-map').node()).origin(origin).on('start', start).on('move', move).on('end', end);
+ var result = func.apply(this, args);
+ memoized.cache = cache.set(key, result) || cache;
+ return result;
+ };
- mode.enter = function () {
- context.install(hover);
- context.install(edit);
- select(window).on('keydown.dragNode', keydown).on('keyup.dragNode', keyup);
- context.history().on('undone.drag-node', cancel);
- };
+ memoized.cache = new (memoize.Cache || MapCache)();
+ return memoized;
+ } // Expose `MapCache`.
- mode.exit = function () {
- context.ui().sidebar.hover.cancel();
- context.uninstall(hover);
- context.uninstall(edit);
- select(window).on('keydown.dragNode', null).on('keyup.dragNode', null);
- context.history().on('undone.drag-node', null);
- _activeEntity = null;
- context.surface().classed('nope', false).classed('nope-suppressed', false).classed('nope-disabled', false).selectAll('.active').classed('active', false);
- stopNudge();
- };
- mode.selectedIDs = function () {
- if (!arguments.length) return _activeEntity ? [_activeEntity.id] : []; // no assign
+ memoize.Cache = MapCache;
+ /**
+ * Creates a function that negates the result of the predicate `func`. The
+ * `func` predicate is invoked with the `this` binding and arguments of the
+ * created function.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {Function} predicate The predicate to negate.
+ * @returns {Function} Returns the new negated function.
+ * @example
+ *
+ * function isEven(n) {
+ * return n % 2 == 0;
+ * }
+ *
+ * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
+ * // => [1, 3, 5]
+ */
- return mode;
- };
+ function negate(predicate) {
+ if (typeof predicate != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
- mode.activeID = function () {
- if (!arguments.length) return _activeEntity && _activeEntity.id; // no assign
+ return function () {
+ var args = arguments;
- return mode;
- };
+ switch (args.length) {
+ case 0:
+ return !predicate.call(this);
- mode.restoreSelectedIDs = function (_) {
- if (!arguments.length) return _restoreSelectedIDs;
- _restoreSelectedIDs = _;
- return mode;
- };
+ case 1:
+ return !predicate.call(this, args[0]);
- mode.behavior = drag;
- return mode;
- }
+ case 2:
+ return !predicate.call(this, args[0], args[1]);
- // @@search logic
- fixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {
- return [
- // `String.prototype.search` method
- // https://tc39.es/ecma262/#sec-string.prototype.search
- function search(regexp) {
- var O = requireObjectCoercible(this);
- var searcher = regexp == undefined ? undefined : regexp[SEARCH];
- return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
- },
- // `RegExp.prototype[@@search]` method
- // https://tc39.es/ecma262/#sec-regexp.prototype-@@search
- function (regexp) {
- var res = maybeCallNative(nativeSearch, regexp, this);
- if (res.done) return res.value;
+ case 3:
+ return !predicate.call(this, args[0], args[1], args[2]);
+ }
- var rx = anObject(regexp);
- var S = String(this);
+ return !predicate.apply(this, args);
+ };
+ }
+ /**
+ * Creates a function that is restricted to invoking `func` once. Repeat calls
+ * to the function return the value of the first invocation. The `func` is
+ * invoked with the `this` binding and arguments of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var initialize = _.once(createApplication);
+ * initialize();
+ * initialize();
+ * // => `createApplication` is invoked once
+ */
- var previousLastIndex = rx.lastIndex;
- if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;
- var result = regexpExecAbstract(rx, S);
- if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;
- return result === null ? -1 : result.index;
- }
- ];
- });
- // Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829
- var NON_GENERIC = !!nativePromiseConstructor && fails(function () {
- nativePromiseConstructor.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });
- });
+ function once(func) {
+ return before(2, func);
+ }
+ /**
+ * Creates a function that invokes `func` with its arguments transformed.
+ *
+ * @static
+ * @since 4.0.0
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to wrap.
+ * @param {...(Function|Function[])} [transforms=[_.identity]]
+ * The argument transforms.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function doubled(n) {
+ * return n * 2;
+ * }
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var func = _.overArgs(function(x, y) {
+ * return [x, y];
+ * }, [square, doubled]);
+ *
+ * func(9, 3);
+ * // => [81, 6]
+ *
+ * func(10, 5);
+ * // => [100, 10]
+ */
- // `Promise.prototype.finally` method
- // https://tc39.es/ecma262/#sec-promise.prototype.finally
- _export({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {
- 'finally': function (onFinally) {
- var C = speciesConstructor(this, getBuiltIn('Promise'));
- var isFunction = typeof onFinally == 'function';
- return this.then(
- isFunction ? function (x) {
- return promiseResolve(C, onFinally()).then(function () { return x; });
- } : onFinally,
- isFunction ? function (e) {
- return promiseResolve(C, onFinally()).then(function () { throw e; });
- } : onFinally
- );
- }
- });
- // patch native Promise.prototype for native async functions
- if ( typeof nativePromiseConstructor == 'function' && !nativePromiseConstructor.prototype['finally']) {
- redefine(nativePromiseConstructor.prototype, 'finally', getBuiltIn('Promise').prototype['finally']);
- }
+ var overArgs = castRest(function (func, transforms) {
+ transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
+ var funcsLength = transforms.length;
+ return baseRest(function (args) {
+ var index = -1,
+ length = nativeMin(args.length, funcsLength);
- function quickselect$1(arr, k, left, right, compare) {
- quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare);
- }
+ while (++index < length) {
+ args[index] = transforms[index].call(this, args[index]);
+ }
- function quickselectStep(arr, k, left, right, compare) {
- while (right > left) {
- if (right - left > 600) {
- var n = right - left + 1;
- var m = k - left + 1;
- var z = Math.log(n);
- var s = 0.5 * Math.exp(2 * z / 3);
- var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
- var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
- var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
- quickselectStep(arr, k, newLeft, newRight, compare);
- }
+ return apply(func, this, args);
+ });
+ });
+ /**
+ * Creates a function that invokes `func` with `partials` prepended to the
+ * arguments it receives. This method is like `_.bind` except it does **not**
+ * alter the `this` binding.
+ *
+ * The `_.partial.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** This method doesn't set the "length" property of partially
+ * applied functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.2.0
+ * @category Function
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new partially applied function.
+ * @example
+ *
+ * function greet(greeting, name) {
+ * return greeting + ' ' + name;
+ * }
+ *
+ * var sayHelloTo = _.partial(greet, 'hello');
+ * sayHelloTo('fred');
+ * // => 'hello fred'
+ *
+ * // Partially applied with placeholders.
+ * var greetFred = _.partial(greet, _, 'fred');
+ * greetFred('hi');
+ * // => 'hi fred'
+ */
- var t = arr[k];
- var i = left;
- var j = right;
- swap$1(arr, left, k);
- if (compare(arr[right], t) > 0) swap$1(arr, left, right);
+ var partial = baseRest(function (func, partials) {
+ var holders = replaceHolders(partials, getHolder(partial));
+ return createWrap(func, WRAP_PARTIAL_FLAG, undefined$1, partials, holders);
+ });
+ /**
+ * This method is like `_.partial` except that partially applied arguments
+ * are appended to the arguments it receives.
+ *
+ * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** This method doesn't set the "length" property of partially
+ * applied functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.0.0
+ * @category Function
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new partially applied function.
+ * @example
+ *
+ * function greet(greeting, name) {
+ * return greeting + ' ' + name;
+ * }
+ *
+ * var greetFred = _.partialRight(greet, 'fred');
+ * greetFred('hi');
+ * // => 'hi fred'
+ *
+ * // Partially applied with placeholders.
+ * var sayHelloTo = _.partialRight(greet, 'hello', _);
+ * sayHelloTo('fred');
+ * // => 'hello fred'
+ */
- while (i < j) {
- swap$1(arr, i, j);
- i++;
- j--;
+ var partialRight = baseRest(function (func, partials) {
+ var holders = replaceHolders(partials, getHolder(partialRight));
+ return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined$1, partials, holders);
+ });
+ /**
+ * Creates a function that invokes `func` with arguments arranged according
+ * to the specified `indexes` where the argument value at the first index is
+ * provided as the first argument, the argument value at the second index is
+ * provided as the second argument, and so on.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {Function} func The function to rearrange arguments for.
+ * @param {...(number|number[])} indexes The arranged argument indexes.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var rearged = _.rearg(function(a, b, c) {
+ * return [a, b, c];
+ * }, [2, 0, 1]);
+ *
+ * rearged('b', 'c', 'a')
+ * // => ['a', 'b', 'c']
+ */
- while (compare(arr[i], t) < 0) {
- i++;
- }
+ var rearg = flatRest(function (func, indexes) {
+ return createWrap(func, WRAP_REARG_FLAG, undefined$1, undefined$1, undefined$1, indexes);
+ });
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the
+ * created function and arguments from `start` and beyond provided as
+ * an array.
+ *
+ * **Note:** This method is based on the
+ * [rest parameter](https://mdn.io/rest_parameters).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Function
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.rest(function(what, names) {
+ * return what + ' ' + _.initial(names).join(', ') +
+ * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+ * });
+ *
+ * say('hello', 'fred', 'barney', 'pebbles');
+ * // => 'hello fred, barney, & pebbles'
+ */
- while (compare(arr[j], t) > 0) {
- j--;
+ function rest(func, start) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+
+ start = start === undefined$1 ? start : toInteger(start);
+ return baseRest(func, start);
}
- }
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the
+ * create function and an array of arguments much like
+ * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
+ *
+ * **Note:** This method is based on the
+ * [spread operator](https://mdn.io/spread_operator).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.2.0
+ * @category Function
+ * @param {Function} func The function to spread arguments over.
+ * @param {number} [start=0] The start position of the spread.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.spread(function(who, what) {
+ * return who + ' says ' + what;
+ * });
+ *
+ * say(['fred', 'hello']);
+ * // => 'fred says hello'
+ *
+ * var numbers = Promise.all([
+ * Promise.resolve(40),
+ * Promise.resolve(36)
+ * ]);
+ *
+ * numbers.then(_.spread(function(x, y) {
+ * return x + y;
+ * }));
+ * // => a Promise of 76
+ */
- if (compare(arr[left], t) === 0) swap$1(arr, left, j);else {
- j++;
- swap$1(arr, j, right);
- }
- if (j <= k) left = j + 1;
- if (k <= j) right = j - 1;
- }
- }
- function swap$1(arr, i, j) {
- var tmp = arr[i];
- arr[i] = arr[j];
- arr[j] = tmp;
- }
+ function spread(func, start) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
- function defaultCompare(a, b) {
- return a < b ? -1 : a > b ? 1 : 0;
- }
+ start = start == null ? 0 : nativeMax(toInteger(start), 0);
+ return baseRest(function (args) {
+ var array = args[start],
+ otherArgs = castSlice(args, 0, start);
- var RBush = /*#__PURE__*/function () {
- function RBush() {
- var maxEntries = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 9;
+ if (array) {
+ arrayPush(otherArgs, array);
+ }
- _classCallCheck(this, RBush);
+ return apply(func, this, otherArgs);
+ });
+ }
+ /**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
+ * method to cancel delayed `func` invocations and a `flush` method to
+ * immediately invoke them. Provide `options` to indicate whether `func`
+ * should be invoked on the leading and/or trailing edge of the `wait`
+ * timeout. The `func` is invoked with the last arguments provided to the
+ * throttled function. Subsequent calls to the throttled function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the throttled function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.throttle` and `_.debounce`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=true]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // Avoid excessively updating the position while scrolling.
+ * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+ *
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+ * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
+ * jQuery(element).on('click', throttled);
+ *
+ * // Cancel the trailing throttled invocation.
+ * jQuery(window).on('popstate', throttled.cancel);
+ */
- // max entries in a node is 9 by default; min node fill is 40% for best performance
- this._maxEntries = Math.max(4, maxEntries);
- this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
- this.clear();
- }
- _createClass(RBush, [{
- key: "all",
- value: function all() {
- return this._all(this.data, []);
- }
- }, {
- key: "search",
- value: function search(bbox) {
- var node = this.data;
- var result = [];
- if (!intersects(bbox, node)) return result;
- var toBBox = this.toBBox;
- var nodesToSearch = [];
+ function throttle(func, wait, options) {
+ var leading = true,
+ trailing = true;
- while (node) {
- for (var i = 0; i < node.children.length; i++) {
- var child = node.children[i];
- var childBBox = node.leaf ? toBBox(child) : child;
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
- if (intersects(bbox, childBBox)) {
- if (node.leaf) result.push(child);else if (contains(bbox, childBBox)) this._all(child, result);else nodesToSearch.push(child);
- }
+ if (isObject(options)) {
+ leading = 'leading' in options ? !!options.leading : leading;
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
}
- node = nodesToSearch.pop();
+ return debounce(func, wait, {
+ 'leading': leading,
+ 'maxWait': wait,
+ 'trailing': trailing
+ });
}
+ /**
+ * Creates a function that accepts up to one argument, ignoring any
+ * additional arguments.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Function
+ * @param {Function} func The function to cap arguments for.
+ * @returns {Function} Returns the new capped function.
+ * @example
+ *
+ * _.map(['6', '8', '10'], _.unary(parseInt));
+ * // => [6, 8, 10]
+ */
- return result;
- }
- }, {
- key: "collides",
- value: function collides(bbox) {
- var node = this.data;
- if (!intersects(bbox, node)) return false;
- var nodesToSearch = [];
- while (node) {
- for (var i = 0; i < node.children.length; i++) {
- var child = node.children[i];
- var childBBox = node.leaf ? this.toBBox(child) : child;
+ function unary(func) {
+ return ary(func, 1);
+ }
+ /**
+ * Creates a function that provides `value` to `wrapper` as its first
+ * argument. Any additional arguments provided to the function are appended
+ * to those provided to the `wrapper`. The wrapper is invoked with the `this`
+ * binding of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {*} value The value to wrap.
+ * @param {Function} [wrapper=identity] The wrapper function.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var p = _.wrap(_.escape, function(func, text) {
+ * return '' + func(text) + '
';
+ * });
+ *
+ * p('fred, barney, & pebbles');
+ * // => 'fred, barney, & pebbles
'
+ */
- if (intersects(bbox, childBBox)) {
- if (node.leaf || contains(bbox, childBBox)) return true;
- nodesToSearch.push(child);
- }
- }
- node = nodesToSearch.pop();
+ function wrap(value, wrapper) {
+ return partial(castFunction(wrapper), value);
}
+ /*------------------------------------------------------------------------*/
- return false;
- }
- }, {
- key: "load",
- value: function load(data) {
- if (!(data && data.length)) return this;
+ /**
+ * Casts `value` as an array if it's not one.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.4.0
+ * @category Lang
+ * @param {*} value The value to inspect.
+ * @returns {Array} Returns the cast array.
+ * @example
+ *
+ * _.castArray(1);
+ * // => [1]
+ *
+ * _.castArray({ 'a': 1 });
+ * // => [{ 'a': 1 }]
+ *
+ * _.castArray('abc');
+ * // => ['abc']
+ *
+ * _.castArray(null);
+ * // => [null]
+ *
+ * _.castArray(undefined);
+ * // => [undefined]
+ *
+ * _.castArray();
+ * // => []
+ *
+ * var array = [1, 2, 3];
+ * console.log(_.castArray(array) === array);
+ * // => true
+ */
- if (data.length < this._minEntries) {
- for (var i = 0; i < data.length; i++) {
- this.insert(data[i]);
+
+ function castArray() {
+ if (!arguments.length) {
+ return [];
}
- return this;
- } // recursively build the tree with the given data from scratch using OMT algorithm
+ var value = arguments[0];
+ return isArray(value) ? value : [value];
+ }
+ /**
+ * Creates a shallow clone of `value`.
+ *
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
+ * and supports cloning arrays, array buffers, booleans, date objects, maps,
+ * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
+ * arrays. The own enumerable properties of `arguments` objects are cloned
+ * as plain objects. An empty object is returned for uncloneable values such
+ * as error objects, functions, DOM nodes, and WeakMaps.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to clone.
+ * @returns {*} Returns the cloned value.
+ * @see _.cloneDeep
+ * @example
+ *
+ * var objects = [{ 'a': 1 }, { 'b': 2 }];
+ *
+ * var shallow = _.clone(objects);
+ * console.log(shallow[0] === objects[0]);
+ * // => true
+ */
- var node = this._build(data.slice(), 0, data.length - 1, 0);
+ function clone(value) {
+ return baseClone(value, CLONE_SYMBOLS_FLAG);
+ }
+ /**
+ * This method is like `_.clone` except that it accepts `customizer` which
+ * is invoked to produce the cloned value. If `customizer` returns `undefined`,
+ * cloning is handled by the method instead. The `customizer` is invoked with
+ * up to four arguments; (value [, index|key, object, stack]).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to clone.
+ * @param {Function} [customizer] The function to customize cloning.
+ * @returns {*} Returns the cloned value.
+ * @see _.cloneDeepWith
+ * @example
+ *
+ * function customizer(value) {
+ * if (_.isElement(value)) {
+ * return value.cloneNode(false);
+ * }
+ * }
+ *
+ * var el = _.cloneWith(document.body, customizer);
+ *
+ * console.log(el === document.body);
+ * // => false
+ * console.log(el.nodeName);
+ * // => 'BODY'
+ * console.log(el.childNodes.length);
+ * // => 0
+ */
- if (!this.data.children.length) {
- // save as is if tree is empty
- this.data = node;
- } else if (this.data.height === node.height) {
- // split root if trees have the same height
- this._splitRoot(this.data, node);
- } else {
- if (this.data.height < node.height) {
- // swap trees if inserted one is bigger
- var tmpNode = this.data;
- this.data = node;
- node = tmpNode;
- } // insert the small tree into the large tree at appropriate level
+ function cloneWith(value, customizer) {
+ customizer = typeof customizer == 'function' ? customizer : undefined$1;
+ return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
+ }
+ /**
+ * This method is like `_.clone` except that it recursively clones `value`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.0.0
+ * @category Lang
+ * @param {*} value The value to recursively clone.
+ * @returns {*} Returns the deep cloned value.
+ * @see _.clone
+ * @example
+ *
+ * var objects = [{ 'a': 1 }, { 'b': 2 }];
+ *
+ * var deep = _.cloneDeep(objects);
+ * console.log(deep[0] === objects[0]);
+ * // => false
+ */
- this._insert(node, this.data.height - node.height - 1, true);
+
+ function cloneDeep(value) {
+ return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
}
+ /**
+ * This method is like `_.cloneWith` except that it recursively clones `value`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to recursively clone.
+ * @param {Function} [customizer] The function to customize cloning.
+ * @returns {*} Returns the deep cloned value.
+ * @see _.cloneWith
+ * @example
+ *
+ * function customizer(value) {
+ * if (_.isElement(value)) {
+ * return value.cloneNode(true);
+ * }
+ * }
+ *
+ * var el = _.cloneDeepWith(document.body, customizer);
+ *
+ * console.log(el === document.body);
+ * // => false
+ * console.log(el.nodeName);
+ * // => 'BODY'
+ * console.log(el.childNodes.length);
+ * // => 20
+ */
- return this;
- }
- }, {
- key: "insert",
- value: function insert(item) {
- if (item) this._insert(item, this.data.height - 1);
- return this;
- }
- }, {
- key: "clear",
- value: function clear() {
- this.data = createNode([]);
- return this;
- }
- }, {
- key: "remove",
- value: function remove(item, equalsFn) {
- if (!item) return this;
- var node = this.data;
- var bbox = this.toBBox(item);
- var path = [];
- var indexes = [];
- var i, parent, goingUp; // depth-first iterative tree traversal
- while (node || path.length) {
- if (!node) {
- // go up
- node = path.pop();
- parent = path[path.length - 1];
- i = indexes.pop();
- goingUp = true;
- }
+ function cloneDeepWith(value, customizer) {
+ customizer = typeof customizer == 'function' ? customizer : undefined$1;
+ return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
+ }
+ /**
+ * Checks if `object` conforms to `source` by invoking the predicate
+ * properties of `source` with the corresponding property values of `object`.
+ *
+ * **Note:** This method is equivalent to `_.conforms` when `source` is
+ * partially applied.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.14.0
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ *
+ * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
+ * // => true
+ *
+ * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
+ * // => false
+ */
- if (node.leaf) {
- // check current node
- var index = findItem(item, node.children, equalsFn);
- if (index !== -1) {
- // item found, remove the item and condense tree upwards
- node.children.splice(index, 1);
- path.push(node);
+ function conformsTo(object, source) {
+ return source == null || baseConformsTo(object, source, keys(source));
+ }
+ /**
+ * Performs a
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * comparison between two values to determine if they are equivalent.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.eq(object, object);
+ * // => true
+ *
+ * _.eq(object, other);
+ * // => false
+ *
+ * _.eq('a', 'a');
+ * // => true
+ *
+ * _.eq('a', Object('a'));
+ * // => false
+ *
+ * _.eq(NaN, NaN);
+ * // => true
+ */
- this._condense(path);
- return this;
- }
- }
+ function eq(value, other) {
+ return value === other || value !== value && other !== other;
+ }
+ /**
+ * Checks if `value` is greater than `other`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.9.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than `other`,
+ * else `false`.
+ * @see _.lt
+ * @example
+ *
+ * _.gt(3, 1);
+ * // => true
+ *
+ * _.gt(3, 3);
+ * // => false
+ *
+ * _.gt(1, 3);
+ * // => false
+ */
- if (!goingUp && !node.leaf && contains(node, bbox)) {
- // go down
- path.push(node);
- indexes.push(i);
- i = 0;
- parent = node;
- node = node.children[0];
- } else if (parent) {
- // go right
- i++;
- node = parent.children[i];
- goingUp = false;
- } else node = null; // nothing found
+ var gt = createRelationalOperation(baseGt);
+ /**
+ * Checks if `value` is greater than or equal to `other`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.9.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than or equal to
+ * `other`, else `false`.
+ * @see _.lte
+ * @example
+ *
+ * _.gte(3, 1);
+ * // => true
+ *
+ * _.gte(3, 3);
+ * // => true
+ *
+ * _.gte(1, 3);
+ * // => false
+ */
+
+ var gte = createRelationalOperation(function (value, other) {
+ return value >= other;
+ });
+ /**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ * else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+
+ var isArguments = baseIsArguments(function () {
+ return arguments;
+ }()) ? baseIsArguments : function (value) {
+ return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
+ };
+ /**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(document.body.children);
+ * // => false
+ *
+ * _.isArray('abc');
+ * // => false
+ *
+ * _.isArray(_.noop);
+ * // => false
+ */
+
+ var isArray = Array.isArray;
+ /**
+ * Checks if `value` is classified as an `ArrayBuffer` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+ * @example
+ *
+ * _.isArrayBuffer(new ArrayBuffer(2));
+ * // => true
+ *
+ * _.isArrayBuffer(new Array(2));
+ * // => false
+ */
+
+ var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
+ /**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+
+ function isArrayLike(value) {
+ return value != null && isLength(value.length) && !isFunction(value);
}
+ /**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ * else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
- return this;
- }
- }, {
- key: "toBBox",
- value: function toBBox(item) {
- return item;
- }
- }, {
- key: "compareMinX",
- value: function compareMinX(a, b) {
- return a.minX - b.minX;
- }
- }, {
- key: "compareMinY",
- value: function compareMinY(a, b) {
- return a.minY - b.minY;
- }
- }, {
- key: "toJSON",
- value: function toJSON() {
- return this.data;
- }
- }, {
- key: "fromJSON",
- value: function fromJSON(data) {
- this.data = data;
- return this;
- }
- }, {
- key: "_all",
- value: function _all(node, result) {
- var nodesToSearch = [];
- while (node) {
- if (node.leaf) result.push.apply(result, _toConsumableArray(node.children));else nodesToSearch.push.apply(nodesToSearch, _toConsumableArray(node.children));
- node = nodesToSearch.pop();
+ function isArrayLikeObject(value) {
+ return isObjectLike(value) && isArrayLike(value);
}
+ /**
+ * Checks if `value` is classified as a boolean primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
+ * @example
+ *
+ * _.isBoolean(false);
+ * // => true
+ *
+ * _.isBoolean(null);
+ * // => false
+ */
- return result;
- }
- }, {
- key: "_build",
- value: function _build(items, left, right, height) {
- var N = right - left + 1;
- var M = this._maxEntries;
- var node;
- if (N <= M) {
- // reached leaf level; return leaf
- node = createNode(items.slice(left, right + 1));
- calcBBox(node, this.toBBox);
- return node;
+ function isBoolean(value) {
+ return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag;
}
+ /**
+ * Checks if `value` is a buffer.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+ * @example
+ *
+ * _.isBuffer(new Buffer(2));
+ * // => true
+ *
+ * _.isBuffer(new Uint8Array(2));
+ * // => false
+ */
- if (!height) {
- // target height of the bulk-loaded tree
- height = Math.ceil(Math.log(N) / Math.log(M)); // target number of root entries to maximize storage utilization
- M = Math.ceil(N / Math.pow(M, height - 1));
+ var isBuffer = nativeIsBuffer || stubFalse;
+ /**
+ * Checks if `value` is classified as a `Date` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+ * @example
+ *
+ * _.isDate(new Date);
+ * // => true
+ *
+ * _.isDate('Mon April 23 2012');
+ * // => false
+ */
+
+ var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
+ /**
+ * Checks if `value` is likely a DOM element.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
+ * @example
+ *
+ * _.isElement(document.body);
+ * // => true
+ *
+ * _.isElement('');
+ * // => false
+ */
+
+ function isElement(value) {
+ return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
}
+ /**
+ * Checks if `value` is an empty object, collection, map, or set.
+ *
+ * Objects are considered empty if they have no own enumerable string keyed
+ * properties.
+ *
+ * Array-like values such as `arguments` objects, arrays, buffers, strings, or
+ * jQuery-like collections are considered empty if they have a `length` of `0`.
+ * Similarly, maps and sets are considered empty if they have a `size` of `0`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+ * @example
+ *
+ * _.isEmpty(null);
+ * // => true
+ *
+ * _.isEmpty(true);
+ * // => true
+ *
+ * _.isEmpty(1);
+ * // => true
+ *
+ * _.isEmpty([1, 2, 3]);
+ * // => false
+ *
+ * _.isEmpty({ 'a': 1 });
+ * // => false
+ */
- node = createNode([]);
- node.leaf = false;
- node.height = height; // split the items into M mostly square tiles
- var N2 = Math.ceil(N / M);
- var N1 = N2 * Math.ceil(Math.sqrt(M));
- multiSelect(items, left, right, N1, this.compareMinX);
+ function isEmpty(value) {
+ if (value == null) {
+ return true;
+ }
- for (var i = left; i <= right; i += N1) {
- var right2 = Math.min(i + N1 - 1, right);
- multiSelect(items, i, right2, N2, this.compareMinY);
+ if (isArrayLike(value) && (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || isBuffer(value) || isTypedArray(value) || isArguments(value))) {
+ return !value.length;
+ }
- for (var j = i; j <= right2; j += N2) {
- var right3 = Math.min(j + N2 - 1, right2); // pack each entry recursively
+ var tag = getTag(value);
- node.children.push(this._build(items, j, right3, height - 1));
+ if (tag == mapTag || tag == setTag) {
+ return !value.size;
}
- }
-
- calcBBox(node, this.toBBox);
- return node;
- }
- }, {
- key: "_chooseSubtree",
- value: function _chooseSubtree(bbox, node, level, path) {
- while (true) {
- path.push(node);
- if (node.leaf || path.length - 1 === level) break;
- var minArea = Infinity;
- var minEnlargement = Infinity;
- var targetNode = void 0;
- for (var i = 0; i < node.children.length; i++) {
- var child = node.children[i];
- var area = bboxArea(child);
- var enlargement = enlargedArea(bbox, child) - area; // choose entry with the least area enlargement
+ if (isPrototype(value)) {
+ return !baseKeys(value).length;
+ }
- if (enlargement < minEnlargement) {
- minEnlargement = enlargement;
- minArea = area < minArea ? area : minArea;
- targetNode = child;
- } else if (enlargement === minEnlargement) {
- // otherwise choose one with the smallest area
- if (area < minArea) {
- minArea = area;
- targetNode = child;
- }
+ for (var key in value) {
+ if (hasOwnProperty.call(value, key)) {
+ return false;
}
}
- node = targetNode || node.children[0];
+ return true;
}
+ /**
+ * Performs a deep comparison between two values to determine if they are
+ * equivalent.
+ *
+ * **Note:** This method supports comparing arrays, array buffers, booleans,
+ * date objects, error objects, maps, numbers, `Object` objects, regexes,
+ * sets, strings, symbols, and typed arrays. `Object` objects are compared
+ * by their own, not inherited, enumerable properties. Functions and DOM
+ * nodes are compared by strict equality, i.e. `===`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.isEqual(object, other);
+ * // => true
+ *
+ * object === other;
+ * // => false
+ */
- return node;
- }
- }, {
- key: "_insert",
- value: function _insert(item, level, isNode) {
- var bbox = isNode ? item : this.toBBox(item);
- var insertPath = []; // find the best node for accommodating the item, saving all nodes along the path too
-
- var node = this._chooseSubtree(bbox, this.data, level, insertPath); // put the item into the node
+ function isEqual(value, other) {
+ return baseIsEqual(value, other);
+ }
+ /**
+ * This method is like `_.isEqual` except that it accepts `customizer` which
+ * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+ * are handled by the method instead. The `customizer` is invoked with up to
+ * six arguments: (objValue, othValue [, index|key, object, other, stack]).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * function isGreeting(value) {
+ * return /^h(?:i|ello)$/.test(value);
+ * }
+ *
+ * function customizer(objValue, othValue) {
+ * if (isGreeting(objValue) && isGreeting(othValue)) {
+ * return true;
+ * }
+ * }
+ *
+ * var array = ['hello', 'goodbye'];
+ * var other = ['hi', 'goodbye'];
+ *
+ * _.isEqualWith(array, other, customizer);
+ * // => true
+ */
- node.children.push(item);
- extend$1(node, bbox); // split on node overflow; propagate upwards if necessary
- while (level >= 0) {
- if (insertPath[level].children.length > this._maxEntries) {
- this._split(insertPath, level);
+ function isEqualWith(value, other, customizer) {
+ customizer = typeof customizer == 'function' ? customizer : undefined$1;
+ var result = customizer ? customizer(value, other) : undefined$1;
+ return result === undefined$1 ? baseIsEqual(value, other, undefined$1, customizer) : !!result;
+ }
+ /**
+ * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
+ * `SyntaxError`, `TypeError`, or `URIError` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
+ * @example
+ *
+ * _.isError(new Error);
+ * // => true
+ *
+ * _.isError(Error);
+ * // => false
+ */
- level--;
- } else break;
- } // adjust bboxes along the insertion path
+ function isError(value) {
+ if (!isObjectLike(value)) {
+ return false;
+ }
- this._adjustParentBBoxes(bbox, insertPath, level);
- } // split overflowed node into two
+ var tag = baseGetTag(value);
+ return tag == errorTag || tag == domExcTag || typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value);
+ }
+ /**
+ * Checks if `value` is a finite primitive number.
+ *
+ * **Note:** This method is based on
+ * [`Number.isFinite`](https://mdn.io/Number/isFinite).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
+ * @example
+ *
+ * _.isFinite(3);
+ * // => true
+ *
+ * _.isFinite(Number.MIN_VALUE);
+ * // => true
+ *
+ * _.isFinite(Infinity);
+ * // => false
+ *
+ * _.isFinite('3');
+ * // => false
+ */
- }, {
- key: "_split",
- value: function _split(insertPath, level) {
- var node = insertPath[level];
- var M = node.children.length;
- var m = this._minEntries;
- this._chooseSplitAxis(node, m, M);
+ function isFinite(value) {
+ return typeof value == 'number' && nativeIsFinite(value);
+ }
+ /**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
- var splitIndex = this._chooseSplitIndex(node, m, M);
- var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
- newNode.height = node.height;
- newNode.leaf = node.leaf;
- calcBBox(node, this.toBBox);
- calcBBox(newNode, this.toBBox);
- if (level) insertPath[level - 1].children.push(newNode);else this._splitRoot(node, newNode);
- }
- }, {
- key: "_splitRoot",
- value: function _splitRoot(node, newNode) {
- // split root node
- this.data = createNode([node, newNode]);
- this.data.height = node.height + 1;
- this.data.leaf = false;
- calcBBox(this.data, this.toBBox);
- }
- }, {
- key: "_chooseSplitIndex",
- value: function _chooseSplitIndex(node, m, M) {
- var index;
- var minOverlap = Infinity;
- var minArea = Infinity;
+ function isFunction(value) {
+ if (!isObject(value)) {
+ return false;
+ } // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in Safari 9 which returns 'object' for typed arrays and other constructors.
- for (var i = m; i <= M - m; i++) {
- var bbox1 = distBBox(node, 0, i, this.toBBox);
- var bbox2 = distBBox(node, i, M, this.toBBox);
- var overlap = intersectionArea(bbox1, bbox2);
- var area = bboxArea(bbox1) + bboxArea(bbox2); // choose distribution with minimum overlap
- if (overlap < minOverlap) {
- minOverlap = overlap;
- index = i;
- minArea = area < minArea ? area : minArea;
- } else if (overlap === minOverlap) {
- // otherwise choose distribution with minimum area
- if (area < minArea) {
- minArea = area;
- index = i;
- }
- }
+ var tag = baseGetTag(value);
+ return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
+ /**
+ * Checks if `value` is an integer.
+ *
+ * **Note:** This method is based on
+ * [`Number.isInteger`](https://mdn.io/Number/isInteger).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
+ * @example
+ *
+ * _.isInteger(3);
+ * // => true
+ *
+ * _.isInteger(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isInteger(Infinity);
+ * // => false
+ *
+ * _.isInteger('3');
+ * // => false
+ */
- return index || M - m;
- } // sorts node children by the best axis for split
-
- }, {
- key: "_chooseSplitAxis",
- value: function _chooseSplitAxis(node, m, M) {
- var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX;
- var compareMinY = node.leaf ? this.compareMinY : compareNodeMinY;
- var xMargin = this._allDistMargin(node, m, M, compareMinX);
+ function isInteger(value) {
+ return typeof value == 'number' && value == toInteger(value);
+ }
+ /**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
- var yMargin = this._allDistMargin(node, m, M, compareMinY); // if total distributions margin value is minimal for x, sort by minX,
- // otherwise it's already sorted by minY
+ function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+ }
+ /**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
- if (xMargin < yMargin) node.children.sort(compareMinX);
- } // total margin of all possible split distributions where each node is at least m full
- }, {
- key: "_allDistMargin",
- value: function _allDistMargin(node, m, M, compare) {
- node.children.sort(compare);
- var toBBox = this.toBBox;
- var leftBBox = distBBox(node, 0, m, toBBox);
- var rightBBox = distBBox(node, M - m, M, toBBox);
- var margin = bboxMargin(leftBBox) + bboxMargin(rightBBox);
+ function isObject(value) {
+ var type = _typeof(value);
- for (var i = m; i < M - m; i++) {
- var child = node.children[i];
- extend$1(leftBBox, node.leaf ? toBBox(child) : child);
- margin += bboxMargin(leftBBox);
+ return value != null && (type == 'object' || type == 'function');
}
+ /**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
- for (var _i = M - m - 1; _i >= m; _i--) {
- var _child = node.children[_i];
- extend$1(rightBBox, node.leaf ? toBBox(_child) : _child);
- margin += bboxMargin(rightBBox);
- }
- return margin;
- }
- }, {
- key: "_adjustParentBBoxes",
- value: function _adjustParentBBoxes(bbox, path, level) {
- // adjust bboxes along the given tree path
- for (var i = level; i >= 0; i--) {
- extend$1(path[i], bbox);
+ function isObjectLike(value) {
+ return value != null && _typeof(value) == 'object';
}
- }
- }, {
- key: "_condense",
- value: function _condense(path) {
- // go through the path, removing empty nodes and updating bboxes
- for (var i = path.length - 1, siblings; i >= 0; i--) {
- if (path[i].children.length === 0) {
- if (i > 0) {
- siblings = path[i - 1].children;
- siblings.splice(siblings.indexOf(path[i]), 1);
- } else this.clear();
- } else calcBBox(path[i], this.toBBox);
+ /**
+ * Checks if `value` is classified as a `Map` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+ * @example
+ *
+ * _.isMap(new Map);
+ * // => true
+ *
+ * _.isMap(new WeakMap);
+ * // => false
+ */
+
+
+ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
+ /**
+ * Performs a partial deep comparison between `object` and `source` to
+ * determine if `object` contains equivalent property values.
+ *
+ * **Note:** This method is equivalent to `_.matches` when `source` is
+ * partially applied.
+ *
+ * Partial comparisons will match empty array and empty object `source`
+ * values against any array or object value, respectively. See `_.isEqual`
+ * for a list of supported value comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property values to match.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ *
+ * _.isMatch(object, { 'b': 2 });
+ * // => true
+ *
+ * _.isMatch(object, { 'b': 1 });
+ * // => false
+ */
+
+ function isMatch(object, source) {
+ return object === source || baseIsMatch(object, source, getMatchData(source));
}
- }
- }]);
+ /**
+ * This method is like `_.isMatch` except that it accepts `customizer` which
+ * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+ * are handled by the method instead. The `customizer` is invoked with five
+ * arguments: (objValue, srcValue, index|key, object, source).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property values to match.
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ * @example
+ *
+ * function isGreeting(value) {
+ * return /^h(?:i|ello)$/.test(value);
+ * }
+ *
+ * function customizer(objValue, srcValue) {
+ * if (isGreeting(objValue) && isGreeting(srcValue)) {
+ * return true;
+ * }
+ * }
+ *
+ * var object = { 'greeting': 'hello' };
+ * var source = { 'greeting': 'hi' };
+ *
+ * _.isMatchWith(object, source, customizer);
+ * // => true
+ */
- return RBush;
- }();
- function findItem(item, items, equalsFn) {
- if (!equalsFn) return items.indexOf(item);
+ function isMatchWith(object, source, customizer) {
+ customizer = typeof customizer == 'function' ? customizer : undefined$1;
+ return baseIsMatch(object, source, getMatchData(source), customizer);
+ }
+ /**
+ * Checks if `value` is `NaN`.
+ *
+ * **Note:** This method is based on
+ * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
+ * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
+ * `undefined` and other non-number values.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+ * @example
+ *
+ * _.isNaN(NaN);
+ * // => true
+ *
+ * _.isNaN(new Number(NaN));
+ * // => true
+ *
+ * isNaN(undefined);
+ * // => true
+ *
+ * _.isNaN(undefined);
+ * // => false
+ */
- for (var i = 0; i < items.length; i++) {
- if (equalsFn(item, items[i])) return i;
- }
- return -1;
- } // calculate node's bbox from bboxes of its children
+ function isNaN(value) {
+ // An `NaN` primitive is the only value that is not equal to itself.
+ // Perform the `toStringTag` check first to avoid errors with some
+ // ActiveX objects in IE.
+ return isNumber(value) && value != +value;
+ }
+ /**
+ * Checks if `value` is a pristine native function.
+ *
+ * **Note:** This method can't reliably detect native functions in the presence
+ * of the core-js package because core-js circumvents this kind of detection.
+ * Despite multiple requests, the core-js maintainer has made it clear: any
+ * attempt to fix the detection will be obstructed. As a result, we're left
+ * with little choice but to throw an error. Unfortunately, this also affects
+ * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
+ * which rely on core-js.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function,
+ * else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
- function calcBBox(node, toBBox) {
- distBBox(node, 0, node.children.length, toBBox, node);
- } // min bounding rectangle of node children from k to p-1
+ function isNative(value) {
+ if (isMaskable(value)) {
+ throw new Error(CORE_ERROR_TEXT);
+ }
+ return baseIsNative(value);
+ }
+ /**
+ * Checks if `value` is `null`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
+ * @example
+ *
+ * _.isNull(null);
+ * // => true
+ *
+ * _.isNull(void 0);
+ * // => false
+ */
- function distBBox(node, k, p, toBBox, destNode) {
- if (!destNode) destNode = createNode(null);
- destNode.minX = Infinity;
- destNode.minY = Infinity;
- destNode.maxX = -Infinity;
- destNode.maxY = -Infinity;
- for (var i = k; i < p; i++) {
- var child = node.children[i];
- extend$1(destNode, node.leaf ? toBBox(child) : child);
- }
+ function isNull(value) {
+ return value === null;
+ }
+ /**
+ * Checks if `value` is `null` or `undefined`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
+ * @example
+ *
+ * _.isNil(null);
+ * // => true
+ *
+ * _.isNil(void 0);
+ * // => true
+ *
+ * _.isNil(NaN);
+ * // => false
+ */
- return destNode;
- }
- function extend$1(a, b) {
- a.minX = Math.min(a.minX, b.minX);
- a.minY = Math.min(a.minY, b.minY);
- a.maxX = Math.max(a.maxX, b.maxX);
- a.maxY = Math.max(a.maxY, b.maxY);
- return a;
- }
+ function isNil(value) {
+ return value == null;
+ }
+ /**
+ * Checks if `value` is classified as a `Number` primitive or object.
+ *
+ * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
+ * classified as numbers, use the `_.isFinite` method.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a number, else `false`.
+ * @example
+ *
+ * _.isNumber(3);
+ * // => true
+ *
+ * _.isNumber(Number.MIN_VALUE);
+ * // => true
+ *
+ * _.isNumber(Infinity);
+ * // => true
+ *
+ * _.isNumber('3');
+ * // => false
+ */
- function compareNodeMinX(a, b) {
- return a.minX - b.minX;
- }
- function compareNodeMinY(a, b) {
- return a.minY - b.minY;
- }
+ function isNumber(value) {
+ return typeof value == 'number' || isObjectLike(value) && baseGetTag(value) == numberTag;
+ }
+ /**
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.8.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * _.isPlainObject(new Foo);
+ * // => false
+ *
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
+ *
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
+ */
- function bboxArea(a) {
- return (a.maxX - a.minX) * (a.maxY - a.minY);
- }
- function bboxMargin(a) {
- return a.maxX - a.minX + (a.maxY - a.minY);
- }
+ function isPlainObject(value) {
+ if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
+ return false;
+ }
- function enlargedArea(a, b) {
- 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));
- }
+ var proto = getPrototype(value);
- function intersectionArea(a, b) {
- var minX = Math.max(a.minX, b.minX);
- var minY = Math.max(a.minY, b.minY);
- var maxX = Math.min(a.maxX, b.maxX);
- var maxY = Math.min(a.maxY, b.maxY);
- return Math.max(0, maxX - minX) * Math.max(0, maxY - minY);
- }
+ if (proto === null) {
+ return true;
+ }
- function contains(a, b) {
- return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY;
- }
+ var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+ return typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
+ }
+ /**
+ * Checks if `value` is classified as a `RegExp` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+ * @example
+ *
+ * _.isRegExp(/abc/);
+ * // => true
+ *
+ * _.isRegExp('/abc/');
+ * // => false
+ */
- function intersects(a, b) {
- return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY;
- }
- function createNode(children) {
- return {
- children: children,
- height: 1,
- leaf: true,
- minX: Infinity,
- minY: Infinity,
- maxX: -Infinity,
- maxY: -Infinity
- };
- } // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
- // combines selection algorithm with binary divide & conquer approach
+ var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
+ /**
+ * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
+ * double precision number which isn't the result of a rounded unsafe integer.
+ *
+ * **Note:** This method is based on
+ * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
+ * @example
+ *
+ * _.isSafeInteger(3);
+ * // => true
+ *
+ * _.isSafeInteger(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isSafeInteger(Infinity);
+ * // => false
+ *
+ * _.isSafeInteger('3');
+ * // => false
+ */
+ function isSafeInteger(value) {
+ return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
+ }
+ /**
+ * Checks if `value` is classified as a `Set` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+ * @example
+ *
+ * _.isSet(new Set);
+ * // => true
+ *
+ * _.isSet(new WeakSet);
+ * // => false
+ */
- function multiSelect(arr, left, right, n, compare) {
- var stack = [left, right];
- while (stack.length) {
- right = stack.pop();
- left = stack.pop();
- if (right - left <= n) continue;
- var mid = left + Math.ceil((right - left) / n / 2) * n;
- quickselect$1(arr, mid, left, right, compare);
- stack.push(left, mid, mid, right);
- }
- }
+ var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
+ /**
+ * Checks if `value` is classified as a `String` primitive or object.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a string, else `false`.
+ * @example
+ *
+ * _.isString('abc');
+ * // => true
+ *
+ * _.isString(1);
+ * // => false
+ */
- var tiler = utilTiler();
- var dispatch$1 = dispatch('loaded');
- var _tileZoom = 14;
- var _krUrlRoot = 'https://www.keepright.at';
- var _krData = {
- errorTypes: {},
- localizeStrings: {}
- }; // This gets reassigned if reset
+ function isString(value) {
+ return typeof value == 'string' || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag;
+ }
+ /**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */
- var _cache;
- var _krRuleset = [// no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
- 30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220, 230, 231, 232, 270, 280, 281, 282, 283, 284, 285, 290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313, 320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413];
+ function isSymbol(value) {
+ return _typeof(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag;
+ }
+ /**
+ * Checks if `value` is classified as a typed array.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ * @example
+ *
+ * _.isTypedArray(new Uint8Array);
+ * // => true
+ *
+ * _.isTypedArray([]);
+ * // => false
+ */
- function abortRequest(controller) {
- if (controller) {
- controller.abort();
- }
- }
- function abortUnwantedRequests(cache, tiles) {
- Object.keys(cache.inflightTile).forEach(function (k) {
- var wanted = tiles.find(function (tile) {
- return k === tile.id;
- });
+ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+ /**
+ * Checks if `value` is `undefined`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+ * @example
+ *
+ * _.isUndefined(void 0);
+ * // => true
+ *
+ * _.isUndefined(null);
+ * // => false
+ */
- if (!wanted) {
- abortRequest(cache.inflightTile[k]);
- delete cache.inflightTile[k];
- }
- });
- }
+ function isUndefined(value) {
+ return value === undefined$1;
+ }
+ /**
+ * Checks if `value` is classified as a `WeakMap` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
+ * @example
+ *
+ * _.isWeakMap(new WeakMap);
+ * // => true
+ *
+ * _.isWeakMap(new Map);
+ * // => false
+ */
- function encodeIssueRtree(d) {
- return {
- minX: d.loc[0],
- minY: d.loc[1],
- maxX: d.loc[0],
- maxY: d.loc[1],
- data: d
- };
- } // Replace or remove QAItem from rtree
+
+ function isWeakMap(value) {
+ return isObjectLike(value) && getTag(value) == weakMapTag;
+ }
+ /**
+ * Checks if `value` is classified as a `WeakSet` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
+ * @example
+ *
+ * _.isWeakSet(new WeakSet);
+ * // => true
+ *
+ * _.isWeakSet(new Set);
+ * // => false
+ */
- function updateRtree(item, replace) {
- _cache.rtree.remove(item, function (a, b) {
- return a.data.id === b.data.id;
- });
+ function isWeakSet(value) {
+ return isObjectLike(value) && baseGetTag(value) == weakSetTag;
+ }
+ /**
+ * Checks if `value` is less than `other`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.9.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than `other`,
+ * else `false`.
+ * @see _.gt
+ * @example
+ *
+ * _.lt(1, 3);
+ * // => true
+ *
+ * _.lt(3, 3);
+ * // => false
+ *
+ * _.lt(3, 1);
+ * // => false
+ */
- if (replace) {
- _cache.rtree.insert(item);
- }
- }
- function tokenReplacements(d) {
- if (!(d instanceof QAItem)) return;
- var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
- var replacements = {};
- var issueTemplate = _krData.errorTypes[d.whichType];
+ var lt = createRelationalOperation(baseLt);
+ /**
+ * Checks if `value` is less than or equal to `other`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.9.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than or equal to
+ * `other`, else `false`.
+ * @see _.gte
+ * @example
+ *
+ * _.lte(1, 3);
+ * // => true
+ *
+ * _.lte(3, 3);
+ * // => true
+ *
+ * _.lte(3, 1);
+ * // => false
+ */
- if (!issueTemplate) {
- /* eslint-disable no-console */
- console.log('No Template: ', d.whichType);
- console.log(' ', d.description);
- /* eslint-enable no-console */
+ var lte = createRelationalOperation(function (value, other) {
+ return value <= other;
+ });
+ /**
+ * Converts `value` to an array.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Array} Returns the converted array.
+ * @example
+ *
+ * _.toArray({ 'a': 1, 'b': 2 });
+ * // => [1, 2]
+ *
+ * _.toArray('abc');
+ * // => ['a', 'b', 'c']
+ *
+ * _.toArray(1);
+ * // => []
+ *
+ * _.toArray(null);
+ * // => []
+ */
- return;
- } // some descriptions are just fixed text
+ function toArray(value) {
+ if (!value) {
+ return [];
+ }
+ if (isArrayLike(value)) {
+ return isString(value) ? stringToArray(value) : copyArray(value);
+ }
- if (!issueTemplate.regex) return; // regex pattern should match description with variable details captured
+ if (symIterator && value[symIterator]) {
+ return iteratorToArray(value[symIterator]());
+ }
- var errorRegex = new RegExp(issueTemplate.regex, 'i');
- var errorMatch = errorRegex.exec(d.description);
+ var tag = getTag(value),
+ func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values;
+ return func(value);
+ }
+ /**
+ * Converts `value` to a finite number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.12.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted number.
+ * @example
+ *
+ * _.toFinite(3.2);
+ * // => 3.2
+ *
+ * _.toFinite(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toFinite(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toFinite('3.2');
+ * // => 3.2
+ */
- if (!errorMatch) {
- /* eslint-disable no-console */
- console.log('Unmatched: ', d.whichType);
- console.log(' ', d.description);
- console.log(' ', errorRegex);
- /* eslint-enable no-console */
- return;
- }
+ function toFinite(value) {
+ if (!value) {
+ return value === 0 ? value : 0;
+ }
- for (var i = 1; i < errorMatch.length; i++) {
- // skip first
- var capture = errorMatch[i];
- var idType = void 0;
- idType = 'IDs' in issueTemplate ? issueTemplate.IDs[i - 1] : '';
+ value = toNumber(value);
- if (idType && capture) {
- // link IDs if present in the capture
- capture = parseError(capture, idType);
- } else if (htmlRegex.test(capture)) {
- // escape any html in non-IDs
- capture = '\\' + capture + '\\';
- } else {
- var compare = capture.toLowerCase();
+ if (value === INFINITY || value === -INFINITY) {
+ var sign = value < 0 ? -1 : 1;
+ return sign * MAX_INTEGER;
+ }
- if (_krData.localizeStrings[compare]) {
- // some replacement strings can be localized
- capture = _t('QA.keepRight.error_parts.' + _krData.localizeStrings[compare]);
+ return value === value ? value : 0;
}
- }
-
- replacements['var' + i] = capture;
- }
+ /**
+ * Converts `value` to an integer.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toInteger(3.2);
+ * // => 3
+ *
+ * _.toInteger(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toInteger(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toInteger('3.2');
+ * // => 3
+ */
- return replacements;
- }
- function parseError(capture, idType) {
- var compare = capture.toLowerCase();
+ function toInteger(value) {
+ var result = toFinite(value),
+ remainder = result % 1;
+ return result === result ? remainder ? result - remainder : result : 0;
+ }
+ /**
+ * Converts `value` to an integer suitable for use as the length of an
+ * array-like object.
+ *
+ * **Note:** This method is based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toLength(3.2);
+ * // => 3
+ *
+ * _.toLength(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toLength(Infinity);
+ * // => 4294967295
+ *
+ * _.toLength('3.2');
+ * // => 3
+ */
- if (_krData.localizeStrings[compare]) {
- // some replacement strings can be localized
- capture = _t('QA.keepRight.error_parts.' + _krData.localizeStrings[compare]);
- }
- switch (idType) {
- // link a string like "this node"
- case 'this':
- capture = linkErrorObject(capture);
- break;
+ function toLength(value) {
+ return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
+ }
+ /**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */
- case 'url':
- capture = linkURL(capture);
- break;
- // link an entity ID
- case 'n':
- case 'w':
- case 'r':
- capture = linkEntity(idType + capture);
- break;
- // some errors have more complex ID lists/variance
+ function toNumber(value) {
+ if (typeof value == 'number') {
+ return value;
+ }
- case '20':
- capture = parse20(capture);
- break;
+ if (isSymbol(value)) {
+ return NAN;
+ }
- case '211':
- capture = parse211(capture);
- break;
+ if (isObject(value)) {
+ var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+ value = isObject(other) ? other + '' : other;
+ }
- case '231':
- capture = parse231(capture);
- break;
+ if (typeof value != 'string') {
+ return value === 0 ? value : +value;
+ }
- case '294':
- capture = parse294(capture);
- break;
+ value = baseTrim(value);
+ var isBinary = reIsBinary.test(value);
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
+ }
+ /**
+ * Converts `value` to a plain object flattening inherited enumerable string
+ * keyed properties of `value` to own properties of the plain object.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Object} Returns the converted plain object.
+ * @example
+ *
+ * function Foo() {
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.assign({ 'a': 1 }, new Foo);
+ * // => { 'a': 1, 'b': 2 }
+ *
+ * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+ * // => { 'a': 1, 'b': 2, 'c': 3 }
+ */
- case '370':
- capture = parse370(capture);
- break;
- }
- return capture;
+ function toPlainObject(value) {
+ return copyObject(value, keysIn(value));
+ }
+ /**
+ * Converts `value` to a safe integer. A safe integer can be compared and
+ * represented correctly.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toSafeInteger(3.2);
+ * // => 3
+ *
+ * _.toSafeInteger(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toSafeInteger(Infinity);
+ * // => 9007199254740991
+ *
+ * _.toSafeInteger('3.2');
+ * // => 3
+ */
- function linkErrorObject(d) {
- return "".concat(d, "");
- }
- function linkEntity(d) {
- return "".concat(d, "");
- }
+ function toSafeInteger(value) {
+ return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0;
+ }
+ /**
+ * Converts `value` to a string. An empty string is returned for `null`
+ * and `undefined` values. The sign of `-0` is preserved.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ * @example
+ *
+ * _.toString(null);
+ * // => ''
+ *
+ * _.toString(-0);
+ * // => '-0'
+ *
+ * _.toString([1, 2, 3]);
+ * // => '1,2,3'
+ */
- function linkURL(d) {
- return "").concat(d, "");
- } // arbitrary node list of form: #ID, #ID, #ID...
+ function toString(value) {
+ return value == null ? '' : baseToString(value);
+ }
+ /*------------------------------------------------------------------------*/
- function parse211(capture) {
- var newList = [];
- var items = capture.split(', ');
- items.forEach(function (item) {
- // ID has # at the front
- var id = linkEntity('n' + item.slice(1));
- newList.push(id);
- });
- return newList.join(', ');
- } // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
+ /**
+ * Assigns own enumerable string keyed properties of source objects to the
+ * destination object. Source objects are applied from left to right.
+ * Subsequent sources overwrite property assignments of previous sources.
+ *
+ * **Note:** This method mutates `object` and is loosely based on
+ * [`Object.assign`](https://mdn.io/Object/assign).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.10.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @see _.assignIn
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * function Bar() {
+ * this.c = 3;
+ * }
+ *
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
+ *
+ * _.assign({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'c': 3 }
+ */
- function parse231(capture) {
- var newList = []; // unfortunately 'layer' can itself contain commas, so we split on '),'
+ var assign = createAssigner(function (object, source) {
+ if (isPrototype(source) || isArrayLike(source)) {
+ copyObject(source, keys(source), object);
+ return;
+ }
- var items = capture.split('),');
- items.forEach(function (item) {
- var match = item.match(/\#(\d+)\((.+)\)?/);
+ for (var key in source) {
+ if (hasOwnProperty.call(source, key)) {
+ assignValue(object, key, source[key]);
+ }
+ }
+ });
+ /**
+ * This method is like `_.assign` except that it iterates over own and
+ * inherited source properties.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias extend
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @see _.assign
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * function Bar() {
+ * this.c = 3;
+ * }
+ *
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
+ *
+ * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
+ */
- if (match !== null && match.length > 2) {
- newList.push(linkEntity('w' + match[1]) + ' ' + _t('QA.keepRight.errorTypes.231.layer', {
- layer: match[2]
- }));
- }
- });
- return newList.join(', ');
- } // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
+ var assignIn = createAssigner(function (object, source) {
+ copyObject(source, keysIn(source), object);
+ });
+ /**
+ * This method is like `_.assignIn` except that it accepts `customizer`
+ * which is invoked to produce the assigned values. If `customizer` returns
+ * `undefined`, assignment is handled by the method instead. The `customizer`
+ * is invoked with five arguments: (objValue, srcValue, key, object, source).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias extendWith
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} sources The source objects.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @see _.assignWith
+ * @example
+ *
+ * function customizer(objValue, srcValue) {
+ * return _.isUndefined(objValue) ? srcValue : objValue;
+ * }
+ *
+ * var defaults = _.partialRight(_.assignInWith, customizer);
+ *
+ * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
+ */
+ var assignInWith = createAssigner(function (object, source, srcIndex, customizer) {
+ copyObject(source, keysIn(source), object, customizer);
+ });
+ /**
+ * This method is like `_.assign` except that it accepts `customizer`
+ * which is invoked to produce the assigned values. If `customizer` returns
+ * `undefined`, assignment is handled by the method instead. The `customizer`
+ * is invoked with five arguments: (objValue, srcValue, key, object, source).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} sources The source objects.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @see _.assignInWith
+ * @example
+ *
+ * function customizer(objValue, srcValue) {
+ * return _.isUndefined(objValue) ? srcValue : objValue;
+ * }
+ *
+ * var defaults = _.partialRight(_.assignWith, customizer);
+ *
+ * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
+ */
- function parse294(capture) {
- var newList = [];
- var items = capture.split(',');
- items.forEach(function (item) {
- // item of form "from/to node/relation #ID"
- item = item.split(' '); // to/from role is more clear in quotes
+ var assignWith = createAssigner(function (object, source, srcIndex, customizer) {
+ copyObject(source, keys(source), object, customizer);
+ });
+ /**
+ * Creates an array of values corresponding to `paths` of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.0.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {...(string|string[])} [paths] The property paths to pick.
+ * @returns {Array} Returns the picked values.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+ *
+ * _.at(object, ['a[0].b.c', 'a[1]']);
+ * // => [3, 4]
+ */
- var role = "\"".concat(item[0], "\""); // first letter of node/relation provides the type
+ var at = flatRest(baseAt);
+ /**
+ * Creates an object that inherits from the `prototype` object. If a
+ * `properties` object is given, its own enumerable string keyed properties
+ * are assigned to the created object.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.3.0
+ * @category Object
+ * @param {Object} prototype The object to inherit from.
+ * @param {Object} [properties] The properties to assign to the object.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * function Shape() {
+ * this.x = 0;
+ * this.y = 0;
+ * }
+ *
+ * function Circle() {
+ * Shape.call(this);
+ * }
+ *
+ * Circle.prototype = _.create(Shape.prototype, {
+ * 'constructor': Circle
+ * });
+ *
+ * var circle = new Circle;
+ * circle instanceof Circle;
+ * // => true
+ *
+ * circle instanceof Shape;
+ * // => true
+ */
- var idType = item[1].slice(0, 1); // ID has # at the front
+ function create(prototype, properties) {
+ var result = baseCreate(prototype);
+ return properties == null ? result : baseAssign(result, properties);
+ }
+ /**
+ * Assigns own and inherited enumerable string keyed properties of source
+ * objects to the destination object for all destination properties that
+ * resolve to `undefined`. Source objects are applied from left to right.
+ * Once a property is set, additional values of the same property are ignored.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @see _.defaultsDeep
+ * @example
+ *
+ * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
+ */
- var id = item[2].slice(1);
- id = linkEntity(idType + id);
- newList.push("".concat(role, " ").concat(item[1], " ").concat(id));
- });
- return newList.join(', ');
- } // may or may not include the string "(including the name 'name')"
+ var defaults = baseRest(function (object, sources) {
+ object = Object(object);
+ var index = -1;
+ var length = sources.length;
+ var guard = length > 2 ? sources[2] : undefined$1;
- function parse370(capture) {
- if (!capture) return '';
- var match = capture.match(/\(including the name (\'.+\')\)/);
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+ length = 1;
+ }
- if (match && match.length) {
- return _t('QA.keepRight.errorTypes.370.including_the_name', {
- name: match[1]
- });
- }
+ while (++index < length) {
+ var source = sources[index];
+ var props = keysIn(source);
+ var propsIndex = -1;
+ var propsLength = props.length;
- return '';
- } // arbitrary node list of form: #ID,#ID,#ID...
+ while (++propsIndex < propsLength) {
+ var key = props[propsIndex];
+ var value = object[key];
+ if (value === undefined$1 || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) {
+ object[key] = source[key];
+ }
+ }
+ }
- function parse20(capture) {
- var newList = [];
- var items = capture.split(',');
- items.forEach(function (item) {
- // ID has # at the front
- var id = linkEntity('n' + item.slice(1));
- newList.push(id);
- });
- return newList.join(', ');
- }
- }
+ return object;
+ });
+ /**
+ * This method is like `_.defaults` except that it recursively assigns
+ * default properties.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.10.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @see _.defaults
+ * @example
+ *
+ * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
+ * // => { 'a': { 'b': 2, 'c': 3 } }
+ */
- var serviceKeepRight = {
- title: 'keepRight',
- init: function init() {
- _mainFileFetcher.get('keepRight').then(function (d) {
- return _krData = d;
- });
+ var defaultsDeep = baseRest(function (args) {
+ args.push(undefined$1, customDefaultsMerge);
+ return apply(mergeWith, undefined$1, args);
+ });
+ /**
+ * This method is like `_.find` except that it returns the key of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.1.0
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {string|undefined} Returns the key of the matched element,
+ * else `undefined`.
+ * @example
+ *
+ * var users = {
+ * 'barney': { 'age': 36, 'active': true },
+ * 'fred': { 'age': 40, 'active': false },
+ * 'pebbles': { 'age': 1, 'active': true }
+ * };
+ *
+ * _.findKey(users, function(o) { return o.age < 40; });
+ * // => 'barney' (iteration order is not guaranteed)
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findKey(users, { 'age': 1, 'active': true });
+ * // => 'pebbles'
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findKey(users, ['active', false]);
+ * // => 'fred'
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findKey(users, 'active');
+ * // => 'barney'
+ */
- if (!_cache) {
- this.reset();
- }
+ function findKey(object, predicate) {
+ return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
+ }
+ /**
+ * This method is like `_.findKey` except that it iterates over elements of
+ * a collection in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {string|undefined} Returns the key of the matched element,
+ * else `undefined`.
+ * @example
+ *
+ * var users = {
+ * 'barney': { 'age': 36, 'active': true },
+ * 'fred': { 'age': 40, 'active': false },
+ * 'pebbles': { 'age': 1, 'active': true }
+ * };
+ *
+ * _.findLastKey(users, function(o) { return o.age < 40; });
+ * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findLastKey(users, { 'age': 36, 'active': true });
+ * // => 'barney'
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findLastKey(users, ['active', false]);
+ * // => 'fred'
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findLastKey(users, 'active');
+ * // => 'pebbles'
+ */
- this.event = utilRebind(this, dispatch$1, 'on');
- },
- reset: function reset() {
- if (_cache) {
- Object.values(_cache.inflightTile).forEach(abortRequest);
- }
- _cache = {
- data: {},
- loadedTile: {},
- inflightTile: {},
- inflightPost: {},
- closed: {},
- rtree: new RBush()
- };
- },
- // KeepRight API: http://osm.mueschelsoft.de/keepright/interfacing.php
- loadIssues: function loadIssues(projection) {
- var _this = this;
+ function findLastKey(object, predicate) {
+ return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
+ }
+ /**
+ * Iterates over own and inherited enumerable string keyed properties of an
+ * object and invokes `iteratee` for each property. The iteratee is invoked
+ * with three arguments: (value, key, object). Iteratee functions may exit
+ * iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.3.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forInRight
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forIn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
+ */
- var options = {
- format: 'geojson',
- ch: _krRuleset
- }; // determine the needed tiles to cover the view
- var tiles = tiler.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection); // abort inflight requests that are no longer needed
+ function forIn(object, iteratee) {
+ return object == null ? object : baseFor(object, getIteratee(iteratee, 3), keysIn);
+ }
+ /**
+ * This method is like `_.forIn` except that it iterates over properties of
+ * `object` in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forIn
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forInRight(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
+ */
- abortUnwantedRequests(_cache, tiles); // issue new requests..
- tiles.forEach(function (tile) {
- if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id]) return;
+ function forInRight(object, iteratee) {
+ return object == null ? object : baseForRight(object, getIteratee(iteratee, 3), keysIn);
+ }
+ /**
+ * Iterates over own enumerable string keyed properties of an object and
+ * invokes `iteratee` for each property. The iteratee is invoked with three
+ * arguments: (value, key, object). Iteratee functions may exit iteration
+ * early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.3.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forOwnRight
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+ */
- var _tile$extent$rectangl = tile.extent.rectangle(),
- _tile$extent$rectangl2 = _slicedToArray(_tile$extent$rectangl, 4),
- left = _tile$extent$rectangl2[0],
- top = _tile$extent$rectangl2[1],
- right = _tile$extent$rectangl2[2],
- bottom = _tile$extent$rectangl2[3];
- var params = Object.assign({}, options, {
- left: left,
- bottom: bottom,
- right: right,
- top: top
- });
- var url = "".concat(_krUrlRoot, "/export.php?") + utilQsString(params);
- var controller = new AbortController();
- _cache.inflightTile[tile.id] = controller;
- d3_json(url, {
- signal: controller.signal
- }).then(function (data) {
- delete _cache.inflightTile[tile.id];
- _cache.loadedTile[tile.id] = true;
+ function forOwn(object, iteratee) {
+ return object && baseForOwn(object, getIteratee(iteratee, 3));
+ }
+ /**
+ * This method is like `_.forOwn` except that it iterates over properties of
+ * `object` in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forOwn
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwnRight(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
+ */
- if (!data || !data.features || !data.features.length) {
- throw new Error('No Data');
- }
- data.features.forEach(function (feature) {
- var _feature$properties = feature.properties,
- itemType = _feature$properties.error_type,
- id = _feature$properties.error_id,
- _feature$properties$c = _feature$properties.comment,
- comment = _feature$properties$c === void 0 ? null : _feature$properties$c,
- objectId = _feature$properties.object_id,
- objectType = _feature$properties.object_type,
- schema = _feature$properties.schema,
- title = _feature$properties.title;
- var loc = feature.geometry.coordinates,
- _feature$properties$d = feature.properties.description,
- description = _feature$properties$d === void 0 ? '' : _feature$properties$d; // if there is a parent, save its error type e.g.:
- // Error 191 = "highway-highway"
- // Error 190 = "intersections without junctions" (parent)
+ function forOwnRight(object, iteratee) {
+ return object && baseForOwnRight(object, getIteratee(iteratee, 3));
+ }
+ /**
+ * Creates an array of function property names from own enumerable properties
+ * of `object`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @returns {Array} Returns the function names.
+ * @see _.functionsIn
+ * @example
+ *
+ * function Foo() {
+ * this.a = _.constant('a');
+ * this.b = _.constant('b');
+ * }
+ *
+ * Foo.prototype.c = _.constant('c');
+ *
+ * _.functions(new Foo);
+ * // => ['a', 'b']
+ */
- var issueTemplate = _krData.errorTypes[itemType];
- var parentIssueType = (Math.floor(itemType / 10) * 10).toString(); // try to handle error type directly, fallback to parent error type.
- var whichType = issueTemplate ? itemType : parentIssueType;
- var whichTemplate = _krData.errorTypes[whichType]; // Rewrite a few of the errors at this point..
- // This is done to make them easier to linkify and translate.
+ function functions(object) {
+ return object == null ? [] : baseFunctions(object, keys(object));
+ }
+ /**
+ * Creates an array of function property names from own and inherited
+ * enumerable properties of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @returns {Array} Returns the function names.
+ * @see _.functions
+ * @example
+ *
+ * function Foo() {
+ * this.a = _.constant('a');
+ * this.b = _.constant('b');
+ * }
+ *
+ * Foo.prototype.c = _.constant('c');
+ *
+ * _.functionsIn(new Foo);
+ * // => ['a', 'b', 'c']
+ */
- switch (whichType) {
- case '170':
- description = "This feature has a FIXME tag: ".concat(description);
- break;
- case '292':
- case '293':
- description = description.replace('A turn-', 'This turn-');
- break;
+ function functionsIn(object) {
+ return object == null ? [] : baseFunctions(object, keysIn(object));
+ }
+ /**
+ * Gets the value at `path` of `object`. If the resolved value is
+ * `undefined`, the `defaultValue` is returned in its place.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.7.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.get(object, 'a[0].b.c');
+ * // => 3
+ *
+ * _.get(object, ['a', '0', 'b', 'c']);
+ * // => 3
+ *
+ * _.get(object, 'a.b.c', 'default');
+ * // => 'default'
+ */
- case '294':
- case '295':
- case '296':
- case '297':
- case '298':
- description = "This turn-restriction~".concat(description);
- break;
- case '300':
- description = 'This highway is missing a maxspeed tag';
- break;
+ function get(object, path, defaultValue) {
+ var result = object == null ? undefined$1 : baseGet(object, path);
+ return result === undefined$1 ? defaultValue : result;
+ }
+ /**
+ * Checks if `path` is a direct property of `object`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ * @example
+ *
+ * var object = { 'a': { 'b': 2 } };
+ * var other = _.create({ 'a': _.create({ 'b': 2 }) });
+ *
+ * _.has(object, 'a');
+ * // => true
+ *
+ * _.has(object, 'a.b');
+ * // => true
+ *
+ * _.has(object, ['a', 'b']);
+ * // => true
+ *
+ * _.has(other, 'a');
+ * // => false
+ */
- case '411':
- case '412':
- case '413':
- description = "This feature~".concat(description);
- break;
- } // move markers slightly so it doesn't obscure the geometry,
- // then move markers away from other coincident markers
+ function has(object, path) {
+ return object != null && hasPath(object, path, baseHas);
+ }
+ /**
+ * Checks if `path` is a direct or inherited property of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ * @example
+ *
+ * var object = _.create({ 'a': _.create({ 'b': 2 }) });
+ *
+ * _.hasIn(object, 'a');
+ * // => true
+ *
+ * _.hasIn(object, 'a.b');
+ * // => true
+ *
+ * _.hasIn(object, ['a', 'b']);
+ * // => true
+ *
+ * _.hasIn(object, 'b');
+ * // => false
+ */
- var coincident = false;
- do {
- // first time, move marker up. after that, move marker right.
- var delta = coincident ? [0.00001, 0] : [0, 0.00001];
- loc = geoVecAdd(loc, delta);
- var bbox = geoExtent(loc).bbox();
- coincident = _cache.rtree.search(bbox).length;
- } while (coincident);
+ function hasIn(object, path) {
+ return object != null && hasPath(object, path, baseHasIn);
+ }
+ /**
+ * Creates an object composed of the inverted keys and values of `object`.
+ * If `object` contains duplicate values, subsequent values overwrite
+ * property assignments of previous values.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.7.0
+ * @category Object
+ * @param {Object} object The object to invert.
+ * @returns {Object} Returns the new inverted object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2, 'c': 1 };
+ *
+ * _.invert(object);
+ * // => { '1': 'c', '2': 'b' }
+ */
- var d = new QAItem(loc, _this, itemType, id, {
- comment: comment,
- description: description,
- whichType: whichType,
- parentIssueType: parentIssueType,
- severity: whichTemplate.severity || 'error',
- objectId: objectId,
- objectType: objectType,
- schema: schema,
- title: title
- });
- d.replacements = tokenReplacements(d);
- _cache.data[id] = d;
- _cache.rtree.insert(encodeIssueRtree(d));
- });
- dispatch$1.call('loaded');
- })["catch"](function () {
- delete _cache.inflightTile[tile.id];
- _cache.loadedTile[tile.id] = true;
- });
- });
- },
- postUpdate: function postUpdate(d, callback) {
- var _this2 = this;
+ var invert = createInverter(function (result, value, key) {
+ if (value != null && typeof value.toString != 'function') {
+ value = nativeObjectToString.call(value);
+ }
- if (_cache.inflightPost[d.id]) {
- return callback({
- message: 'Error update already inflight',
- status: -2
- }, d);
- }
+ result[value] = key;
+ }, constant(identity));
+ /**
+ * This method is like `_.invert` except that the inverted object is generated
+ * from the results of running each element of `object` thru `iteratee`. The
+ * corresponding inverted value of each inverted key is an array of keys
+ * responsible for generating the inverted value. The iteratee is invoked
+ * with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.1.0
+ * @category Object
+ * @param {Object} object The object to invert.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Object} Returns the new inverted object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2, 'c': 1 };
+ *
+ * _.invertBy(object);
+ * // => { '1': ['a', 'c'], '2': ['b'] }
+ *
+ * _.invertBy(object, function(value) {
+ * return 'group' + value;
+ * });
+ * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
+ */
- var params = {
- schema: d.schema,
- id: d.id
- };
+ var invertBy = createInverter(function (result, value, key) {
+ if (value != null && typeof value.toString != 'function') {
+ value = nativeObjectToString.call(value);
+ }
- if (d.newStatus) {
- params.st = d.newStatus;
- }
+ if (hasOwnProperty.call(result, value)) {
+ result[value].push(key);
+ } else {
+ result[value] = [key];
+ }
+ }, getIteratee);
+ /**
+ * Invokes the method at `path` of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the method to invoke.
+ * @param {...*} [args] The arguments to invoke the method with.
+ * @returns {*} Returns the result of the invoked method.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
+ *
+ * _.invoke(object, 'a[0].b.c.slice', 1, 3);
+ * // => [2, 3]
+ */
- if (d.newComment !== undefined) {
- params.co = d.newComment;
- } // NOTE: This throws a CORS err, but it seems successful.
- // We don't care too much about the response, so this is fine.
+ var invoke = baseRest(baseInvoke);
+ /**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+ function keys(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+ }
+ /**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */
- var url = "".concat(_krUrlRoot, "/comment.php?") + utilQsString(params);
- var controller = new AbortController();
- _cache.inflightPost[d.id] = controller; // Since this is expected to throw an error just continue as if it worked
- // (worst case scenario the request truly fails and issue will show up if iD restarts)
- d3_json(url, {
- signal: controller.signal
- })["finally"](function () {
- delete _cache.inflightPost[d.id];
+ function keysIn(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+ }
+ /**
+ * The opposite of `_.mapValues`; this method creates an object with the
+ * same values as `object` and keys generated by running each own enumerable
+ * string keyed property of `object` thru `iteratee`. The iteratee is invoked
+ * with three arguments: (value, key, object).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.8.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns the new mapped object.
+ * @see _.mapValues
+ * @example
+ *
+ * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
+ * return key + value;
+ * });
+ * // => { 'a1': 1, 'b2': 2 }
+ */
- if (d.newStatus === 'ignore') {
- // ignore permanently (false positive)
- _this2.removeItem(d);
- } else if (d.newStatus === 'ignore_t') {
- // ignore temporarily (error fixed)
- _this2.removeItem(d);
- _cache.closed["".concat(d.schema, ":").concat(d.id)] = true;
- } else {
- d = _this2.replaceItem(d.update({
- comment: d.newComment,
- newComment: undefined,
- newState: undefined
- }));
+ function mapKeys(object, iteratee) {
+ var result = {};
+ iteratee = getIteratee(iteratee, 3);
+ baseForOwn(object, function (value, key, object) {
+ baseAssignValue(result, iteratee(value, key, object), value);
+ });
+ return result;
}
+ /**
+ * Creates an object with the same keys as `object` and values generated
+ * by running each own enumerable string keyed property of `object` thru
+ * `iteratee`. The iteratee is invoked with three arguments:
+ * (value, key, object).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns the new mapped object.
+ * @see _.mapKeys
+ * @example
+ *
+ * var users = {
+ * 'fred': { 'user': 'fred', 'age': 40 },
+ * 'pebbles': { 'user': 'pebbles', 'age': 1 }
+ * };
+ *
+ * _.mapValues(users, function(o) { return o.age; });
+ * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.mapValues(users, 'age');
+ * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+ */
- if (callback) callback(null, d);
- });
- },
- // Get all cached QAItems covering the viewport
- getItems: function getItems(projection) {
- var viewport = projection.clipExtent();
- var min = [viewport[0][0], viewport[1][1]];
- var max = [viewport[1][0], viewport[0][1]];
- var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
- return _cache.rtree.search(bbox).map(function (d) {
- return d.data;
- });
- },
- // Get a QAItem from cache
- // NOTE: Don't change method name until UI v3 is merged
- getError: function getError(id) {
- return _cache.data[id];
- },
- // Replace a single QAItem in the cache
- replaceItem: function replaceItem(item) {
- if (!(item instanceof QAItem) || !item.id) return;
- _cache.data[item.id] = item;
- updateRtree(encodeIssueRtree(item), true); // true = replace
-
- return item;
- },
- // Remove a single QAItem from the cache
- removeItem: function removeItem(item) {
- if (!(item instanceof QAItem) || !item.id) return;
- delete _cache.data[item.id];
- updateRtree(encodeIssueRtree(item), false); // false = remove
- },
- issueURL: function issueURL(item) {
- return "".concat(_krUrlRoot, "/report_map.php?schema=").concat(item.schema, "&error=").concat(item.id);
- },
- // Get an array of issues closed during this session.
- // Used to populate `closed:keepright` changeset tag
- getClosedIDs: function getClosedIDs() {
- return Object.keys(_cache.closed).sort();
- }
- };
- var tiler$1 = utilTiler();
- var dispatch$2 = dispatch('loaded');
- var _tileZoom$1 = 14;
- var _impOsmUrls = {
- ow: 'https://grab.community.improve-osm.org/directionOfFlowService',
- mr: 'https://grab.community.improve-osm.org/missingGeoService',
- tr: 'https://grab.community.improve-osm.org/turnRestrictionService'
- };
- var _impOsmData = {
- icons: {}
- }; // This gets reassigned if reset
+ function mapValues(object, iteratee) {
+ var result = {};
+ iteratee = getIteratee(iteratee, 3);
+ baseForOwn(object, function (value, key, object) {
+ baseAssignValue(result, key, iteratee(value, key, object));
+ });
+ return result;
+ }
+ /**
+ * This method is like `_.assign` except that it recursively merges own and
+ * inherited enumerable string keyed properties of source objects into the
+ * destination object. Source properties that resolve to `undefined` are
+ * skipped if a destination value exists. Array and plain object properties
+ * are merged recursively. Other objects and value types are overridden by
+ * assignment. Source objects are applied from left to right. Subsequent
+ * sources overwrite property assignments of previous sources.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {
+ * 'a': [{ 'b': 2 }, { 'd': 4 }]
+ * };
+ *
+ * var other = {
+ * 'a': [{ 'c': 3 }, { 'e': 5 }]
+ * };
+ *
+ * _.merge(object, other);
+ * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
+ */
- var _cache$1;
- function abortRequest$1(i) {
- Object.values(i).forEach(function (controller) {
- if (controller) {
- controller.abort();
- }
- });
- }
+ var merge = createAssigner(function (object, source, srcIndex) {
+ baseMerge(object, source, srcIndex);
+ });
+ /**
+ * This method is like `_.merge` except that it accepts `customizer` which
+ * is invoked to produce the merged values of the destination and source
+ * properties. If `customizer` returns `undefined`, merging is handled by the
+ * method instead. The `customizer` is invoked with six arguments:
+ * (objValue, srcValue, key, object, source, stack).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} sources The source objects.
+ * @param {Function} customizer The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function customizer(objValue, srcValue) {
+ * if (_.isArray(objValue)) {
+ * return objValue.concat(srcValue);
+ * }
+ * }
+ *
+ * var object = { 'a': [1], 'b': [2] };
+ * var other = { 'a': [3], 'b': [4] };
+ *
+ * _.mergeWith(object, other, customizer);
+ * // => { 'a': [1, 3], 'b': [2, 4] }
+ */
- function abortUnwantedRequests$1(cache, tiles) {
- Object.keys(cache.inflightTile).forEach(function (k) {
- var wanted = tiles.find(function (tile) {
- return k === tile.id;
- });
+ var mergeWith = createAssigner(function (object, source, srcIndex, customizer) {
+ baseMerge(object, source, srcIndex, customizer);
+ });
+ /**
+ * The opposite of `_.pick`; this method creates an object composed of the
+ * own and inherited enumerable property paths of `object` that are not omitted.
+ *
+ * **Note:** This method is considerably slower than `_.pick`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {...(string|string[])} [paths] The property paths to omit.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.omit(object, ['a', 'c']);
+ * // => { 'b': '2' }
+ */
- if (!wanted) {
- abortRequest$1(cache.inflightTile[k]);
- delete cache.inflightTile[k];
- }
- });
- }
+ var omit = flatRest(function (object, paths) {
+ var result = {};
- function encodeIssueRtree$1(d) {
- return {
- minX: d.loc[0],
- minY: d.loc[1],
- maxX: d.loc[0],
- maxY: d.loc[1],
- data: d
- };
- } // Replace or remove QAItem from rtree
+ if (object == null) {
+ return result;
+ }
+ var isDeep = false;
+ paths = arrayMap(paths, function (path) {
+ path = castPath(path, object);
+ isDeep || (isDeep = path.length > 1);
+ return path;
+ });
+ copyObject(object, getAllKeysIn(object), result);
- function updateRtree$1(item, replace) {
- _cache$1.rtree.remove(item, function (a, b) {
- return a.data.id === b.data.id;
- });
+ if (isDeep) {
+ result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
+ }
- if (replace) {
- _cache$1.rtree.insert(item);
- }
- }
+ var length = paths.length;
- function linkErrorObject(d) {
- return "".concat(d, "");
- }
+ while (length--) {
+ baseUnset(result, paths[length]);
+ }
- function linkEntity(d) {
- return "".concat(d, "");
- }
+ return result;
+ });
+ /**
+ * The opposite of `_.pickBy`; this method creates an object composed of
+ * the own and inherited enumerable string keyed properties of `object` that
+ * `predicate` doesn't return truthy for. The predicate is invoked with two
+ * arguments: (value, key).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {Function} [predicate=_.identity] The function invoked per property.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.omitBy(object, _.isNumber);
+ * // => { 'b': '2' }
+ */
- function pointAverage(points) {
- if (points.length) {
- var sum = points.reduce(function (acc, point) {
- return geoVecAdd(acc, [point.lon, point.lat]);
- }, [0, 0]);
- return geoVecScale(sum, 1 / points.length);
- } else {
- return [0, 0];
- }
- }
+ function omitBy(object, predicate) {
+ return pickBy(object, negate(getIteratee(predicate)));
+ }
+ /**
+ * Creates an object composed of the picked `object` properties.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {...(string|string[])} [paths] The property paths to pick.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.pick(object, ['a', 'c']);
+ * // => { 'a': 1, 'c': 3 }
+ */
- function relativeBearing(p1, p2) {
- var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
- if (angle < 0) {
- angle += 2 * Math.PI;
- } // Return degrees
+ var pick = flatRest(function (object, paths) {
+ return object == null ? {} : basePick(object, paths);
+ });
+ /**
+ * Creates an object composed of the `object` properties `predicate` returns
+ * truthy for. The predicate is invoked with two arguments: (value, key).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {Function} [predicate=_.identity] The function invoked per property.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.pickBy(object, _.isNumber);
+ * // => { 'a': 1, 'c': 3 }
+ */
+ function pickBy(object, predicate) {
+ if (object == null) {
+ return {};
+ }
- return angle * 180 / Math.PI;
- } // Assuming range [0,360)
+ var props = arrayMap(getAllKeysIn(object), function (prop) {
+ return [prop];
+ });
+ predicate = getIteratee(predicate);
+ return basePickBy(object, props, function (value, path) {
+ return predicate(value, path[0]);
+ });
+ }
+ /**
+ * This method is like `_.get` except that if the resolved value is a
+ * function it's invoked with the `this` binding of its parent object and
+ * its result is returned.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to resolve.
+ * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
+ *
+ * _.result(object, 'a[0].b.c1');
+ * // => 3
+ *
+ * _.result(object, 'a[0].b.c2');
+ * // => 4
+ *
+ * _.result(object, 'a[0].b.c3', 'default');
+ * // => 'default'
+ *
+ * _.result(object, 'a[0].b.c3', _.constant('default'));
+ * // => 'default'
+ */
- function cardinalDirection(bearing) {
- var dir = 45 * Math.round(bearing / 45);
- var compass = {
- 0: 'north',
- 45: 'northeast',
- 90: 'east',
- 135: 'southeast',
- 180: 'south',
- 225: 'southwest',
- 270: 'west',
- 315: 'northwest',
- 360: 'north'
- };
- return _t("QA.improveOSM.directions.".concat(compass[dir]));
- } // Errors shouldn't obscure each other
+ function result(object, path, defaultValue) {
+ path = castPath(path, object);
+ var index = -1,
+ length = path.length; // Ensure the loop is entered when path is empty.
+ if (!length) {
+ length = 1;
+ object = undefined$1;
+ }
- function preventCoincident(loc, bumpUp) {
- var coincident = false;
+ while (++index < length) {
+ var value = object == null ? undefined$1 : object[toKey(path[index])];
- do {
- // first time, move marker up. after that, move marker right.
- var delta = coincident ? [0.00001, 0] : bumpUp ? [0, 0.00001] : [0, 0];
- loc = geoVecAdd(loc, delta);
- var bbox = geoExtent(loc).bbox();
- coincident = _cache$1.rtree.search(bbox).length;
- } while (coincident);
+ if (value === undefined$1) {
+ index = length;
+ value = defaultValue;
+ }
- return loc;
- }
+ object = isFunction(value) ? value.call(object) : value;
+ }
- var serviceImproveOSM = {
- title: 'improveOSM',
- init: function init() {
- _mainFileFetcher.get('qa_data').then(function (d) {
- return _impOsmData = d.improveOSM;
- });
+ return object;
+ }
+ /**
+ * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
+ * it's created. Arrays are created for missing index properties while objects
+ * are created for all other missing properties. Use `_.setWith` to customize
+ * `path` creation.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.7.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.set(object, 'a[0].b.c', 4);
+ * console.log(object.a[0].b.c);
+ * // => 4
+ *
+ * _.set(object, ['x', '0', 'y', 'z'], 5);
+ * console.log(object.x[0].y.z);
+ * // => 5
+ */
- if (!_cache$1) {
- this.reset();
- }
- this.event = utilRebind(this, dispatch$2, 'on');
- },
- reset: function reset() {
- if (_cache$1) {
- Object.values(_cache$1.inflightTile).forEach(abortRequest$1);
- }
+ function set(object, path, value) {
+ return object == null ? object : baseSet(object, path, value);
+ }
+ /**
+ * This method is like `_.set` except that it accepts `customizer` which is
+ * invoked to produce the objects of `path`. If `customizer` returns `undefined`
+ * path creation is handled by the method instead. The `customizer` is invoked
+ * with three arguments: (nsValue, key, nsObject).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {};
+ *
+ * _.setWith(object, '[0][1]', 'a', Object);
+ * // => { '0': { '1': 'a' } }
+ */
- _cache$1 = {
- data: {},
- loadedTile: {},
- inflightTile: {},
- inflightPost: {},
- closed: {},
- rtree: new RBush()
- };
- },
- loadIssues: function loadIssues(projection) {
- var _this = this;
- var options = {
- client: 'iD',
- status: 'OPEN',
- zoom: '19' // Use a high zoom so that clusters aren't returned
+ function setWith(object, path, value, customizer) {
+ customizer = typeof customizer == 'function' ? customizer : undefined$1;
+ return object == null ? object : baseSet(object, path, value, customizer);
+ }
+ /**
+ * Creates an array of own enumerable string keyed-value pairs for `object`
+ * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
+ * entries are returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias entries
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the key-value pairs.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.toPairs(new Foo);
+ * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
+ */
- }; // determine the needed tiles to cover the view
- var tiles = tiler$1.zoomExtent([_tileZoom$1, _tileZoom$1]).getTiles(projection); // abort inflight requests that are no longer needed
+ var toPairs = createToPairs(keys);
+ /**
+ * Creates an array of own and inherited enumerable string keyed-value pairs
+ * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
+ * or set, its entries are returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias entriesIn
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the key-value pairs.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.toPairsIn(new Foo);
+ * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
+ */
- abortUnwantedRequests$1(_cache$1, tiles); // issue new requests..
+ var toPairsIn = createToPairs(keysIn);
+ /**
+ * An alternative to `_.reduce`; this method transforms `object` to a new
+ * `accumulator` object which is the result of running each of its own
+ * enumerable string keyed properties thru `iteratee`, with each invocation
+ * potentially mutating the `accumulator` object. If `accumulator` is not
+ * provided, a new object with the same `[[Prototype]]` will be used. The
+ * iteratee is invoked with four arguments: (accumulator, value, key, object).
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.3.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The custom accumulator value.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * _.transform([2, 3, 4], function(result, n) {
+ * result.push(n *= n);
+ * return n % 2 == 0;
+ * }, []);
+ * // => [4, 9]
+ *
+ * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+ * (result[value] || (result[value] = [])).push(key);
+ * }, {});
+ * // => { '1': ['a', 'c'], '2': ['b'] }
+ */
- tiles.forEach(function (tile) {
- if (_cache$1.loadedTile[tile.id] || _cache$1.inflightTile[tile.id]) return;
+ function transform(object, iteratee, accumulator) {
+ var isArr = isArray(object),
+ isArrLike = isArr || isBuffer(object) || isTypedArray(object);
+ iteratee = getIteratee(iteratee, 4);
- var _tile$extent$rectangl = tile.extent.rectangle(),
- _tile$extent$rectangl2 = _slicedToArray(_tile$extent$rectangl, 4),
- east = _tile$extent$rectangl2[0],
- north = _tile$extent$rectangl2[1],
- west = _tile$extent$rectangl2[2],
- south = _tile$extent$rectangl2[3];
+ if (accumulator == null) {
+ var Ctor = object && object.constructor;
- var params = Object.assign({}, options, {
- east: east,
- south: south,
- west: west,
- north: north
- }); // 3 separate requests to store for each tile
+ if (isArrLike) {
+ accumulator = isArr ? new Ctor() : [];
+ } else if (isObject(object)) {
+ accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
+ } else {
+ accumulator = {};
+ }
+ }
- var requests = {};
- Object.keys(_impOsmUrls).forEach(function (k) {
- // We exclude WATER from missing geometry as it doesn't seem useful
- // We use most confident one-way and turn restrictions only, still have false positives
- var kParams = Object.assign({}, params, k === 'mr' ? {
- type: 'PARKING,ROAD,BOTH,PATH'
- } : {
- confidenceLevel: 'C1'
+ (isArrLike ? arrayEach : baseForOwn)(object, function (value, index, object) {
+ return iteratee(accumulator, value, index, object);
});
- var url = "".concat(_impOsmUrls[k], "/search?") + utilQsString(kParams);
- var controller = new AbortController();
- requests[k] = controller;
- d3_json(url, {
- signal: controller.signal
- }).then(function (data) {
- delete _cache$1.inflightTile[tile.id][k];
-
- if (!Object.keys(_cache$1.inflightTile[tile.id]).length) {
- delete _cache$1.inflightTile[tile.id];
- _cache$1.loadedTile[tile.id] = true;
- } // Road segments at high zoom == oneways
+ return accumulator;
+ }
+ /**
+ * Removes the property at `path` of `object`.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to unset.
+ * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 7 } }] };
+ * _.unset(object, 'a[0].b.c');
+ * // => true
+ *
+ * console.log(object);
+ * // => { 'a': [{ 'b': {} }] };
+ *
+ * _.unset(object, ['a', '0', 'b', 'c']);
+ * // => true
+ *
+ * console.log(object);
+ * // => { 'a': [{ 'b': {} }] };
+ */
- if (data.roadSegments) {
- data.roadSegments.forEach(function (feature) {
- // Position error at the approximate middle of the segment
- var points = feature.points,
- wayId = feature.wayId,
- fromNodeId = feature.fromNodeId,
- toNodeId = feature.toNodeId;
- var itemId = "".concat(wayId).concat(fromNodeId).concat(toNodeId);
- var mid = points.length / 2;
- var loc; // Even number of points, find midpoint of the middle two
- // Odd number of points, use position of very middle point
+ function unset(object, path) {
+ return object == null ? true : baseUnset(object, path);
+ }
+ /**
+ * This method is like `_.set` except that accepts `updater` to produce the
+ * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
+ * is invoked with one argument: (value).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.6.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {Function} updater The function to produce the updated value.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.update(object, 'a[0].b.c', function(n) { return n * n; });
+ * console.log(object.a[0].b.c);
+ * // => 9
+ *
+ * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
+ * console.log(object.x[0].y.z);
+ * // => 0
+ */
- if (mid % 1 === 0) {
- loc = pointAverage([points[mid - 1], points[mid]]);
- } else {
- mid = points[Math.floor(mid)];
- loc = [mid.lon, mid.lat];
- } // One-ways can land on same segment in opposite direction
+ function update(object, path, updater) {
+ return object == null ? object : baseUpdate(object, path, castFunction(updater));
+ }
+ /**
+ * This method is like `_.update` except that it accepts `customizer` which is
+ * invoked to produce the objects of `path`. If `customizer` returns `undefined`
+ * path creation is handled by the method instead. The `customizer` is invoked
+ * with three arguments: (nsValue, key, nsObject).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.6.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {Function} updater The function to produce the updated value.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {};
+ *
+ * _.updateWith(object, '[0][1]', _.constant('a'), Object);
+ * // => { '0': { '1': 'a' } }
+ */
- loc = preventCoincident(loc, false);
- var d = new QAItem(loc, _this, k, itemId, {
- issueKey: k,
- // used as a category
- identifier: {
- // used to post changes
- wayId: wayId,
- fromNodeId: fromNodeId,
- toNodeId: toNodeId
- },
- objectId: wayId,
- objectType: 'way'
- }); // Variables used in the description
- d.replacements = {
- percentage: feature.percentOfTrips,
- num_trips: feature.numberOfTrips,
- highway: linkErrorObject(_t('QA.keepRight.error_parts.highway')),
- from_node: linkEntity('n' + feature.fromNodeId),
- to_node: linkEntity('n' + feature.toNodeId)
- };
- _cache$1.data[d.id] = d;
+ function updateWith(object, path, updater, customizer) {
+ customizer = typeof customizer == 'function' ? customizer : undefined$1;
+ return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
+ }
+ /**
+ * Creates an array of the own enumerable string keyed property values of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.values(new Foo);
+ * // => [1, 2] (iteration order is not guaranteed)
+ *
+ * _.values('hi');
+ * // => ['h', 'i']
+ */
- _cache$1.rtree.insert(encodeIssueRtree$1(d));
- });
- } // Tiles at high zoom == missing roads
+ function values(object) {
+ return object == null ? [] : baseValues(object, keys(object));
+ }
+ /**
+ * Creates an array of the own and inherited enumerable string keyed property
+ * values of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.valuesIn(new Foo);
+ * // => [1, 2, 3] (iteration order is not guaranteed)
+ */
- if (data.tiles) {
- data.tiles.forEach(function (feature) {
- var type = feature.type,
- x = feature.x,
- y = feature.y,
- numberOfTrips = feature.numberOfTrips;
- var geoType = type.toLowerCase();
- var itemId = "".concat(geoType).concat(x).concat(y).concat(numberOfTrips); // Average of recorded points should land on the missing geometry
- // Missing geometry could happen to land on another error
- var loc = pointAverage(feature.points);
- loc = preventCoincident(loc, false);
- var d = new QAItem(loc, _this, "".concat(k, "-").concat(geoType), itemId, {
- issueKey: k,
- identifier: {
- x: x,
- y: y
- }
- });
- d.replacements = {
- num_trips: numberOfTrips,
- geometry_type: _t("QA.improveOSM.geometry_types.".concat(geoType))
- }; // -1 trips indicates data came from a 3rd party
+ function valuesIn(object) {
+ return object == null ? [] : baseValues(object, keysIn(object));
+ }
+ /*------------------------------------------------------------------------*/
- if (numberOfTrips === -1) {
- d.desc = _t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
- }
+ /**
+ * Clamps `number` within the inclusive `lower` and `upper` bounds.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Number
+ * @param {number} number The number to clamp.
+ * @param {number} [lower] The lower bound.
+ * @param {number} upper The upper bound.
+ * @returns {number} Returns the clamped number.
+ * @example
+ *
+ * _.clamp(-10, -5, 5);
+ * // => -5
+ *
+ * _.clamp(10, -5, 5);
+ * // => 5
+ */
- _cache$1.data[d.id] = d;
- _cache$1.rtree.insert(encodeIssueRtree$1(d));
- });
- } // Entities at high zoom == turn restrictions
+ function clamp(number, lower, upper) {
+ if (upper === undefined$1) {
+ upper = lower;
+ lower = undefined$1;
+ }
+ if (upper !== undefined$1) {
+ upper = toNumber(upper);
+ upper = upper === upper ? upper : 0;
+ }
- if (data.entities) {
- data.entities.forEach(function (feature) {
- var point = feature.point,
- id = feature.id,
- segments = feature.segments,
- numberOfPasses = feature.numberOfPasses,
- turnType = feature.turnType;
- var itemId = "".concat(id.replace(/[,:+#]/g, '_')); // Turn restrictions could be missing at same junction
- // We also want to bump the error up so node is accessible
+ if (lower !== undefined$1) {
+ lower = toNumber(lower);
+ lower = lower === lower ? lower : 0;
+ }
- var loc = preventCoincident([point.lon, point.lat], true); // Elements are presented in a strange way
+ return baseClamp(toNumber(number), lower, upper);
+ }
+ /**
+ * Checks if `n` is between `start` and up to, but not including, `end`. If
+ * `end` is not specified, it's set to `start` with `start` then set to `0`.
+ * If `start` is greater than `end` the params are swapped to support
+ * negative ranges.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.3.0
+ * @category Number
+ * @param {number} number The number to check.
+ * @param {number} [start=0] The start of the range.
+ * @param {number} end The end of the range.
+ * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+ * @see _.range, _.rangeRight
+ * @example
+ *
+ * _.inRange(3, 2, 4);
+ * // => true
+ *
+ * _.inRange(4, 8);
+ * // => true
+ *
+ * _.inRange(4, 2);
+ * // => false
+ *
+ * _.inRange(2, 2);
+ * // => false
+ *
+ * _.inRange(1.2, 2);
+ * // => true
+ *
+ * _.inRange(5.2, 4);
+ * // => false
+ *
+ * _.inRange(-3, -2, -6);
+ * // => true
+ */
- var ids = id.split(',');
- var from_way = ids[0];
- var via_node = ids[3];
- var to_way = ids[2].split(':')[1];
- var d = new QAItem(loc, _this, k, itemId, {
- issueKey: k,
- identifier: id,
- objectId: via_node,
- objectType: 'node'
- }); // Travel direction along from_way clarifies the turn restriction
- var _segments$0$points = _slicedToArray(segments[0].points, 2),
- p1 = _segments$0$points[0],
- p2 = _segments$0$points[1];
+ function inRange(number, start, end) {
+ start = toFinite(start);
- var dir_of_travel = cardinalDirection(relativeBearing(p1, p2)); // Variables used in the description
+ if (end === undefined$1) {
+ end = start;
+ start = 0;
+ } else {
+ end = toFinite(end);
+ }
- d.replacements = {
- num_passed: numberOfPasses,
- num_trips: segments[0].numberOfTrips,
- turn_restriction: turnType.toLowerCase(),
- from_way: linkEntity('w' + from_way),
- to_way: linkEntity('w' + to_way),
- travel_direction: dir_of_travel,
- junction: linkErrorObject(_t('QA.keepRight.error_parts.this_node'))
- };
- _cache$1.data[d.id] = d;
+ number = toNumber(number);
+ return baseInRange(number, start, end);
+ }
+ /**
+ * Produces a random number between the inclusive `lower` and `upper` bounds.
+ * If only one argument is provided a number between `0` and the given number
+ * is returned. If `floating` is `true`, or either `lower` or `upper` are
+ * floats, a floating-point number is returned instead of an integer.
+ *
+ * **Note:** JavaScript follows the IEEE-754 standard for resolving
+ * floating-point values which can produce unexpected results.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.7.0
+ * @category Number
+ * @param {number} [lower=0] The lower bound.
+ * @param {number} [upper=1] The upper bound.
+ * @param {boolean} [floating] Specify returning a floating-point number.
+ * @returns {number} Returns the random number.
+ * @example
+ *
+ * _.random(0, 5);
+ * // => an integer between 0 and 5
+ *
+ * _.random(5);
+ * // => also an integer between 0 and 5
+ *
+ * _.random(5, true);
+ * // => a floating-point number between 0 and 5
+ *
+ * _.random(1.2, 5.2);
+ * // => a floating-point number between 1.2 and 5.2
+ */
- _cache$1.rtree.insert(encodeIssueRtree$1(d));
- dispatch$2.call('loaded');
- });
- }
- })["catch"](function () {
- delete _cache$1.inflightTile[tile.id][k];
+ function random(lower, upper, floating) {
+ if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
+ upper = floating = undefined$1;
+ }
- if (!Object.keys(_cache$1.inflightTile[tile.id]).length) {
- delete _cache$1.inflightTile[tile.id];
- _cache$1.loadedTile[tile.id] = true;
+ if (floating === undefined$1) {
+ if (typeof upper == 'boolean') {
+ floating = upper;
+ upper = undefined$1;
+ } else if (typeof lower == 'boolean') {
+ floating = lower;
+ lower = undefined$1;
}
- });
- });
- _cache$1.inflightTile[tile.id] = requests;
- });
- },
- getComments: function getComments(item) {
- var _this2 = this;
+ }
- // If comments already retrieved no need to do so again
- if (item.comments) {
- return Promise.resolve(item);
- }
+ if (lower === undefined$1 && upper === undefined$1) {
+ lower = 0;
+ upper = 1;
+ } else {
+ lower = toFinite(lower);
- var key = item.issueKey;
- var qParams = {};
+ if (upper === undefined$1) {
+ upper = lower;
+ lower = 0;
+ } else {
+ upper = toFinite(upper);
+ }
+ }
- if (key === 'ow') {
- qParams = item.identifier;
- } else if (key === 'mr') {
- qParams.tileX = item.identifier.x;
- qParams.tileY = item.identifier.y;
- } else if (key === 'tr') {
- qParams.targetId = item.identifier;
- }
+ if (lower > upper) {
+ var temp = lower;
+ lower = upper;
+ upper = temp;
+ }
- var url = "".concat(_impOsmUrls[key], "/retrieveComments?") + utilQsString(qParams);
+ if (floating || lower % 1 || upper % 1) {
+ var rand = nativeRandom();
+ return nativeMin(lower + rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1))), upper);
+ }
- var cacheComments = function cacheComments(data) {
- // Assign directly for immediate use afterwards
- // comments are served newest to oldest
- item.comments = data.comments ? data.comments.reverse() : [];
+ return baseRandom(lower, upper);
+ }
+ /*------------------------------------------------------------------------*/
- _this2.replaceItem(item);
- };
+ /**
+ * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the camel cased string.
+ * @example
+ *
+ * _.camelCase('Foo Bar');
+ * // => 'fooBar'
+ *
+ * _.camelCase('--foo-bar--');
+ * // => 'fooBar'
+ *
+ * _.camelCase('__FOO_BAR__');
+ * // => 'fooBar'
+ */
- return d3_json(url).then(cacheComments).then(function () {
- return item;
- });
- },
- postUpdate: function postUpdate(d, callback) {
- if (!serviceOsm.authenticated()) {
- // Username required in payload
- return callback({
- message: 'Not Authenticated',
- status: -3
- }, d);
- }
- if (_cache$1.inflightPost[d.id]) {
- return callback({
- message: 'Error update already inflight',
- status: -2
- }, d);
- } // Payload can only be sent once username is established
+ var camelCase = createCompounder(function (result, word, index) {
+ word = word.toLowerCase();
+ return result + (index ? capitalize(word) : word);
+ });
+ /**
+ * Converts the first character of `string` to upper case and the remaining
+ * to lower case.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to capitalize.
+ * @returns {string} Returns the capitalized string.
+ * @example
+ *
+ * _.capitalize('FRED');
+ * // => 'Fred'
+ */
+
+ function capitalize(string) {
+ return upperFirst(toString(string).toLowerCase());
+ }
+ /**
+ * Deburrs `string` by converting
+ * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+ * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
+ * letters to basic Latin letters and removing
+ * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to deburr.
+ * @returns {string} Returns the deburred string.
+ * @example
+ *
+ * _.deburr('déjà vu');
+ * // => 'deja vu'
+ */
- serviceOsm.userDetails(sendPayload.bind(this));
+ function deburr(string) {
+ string = toString(string);
+ return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
+ }
+ /**
+ * Checks if `string` ends with the given target string.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to inspect.
+ * @param {string} [target] The string to search for.
+ * @param {number} [position=string.length] The position to search up to.
+ * @returns {boolean} Returns `true` if `string` ends with `target`,
+ * else `false`.
+ * @example
+ *
+ * _.endsWith('abc', 'c');
+ * // => true
+ *
+ * _.endsWith('abc', 'b');
+ * // => false
+ *
+ * _.endsWith('abc', 'b', 2);
+ * // => true
+ */
- function sendPayload(err, user) {
- var _this3 = this;
- if (err) {
- return callback(err, d);
+ function endsWith(string, target, position) {
+ string = toString(string);
+ target = baseToString(target);
+ var length = string.length;
+ position = position === undefined$1 ? length : baseClamp(toInteger(position), 0, length);
+ var end = position;
+ position -= target.length;
+ return position >= 0 && string.slice(position, end) == target;
}
+ /**
+ * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
+ * corresponding HTML entities.
+ *
+ * **Note:** No other characters are escaped. To escape additional
+ * characters use a third-party library like [_he_](https://mths.be/he).
+ *
+ * Though the ">" character is escaped for symmetry, characters like
+ * ">" and "/" don't need escaping in HTML and have no special meaning
+ * unless they're part of a tag or unquoted attribute value. See
+ * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+ * (under "semi-related fun fact") for more details.
+ *
+ * When working with HTML you should always
+ * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
+ * XSS vectors.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escape('fred, barney, & pebbles');
+ * // => 'fred, barney, & pebbles'
+ */
- var key = d.issueKey;
- var url = "".concat(_impOsmUrls[key], "/comment");
- var payload = {
- username: user.display_name,
- targetIds: [d.identifier]
- };
- if (d.newStatus) {
- payload.status = d.newStatus;
- payload.text = 'status changed';
- } // Comment take place of default text
+ function escape(string) {
+ string = toString(string);
+ return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string;
+ }
+ /**
+ * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
+ * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escapeRegExp('[lodash](https://lodash.com/)');
+ * // => '\[lodash\]\(https://lodash\.com/\)'
+ */
- if (d.newComment) {
- payload.text = d.newComment;
+ function escapeRegExp(string) {
+ string = toString(string);
+ return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, '\\$&') : string;
}
+ /**
+ * Converts `string` to
+ * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the kebab cased string.
+ * @example
+ *
+ * _.kebabCase('Foo Bar');
+ * // => 'foo-bar'
+ *
+ * _.kebabCase('fooBar');
+ * // => 'foo-bar'
+ *
+ * _.kebabCase('__FOO_BAR__');
+ * // => 'foo-bar'
+ */
- var controller = new AbortController();
- _cache$1.inflightPost[d.id] = controller;
- var options = {
- method: 'POST',
- signal: controller.signal,
- body: JSON.stringify(payload)
- };
- d3_json(url, options).then(function () {
- delete _cache$1.inflightPost[d.id]; // Just a comment, update error in cache
- if (!d.newStatus) {
- var now = new Date();
- var comments = d.comments ? d.comments : [];
- comments.push({
- username: payload.username,
- text: payload.text,
- timestamp: now.getTime() / 1000
- });
+ var kebabCase = createCompounder(function (result, word, index) {
+ return result + (index ? '-' : '') + word.toLowerCase();
+ });
+ /**
+ * Converts `string`, as space separated words, to lower case.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the lower cased string.
+ * @example
+ *
+ * _.lowerCase('--Foo-Bar--');
+ * // => 'foo bar'
+ *
+ * _.lowerCase('fooBar');
+ * // => 'foo bar'
+ *
+ * _.lowerCase('__FOO_BAR__');
+ * // => 'foo bar'
+ */
- _this3.replaceItem(d.update({
- comments: comments,
- newComment: undefined
- }));
- } else {
- _this3.removeItem(d);
+ var lowerCase = createCompounder(function (result, word, index) {
+ return result + (index ? ' ' : '') + word.toLowerCase();
+ });
+ /**
+ * Converts the first character of `string` to lower case.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the converted string.
+ * @example
+ *
+ * _.lowerFirst('Fred');
+ * // => 'fred'
+ *
+ * _.lowerFirst('FRED');
+ * // => 'fRED'
+ */
- if (d.newStatus === 'SOLVED') {
- // Keep track of the number of issues closed per type to tag the changeset
- if (!(d.issueKey in _cache$1.closed)) {
- _cache$1.closed[d.issueKey] = 0;
- }
+ var lowerFirst = createCaseFirst('toLowerCase');
+ /**
+ * Pads `string` on the left and right sides if it's shorter than `length`.
+ * Padding characters are truncated if they can't be evenly divided by `length`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.pad('abc', 8);
+ * // => ' abc '
+ *
+ * _.pad('abc', 8, '_-');
+ * // => '_-abc_-_'
+ *
+ * _.pad('abc', 3);
+ * // => 'abc'
+ */
- _cache$1.closed[d.issueKey] += 1;
- }
+ function pad(string, length, chars) {
+ string = toString(string);
+ length = toInteger(length);
+ var strLength = length ? stringSize(string) : 0;
+
+ if (!length || strLength >= length) {
+ return string;
}
- if (callback) callback(null, d);
- })["catch"](function (err) {
- delete _cache$1.inflightPost[d.id];
- if (callback) callback(err.message);
- });
- }
- },
- // Get all cached QAItems covering the viewport
- getItems: function getItems(projection) {
- var viewport = projection.clipExtent();
- var min = [viewport[0][0], viewport[1][1]];
- var max = [viewport[1][0], viewport[0][1]];
- var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
- return _cache$1.rtree.search(bbox).map(function (d) {
- return d.data;
- });
- },
- // Get a QAItem from cache
- // NOTE: Don't change method name until UI v3 is merged
- getError: function getError(id) {
- return _cache$1.data[id];
- },
- // get the name of the icon to display for this item
- getIcon: function getIcon(itemType) {
- return _impOsmData.icons[itemType];
- },
- // Replace a single QAItem in the cache
- replaceItem: function replaceItem(issue) {
- if (!(issue instanceof QAItem) || !issue.id) return;
- _cache$1.data[issue.id] = issue;
- updateRtree$1(encodeIssueRtree$1(issue), true); // true = replace
+ var mid = (length - strLength) / 2;
+ return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars);
+ }
+ /**
+ * Pads `string` on the right side if it's shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.padEnd('abc', 6);
+ * // => 'abc '
+ *
+ * _.padEnd('abc', 6, '_-');
+ * // => 'abc_-_'
+ *
+ * _.padEnd('abc', 3);
+ * // => 'abc'
+ */
- return issue;
- },
- // Remove a single QAItem from the cache
- removeItem: function removeItem(issue) {
- if (!(issue instanceof QAItem) || !issue.id) return;
- delete _cache$1.data[issue.id];
- updateRtree$1(encodeIssueRtree$1(issue), false); // false = remove
- },
- // Used to populate `closed:improveosm:*` changeset tags
- getClosedCounts: function getClosedCounts() {
- return _cache$1.closed;
- }
- };
- var quot = /"/g;
+ function padEnd(string, length, chars) {
+ string = toString(string);
+ length = toInteger(length);
+ var strLength = length ? stringSize(string) : 0;
+ return length && strLength < length ? string + createPadding(length - strLength, chars) : string;
+ }
+ /**
+ * Pads `string` on the left side if it's shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.padStart('abc', 6);
+ * // => ' abc'
+ *
+ * _.padStart('abc', 6, '_-');
+ * // => '_-_abc'
+ *
+ * _.padStart('abc', 3);
+ * // => 'abc'
+ */
- // B.2.3.2.1 CreateHTML(string, tag, attribute, value)
- // https://tc39.es/ecma262/#sec-createhtml
- var createHtml = function (string, tag, attribute, value) {
- var S = String(requireObjectCoercible(string));
- var p1 = '<' + tag;
- if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '"') + '"';
- return p1 + '>' + S + '' + tag + '>';
- };
- // check the existence of a method, lowercase
- // of a tag and escaping quotes in arguments
- var stringHtmlForced = function (METHOD_NAME) {
- return fails(function () {
- var test = ''[METHOD_NAME]('"');
- return test !== test.toLowerCase() || test.split('"').length > 3;
- });
- };
+ function padStart(string, length, chars) {
+ string = toString(string);
+ length = toInteger(length);
+ var strLength = length ? stringSize(string) : 0;
+ return length && strLength < length ? createPadding(length - strLength, chars) + string : string;
+ }
+ /**
+ * Converts `string` to an integer of the specified radix. If `radix` is
+ * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
+ * hexadecimal, in which case a `radix` of `16` is used.
+ *
+ * **Note:** This method aligns with the
+ * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.1.0
+ * @category String
+ * @param {string} string The string to convert.
+ * @param {number} [radix=10] The radix to interpret `value` by.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.parseInt('08');
+ * // => 8
+ *
+ * _.map(['6', '08', '10'], _.parseInt);
+ * // => [6, 8, 10]
+ */
- // `String.prototype.link` method
- // https://tc39.es/ecma262/#sec-string.prototype.link
- _export({ target: 'String', proto: true, forced: stringHtmlForced('link') }, {
- link: function link(url) {
- return createHtml(this, 'a', 'href', url);
- }
- });
- var $trimEnd = stringTrim.end;
+ function parseInt(string, radix, guard) {
+ if (guard || radix == null) {
+ radix = 0;
+ } else if (radix) {
+ radix = +radix;
+ }
+
+ return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
+ }
+ /**
+ * Repeats the given string `n` times.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to repeat.
+ * @param {number} [n=1] The number of times to repeat the string.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {string} Returns the repeated string.
+ * @example
+ *
+ * _.repeat('*', 3);
+ * // => '***'
+ *
+ * _.repeat('abc', 2);
+ * // => 'abcabc'
+ *
+ * _.repeat('abc', 0);
+ * // => ''
+ */
- var FORCED$e = stringTrimForced('trimEnd');
+ function repeat(string, n, guard) {
+ if (guard ? isIterateeCall(string, n, guard) : n === undefined$1) {
+ n = 1;
+ } else {
+ n = toInteger(n);
+ }
- var trimEnd = FORCED$e ? function trimEnd() {
- return $trimEnd(this);
- } : ''.trimEnd;
+ return baseRepeat(toString(string), n);
+ }
+ /**
+ * Replaces matches for `pattern` in `string` with `replacement`.
+ *
+ * **Note:** This method is based on
+ * [`String#replace`](https://mdn.io/String/replace).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to modify.
+ * @param {RegExp|string} pattern The pattern to replace.
+ * @param {Function|string} replacement The match replacement.
+ * @returns {string} Returns the modified string.
+ * @example
+ *
+ * _.replace('Hi Fred', 'Fred', 'Barney');
+ * // => 'Hi Barney'
+ */
- // `String.prototype.{ trimEnd, trimRight }` methods
- // https://tc39.es/ecma262/#sec-string.prototype.trimend
- // https://tc39.es/ecma262/#String.prototype.trimright
- _export({ target: 'String', proto: true, forced: FORCED$e }, {
- trimEnd: trimEnd,
- trimRight: trimEnd
- });
- var defaults = createCommonjsModule(function (module) {
- function getDefaults() {
- return {
- baseUrl: null,
- breaks: false,
- gfm: true,
- headerIds: true,
- headerPrefix: '',
- highlight: null,
- langPrefix: 'language-',
- mangle: true,
- pedantic: false,
- renderer: null,
- sanitize: false,
- sanitizer: null,
- silent: false,
- smartLists: false,
- smartypants: false,
- tokenizer: null,
- walkTokens: null,
- xhtml: false
- };
- }
+ function replace() {
+ var args = arguments,
+ string = toString(args[0]);
+ return args.length < 3 ? string : string.replace(args[1], args[2]);
+ }
+ /**
+ * Converts `string` to
+ * [snake case](https://en.wikipedia.org/wiki/Snake_case).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the snake cased string.
+ * @example
+ *
+ * _.snakeCase('Foo Bar');
+ * // => 'foo_bar'
+ *
+ * _.snakeCase('fooBar');
+ * // => 'foo_bar'
+ *
+ * _.snakeCase('--FOO-BAR--');
+ * // => 'foo_bar'
+ */
- function changeDefaults(newDefaults) {
- module.exports.defaults = newDefaults;
- }
- module.exports = {
- defaults: getDefaults(),
- getDefaults: getDefaults,
- changeDefaults: changeDefaults
- };
- });
+ var snakeCase = createCompounder(function (result, word, index) {
+ return result + (index ? '_' : '') + word.toLowerCase();
+ });
+ /**
+ * Splits `string` by `separator`.
+ *
+ * **Note:** This method is based on
+ * [`String#split`](https://mdn.io/String/split).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to split.
+ * @param {RegExp|string} separator The separator pattern to split by.
+ * @param {number} [limit] The length to truncate results to.
+ * @returns {Array} Returns the string segments.
+ * @example
+ *
+ * _.split('a-b-c', '-', 2);
+ * // => ['a', 'b']
+ */
- /**
- * Helpers
- */
- var escapeTest = /[&<>"']/;
- var escapeReplace = /[&<>"']/g;
- var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
- var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
- var escapeReplacements = {
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"',
- "'": '''
- };
+ function split(string, separator, limit) {
+ if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
+ separator = limit = undefined$1;
+ }
- var getEscapeReplacement = function getEscapeReplacement(ch) {
- return escapeReplacements[ch];
- };
+ limit = limit === undefined$1 ? MAX_ARRAY_LENGTH : limit >>> 0;
- function escape$1(html, encode) {
- if (encode) {
- if (escapeTest.test(html)) {
- return html.replace(escapeReplace, getEscapeReplacement);
- }
- } else {
- if (escapeTestNoEncode.test(html)) {
- return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
- }
- }
+ if (!limit) {
+ return [];
+ }
- return html;
- }
+ string = toString(string);
- var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
+ if (string && (typeof separator == 'string' || separator != null && !isRegExp(separator))) {
+ separator = baseToString(separator);
- function unescape$1(html) {
- // explicitly match decimal, hex, and named HTML entities
- return html.replace(unescapeTest, function (_, n) {
- n = n.toLowerCase();
- if (n === 'colon') return ':';
+ if (!separator && hasUnicode(string)) {
+ return castSlice(stringToArray(string), 0, limit);
+ }
+ }
- if (n.charAt(0) === '#') {
- return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));
- }
+ return string.split(separator, limit);
+ }
+ /**
+ * Converts `string` to
+ * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.1.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the start cased string.
+ * @example
+ *
+ * _.startCase('--foo-bar--');
+ * // => 'Foo Bar'
+ *
+ * _.startCase('fooBar');
+ * // => 'Foo Bar'
+ *
+ * _.startCase('__FOO_BAR__');
+ * // => 'FOO BAR'
+ */
- return '';
- });
- }
- var caret = /(^|[^\[])\^/g;
+ var startCase = createCompounder(function (result, word, index) {
+ return result + (index ? ' ' : '') + upperFirst(word);
+ });
+ /**
+ * Checks if `string` starts with the given target string.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to inspect.
+ * @param {string} [target] The string to search for.
+ * @param {number} [position=0] The position to search from.
+ * @returns {boolean} Returns `true` if `string` starts with `target`,
+ * else `false`.
+ * @example
+ *
+ * _.startsWith('abc', 'a');
+ * // => true
+ *
+ * _.startsWith('abc', 'b');
+ * // => false
+ *
+ * _.startsWith('abc', 'b', 1);
+ * // => true
+ */
- function edit(regex, opt) {
- regex = regex.source || regex;
- opt = opt || '';
- var obj = {
- replace: function replace(name, val) {
- val = val.source || val;
- val = val.replace(caret, '$1');
- regex = regex.replace(name, val);
- return obj;
- },
- getRegex: function getRegex() {
- return new RegExp(regex, opt);
- }
- };
- return obj;
- }
+ function startsWith(string, target, position) {
+ string = toString(string);
+ position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length);
+ target = baseToString(target);
+ return string.slice(position, position + target.length) == target;
+ }
+ /**
+ * Creates a compiled template function that can interpolate data properties
+ * in "interpolate" delimiters, HTML-escape interpolated data properties in
+ * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
+ * properties may be accessed as free variables in the template. If a setting
+ * object is given, it takes precedence over `_.templateSettings` values.
+ *
+ * **Note:** In the development build `_.template` utilizes
+ * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+ * for easier debugging.
+ *
+ * For more information on precompiling templates see
+ * [lodash's custom builds documentation](https://lodash.com/custom-builds).
+ *
+ * For more information on Chrome extension sandboxes see
+ * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The template string.
+ * @param {Object} [options={}] The options object.
+ * @param {RegExp} [options.escape=_.templateSettings.escape]
+ * The HTML "escape" delimiter.
+ * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
+ * The "evaluate" delimiter.
+ * @param {Object} [options.imports=_.templateSettings.imports]
+ * An object to import into the template as free variables.
+ * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
+ * The "interpolate" delimiter.
+ * @param {string} [options.sourceURL='lodash.templateSources[n]']
+ * The sourceURL of the compiled template.
+ * @param {string} [options.variable='obj']
+ * The data object variable name.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Function} Returns the compiled template function.
+ * @example
+ *
+ * // Use the "interpolate" delimiter to create a compiled template.
+ * var compiled = _.template('hello <%= user %>!');
+ * compiled({ 'user': 'fred' });
+ * // => 'hello fred!'
+ *
+ * // Use the HTML "escape" delimiter to escape data property values.
+ * var compiled = _.template('<%- value %>');
+ * compiled({ 'value': '