commit 2cb633e99dc66bbeb68342e366bfa1edd018a119 Author: Alexandre Date: Fri Aug 21 11:10:35 2026 +0200 Initial commit: offline flight planner (Rust, PFPX-class) Clean-room reproduction of PFPX: route generation + IFPS validation + OFP. Independent design — official ICAO/EUROCONTROL data only (RAD, FRA points, IFPUV oracle); no community FPL sources. Workspace crates: core (routing/discover/rad/navdata/perf/export), cli, server, rad (Annex parser), gui (Tauri v2 + React + MapLibre). Route discovery: oracle-in-the-loop repair against Eurocontrol IFPUV. Co-Authored-By: Claude Opus 4.8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc8051a --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Rust build artifacts (root workspace + nested Tauri crate) +/target/ +**/target/ + +# Local SQLite databases (generated by `import-navdata`) +*.db +*.db-journal +*.db-wal +*.db-shm + +# Full X-Plane navdata (large, licensed separately — see README) +/navdata/ + +# Generated flight plans at the repo root (demo/output artifacts) +/*.pln +/*.fms + +# Node / frontend +node_modules/ +/gui/dist/ + +# Local agent config (machine-specific permissions) +/.claude/settings.local.json + +# Editor / OS +*.rs.bk +.DS_Store diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ef85564 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5670 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "accurate" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f209f0bc218ee6cf50db56ec0d9fe10b3cbfb6f3900d019b36c8fdb6d3bc03e" +dependencies = [ + "cfg-if", + "ieee754", + "num-traits", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.1", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "calamine" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138646b9af2c5d7f1804ea4bf93afc597737d2bd4f7341d67c48b03316976eb1" +dependencies = [ + "byteorder", + "codepage", + "encoding_rs", + "log", + "quick-xml 0.31.0", + "serde", + "zip", +] + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.20", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "codepage" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f68d061bc2828ae826206326e61251aca94c1e4a5305cf52d9138639c918b4" +dependencies = [ + "encoding_rs", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "cookie" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.1", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "earcutr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01" +dependencies = [ + "itertools", + "num-traits", +] + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.4+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flightplanner-cli" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "flightplanner-core", + "flightplanner-rad", + "serde_json", +] + +[[package]] +name = "flightplanner-core" +version = "0.1.0" +dependencies = [ + "geo", + "geographiclib-rs", + "petgraph", + "rusqlite", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "flightplanner-gui" +version = "0.1.0" +dependencies = [ + "flightplanner-core", + "flightplanner-rad", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-opener", +] + +[[package]] +name = "flightplanner-rad" +version = "0.1.0" +dependencies = [ + "anyhow", + "calamine", + "flightplanner-core", + "serde", +] + +[[package]] +name = "flightplanner-server" +version = "0.1.0" +dependencies = [ + "axum", + "flightplanner-core", + "flightplanner-rad", + "serde", + "serde_json", + "tokio", + "tower-http 0.5.2", +] + +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "geo" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f811f663912a69249fa620dcd2a005db7254529da2d8a0b23942e81f47084501" +dependencies = [ + "earcutr", + "float_next_after", + "geo-types", + "geographiclib-rs", + "log", + "num-traits", + "robust", + "rstar", + "spade", +] + +[[package]] +name = "geo-types" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777d18aa0f12f8b285331cd867133ee14422b3f023f6d388034c47d43e28786a" +dependencies = [ + "approx", + "num-traits", + "rstar", + "serde", + "thiserror 2.0.20", +] + +[[package]] +name = "geographiclib-rs" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a7f08910fd98737a6eda7568e7c5e645093e073328eeef49758cfe8b0489c7" +dependencies = [ + "accurate", + "libm", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92a7ed671a6aad807a8651a2e1782a6598fda9ce5185dd8158549e95a91c6428" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ieee754" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9007da9cacbd3e6343da136e98b0d2df013f553d35bdec8b518f07bea768e19c" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link 0.2.1", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.13.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a" +dependencies = [ + "libc", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "open" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cfef937e9c486488c7e3d949ae31c0f1d06bdacd75b99c086cb35356e30408" +dependencies = [ + "dunce", + "is-wsl", + "libc", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.14.0", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "quick-xml 0.41.0", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "encoding_rs", + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.20", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http 0.6.11", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "robust" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" + +[[package]] +name = "rstar" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb" +dependencies = [ + "heapless", + "num-traits", + "smallvec", +] + +[[package]] +name = "rusqlite" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +dependencies = [ + "bitflags 2.13.1", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.1", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "spade" +version = "2.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9699399fd9349b00b184f5635b074f9ec93afffef30c853f8c875b32c0f8c7fa" +dependencies = [ + "hashbrown 0.16.1", + "num-traits", + "robust", + "smallvec", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.1", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.20", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.20", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.20", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.20", + "toml 1.1.4+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.4+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045979e3f037cd18ad1cb2a419dfda133c5c29c9f3453370079f2255d46c257e" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.20", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 3.0.3", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b5c6b5976d66c1d703c4fd17d3f5e43c8cedaacf604961b171adc7130896d8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f212a141d820099d57ffafb9569be9617a6f27d3dc881fbee8fb56642f917a9" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "zip" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap 2.14.0", + "memchr", + "thiserror 2.0.20", + "zopfli", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zvariant" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.4", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 3.0.3", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.3", + "winnow 1.0.4", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..1b0b0f6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,26 @@ +[workspace] +resolver = "2" +members = ["crates/core", "crates/cli", "crates/rad", "crates/server", "gui/src-tauri"] + +[workspace.package] +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" +rust-version = "1.74" + +# Shared dependency versions — pinned once here, referenced with +# `dep = { workspace = true }` from each crate. +[workspace.dependencies] +flightplanner-core = { path = "crates/core" } +rusqlite = { version = "0.32", features = ["bundled"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +thiserror = "1.0" +anyhow = "1.0" +clap = { version = "4.5", features = ["derive"] } +petgraph = "0.6" +geo = "0.28" +geographiclib-rs = "0.2" + +[profile.release] +lto = "thin" diff --git a/IDEAS.md b/IDEAS.md new file mode 100644 index 0000000..00d3b8a --- /dev/null +++ b/IDEAS.md @@ -0,0 +1,134 @@ +# IDEAS / Vision — flightplanner + +Cible produit à long terme : une appli de **briefing de vol** complète, dans +l'esprit de SkyNexus / SimBrief / PFPX (voir maquettes fournies). Ce document +capture les idées **au-delà du MVP** ; il ne remet pas en cause l'ordre de +travail défini dans [`TODO.md`]. + +> ⚠️ **Tension à assumer.** Le MVP est *offline-first* (navdata X-Plane locale, +> zéro dépendance cloud). La plupart des écrans ci-dessous reposent sur des +> **données temps réel / online** (météo, NOTAM, réseau VATSIM, cartes ChartFox). +> Ils appartiennent donc à une **phase post-MVP**, et seront branchés via une +> couche *providers* **optionnelle** : chaque source a une implémentation +> « offline / vide » par défaut, et une implémentation « online » activable. +> Le cœur (parsing, routing, perf, export) reste utilisable sans réseau. + +## Impact architecture (prévoir tôt, coder plus tard) + +- **`crates/providers`** — traits abstraits + implémentations : + `WeatherProvider` (METAR/TAF/SIGMET/WAFS), `NotamProvider`, `ChartProvider` + (ChartFox), `NetworkProvider` (VATSIM online ATC/traffic). Chaque trait a une + impl `Null`/offline. Aucune de ces deps ne remonte dans `core`. +- **`crates/web`** — UI locale (Axum + front simple) qui héberge les écrans + Briefing / DEP-ARR-ALT / Enroute / Charts. Consomme `core` + `providers`. +- **`OFP builder`** dans `core` : agrège route + perf + météo en un objet + « briefing » sérialisable (base commune CLI ↔ web ↔ export PDF/texte). +- **Modèle de vol enrichi** : callsign, type OACI (ex. BCS3/A220), CI, step + climbs, ZFW/TOW/LDW, bloc carburant détaillé, alternates multiples. + +--- + +## 1. Écran BRIEFING (OFP / dashboard) + +- **Bandeau global** (toutes pages) : callsign, type avion + moteur, dep→arr, + heures OFF/ON + temps bloc, cycle AIRAC, version OFP, sync multi-appareils, + actions PAD / OFP / REFRESH. +- **Couverture ATC** : timeline des FIR traversés avec état online (VATSIM). +- **Weights** : ZFW / TOW / LDW. +- **Fuel** : bloc total + décomposition TAXI / TRIP / CONT / ALTN / FINRES + (barre empilée visuelle). +- **Load** : PAX, cargo, payload, Cost Index, CRZ FL / temp, Mach. +- **Step climbs** : profil d'altitude par étape. +- **Cartes départ / arrivée** condensées : RWY, SID/STAR, QNH, vent, METAR. +- **Route** : chaîne complète SID … DCT/airways … STAR, + bouton « File on VATSIM ». +- **Alternates** : FL, distance, fuel, ETE, route de déroutement. +- **Cruise level impact** : Δ trip fuel / Δ temps pour FL ±2000/4000/6000 vs FL choisi. + +## 2. Écrans DEP / ARR / ALT (briefing terrain) + +- **En-tête terrain** : nom, ELEV, TA (transition alt), TL (transition level), + RWY active + « change RWY », sélecteur SID/STAR. +- **Météo** : rose des vents (orientation piste + vecteur vent + composantes), + tuiles WIND / VIS / QNH / TEMP-DEW, METAR + TAF (mise en évidence des + changements/éléments importants), refresh. +- **ATIS** décodé, avec source (SayIntentions / VATSIM / réel). +- **NOTAMs** : compteur total + CRITICAL/IMPORTANT, filtre « n'affectant que mon + vol », regroupement (YOUR FLIGHT / TAXIWAYS & GROUND / NAVAIDS & LIGHTING / + GENERAL), tags CHANGED / NOT AVAILABLE, dépliables. +- **NADP** (profil anti-bruit) + **EOSID** (engine-out SID). +- **Table pistes** : HDG, type d'approche, dimensions, THR ELEV, TORA/TODA/ASDA/LDA, marge. +- **Operational notes** : infos arrivée/départ/taxi spécifiques au terrain. +- **Crew briefing** : catégorie d'approche (CAT), threats (TEM). +- **ALT (déroutement)** : Divert plan — niveau, distance, fuel, ETE, route. + +## 3. Écran ENROUTE (carte + profil vertical) + +- **Carte mobile** avec la route tracée et les waypoints. +- **Couches** : + - Flight plan (route + waypoints) + - Météo : METARs, SIGMET, conditions de vol, vents ≥15kt, **radar de précip** + - Prévision WAFS : jet stream, turbulence, givrage, fronts + - Réseau online : ATC VATSIM, trafic, ma position + - Catégories de vol (VFR / MVFR / IFR / LIFR) avec compteurs + légende + - Vent surface (légende barbules) +- **Time scrubber** : LIVE + prévision (+6h … +36h). +- **Badges météo aéroports** (dispo GA/TAF/ATIS). +- **Profil vertical (type EWAS)** : bandes FL, vent/temp le long de la route, + terrain, waypoints avec distances cumulées, axe temps, FL de croisière surligné. + +## 4. Écran CHARTS + +- Intégration **ChartFox** (ou équivalent). +- Par terrain (DEP/ARR/ALT + ajout ICAO) : cartes groupées TAXI / SID / STAR / + APPROACH avec alternatives, tags « ON PLAN » / « GEO » (géo-référencé), épinglage. +- **Visionneuse** : zoom/fit/rotation/luminosité, overlay position live, + download, ouverture externe, barre d'onglets des cartes ouvertes. + +--- + +## Validation IFPS (Eurocontrol) — « check IFPS fiable » + +Objectif : savoir si une route serait **acceptée par l'IFPS** (Eurocontrol NM, +espace IFPZ européen). C'est demandé comme fonctionnalité *fiable*. + +**Réalité à assumer :** un check IFPS *fiable* est **forcément online et +autoritatif**. Les règles à respecter incluent la connectivité point/airway, le +sens et la bande de FL des airways, les **RAD** (Route Availability Document : +routings obligatoires, DCT interdits, restrictions de flux, contraintes de +niveau par zone/horaire — change à chaque cycle AIRAC), les limites DCT en FRA, +la connexion SID/STAR au réseau, RVSM, etc. Reproduire tout cela **hors ligne** +ne peut pas être « fiable » : on courrait derrière le ruleset Eurocontrol. + +**Conception en deux couches :** + +1. **Validateur autoritatif (online, post-MVP)** — la seule source *fiable* : + - **Eurocontrol NM B2B** service `flightPlanValidation` (nécessite un compte + NM + certificat, réservé AO/CFSP) — référence absolue. + - Alternative : **Autorouter** (fait une vraie validation IFPS) ou portail NOP + (manuel). Renvoie accepté/refusé + messages IFPS (ERROUTxxx, PROF…). + - Exposé via un trait `providers::IfpsValidator` ; impl online activable. + +2. **Pré-validateur structurel (offline, faisable dans `core`)** — *best-effort, + non autoritatif*, pour attraper les erreurs évidentes avant soumission : + - chaque point de la route existe et est bien sur l'airway cité ; + - sens d'airway (N/F/B) respecté ; + - FL de croisière dans la bande `base_fl…top_fl` du segment ; + - DCT « raisonnables » (longueur, hors FRA) ; + - continuité de la séquence (pas de trou entre segments). + Résultat étiqueté clairement « pré-check local, non IFPS-officiel ». + +> Décision requise : cible du validateur autoritatif (NM B2B vs Autorouter) et +> accès/credentials disponibles. En attendant, le pré-validateur offline apporte +> déjà de la valeur et alimentera la même API `IfpsResult { accepted, errors, +> warnings }`. + +## Priorisation suggérée (post-MVP) + +1. **OFP builder + écran Briefing texte** (n'a besoin que de core : route + perf). + Faisable offline, prolonge directement l'étape 5 (OFP). +2. **UI web locale** (Axum) réutilisant l'OFP builder — pages statiques d'abord. +3. **Providers online optionnels** : météo (METAR/TAF) → NOTAM → WAFS → réseau + VATSIM → ChartFox, dans cet ordre de valeur/effort. +4. **Écran Enroute (carte + profil vertical)** — le plus lourd, en dernier. + +[`TODO.md`]: ./TODO.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..86836d8 --- /dev/null +++ b/README.md @@ -0,0 +1,91 @@ +# flightplanner + +Outil de *flight planning* **local et offline** pour la simulation de vol +(MSFS / P3D / X-Plane), dans l'esprit de PFPX en plus simple. Aucune dépendance +cloud : navdata X-Plane importée en base SQLite locale, routing par réseau +d'airways, plan carburant, export `.pln` / `.fms` / OFP texte. + +> État : **MVP en construction**. Voir [`TODO.md`](TODO.md) pour l'avancement, +> et [`IDEAS.md`](IDEAS.md) pour la vision produit long terme (briefing complet +> type SkyNexus/SimBrief : météo, NOTAM, carte enroute, charts…). + +## Architecture + +Workspace Cargo à deux crates : + +| Crate | Rôle | +|-----------------------|------------------------------------------------------------------| +| `flightplanner-core` | Logique métier : parsing navdata, base SQLite, routing, perf, export | +| `flightplanner-cli` | Binaire `flightplanner` (interface `clap`) | + +Une interface web locale (Axum) pourra s'ajouter plus tard sans toucher au cœur. + +## Prérequis + +- **Rust stable** (toolchain MSVC sous Windows) — https://rustup.rs +- Un **compilateur C** : `rusqlite` est utilisé en mode `bundled` (SQLite compilé + depuis la source). Sous Windows, installer les *Visual Studio Build Tools* + (workload « Développement Desktop en C++ »). + +## Récupérer la navdata X-Plane (gratuit) + +L'outil lit le format texte X-Plane. La donnée par défaut, **libre**, est fournie +avec X-Plane 11/12 dans : + +``` +/Resources/default data/ +``` + +Fichiers utilisés : + +| Fichier | Contenu | +|------------------|------------------------------------------| +| `earth_fix.dat` | Waypoints / fixes | +| `earth_nav.dat` | Navaids (VOR, DME, NDB, ILS...) | +| `earth_awy.dat` | Airways (segments entre waypoints) | + +Copier ces fichiers dans un dossier local, p. ex. `./navdata/` (ignoré par git). + +> Pour une navdata à jour (cycle AIRAC courant), une souscription Navigraph est +> possible, mais **hors périmètre du MVP** : ici on part de la donnée X-Plane +> gratuite, importée manuellement. + +## Utilisation + +```sh +# 1) Importer la navdata en base SQLite locale +flightplanner import-navdata --source ./navdata/ --db flightplanner.db + +# 2) Router (FL-aware si --cruise-fl ou profil avion fourni) +flightplanner route --from LFPG --to EGLL --db flightplanner.db + +# 3) Route + carburant + pré-check IFPS + exports +flightplanner route --from LFPG --to EGLL --db flightplanner.db \ + --aircraft A320 --cruise-fl 340 \ + --check-ifps --ofp \ + --pln LFPG-EGLL.pln --fms LFPG-EGLL.fms + +# Pré-check IFPS d'une chaîne de route arbitraire +flightplanner ifps-check --route "LFPG DCT PON UT300 ... MODMI DCT EGLL" --fl 340 --db flightplanner.db +``` + +> **Aéroports** : les coordonnées viennent des seuils de piste des fichiers +> `CIFP/.dat`. Pour router au-delà de la paire testée, extraire tout le +> dossier `CIFP/` de l'archive navdata dans `./navdata/CIFP/` avant l'import. + +> **Check IFPS** : le `--check-ifps` est un **pré-check local best-effort** (non +> officiel). Un vrai check IFPS *fiable* nécessite un validateur online +> (Autorouter / Eurocontrol NM) — voir [`IDEAS.md`](IDEAS.md). + +## Développement + +```sh +cargo build +cargo test +cargo fmt && cargo clippy +``` + +## Licence + +MIT OR Apache-2.0. La navdata X-Plane est soumise à sa propre licence et n'est +pas redistribuée dans ce dépôt. diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..afa91a1 --- /dev/null +++ b/TODO.md @@ -0,0 +1,91 @@ +# TODO — flightplanner + +État d'avancement entre sessions. Cocher au fur et à mesure. + +## Étape 1 — Workspace Cargo ✅ (en cours de validation) +- [x] Workspace `Cargo.toml` (members core + cli, deps partagées) +- [x] Crate `flightplanner-core` (lib) : `error`, `model`, stubs `navdata/db/routing/perf/export` +- [x] Crate `flightplanner-cli` (bin `flightplanner`) : clap, sous-commandes `import-navdata` / `route` (stub) +- [x] Profils avions `data/aircraft/{a320,b738}.json` +- [x] README, TODO, .gitignore, rust-toolchain +- [x] `cargo build` + `cargo test` verts, `clippy -D warnings` propre, `fmt --check` OK +- [ ] **Point d'arrêt : validation utilisateur** + +## Étape 2 — Parsing navdata + import SQLite ✅ (en cours de validation) +- [x] Format figé depuis les vrais fichiers (fix 1101, nav 1150, awy 1100 + coords CIFP) +- [x] Parsers streaming ligne-à-ligne (`navdata/{fix,nav,airway,airport}.rs`) +- [x] Schéma SQLite : `airports`, `waypoints`, `navaids`, `airways`, `airway_segments` +- [x] Import bulk transactionnel (`db::import_navdata`) +- [x] Aéroports dérivés des seuils de piste CIFP (centroïde = point de référence) +- [x] Fixtures faites main + tests unitaires parsing + test intégration end-to-end +- [x] Câbler `import-navdata` dans le CLI +- [x] Import réel vérifié : 250 762 wpt / 7 923 navaids / 121 884 segments awy +- [ ] **Point d'arrêt : validation utilisateur** + +> Note : n'ont été extraits du CIFP que `LFPG.dat`/`EGLL.dat` (→ 2 aéroports). +> Pour tous les aéroports, extraire tout le dossier `CIFP/` de l'archive. + +## Étape 3 — Routing ✅ (en cours de validation) +- [x] Construction graphe `petgraph` depuis SQLite (`routing/graph.rs`) +- [x] A* airways (heuristique great-circle) + connexion dep/dest aux points proches (DCT) +- [x] Fallback direct great-circle si pas de chemin +- [x] Test bout-en-bout LFPG→EGLL sur fixtures + gestion aéroport inconnu +- [x] Câbler `route` dans le CLI +- [x] Vérifié sur vraies données : `LFPG DCT PON UT300 … MID UM185 MODMI DCT EGLL` (12 legs, 236 nm) +- [x] **FL-aware** : filtrage des airways par bande base/top selon le FL de croisière (`build(conn, Some(fl))`) → routes cohérentes qui passent le pré-check IFPS +- [ ] **Point d'arrêt : validation utilisateur** +- [ ] (idée) collapse des legs consécutifs d'un même airway à l'affichage + +## Étape 4 — Performance / carburant ✅ (en cours de validation) +- [x] Struct `AircraftProfile` (serde) + chargement `data/aircraft/.json` +- [x] Modèle 3 phases (montée/croisière/descente) réparti sur la distance +- [x] Temps/carburant par segment + cumul + réserves (taxi/contingence/finale/alternate) +- [x] `route --aircraft A320 [--alternate] [--cruise-fl]` dans le CLI +- [x] Tests (couverture distance, block>trip, vol court sans croisière, chargement profil) +- [ ] **Point d'arrêt : validation utilisateur** + +## Étape 5 — Export ✅ (MVP bouclé) +- [x] `.pln` (MSFS/P3D, AceXML) avec ATCWaypoint + ATCAirway +- [x] `.fms` (X-Plane 11, v1100) avec ADEP/ADES/NUMENR +- [x] OFP texte (route, table legs dist/ETE/fuel/cumul, réserves, block) +- [x] Câblé au CLI : `route … --pln f.pln --fms f.fms --ofp` +- [x] Test end-to-end export (pln/fms/ofp) + +## Étape 6 — Moteur de perf physique OpenAP 🔧 (en cours — cap : remplaçant PFPX) +Objectif : sortir du `fuel_flow_kgph` fixe et calculer la conso par la physique +(atmosphère ISA + polaire de traînée + TSFC), comme BADA/OpenAP. +- [x] `perf/openap.rs` : atmosphère ISA, polaire `CD = CD0 + k·CL²`, débit = TSFC·traînée +- [x] Coefficients réels OpenAP embarqués (A320/CFM56-5B4, B738/CFM56-7B26) dans les JSON avion (`openap{}`) +- [x] Débit **fonction de la masse et du FL** ; câblé dans `compute_fuel_plan` (non-cassant, fallback si pas d'`openap`) +- [x] Tests : ISA vs valeurs connues, croisière A320 réaliste (~2000 kg/h @FL350), + lourd = + conso, + haut = - conso, plancher idle en descente +- [x] Vérifié sur route réelle : courbe d'altitude optimale (min conso ~FL360, remonte à FL390) +- [x] **Masse réelle** : `--payload` au CLI, ZFW/TOW/LDW calculés, itération point-fixe du block-fuel (masse ← OEW+payload+carburant), alertes MTOW/MLW ; masses au print + OFP. Vérifié : trip fuel monte avec la charge (LFPG→EGLL : 1736→1959 kg de 8t à 20t) +- [ ] Profil de montée/descente intégré par tranches d'altitude (au lieu d'une altitude médiane) +- [ ] Traînée de compressibilité (wave drag) près du Mach de croisière +- [ ] TSFC calibrée par phase (idle/approche/climb depuis les points ICAO du moteur) +- [ ] (option) brancher les datasets BADA 4 derrière la même interface `PerfModel` si licence EUROCONTROL obtenue + +## Étape 7 — GUI desktop (Tauri + React + Fluent UI) 🖥️ (en cours) +Fenêtre native (WebView2, PAS un navigateur). **Règle : aucun CSS/style écrit à la +main — on utilise le design system Fluent UI (Microsoft, look Windows 11).** +`gui/` = frontend React/TypeScript (Vite) ; `gui/src-tauri/` = backend Rust +(`flightplanner-gui`, membre du workspace). Lancer : `cd gui ; npm run tauri dev`. +- [x] Scaffold Tauri v2 (react-ts) intégré au workspace, WebView2 présent +- [x] **Fluent UI** (`@fluentui/react-components`) : `FluentProvider` suit le thème clair/sombre de l'OS ; composants standards (Field/Input/Select/Card/Table/Badge/MessageBar) → zéro style maison, juste de la mise en page via les tokens +- [x] Commande `plan` : pont vers `core` (route + fuel plan) via DTO sérialisables +- [x] Formulaire : dep/dest, avion, cruise FL, payload, alternate, sources data (DB/profils) +- [x] Résultats : route string, cartes (trip/block/réserves), bandeau masses (payload/ZFW/TOW/LDW + alertes MTOW/MLW), table des legs (dist/ETE/fuel/cum) +- [x] `cargo check` propre sur `flightplanner-gui`, frontend `npm run build` (tsc) OK +- [ ] Carte (MapLibre) avec tracé de la route + waypoints +- [ ] Sélecteurs d'aéroport avec autocomplétion depuis la DB (Combobox Fluent) +- [ ] Boutons export (.pln/.fms/OFP) + copier route +- [ ] Écran réglages (chemin DB, cycle AIRAC, unités kg/lb) +- [ ] Bundler une DB navdata + packaging installeur (`tauri build`) + +## Plus tard (hors MVP) +- ~~UI web locale (Axum)~~ → remplacé par GUI Tauri (étape 7) +- Météo, cycles AIRAC automatiques +- **Check IFPS** : + - [x] Pré-validateur offline (`core::ifps`) : point existe / sur airway, sens, bande FL, DCT, continuité + CLI `ifps-check` et `route --check-ifps` + - [ ] Validateur autoritatif online **Autorouter** (le vrai « fiable ») — voir [`IDEAS.md`](IDEAS.md) +- **Vision produit complète (briefing type SkyNexus/SimBrief) → voir [`IDEAS.md`](IDEAS.md)** diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml new file mode 100644 index 0000000..05b803e --- /dev/null +++ b/crates/cli/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "flightplanner-cli" +description = "Command-line interface for the local flight planner." +version.workspace = true +edition.workspace = true +license.workspace = true +rust-version.workspace = true + +[[bin]] +name = "flightplanner" +path = "src/main.rs" + +[dependencies] +flightplanner-core = { workspace = true } +flightplanner-rad = { path = "../rad" } +clap = { workspace = true } +anyhow = { workspace = true } +serde_json = { workspace = true } diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs new file mode 100644 index 0000000..2152ee2 --- /dev/null +++ b/crates/cli/src/main.rs @@ -0,0 +1,386 @@ +//! `flightplanner` CLI — thin `clap` layer over `flightplanner-core`. + +use std::path::PathBuf; + +use clap::{Parser, Subcommand}; + +#[derive(Parser)] +#[command( + name = "flightplanner", + version, + about = "Local, offline flight planner (X-Plane navdata, MSFS/P3D/X-Plane export)" +)] +struct Cli { + #[command(subcommand)] + command: Command, +} + +#[derive(Subcommand)] +enum Command { + /// Import X-Plane navdata (.dat) into the local SQLite database. + ImportNavdata { + /// Directory containing earth_fix.dat, earth_nav.dat, earth_awy.dat. + #[arg(long)] + source: PathBuf, + /// SQLite database file to create/update. + #[arg(long, default_value = "flightplanner.db")] + db: PathBuf, + }, + /// Import PFPX `.route` files as unvalidated seeds into our route DB. + ImportPfpx { + /// PFPX `Routes` directory (e.g. `C:\Users\Public\Documents\PFPX Data\Routes`). + #[arg(long)] + source: PathBuf, + /// SQLite database file to update. + #[arg(long, default_value = "flightplanner.db")] + db: PathBuf, + }, + /// Compute a route between two waypoints/airports. + Route { + /// Departure identifier (e.g. LFPG). + #[arg(long)] + from: String, + /// Destination identifier (e.g. EGLL). + #[arg(long)] + to: String, + /// SQLite database file produced by `import-navdata`. + #[arg(long, default_value = "flightplanner.db")] + db: PathBuf, + /// Aircraft type (e.g. A320) — enables the fuel plan. + #[arg(long)] + aircraft: Option, + /// Directory holding `.json` aircraft profiles. + #[arg(long, default_value = "data/aircraft")] + aircraft_dir: PathBuf, + /// Cruise flight level (×100 ft); defaults to the profile's value. + #[arg(long)] + cruise_fl: Option, + /// Alternate airport identifier — adds alternate fuel. + #[arg(long)] + alternate: Option, + /// Payload (pax + cargo) in kg; defaults to a medium load factor. + #[arg(long)] + payload: Option, + /// Run the offline IFPS pre-check on the computed route. + #[arg(long)] + check_ifps: bool, + /// Write an MSFS/P3D `.pln` to this path. + #[arg(long)] + pln: Option, + /// Write an X-Plane `.fms` to this path. + #[arg(long)] + fms: Option, + /// Print a text OFP to stdout. + #[arg(long)] + ofp: bool, + }, + /// Discover an IFPS-valid route via the oracle loop (live Eurocontrol IFPUV). + Discover { + /// Departure ICAO (e.g. LFRN). + #[arg(long)] + from: String, + /// Destination ICAO (e.g. LFMN). + #[arg(long)] + to: String, + /// SQLite database (navdata). + #[arg(long, default_value = "real.db")] + db: PathBuf, + /// Aircraft type (for the cruise FL default). + #[arg(long, default_value = "A320")] + aircraft: String, + /// Aircraft profiles dir. + #[arg(long, default_value = "data/aircraft")] + aircraft_dir: PathBuf, + /// CIFP directory (SID/STAR). + #[arg(long, default_value = "navdata/CIFP")] + cifp: PathBuf, + /// Requested cruise FL (×100 ft); capped by RAD. + #[arg(long, default_value_t = 360)] + fl: i32, + }, + /// Offline IFPS pre-check of a route string (best-effort, non-authoritative). + IfpsCheck { + /// Route string, e.g. "LFPG DCT PON UT300 ELCOB ... EGLL". + #[arg(long)] + route: String, + /// Cruise flight level (×100 ft). + #[arg(long)] + fl: i32, + /// SQLite database file produced by `import-navdata`. + #[arg(long, default_value = "flightplanner.db")] + db: PathBuf, + }, +} + +fn main() -> anyhow::Result<()> { + let cli = Cli::parse(); + match cli.command { + Command::ImportNavdata { source, db } => { + use flightplanner_core::db; + let mut conn = db::open(&db)?; + let stats = db::import_navdata(&mut conn, &source)?; + println!( + "Imported navdata from {} into {}:", + source.display(), + db.display() + ); + println!(" waypoints: {}", stats.waypoints); + println!(" navaids: {}", stats.navaids); + println!(" airway segments: {}", stats.airway_segments); + println!(" airports: {}", stats.airports); + } + Command::ImportPfpx { source, db } => { + use flightplanner_core::{db, pfpx}; + let mut conn = db::open(&db)?; + let (parsed, inserted) = pfpx::import_dir(&mut conn, &source)?; + println!( + "Imported PFPX routes from {} into {}:", + source.display(), + db.display() + ); + println!(" parsed: {parsed}"); + println!(" inserted: {inserted} (new seeds; existing rows kept)"); + } + Command::Discover { from, to, db, aircraft, aircraft_dir, cifp, fl } => { + use flightplanner_core::api::{self, PlanRequest}; + let rad = load_rad_full(); + let req = PlanRequest { + from: from.clone(), + to: to.clone(), + db_path: db.to_string_lossy().into(), + aircraft: Some(aircraft), + aircraft_dir: aircraft_dir.to_string_lossy().into(), + cifp_dir: Some(cifp.to_string_lossy().into()), + cruise_fl: Some(fl), + alternate: None, + payload_kg: Some(16_000.0), + }; + let validator = CliIfps; + let r = api::discover_route(&req, rad.as_ref(), &validator)?; + println!("\n{from} → {to} {}", if r.accepted { "✓ IFPS ACCEPTED" } else { "✗ not accepted" }); + println!(" FL{:03} {:.0} nm ({} iterations)", r.fl, r.total_nm, r.iterations); + println!(" route : {}", r.route_string); + println!(" log:"); + for l in &r.log { println!(" {l}"); } + if !r.accepted { + println!(" remaining errors:"); + for e in &r.errors { println!(" {} {}", e.code, e.msg); } + } + } + Command::Route { + from, + to, + db, + aircraft, + aircraft_dir, + cruise_fl, + alternate, + payload, + check_ifps, + pln, + fms, + ofp, + } => { + use flightplanner_core::{db as database, export, ifps, perf, routing}; + let conn = database::open(&db)?; + let profile = match &aircraft { + Some(icao) => Some(perf::AircraftProfile::load(&aircraft_dir, icao)?), + None => None, + }; + // Effective cruise FL: explicit flag, else the aircraft's default. + let cruise_fl = cruise_fl.or_else(|| profile.as_ref().map(|p| p.default_cruise_fl)); + + let route = + routing::plan_route(&conn, &from.to_uppercase(), &to.to_uppercase(), cruise_fl)?; + println!("{}", route.route_string()); + println!( + "{} legs, {:.0} nm ({})", + route.legs.len(), + route.total_nm, + if route.via_airways { + "via airways" + } else { + "direct great-circle fallback" + } + ); + + let fuel_plan = if let Some(profile) = &profile { + let fl = cruise_fl.unwrap_or(profile.default_cruise_fl); + let alternate_nm = match &alternate { + Some(alt) => Some( + routing::plan_route( + &conn, + &to.to_uppercase(), + &alt.to_uppercase(), + cruise_fl, + )? + .total_nm, + ), + None => None, + }; + let plan = perf::compute_fuel_plan(profile, &route, fl, alternate_nm, payload); + print_fuel_plan(profile, &plan, alternate.as_deref()); + Some(plan) + } else { + None + }; + + if check_ifps { + let ifps_fl = cruise_fl.unwrap_or(350); + let report = ifps::prevalidate(&conn, &route.route_string(), ifps_fl, None)?; + print_ifps_report(&report, ifps_fl); + } + + let cruise_alt_ft = cruise_fl.unwrap_or(350) * 100; + if let Some(path) = &pln { + std::fs::write(path, export::pln::to_pln(&conn, &route, cruise_alt_ft)?)?; + println!("wrote {}", path.display()); + } + if let Some(path) = &fms { + std::fs::write(path, export::fms::to_fms(&conn, &route, cruise_alt_ft)?)?; + println!("wrote {}", path.display()); + } + if ofp { + print!( + "{}", + export::ofp::to_ofp(&route, fuel_plan.as_ref(), aircraft.as_deref(), cruise_fl) + ); + } + } + Command::IfpsCheck { route, fl, db } => { + use flightplanner_core::{db as database, ifps}; + let conn = database::open(&db)?; + let report = ifps::prevalidate(&conn, &route, fl, None)?; + print_ifps_report(&report, fl); + } + } + Ok(()) +} + +/// Format minutes as `H:MM`. +fn hm(minutes: f64) -> String { + let total = minutes.round() as i64; + format!("{}:{:02}", total / 60, total % 60) +} + +/// Load the RAD workbook + official FRA points (env `FP_RAD` / `FP_FRA_POINTS`). +fn load_rad_full() -> Option { + let path = std::env::var("FP_RAD").unwrap_or_else(|_| "rad/RAD_current.xlsx".into()); + let mut rad = flightplanner_rad::parse(&path).ok()?; + let fp = std::env::var("FP_FRA_POINTS").unwrap_or_else(|_| "rad/fra-points.xlsx".into()); + rad.fra_points = flightplanner_rad::parse_fra_points(&fp).unwrap_or_default(); + eprintln!("RAD: {} level caps, {} FRA points", rad.level_caps.len(), rad.fra_points.len()); + Some(rad) +} + +/// IFPS validator spawning the IFPUV scraper (`tools/ifpuv/validate.mjs`). +struct CliIfps; +impl flightplanner_core::routing::discover::IfpsValidator for CliIfps { + fn validate( + &self, + adep: &str, + ades: &str, + route: &str, + fl: i32, + ) -> flightplanner_core::error::Result { + use flightplanner_core::error::CoreError; + use flightplanner_core::routing::discover::{IfpsErr, IfpsVerdict}; + eprint!(" · checking @ FL{fl:03} … "); + let dir = std::env::var("FP_IFPUV_DIR").unwrap_or_else(|_| "tools/ifpuv".into()); + let payload = serde_json::json!({ + "adep": adep, "ades": ades, "route": route, "level": format!("F{:03}", fl), + }); + let out = std::process::Command::new("node") + .arg("validate.mjs") + .arg(payload.to_string()) + .current_dir(&dir) + .output()?; + let stdout = String::from_utf8_lossy(&out.stdout); + let line = stdout + .lines() + .rev() + .find(|l| l.trim_start().starts_with('{')) + .ok_or_else(|| CoreError::Other(format!("validator: no result. stderr: {}", String::from_utf8_lossy(&out.stderr).trim())))?; + let v: serde_json::Value = serde_json::from_str(line)?; + let errors: Vec = v["errors"] + .as_array() + .map(|a| { + a.iter() + .filter_map(|e| Some(IfpsErr { code: e["code"].as_str()?.to_string(), msg: e["msg"].as_str()?.to_string() })) + .collect() + }) + .unwrap_or_default(); + eprintln!("{} err", errors.len()); + Ok(IfpsVerdict { accepted: v["accepted"].as_bool().unwrap_or(false), errors }) + } +} + +fn print_fuel_plan( + profile: &flightplanner_core::perf::AircraftProfile, + plan: &flightplanner_core::perf::FuelPlan, + alternate: Option<&str>, +) { + println!(); + println!( + "Aircraft {} ({}) CRZ FL{:03}", + profile.icao, profile.name, plan.cruise_fl + ); + println!( + "Trip: {:.0} nm {} {:.0} kg", + plan.climb.dist_nm + plan.cruise.dist_nm + plan.descent.dist_nm, + hm(plan.trip_time_min), + plan.trip_fuel_kg + ); + for (label, p) in [ + ("climb ", &plan.climb), + ("cruise ", &plan.cruise), + ("descent", &plan.descent), + ] { + println!( + " {label}: {:>5.0} nm {:>5} {:>6.0} kg", + p.dist_nm, + hm(p.time_min), + p.fuel_kg + ); + } + println!( + "Reserves: taxi {:.0} contingency {:.0} alternate{} {:.0} final {:.0}", + plan.taxi_kg, + plan.contingency_kg, + alternate.map(|a| format!(" ({a})")).unwrap_or_default(), + plan.alternate_kg, + plan.final_reserve_kg + ); + println!("Block fuel: {:.0} kg", plan.block_fuel_kg); + if let Some(m) = &plan.masses { + println!( + "Mass: payload {:.0} ZFW {:.0} TOW {:.0} LDW {:.0} kg", + m.payload_kg, m.zfw_kg, m.takeoff_kg, m.landing_kg + ); + if m.over_mtow { + println!(" ! TOW exceeds MTOW — reduce payload or fuel"); + } + if m.over_mlw { + println!(" ! LDW exceeds MLW"); + } + } +} + +fn print_ifps_report(report: &flightplanner_core::ifps::IfpsReport, fl: i32) { + println!(); + println!("IFPS pre-check (local, non-authoritative) at FL{fl}:"); + if report.accepted { + println!(" ACCEPTED"); + } else { + println!(" REJECTED ({} error(s))", report.errors.len()); + } + for e in &report.errors { + println!(" ✗ {e}"); + } + for w in &report.warnings { + println!(" ! {w}"); + } + if !report.expanded.is_empty() { + println!(" expanded: {}", report.expanded.join(" ")); + } +} diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml new file mode 100644 index 0000000..bb3dacb --- /dev/null +++ b/crates/core/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "flightplanner-core" +description = "Core logic for the local flight planner: navdata parsing, routing, performance, export." +version.workspace = true +edition.workspace = true +license.workspace = true +rust-version.workspace = true + +[dependencies] +rusqlite = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +thiserror = { workspace = true } +petgraph = { workspace = true } +geo = { workspace = true } +geographiclib-rs = { workspace = true } diff --git a/crates/core/src/api.rs b/crates/core/src/api.rs new file mode 100644 index 0000000..ba898e2 --- /dev/null +++ b/crates/core/src/api.rs @@ -0,0 +1,492 @@ +//! Shared planning API — one `plan(request) -> result` used by both the local +//! (in-process, Tauri) and the custom-server (HTTP) backends, so the two modes +//! run the exact same engine. + +use std::path::Path; + +use serde::{Deserialize, Serialize}; + +use crate::error::Result; +use crate::{db, export, perf, routing}; + +/// Everything the UI form sends to plan a flight. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PlanRequest { + pub from: String, + pub to: String, + pub db_path: String, + /// Aircraft ICAO (e.g. "A320"); `None`/empty ⇒ route only, no fuel plan. + pub aircraft: Option, + pub aircraft_dir: String, + /// Directory of CIFP airport files (for SID/STAR connectors); `None` ⇒ no + /// SID/STAR-aware routing (falls back to nearest-airway-point connection). + #[serde(default)] + pub cifp_dir: Option, + /// Cruise flight level (×100 ft); `None` ⇒ the profile's default. + pub cruise_fl: Option, + /// Alternate airport ICAO; adds alternate fuel when set. + pub alternate: Option, + /// Payload (pax + cargo) in kg; `None` ⇒ a medium default load. + pub payload_kg: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct LegDto { + pub from: String, + pub via: String, + pub to: String, + pub dist_nm: f64, + pub cum_dist_nm: f64, + pub time_min: Option, + pub cum_time_min: Option, + pub fuel_kg: Option, + pub cum_fuel_kg: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PhaseDto { + pub dist_nm: f64, + pub time_min: f64, + pub fuel_kg: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MassDto { + pub payload_kg: f64, + pub zfw_kg: f64, + pub takeoff_kg: f64, + pub landing_kg: f64, + pub over_mtow: bool, + pub over_mlw: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FuelDto { + pub aircraft: String, + pub cruise_fl: i32, + pub climb: PhaseDto, + pub cruise: PhaseDto, + pub descent: PhaseDto, + pub trip_fuel_kg: f64, + pub trip_time_min: f64, + pub taxi_kg: f64, + pub contingency_kg: f64, + pub alternate_kg: f64, + pub final_reserve_kg: f64, + pub block_fuel_kg: f64, + pub mass: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PointDto { + pub ident: String, + pub lat: f64, + pub lon: f64, +} + +/// A full SID/STAR procedure track, for drawing on the map. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProcTrackDto { + pub name: String, + /// `"SID"` or `"STAR"`. + pub kind: String, + pub points: Vec, +} + +/// Offline IFPS pre-check outcome (best-effort, non-authoritative). +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct IfpsDto { + pub accepted: bool, + pub errors: Vec, + pub warnings: Vec, +} + +/// A stored flight plan from our own route database. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CachedRouteDto { + pub dep: String, + pub dest: String, + pub cruise_fl: i32, + pub route_string: String, + pub dist_nm: f64, + pub ifps_ok: bool, + pub source: String, + pub generated_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PlanResult { + pub route_string: String, + pub via_airways: bool, + pub total_nm: f64, + pub cruise_fl: Option, + pub legs: Vec, + pub fuel: Option, + /// Ordered waypoint positions for the map (dep → … → dest). + pub geometry: Vec, + /// Full SID/STAR procedure tracks (terminal), for the map. + pub procedures: Vec, + /// Ready-to-read operational flight plan (plain text). + pub ofp: String, + /// Offline IFPS pre-check result for the computed route. + pub ifps: IfpsDto, +} + +fn phase_dto(p: &perf::PhaseResult) -> PhaseDto { + PhaseDto { + dist_nm: p.dist_nm, + time_min: p.time_min, + fuel_kg: p.fuel_kg, + } +} + +/// Resolve a SID/STAR fix sequence to map points (airport prepended for a SID, +/// appended for a STAR), reusing the route-geometry resolver. +fn resolve_track( + conn: &rusqlite::Connection, + airport: &str, + fixes: &[String], + is_sid: bool, +) -> Vec { + if fixes.is_empty() { + return Vec::new(); + } + let mut idents: Vec = Vec::new(); + if is_sid { + idents.push(airport.to_uppercase()); + } + idents.extend(fixes.iter().cloned()); + if !is_sid { + idents.push(airport.to_uppercase()); + } + let legs = idents + .windows(2) + .map(|w| routing::Leg { + from: w[0].clone(), + to: w[1].clone(), + airway: "DCT".to_owned(), + dist_nm: 0.0, + }) + .collect(); + let route = routing::Route { + legs, + total_nm: 0.0, + via_airways: false, + }; + routing::resolve_geometry(conn, &route) + .unwrap_or_default() + .into_iter() + .map(|(ident, pos)| PointDto { + ident, + lat: pos.lat, + lon: pos.lon, + }) + .collect() +} + +/// Run the full pipeline (route → fuel plan → geometry → OFP) for `req`. +/// When `rad` is supplied, the IFPS pre-check also flags RAD DCT violations. +pub fn plan(req: &PlanRequest, rad: Option<&crate::rad::RadData>) -> Result { + let conn = db::open(Path::new(&req.db_path))?; + let from = req.from.trim().to_uppercase(); + let to = req.to.trim().to_uppercase(); + + let aircraft = req.aircraft.as_deref().filter(|s| !s.trim().is_empty()); + let profile = match aircraft { + Some(icao) => Some(perf::AircraftProfile::load( + Path::new(&req.aircraft_dir), + icao, + )?), + None => None, + }; + let cruise_fl = req + .cruise_fl + .or_else(|| profile.as_ref().map(|p| p.default_cruise_fl)); + // Respect RAD city-pair level caps (Annex 2A) up front, so airways are chosen + // valid at the filed FL and the route is PROF204-clean by construction. + let rad_cap = rad.and_then(|r| r.max_cruise_fl(&from, &to)); + let cruise_fl = match (cruise_fl, rad_cap) { + // Snap to a valid cruise level (multiple of 10 = 1000 ft); an odd cap like + // FL235 filed verbatim is rejected by IFPS as SYN101 INVALID LEVEL. + (Some(fl), Some(cap)) => Some(fl.min(cap) / 10 * 10), + (fl, _) => fl, + }; + + // SID exits (dep) / STAR entries (dest): (procedure name, connector fix). + use crate::navdata::procedure::{connectors, ProcKind}; + let (dep_sid, dest_star): (Vec<(String, String)>, Vec<(String, String)>) = + match req.cifp_dir.as_deref().filter(|s| !s.trim().is_empty()) { + Some(cifp) => { + let dir = Path::new(cifp); + ( + connectors(dir, &from, ProcKind::Sid).unwrap_or_default(), + connectors(dir, &to, ProcKind::Star).unwrap_or_default(), + ) + } + None => (Vec::new(), Vec::new()), + }; + // Route to file (FRA graph → FRA heuristic → airways); see `plan_preferred`. + let route = routing::plan_preferred(&conn, &from, &to, &dep_sid, &dest_star, cruise_fl, rad)?; + + let fuel = if let Some(profile) = &profile { + let fl = cruise_fl.unwrap_or(profile.default_cruise_fl); + let alternate_nm = match req.alternate.as_deref().filter(|s| !s.trim().is_empty()) { + Some(alt) => Some( + routing::plan_route_best(&conn, &to, &alt.trim().to_uppercase(), cruise_fl, &[], &[])? + .total_nm, + ), + None => None, + }; + let p = perf::compute_fuel_plan(profile, &route, fl, alternate_nm, req.payload_kg); + Some((profile.clone(), fl, p)) + } else { + None + }; + + let geometry = routing::resolve_geometry(&conn, &route)? + .into_iter() + .map(|(ident, pos)| PointDto { + ident, + lat: pos.lat, + lon: pos.lon, + }) + .collect(); + + // Full SID/STAR procedure tracks (chosen SID = first non-DCT leg, STAR = last). + let mut procedures: Vec = Vec::new(); + if let Some(cifp) = req.cifp_dir.as_deref().filter(|s| !s.trim().is_empty()) { + let dir = Path::new(cifp); + if let Some(first) = route.legs.first() { + if first.airway != "DCT" { + let fixes = crate::navdata::procedure::procedure_track( + dir, &from, ProcKind::Sid, &first.airway, &first.to, + ) + .unwrap_or_default(); + let pts = resolve_track(&conn, &from, &fixes, true); + if pts.len() >= 2 { + procedures.push(ProcTrackDto { + name: first.airway.clone(), + kind: "SID".to_owned(), + points: pts, + }); + } + } + } + if let Some(last) = route.legs.last() { + if last.airway != "DCT" { + let fixes = crate::navdata::procedure::procedure_track( + dir, &to, ProcKind::Star, &last.airway, &last.from, + ) + .unwrap_or_default(); + let pts = resolve_track(&conn, &to, &fixes, false); + if pts.len() >= 2 { + procedures.push(ProcTrackDto { + name: last.airway.clone(), + kind: "STAR".to_owned(), + points: pts, + }); + } + } + } + } + + let ofp = export::ofp::to_ofp(&route, fuel.as_ref().map(|(_, _, p)| p), aircraft, cruise_fl); + + let mut cum_dist = 0.0; + let legs = match &fuel { + Some((_, _, plan)) => plan + .legs + .iter() + .map(|l| { + cum_dist += l.dist_nm; + LegDto { + from: l.from.clone(), + via: l.airway.clone(), + to: l.to.clone(), + dist_nm: l.dist_nm, + cum_dist_nm: cum_dist, + time_min: Some(l.time_min), + cum_time_min: Some(l.cum_time_min), + fuel_kg: Some(l.fuel_kg), + cum_fuel_kg: Some(l.cum_fuel_kg), + } + }) + .collect(), + None => route + .legs + .iter() + .map(|l| { + cum_dist += l.dist_nm; + LegDto { + from: l.from.clone(), + via: l.airway.clone(), + to: l.to.clone(), + dist_nm: l.dist_nm, + cum_dist_nm: cum_dist, + time_min: None, + cum_time_min: None, + fuel_kg: None, + cum_fuel_kg: None, + } + }) + .collect(), + }; + + let fuel_dto = fuel.map(|(profile, fl, plan)| FuelDto { + aircraft: format!("{} ({})", profile.icao, profile.name), + cruise_fl: fl, + climb: phase_dto(&plan.climb), + cruise: phase_dto(&plan.cruise), + descent: phase_dto(&plan.descent), + trip_fuel_kg: plan.trip_fuel_kg, + trip_time_min: plan.trip_time_min, + taxi_kg: plan.taxi_kg, + contingency_kg: plan.contingency_kg, + alternate_kg: plan.alternate_kg, + final_reserve_kg: plan.final_reserve_kg, + block_fuel_kg: plan.block_fuel_kg, + mass: plan.masses.map(|m| MassDto { + payload_kg: m.payload_kg, + zfw_kg: m.zfw_kg, + takeoff_kg: m.takeoff_kg, + landing_kg: m.landing_kg, + over_mtow: m.over_mtow, + over_mlw: m.over_mlw, + }), + }); + + // Offline IFPS pre-check (structural, non-authoritative), then store the plan + // as an UNVALIDATED draft. `ifps_ok` is reserved for routes the real IFPUV + // oracle has accepted (`discover_route`), so the DB never claims a route is + // IFPS-valid on the strength of the offline check (it has false positives). + let route_str = route.route_string(); + let ifps_fl = cruise_fl.unwrap_or(350); + let report = crate::ifps::prevalidate(&conn, &route_str, ifps_fl, rad)?; + let _ = crate::routes::record( + &conn, + &from, + &to, + ifps_fl, + &route_str, + route.total_nm, + route.via_airways, + false, // never authoritative — only the oracle sets ifps_ok + &report.errors, + "draft", + ); + + Ok(PlanResult { + route_string: route_str, + via_airways: route.via_airways, + total_nm: route.total_nm, + cruise_fl, + legs, + fuel: fuel_dto, + geometry, + procedures, + ofp, + ifps: IfpsDto { + accepted: report.accepted, + errors: report.errors, + warnings: report.warnings, + }, + }) +} + +/// Discover an IFPS-valid route via the oracle loop, then store it. `validator` +/// is supplied by the app layer (spawns the IFPUV scraper). The accepted route is +/// saved to our route DB (`source="ifps"`) so it's reused instantly next time. +pub fn discover_route( + req: &PlanRequest, + rad: Option<&crate::rad::RadData>, + validator: &dyn routing::discover::IfpsValidator, +) -> Result { + use crate::navdata::procedure::{connectors, ProcKind}; + let conn = db::open(Path::new(&req.db_path))?; + let from = req.from.trim().to_uppercase(); + let to = req.to.trim().to_uppercase(); + // Start at the requested FL, capped by any RAD city-pair level cap (Annex 2A). + let requested = req.cruise_fl.unwrap_or(360); + let start_fl = rad + .and_then(|r| r.max_cruise_fl(&from, &to)) + .map_or(requested, |cap| requested.min(cap) / 10 * 10); // valid cruise level + + // Reuse: instant return if our DB already holds an oracle-validated (no-error) + // route for this pair — this is how the self-built IFPS route DB pays off. + if let Ok(stored) = crate::routes::recent(&conn, &from, &to, 25) { + if let Some(r) = stored.iter().find(|r| r.ifps_ok && r.source == "ifps") { + return Ok(routing::discover::DiscoverResult { + accepted: true, + route_string: r.route_string.clone(), + item15: r.route_string.clone(), + fl: r.cruise_fl, + total_nm: r.dist_nm, + errors: Vec::new(), + iterations: 0, + log: vec![format!("reused stored IFPS-valid route ({})", r.generated_at)], + }); + } + } + + let (dep_sid, dest_star) = match req.cifp_dir.as_deref().filter(|s| !s.trim().is_empty()) { + Some(cifp) => { + let dir = Path::new(cifp); + ( + connectors(dir, &from, ProcKind::Sid).unwrap_or_default(), + connectors(dir, &to, ProcKind::Star).unwrap_or_default(), + ) + } + None => (Vec::new(), Vec::new()), + }; + + let result = routing::discover::find_valid_route( + &conn, &from, &to, &dep_sid, &dest_star, start_fl, rad, validator, + )?; + + // Only store routes the oracle actually accepted (no-error) — the DB is the + // set of IFPS-valid routes, nothing else. + if result.accepted { + let _ = crate::routes::record( + &conn, + &from, + &to, + result.fl, + &result.route_string, + result.total_nm, + true, + true, + &[], + "ifps", + ); + } + Ok(result) +} + +/// Stored routes for a city pair (our own FPL database), most recent first. +pub fn recent_routes( + db_path: &str, + dep: &str, + dest: &str, + limit: usize, +) -> Result> { + let conn = db::open(Path::new(db_path))?; + Ok(crate::routes::recent(&conn, dep, dest, limit)? + .into_iter() + .map(|r| CachedRouteDto { + dep: r.dep, + dest: r.dest, + cruise_fl: r.cruise_fl, + route_string: r.route_string, + dist_nm: r.dist_nm, + ifps_ok: r.ifps_ok, + source: r.source, + generated_at: r.generated_at, + }) + .collect()) +} + +/// Total number of stored routes in `db_path`. +pub fn route_db_count(db_path: &str) -> Result { + let conn = db::open(Path::new(db_path))?; + crate::routes::count(&conn) +} diff --git a/crates/core/src/db/mod.rs b/crates/core/src/db/mod.rs new file mode 100644 index 0000000..3ca22a3 --- /dev/null +++ b/crates/core/src/db/mod.rs @@ -0,0 +1,143 @@ +//! SQLite persistence via `rusqlite` (feature `bundled`, no system dependency). +//! +//! [`import_navdata`] streams the X-Plane `.dat` files from a source directory +//! into the local database inside a single transaction. + +pub mod schema; + +use std::fs::File; +use std::io::BufReader; +use std::path::Path; + +use rusqlite::{params, Connection, Transaction}; + +use crate::error::Result; +use crate::navdata::{ + airport::parse_airport_from_cifp, airway::parse_awy_line, fix::parse_fix_line, + nav::parse_nav_line, stream_file, +}; + +/// Row counts produced by an import. +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] +pub struct ImportStats { + pub waypoints: usize, + pub navaids: usize, + pub airway_segments: usize, + pub airports: usize, +} + +/// Open (creating if needed) a database file and ensure the schema exists. +pub fn open(path: &Path) -> Result { + let conn = Connection::open(path)?; + init_schema(&conn)?; + Ok(conn) +} + +/// Apply the schema (idempotent). +pub fn init_schema(conn: &Connection) -> Result<()> { + conn.execute_batch(schema::SCHEMA_SQL)?; + Ok(()) +} + +/// Import `earth_fix.dat`, `earth_nav.dat`, `earth_awy.dat` and (if present) the +/// `CIFP/` airports from `source` into `conn`. +pub fn import_navdata(conn: &mut Connection, source: &Path) -> Result { + init_schema(conn)?; + let tx = conn.transaction()?; + let stats = ImportStats { + waypoints: import_fixes(&tx, &source.join("earth_fix.dat"))?, + navaids: import_navaids(&tx, &source.join("earth_nav.dat"))?, + airway_segments: import_airways(&tx, &source.join("earth_awy.dat"))?, + airports: import_airports(&tx, &source.join("CIFP"))?, + }; + tx.commit()?; + Ok(stats) +} + +fn reader(path: &Path) -> Result> { + Ok(BufReader::new(File::open(path)?)) +} + +fn import_fixes(tx: &Transaction, path: &Path) -> Result { + let mut stmt = + tx.prepare("INSERT INTO waypoints (ident, region, lat, lon) VALUES (?1, ?2, ?3, ?4)")?; + stream_file(reader(path)?, "earth_fix.dat", parse_fix_line, |wp| { + stmt.execute(params![wp.ident, wp.region, wp.pos.lat, wp.pos.lon])?; + Ok(()) + }) +} + +fn import_navaids(tx: &Transaction, path: &Path) -> Result { + let mut stmt = tx.prepare( + "INSERT INTO navaids (ident, region, kind, freq, lat, lon, name) \ + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)", + )?; + stream_file(reader(path)?, "earth_nav.dat", parse_nav_line, |nv| { + stmt.execute(params![ + nv.ident, + nv.region, + nv.kind.as_str(), + nv.freq, + nv.pos.lat, + nv.pos.lon, + nv.name + ])?; + Ok(()) + }) +} + +fn import_airways(tx: &Transaction, path: &Path) -> Result { + let mut seg_stmt = tx.prepare( + "INSERT INTO airway_segments \ + (airway_name, from_ident, from_region, to_ident, to_region, direction, layer, base_fl, top_fl) \ + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)", + )?; + let mut awy_stmt = tx.prepare("INSERT OR IGNORE INTO airways (name, layer) VALUES (?1, ?2)")?; + let mut rows = 0usize; + stream_file(reader(path)?, "earth_awy.dat", parse_awy_line, |seg| { + let layer = seg.layer.as_str(); + let dir = seg.direction.to_string(); + for name in &seg.airways { + seg_stmt.execute(params![ + name, + seg.from_ident, + seg.from_region, + seg.to_ident, + seg.to_region, + dir, + layer, + seg.base_fl, + seg.top_fl + ])?; + awy_stmt.execute(params![name, layer])?; + rows += 1; + } + Ok(()) + })?; + Ok(rows) +} + +fn import_airports(tx: &Transaction, cifp_dir: &Path) -> Result { + if !cifp_dir.is_dir() { + return Ok(0); + } + let mut stmt = + tx.prepare("INSERT OR REPLACE INTO airports (icao, lat, lon) VALUES (?1, ?2, ?3)")?; + let mut n = 0usize; + for entry in std::fs::read_dir(cifp_dir)? { + let path = entry?.path(); + if path.extension().and_then(|e| e.to_str()) != Some("dat") { + continue; + } + let icao = path + .file_stem() + .and_then(|s| s.to_str()) + .unwrap_or_default() + .to_owned(); + if let Some(ap) = parse_airport_from_cifp(&icao, reader(&path)?)? { + stmt.execute(params![ap.icao, ap.pos.lat, ap.pos.lon])?; + n += 1; + } + } + Ok(n) +} diff --git a/crates/core/src/db/schema.rs b/crates/core/src/db/schema.rs new file mode 100644 index 0000000..28e3097 --- /dev/null +++ b/crates/core/src/db/schema.rs @@ -0,0 +1,69 @@ +//! SQLite schema. Kept in one place so `init_schema` and future migrations stay +//! in sync. + +/// DDL applied on every `open`/import (idempotent). +pub const SCHEMA_SQL: &str = r#" +CREATE TABLE IF NOT EXISTS waypoints ( + id INTEGER PRIMARY KEY, + ident TEXT NOT NULL, + region TEXT NOT NULL, + lat REAL NOT NULL, + lon REAL NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_waypoints_ident ON waypoints(ident); + +CREATE TABLE IF NOT EXISTS navaids ( + id INTEGER PRIMARY KEY, + ident TEXT NOT NULL, + region TEXT NOT NULL, + kind TEXT NOT NULL, + freq INTEGER NOT NULL, + lat REAL NOT NULL, + lon REAL NOT NULL, + name TEXT NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_navaids_ident ON navaids(ident); + +CREATE TABLE IF NOT EXISTS airports ( + icao TEXT PRIMARY KEY, + lat REAL NOT NULL, + lon REAL NOT NULL +); + +CREATE TABLE IF NOT EXISTS airways ( + name TEXT PRIMARY KEY, + layer TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS airway_segments ( + id INTEGER PRIMARY KEY, + airway_name TEXT NOT NULL, + from_ident TEXT NOT NULL, + from_region TEXT NOT NULL, + to_ident TEXT NOT NULL, + to_region TEXT NOT NULL, + direction TEXT NOT NULL, + layer TEXT NOT NULL, + base_fl INTEGER NOT NULL, + top_fl INTEGER NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_awyseg_from ON airway_segments(from_ident); +CREATE INDEX IF NOT EXISTS idx_awyseg_to ON airway_segments(to_ident); + +-- Our own database of flight plans: routes we generated and IFPS-pre-checked. +CREATE TABLE IF NOT EXISTS routes ( + id INTEGER PRIMARY KEY, + dep TEXT NOT NULL, + dest TEXT NOT NULL, + cruise_fl INTEGER NOT NULL, + route_string TEXT NOT NULL, + dist_nm REAL NOT NULL, + via_airways INTEGER NOT NULL, + ifps_ok INTEGER NOT NULL, + ifps_errors TEXT NOT NULL, + source TEXT NOT NULL, + generated_at TEXT NOT NULL, + UNIQUE(dep, dest, cruise_fl, route_string) +); +CREATE INDEX IF NOT EXISTS idx_routes_pair ON routes(dep, dest); +"#; diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs new file mode 100644 index 0000000..a617d1e --- /dev/null +++ b/crates/core/src/error.rs @@ -0,0 +1,37 @@ +//! Crate-wide error type. Library code returns [`Result`]; the CLI wraps these +//! with `anyhow` for user-facing context. + +use thiserror::Error; + +/// All fallible operations in `flightplanner-core` return this error. +#[derive(Debug, Error)] +pub enum CoreError { + #[error("I/O error: {0}")] + Io(#[from] std::io::Error), + + #[error("database error: {0}")] + Db(#[from] rusqlite::Error), + + #[error("JSON error: {0}")] + Json(#[from] serde_json::Error), + + /// A navdata line could not be parsed. Carries enough context to locate it. + #[error("parse error in {file} (line {line}): {reason}")] + Parse { + file: String, + line: usize, + reason: String, + }, + + #[error("routing error: {0}")] + Routing(String), + + #[error("not found: {0}")] + NotFound(String), + + #[error("{0}")] + Other(String), +} + +/// Convenience alias used throughout the crate. +pub type Result = std::result::Result; diff --git a/crates/core/src/export/fms.rs b/crates/core/src/export/fms.rs new file mode 100644 index 0000000..0b1b018 --- /dev/null +++ b/crates/core/src/export/fms.rs @@ -0,0 +1,40 @@ +//! X-Plane 11 `.fms` flight plan (version 1100). + +use rusqlite::Connection; + +use super::{build_points, PointKind}; +use crate::error::Result; +use crate::routing::Route; + +/// Render `route` as an X-Plane `.fms` document, cruising at `cruise_alt_ft`. +pub fn to_fms(conn: &Connection, route: &Route, cruise_alt_ft: i32) -> Result { + let points = build_points(conn, route)?; + let dep = &points[0]; + let dest = &points[points.len() - 1]; + + let mut s = String::new(); + s.push_str("I\n"); + s.push_str("1100 Version\n"); + s.push_str("CYCLE 2608\n"); + s.push_str(&format!("ADEP {}\n", dep.ident)); + s.push_str(&format!("ADES {}\n", dest.ident)); + s.push_str(&format!("NUMENR {}\n", points.len())); + + for p in &points { + let alt = if p.kind == PointKind::Airport { + 0.0 + } else { + cruise_alt_ft as f64 + }; + s.push_str(&format!( + "{} {} {} {:.6} {:.6} {:.6}\n", + p.kind.fms_type(), + p.ident, + p.via, + alt, + p.pos.lat, + p.pos.lon + )); + } + Ok(s) +} diff --git a/crates/core/src/export/mod.rs b/crates/core/src/export/mod.rs new file mode 100644 index 0000000..4896d70 --- /dev/null +++ b/crates/core/src/export/mod.rs @@ -0,0 +1,170 @@ +//! Route/plan exporters: `.pln` (MSFS/P3D), `.fms` (X-Plane) and a text OFP. +//! +//! The sim formats need a coordinate per point, so [`build_points`] resolves each +//! route ident against the local navdata (airports, navaids, waypoints) and +//! annotates it with the inbound airway (or `ADEP`/`ADES`/`DCT`). + +pub mod fms; +pub mod ofp; +pub mod ofp_template; +pub mod pln; + +use rusqlite::{params, Connection, OptionalExtension}; + +use crate::error::{CoreError, Result}; +use crate::model::LatLon; +use crate::routing::Route; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum PointKind { + Airport, + Vor, + Ndb, + Fix, +} + +impl PointKind { + fn pln_type(self) -> &'static str { + match self { + PointKind::Airport => "Airport", + PointKind::Vor => "VOR", + PointKind::Ndb => "NDB", + PointKind::Fix => "Intersection", + } + } + + fn fms_type(self) -> i32 { + match self { + PointKind::Airport => 1, + PointKind::Ndb => 2, + PointKind::Vor => 3, + PointKind::Fix => 11, + } + } +} + +/// A resolved route point ready for export. +pub struct ExportPoint { + pub ident: String, + pub pos: LatLon, + pub kind: PointKind, + /// Inbound leg: `ADEP`, `ADES`, `DCT`, or an airway name. + pub via: String, +} + +/// Resolve a route into an ordered list of positioned points (dep first, dest +/// last). +pub fn build_points(conn: &Connection, route: &Route) -> Result> { + let first = route + .legs + .first() + .ok_or_else(|| CoreError::Other("cannot export an empty route".to_owned()))?; + + // (ident, inbound airway) in order. + let mut seq: Vec<(String, String)> = vec![(first.from.clone(), "ADEP".to_owned())]; + for leg in &route.legs { + let via = if leg.airway == "DCT" { + "DCT".to_owned() + } else { + leg.airway.clone() + }; + seq.push((leg.to.clone(), via)); + } + + let n = seq.len(); + let mut points = Vec::with_capacity(n); + for (i, (ident, via)) in seq.into_iter().enumerate() { + let (pos, kind) = resolve_point(conn, &ident)?; + let via = if i == 0 { + "ADEP".to_owned() + } else if i == n - 1 { + "ADES".to_owned() + } else { + via + }; + points.push(ExportPoint { + ident, + pos, + kind, + via, + }); + } + Ok(points) +} + +fn resolve_point(conn: &Connection, ident: &str) -> Result<(LatLon, PointKind)> { + if let Some(p) = q_airport(conn, ident)? { + return Ok((p, PointKind::Airport)); + } + if let Some(pk) = q_navaid(conn, ident)? { + return Ok(pk); + } + if let Some(p) = q_waypoint(conn, ident)? { + return Ok((p, PointKind::Fix)); + } + Err(CoreError::NotFound(format!("point '{ident}' for export"))) +} + +fn q_airport(conn: &Connection, ident: &str) -> Result> { + Ok(conn + .query_row( + "SELECT lat, lon FROM airports WHERE icao = ?1", + params![ident], + |r| Ok(LatLon::new(r.get(0)?, r.get(1)?)), + ) + .optional()?) +} + +fn q_navaid(conn: &Connection, ident: &str) -> Result> { + let row = conn + .query_row( + "SELECT lat, lon, kind FROM navaids WHERE ident = ?1 LIMIT 1", + params![ident], + |r| Ok((LatLon::new(r.get(0)?, r.get(1)?), r.get::<_, String>(2)?)), + ) + .optional()?; + Ok(row.map(|(pos, kind)| { + let kind = if kind == "NDB" { + PointKind::Ndb + } else { + PointKind::Vor + }; + (pos, kind) + })) +} + +fn q_waypoint(conn: &Connection, ident: &str) -> Result> { + Ok(conn + .query_row( + "SELECT lat, lon FROM waypoints WHERE ident = ?1 LIMIT 1", + params![ident], + |r| Ok(LatLon::new(r.get(0)?, r.get(1)?)), + ) + .optional()?) +} + +/// Degrees/minutes/seconds string like `N49° 0' 34.93"`. +pub(crate) fn dms(value: f64, is_lat: bool) -> String { + let hemi = match (is_lat, value >= 0.0) { + (true, true) => 'N', + (true, false) => 'S', + (false, true) => 'E', + (false, false) => 'W', + }; + let v = value.abs(); + let deg = v.trunc() as i64; + let minutes = (v - deg as f64) * 60.0; + let min = minutes.trunc() as i64; + let sec = (minutes - min as f64) * 60.0; + format!("{hemi}{deg}° {min}' {sec:.2}\"") +} + +/// MSFS `WorldPosition` string: `lat,lon,+000000.00`. +pub(crate) fn world_position(pos: LatLon, alt_ft: i32) -> String { + format!( + "{},{},{:+010.2}", + dms(pos.lat, true), + dms(pos.lon, false), + alt_ft as f64 + ) +} diff --git a/crates/core/src/export/ofp.rs b/crates/core/src/export/ofp.rs new file mode 100644 index 0000000..78ead72 --- /dev/null +++ b/crates/core/src/export/ofp.rs @@ -0,0 +1,116 @@ +//! Human-readable Operational Flight Plan (plain text). + +use std::fmt::Write; + +use crate::perf::FuelPlan; +use crate::routing::Route; + +fn hm(minutes: f64) -> String { + let t = minutes.round() as i64; + format!("{}:{:02}", t / 60, t % 60) +} + +/// Render a text OFP. When `plan` is provided, per-leg time/fuel and a fuel +/// summary are included; otherwise only route and distances are shown. +pub fn to_ofp( + route: &Route, + plan: Option<&FuelPlan>, + aircraft: Option<&str>, + cruise_fl: Option, +) -> String { + let dep = route + .legs + .first() + .map(|l| l.from.as_str()) + .unwrap_or("????"); + let dest = route.legs.last().map(|l| l.to.as_str()).unwrap_or("????"); + let bar = "=".repeat(64); + let sep = "-".repeat(64); + + let mut s = String::new(); + let _ = writeln!(s, "{bar}"); + let _ = writeln!(s, " OPERATIONAL FLIGHT PLAN (unofficial, sim use)"); + let _ = writeln!( + s, + " {dep} -> {dest} {}", + aircraft.unwrap_or("(no aircraft)") + ); + let _ = writeln!( + s, + " Cruise {} AIRAC 2608 routing: {}", + cruise_fl + .map(|f| format!("FL{f:03}")) + .unwrap_or_else(|| "n/a".to_owned()), + if route.via_airways { + "airways" + } else { + "direct" + } + ); + let _ = writeln!(s, "{sep}"); + let _ = writeln!(s, " ROUTE"); + let _ = writeln!(s, " {}", route.route_string()); + let _ = writeln!(s, "{sep}"); + + if let Some(plan) = plan { + let _ = writeln!( + s, + " {:<7} {:<6} {:<7} {:>5} {:>6} {:>7} {:>8}", + "FROM", "VIA", "TO", "DIST", "ETE", "FUEL", "CUMFUEL" + ); + for leg in &plan.legs { + let _ = writeln!( + s, + " {:<7} {:<6} {:<7} {:>5.0} {:>6} {:>7.0} {:>8.0}", + leg.from, + leg.airway, + leg.to, + leg.dist_nm, + hm(leg.time_min), + leg.fuel_kg, + leg.cum_fuel_kg + ); + } + let _ = writeln!(s, "{sep}"); + let _ = writeln!( + s, + " Trip: {:>6.0} nm {} {:>6.0} kg", + plan.climb.dist_nm + plan.cruise.dist_nm + plan.descent.dist_nm, + hm(plan.trip_time_min), + plan.trip_fuel_kg + ); + let _ = writeln!( + s, + " Reserves: taxi {:.0} contingency {:.0} alternate {:.0} final {:.0}", + plan.taxi_kg, plan.contingency_kg, plan.alternate_kg, plan.final_reserve_kg + ); + let _ = writeln!(s, " BLOCK FUEL: {:.0} kg", plan.block_fuel_kg); + if let Some(m) = &plan.masses { + let _ = writeln!(s, "{sep}"); + let _ = writeln!( + s, + " MASS payload {:.0} ZFW {:.0} TOW {:.0} LDW {:.0} kg", + m.payload_kg, m.zfw_kg, m.takeoff_kg, m.landing_kg + ); + if m.over_mtow { + let _ = writeln!(s, " ! TOW exceeds MTOW — infeasible as loaded"); + } + if m.over_mlw { + let _ = writeln!(s, " ! LDW exceeds MLW"); + } + } + } else { + let _ = writeln!(s, " {:<7} {:<6} {:<7} {:>5}", "FROM", "VIA", "TO", "DIST"); + for leg in &route.legs { + let _ = writeln!( + s, + " {:<7} {:<6} {:<7} {:>5.0}", + leg.from, leg.airway, leg.to, leg.dist_nm + ); + } + let _ = writeln!(s, "{sep}"); + let _ = writeln!(s, " Total distance: {:.0} nm", route.total_nm); + } + let _ = writeln!(s, "{bar}"); + s +} diff --git a/crates/core/src/export/ofp_template.rs b/crates/core/src/export/ofp_template.rs new file mode 100644 index 0000000..a97d756 --- /dev/null +++ b/crates/core/src/export/ofp_template.rs @@ -0,0 +1,225 @@ +//! Token-based OFP template engine (PFPX-style, clean-room). +//! +//! PFPX renders its Operational Flight Plan from a **text template** full of +//! `<&Token>` placeholders and repeating `<&Section_Begin>…<&Section_End>` blocks +//! (e.g. the nav-log). This module reproduces that *system* — our own engine and +//! our own default template — so the OFP layout is configurable, not hard-coded. +//! +//! Token grammar: +//! * `<&Name>` — the value of `Name` +//! * `<&Name:W>` — right-justified in a field of width `W` +//! * `<&Name:W:L>` — left-justified in width `W` +//! * `<&NavLog_Begin>…<&NavLog_End>` — the inner block repeated once per leg +//! +//! Values come from an [`OfpContext`] built from a [`Route`] + optional +//! [`FuelPlan`]; inside the nav-log section, per-row tokens shadow scalars. + +use std::collections::HashMap; + +use crate::perf::FuelPlan; +use crate::routing::Route; + +/// Values available to a template: scalar tokens + repeating nav-log rows. +#[derive(Debug, Default, Clone)] +pub struct OfpContext { + scalars: HashMap, + navlog: Vec>, +} + +impl OfpContext { + fn set(&mut self, key: &str, val: impl Into) { + self.scalars.insert(key.to_string(), val.into()); + } +} + +fn hm(minutes: f64) -> String { + let t = minutes.round() as i64; + format!("{}:{:02}", t / 60, t % 60) +} + +fn kg(v: f64) -> String { + format!("{:.0}", v) +} + +fn truncate(s: &str, w: usize) -> String { + if s.chars().count() > w { + s.chars().take(w).collect() + } else { + s.to_string() + } +} + +/// Replace `<&Name[:W[:L]]>` tokens using `get`. Section markers must already be +/// expanded away before this runs. +fn render_scalars(s: &str, get: &dyn Fn(&str) -> Option) -> String { + let mut out = String::with_capacity(s.len()); + let mut rest = s; + while let Some(i) = rest.find("<&") { + out.push_str(&rest[..i]); + rest = &rest[i + 2..]; + let Some(j) = rest.find('>') else { + out.push_str("<&"); + break; + }; + let tok = &rest[..j]; + rest = &rest[j + 1..]; + let mut parts = tok.split(':'); + let name = parts.next().unwrap_or(""); + let width: Option = parts.next().and_then(|w| w.parse().ok()); + let left = parts.next() == Some("L"); + let val = get(name).unwrap_or_default(); + match width { + Some(w) if left => out.push_str(&format!("{: out.push_str(&format!("{:>w$}", truncate(&val, w), w = w)), + None => out.push_str(&val), + } + } + out.push_str(rest); + out +} + +/// Expand `<&{name}_Begin>…<&{name}_End>`, repeating the inner block per row. +fn expand_section( + template: &str, + name: &str, + rows: &[HashMap], + scalars: &HashMap, +) -> String { + let begin = format!("<&{name}_Begin>"); + let end = format!("<&{name}_End>"); + let (Some(b), Some(e)) = (template.find(&begin), template.find(&end)) else { + return template.to_string(); + }; + let inner = &template[b + begin.len()..e]; + let mut body = String::new(); + for row in rows { + let get = |k: &str| row.get(k).cloned().or_else(|| scalars.get(k).cloned()); + body.push_str(&render_scalars(inner, &get)); + } + format!("{}{}{}", &template[..b], body, &template[e + end.len()..]) +} + +/// Render `template` with `ctx`. +pub fn render(template: &str, ctx: &OfpContext) -> String { + let expanded = expand_section(template, "NavLog", &ctx.navlog, &ctx.scalars); + let get = |k: &str| ctx.scalars.get(k).cloned(); + render_scalars(&expanded, &get) +} + +/// Build the render context from a computed route/plan. +pub fn context( + route: &Route, + plan: Option<&FuelPlan>, + aircraft: Option<&str>, + cruise_fl: Option, + airac: &str, +) -> OfpContext { + let mut c = OfpContext::default(); + let dep = route.legs.first().map(|l| l.from.as_str()).unwrap_or("????"); + let dest = route.legs.last().map(|l| l.to.as_str()).unwrap_or("????"); + c.set("DEP", dep); + c.set("DEST", dest); + c.set("AIRCRAFT", aircraft.unwrap_or("---")); + c.set("CRUISE", cruise_fl.map(|f| format!("FL{f:03}")).unwrap_or_else(|| "---".into())); + c.set("AIRAC", airac); + c.set("ROUTE", route.route_string()); + c.set("TOTALDIST", format!("{:.0}", route.total_nm)); + c.set("ROUTING", if route.via_airways { "airways" } else { "direct" }); + + if let Some(p) = plan { + for leg in &p.legs { + let mut row = HashMap::new(); + row.insert("FROM".into(), leg.from.clone()); + row.insert("VIA".into(), leg.airway.clone()); + row.insert("TO".into(), leg.to.clone()); + row.insert("DIST".into(), format!("{:.0}", leg.dist_nm)); + row.insert("ETE".into(), hm(leg.time_min)); + row.insert("FUEL".into(), kg(leg.fuel_kg)); + row.insert("CUMFUEL".into(), kg(leg.cum_fuel_kg)); + c.navlog.push(row); + } + c.set("TRIPDIST", format!("{:.0}", p.climb.dist_nm + p.cruise.dist_nm + p.descent.dist_nm)); + c.set("TRIPTIME", hm(p.trip_time_min)); + c.set("TRIPFUEL", kg(p.trip_fuel_kg)); + c.set("TAXI", kg(p.taxi_kg)); + c.set("CONTINGENCY", kg(p.contingency_kg)); + c.set("ALTERNATE", kg(p.alternate_kg)); + c.set("FINALRES", kg(p.final_reserve_kg)); + c.set("BLOCKFUEL", kg(p.block_fuel_kg)); + if let Some(m) = &p.masses { + c.set("PAYLOAD", kg(m.payload_kg)); + c.set("ZFW", kg(m.zfw_kg)); + c.set("TOW", kg(m.takeoff_kg)); + c.set("LDW", kg(m.landing_kg)); + } + } + c +} + +/// Our own default PFPX-style OFP template. +pub const DEFAULT_TEMPLATE: &str = "\ +================================================================ + OPERATIONAL FLIGHT PLAN (unofficial, sim use) + <&DEP> -> <&DEST> <&AIRCRAFT> <&CRUISE> AIRAC <&AIRAC> + routing: <&ROUTING> distance: <&TOTALDIST> nm +---------------------------------------------------------------- + ROUTE + <&ROUTE> +---------------------------------------------------------------- + FROM VIA TO DIST ETE FUEL CUMFUEL +<&NavLog_Begin> <&FROM:7:L> <&VIA:6:L> <&TO:7:L> <&DIST:5> <&ETE:6> <&FUEL:6> <&CUMFUEL:8> +<&NavLog_End>---------------------------------------------------------------- + TRIP <&TRIPDIST:6> nm <&TRIPTIME:6> <&TRIPFUEL:6> kg + RES taxi <&TAXI> / cont <&CONTINGENCY> / altn <&ALTERNATE> / final <&FINALRES> + BLOCK FUEL <&BLOCKFUEL> kg + MASS payload <&PAYLOAD> ZFW <&ZFW> TOW <&TOW> LDW <&LDW> kg +================================================================ +"; + +/// Render the default OFP for a route/plan. +pub fn render_default( + route: &Route, + plan: Option<&FuelPlan>, + aircraft: Option<&str>, + cruise_fl: Option, + airac: &str, +) -> String { + render(DEFAULT_TEMPLATE, &context(route, plan, aircraft, cruise_fl, airac)) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::routing::{Leg, Route}; + + fn leg(from: &str, via: &str, to: &str, nm: f64) -> Leg { + Leg { from: from.into(), airway: via.into(), to: to.into(), dist_nm: nm } + } + + #[test] + fn scalar_tokens_and_width() { + let mut c = OfpContext::default(); + c.set("A", "LFPG"); + c.set("N", "1234"); + assert_eq!(render("<&A> x<&N:6>|", &c), "LFPG x 1234|"); + assert_eq!(render("<&A:6:L>|", &c), "LFPG |"); // left-justified + assert_eq!(render("<&MISSING>!", &c), "!"); // unknown → empty + } + + #[test] + fn navlog_section_repeats_per_leg() { + let route = Route { + legs: vec![leg("LFPG", "DCT", "OPALE", 20.0), leg("OPALE", "UN491", "EGLL", 180.0)], + total_nm: 200.0, + via_airways: true, + }; + let out = render_default(&route, None, Some("A320"), Some(360), "2608"); + assert!(out.contains("LFPG -> EGLL")); + assert!(out.contains("A320")); + assert!(out.contains("FL360")); + // one nav-log line per leg + assert!(out.contains("OPALE")); + assert!(out.contains("UN491")); + assert!(out.matches("EGLL").count() >= 1); + } +} diff --git a/crates/core/src/export/pln.rs b/crates/core/src/export/pln.rs new file mode 100644 index 0000000..cf3fc96 --- /dev/null +++ b/crates/core/src/export/pln.rs @@ -0,0 +1,71 @@ +//! MSFS / Prepar3D `.pln` flight plan (AceXML). + +use rusqlite::Connection; + +use super::{build_points, world_position, PointKind}; +use crate::error::Result; +use crate::routing::Route; + +/// Render `route` as a `.pln` XML document, cruising at `cruise_alt_ft`. +pub fn to_pln(conn: &Connection, route: &Route, cruise_alt_ft: i32) -> Result { + let points = build_points(conn, route)?; + let dep = &points[0]; + let dest = &points[points.len() - 1]; + + let mut s = String::new(); + s.push_str("\n"); + s.push_str("\n"); + s.push_str(" AceXML Document\n"); + s.push_str(" \n"); + s.push_str(&format!( + " {} to {}\n", + dep.ident, dest.ident + )); + s.push_str(" IFR\n"); + s.push_str(&format!(" {cruise_alt_ft}\n")); + s.push_str(&format!(" {}\n", dep.ident)); + s.push_str(&format!( + " {}\n", + world_position(dep.pos, 0) + )); + s.push_str(&format!( + " {}\n", + dest.ident + )); + s.push_str(&format!( + " {}\n", + world_position(dest.pos, 0) + )); + s.push_str(&format!( + " {} to {}\n", + dep.ident, dest.ident + )); + + for p in &points { + let alt = if p.kind == PointKind::Airport { + 0 + } else { + cruise_alt_ft + }; + s.push_str(&format!(" \n", p.ident)); + s.push_str(&format!( + " {}\n", + p.kind.pln_type() + )); + s.push_str(&format!( + " {}\n", + world_position(p.pos, alt) + )); + if !matches!(p.via.as_str(), "ADEP" | "ADES" | "DCT") { + s.push_str(&format!(" {}\n", p.via)); + } + s.push_str(" \n"); + s.push_str(&format!(" {}\n", p.ident)); + s.push_str(" \n"); + s.push_str(" \n"); + } + + s.push_str(" \n"); + s.push_str("\n"); + Ok(s) +} diff --git a/crates/core/src/ifps.rs b/crates/core/src/ifps.rs new file mode 100644 index 0000000..5d87022 --- /dev/null +++ b/crates/core/src/ifps.rs @@ -0,0 +1,405 @@ +//! Offline, **best-effort** IFPS pre-check. +//! +//! This is NOT an authoritative IFPS validation — RAD restrictions, traffic-flow +//! and FRA rules require Eurocontrol NM (see `IDEAS.md`). It only checks what our +//! local navdata can prove about a route string: +//! +//! - every point exists (waypoint or navaid); +//! - each cited airway exists and both endpoints lie on it; +//! - the airway is traversable in the requested direction between them; +//! - the cruise FL falls within each traversed segment's `base…top` band; +//! - the route has no discontinuity (missing connector between two points). +//! +//! Airport codes at the ends and unrecognised first/last tokens (SID/STAR names) +//! are reported as warnings, not errors. + +use std::collections::{HashMap, HashSet, VecDeque}; + +use rusqlite::{params, Connection}; + +use crate::error::Result; +use crate::model::LatLon; +use crate::rad::RadData; + +/// DCT legs longer than this are flagged (a warning, since free-route airspace +/// permits long directs while structured airspace/RAD usually restricts them). +const MAX_DCT_NM: f64 = 100.0; + +/// Result of a local IFPS pre-check. +#[derive(Debug, Clone, PartialEq)] +pub struct IfpsReport { + pub accepted: bool, + pub errors: Vec, + pub warnings: Vec, + /// The route expanded to its full point sequence (airway intermediates added). + pub expanded: Vec, +} + +enum Connector { + Dct, + Airway(String), +} + +/// Pre-validate a route string (e.g. `LFPG DCT PON UT300 ELCOB … EGLL`) at +/// `cruise_fl` against the local navdata. When `rad` is provided, DCT legs are +/// also checked against the Eurocontrol RAD (forbidden directs at that FL). +pub fn prevalidate( + conn: &Connection, + route: &str, + cruise_fl: i32, + rad: Option<&RadData>, +) -> Result { + let tokens: Vec = route.split_whitespace().map(|t| t.to_uppercase()).collect(); + let mut errors = Vec::new(); + let mut warnings = Vec::new(); + let mut expanded: Vec = Vec::new(); + let mut last_point: Option = None; + let mut last_pos: Option = None; + let mut pending: Option = None; + + for (i, t) in tokens.iter().enumerate() { + let connector_pos = last_point.is_some() && pending.is_none(); + + if t == "DCT" { + pending = Some(Connector::Dct); + continue; + } + // Aerodrome at either end: anchor, not an enroute point. + if (i == 0 || i == tokens.len() - 1) && airport_exists(conn, t)? { + let cur_pos = point_pos(conn, t, last_pos)?; + if matches!(pending, Some(Connector::Dct)) { + if let (Some(a), Some(b), Some(prev)) = (last_pos, cur_pos, last_point.as_deref()) { + check_dct_len(&mut warnings, prev, t, a, b); + } + if let Some(prev) = last_point.as_deref() { + check_dct_rad(&mut errors, rad, prev, t, cruise_fl); + } + } + expanded.push(t.clone()); + last_point = Some(t.clone()); + last_pos = cur_pos; + pending = None; + continue; + } + if connector_pos && airway_exists(conn, t)? { + pending = Some(Connector::Airway(t.clone())); + continue; + } + if point_exists(conn, t)? { + let cur_pos = point_pos(conn, t, last_pos)?; + match (last_point.as_ref(), pending.take()) { + (Some(prev), Some(Connector::Airway(awy))) => { + let (mut inter, errs) = trace_airway(conn, &awy, prev, t, cruise_fl)?; + errors.extend(errs); + expanded.append(&mut inter); + expanded.push(t.clone()); + } + (Some(prev), Some(Connector::Dct)) => { + if let (Some(a), Some(b)) = (last_pos, cur_pos) { + check_dct_len(&mut warnings, prev, t, a, b); + } + check_dct_rad(&mut errors, rad, prev, t, cruise_fl); + expanded.push(t.clone()); + } + (None, _) => { + expanded.push(t.clone()); + } + (Some(prev), None) => { + errors.push(format!("route discontinuity: {prev} → {t} (no airway/DCT)")); + expanded.push(t.clone()); + } + } + last_point = Some(t.clone()); + last_pos = cur_pos; + continue; + } + + // Unrecognised token. + if i == 0 || i == tokens.len() - 1 { + warnings.push(format!("'{t}' not checked offline (SID/STAR/procedure?)")); + } else if airway_exists(conn, t)? { + errors.push(format!( + "unexpected airway '{t}' (missing point before it?)" + )); + } else { + errors.push(format!("unknown point or airway: '{t}'")); + } + } + + if last_point.is_none() { + errors.push("no valid enroute point in route".to_owned()); + } + + Ok(IfpsReport { + accepted: errors.is_empty(), + errors, + warnings, + expanded, + }) +} + +/// Flag a DCT leg that the RAD marks as forbidden at this flight level. +fn check_dct_rad(errors: &mut Vec, rad: Option<&RadData>, from: &str, to: &str, fl: i32) { + if let Some(rad) = rad { + if let Some(r) = rad.forbidden_dct(from, to, fl) { + errors.push(format!("RAD: DCT {from} → {to} not available at FL{fl} [{}]", r.id)); + } + } +} + +/// Warn when a DCT leg is longer than [`MAX_DCT_NM`]. +fn check_dct_len(warnings: &mut Vec, from: &str, to: &str, a: LatLon, b: LatLon) { + let d = a.distance_nm(&b); + if d > MAX_DCT_NM { + warnings.push(format!( + "long DCT {from} → {to}: {d:.0} nm (restricted outside free-route airspace)" + )); + } +} + +/// Position of `ident` (airport, then fix, then navaid). When it repeats across +/// regions, the candidate nearest `near` is chosen. +fn point_pos(conn: &Connection, ident: &str, near: Option) -> Result> { + if let Ok(p) = conn.query_row( + "SELECT lat, lon FROM airports WHERE icao = ?1", + params![ident], + |r| Ok(LatLon::new(r.get(0)?, r.get(1)?)), + ) { + return Ok(Some(p)); + } + let mut cands: Vec = Vec::new(); + for sql in [ + "SELECT lat, lon FROM waypoints WHERE ident = ?1", + "SELECT lat, lon FROM navaids WHERE ident = ?1", + ] { + let mut stmt = conn.prepare(sql)?; + let rows = stmt.query_map(params![ident], |r| Ok(LatLon::new(r.get(0)?, r.get(1)?)))?; + for row in rows { + cands.push(row?); + } + } + Ok(match near { + Some(n) => cands.into_iter().min_by(|a, b| { + a.distance_nm(&n) + .partial_cmp(&b.distance_nm(&n)) + .unwrap_or(std::cmp::Ordering::Equal) + }), + None => cands.into_iter().next(), + }) +} + +/// Walk `airway` from `from` to `to`, honouring direction and FL band. +/// Returns the intermediate points (excluding both endpoints) and any errors. +fn trace_airway( + conn: &Connection, + airway: &str, + from: &str, + to: &str, + fl: i32, +) -> Result<(Vec, Vec)> { + let mut stmt = conn.prepare( + "SELECT from_ident, to_ident, direction, base_fl, top_fl \ + FROM airway_segments WHERE airway_name = ?1", + )?; + let rows = stmt.query_map(params![airway], |r| { + Ok(( + r.get::<_, String>(0)?, + r.get::<_, String>(1)?, + r.get::<_, String>(2)?, + r.get::<_, i32>(3)?, + r.get::<_, i32>(4)?, + )) + })?; + + // Adjacency: node -> Vec<(neighbour, base_fl, top_fl)>, respecting direction. + let mut adj: HashMap> = HashMap::new(); + let mut nodes: HashSet = HashSet::new(); + for row in rows { + let (f, t, dir, base, top) = row?; + nodes.insert(f.clone()); + nodes.insert(t.clone()); + let d = dir.chars().next().unwrap_or('N'); + if d == 'N' || d == 'F' { + adj.entry(f.clone()) + .or_default() + .push((t.clone(), base, top)); + } + if d == 'N' || d == 'B' { + adj.entry(t).or_default().push((f, base, top)); + } + } + + let mut errors = Vec::new(); + if !nodes.contains(from) { + errors.push(format!("{from} is not on airway {airway}")); + } + if !nodes.contains(to) { + errors.push(format!("{to} is not on airway {airway}")); + } + if !errors.is_empty() { + return Ok((vec![], errors)); + } + + // BFS, recording predecessor and the segment's FL band used to reach a node. + let mut prev: HashMap = HashMap::new(); + let mut visited: HashSet = HashSet::from([from.to_owned()]); + let mut queue: VecDeque = VecDeque::from([from.to_owned()]); + let mut found = false; + while let Some(cur) = queue.pop_front() { + if cur == to { + found = true; + break; + } + if let Some(neigh) = adj.get(&cur) { + for (n, base, top) in neigh { + if visited.insert(n.clone()) { + prev.insert(n.clone(), (cur.clone(), *base, *top)); + queue.push_back(n.clone()); + } + } + } + } + if !found { + errors.push(format!( + "no {airway} connection {from} → {to} (wrong direction?)" + )); + return Ok((vec![], errors)); + } + + // Reconstruct path to..from, checking FL band on each edge (top 0 = unknown). + let mut path = Vec::new(); + let mut node = to.to_owned(); + while node != *from { + let (p, base, top) = match prev.get(&node) { + Some(v) => v.clone(), + None => break, + }; + if top > 0 && (fl < base || fl > top) { + errors.push(format!( + "FL{fl} outside {airway} band FL{base}..FL{top} near {node}" + )); + } + path.push(node.clone()); + node = p; + } + path.reverse(); + path.pop(); // drop `to`; the caller appends it + Ok((path, errors)) +} + +fn airway_exists(conn: &Connection, name: &str) -> Result { + let n: i64 = conn.query_row( + "SELECT EXISTS(SELECT 1 FROM airways WHERE name = ?1)", + params![name], + |r| r.get(0), + )?; + Ok(n == 1) +} + +fn point_exists(conn: &Connection, ident: &str) -> Result { + let n: i64 = conn.query_row( + "SELECT (EXISTS(SELECT 1 FROM waypoints WHERE ident = ?1) \ + OR EXISTS(SELECT 1 FROM navaids WHERE ident = ?1))", + params![ident], + |r| r.get(0), + )?; + Ok(n == 1) +} + +fn airport_exists(conn: &Connection, icao: &str) -> Result { + let n: i64 = conn.query_row( + "SELECT EXISTS(SELECT 1 FROM airports WHERE icao = ?1)", + params![icao], + |r| r.get(0), + )?; + Ok(n == 1) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::db; + use std::path::PathBuf; + + fn db_from_fixtures() -> Connection { + let dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures"); + let mut conn = Connection::open_in_memory().unwrap(); + db::import_navdata(&mut conn, &dir).unwrap(); + conn + } + + #[test] + fn accepts_a_valid_low_route() { + let conn = db_from_fixtures(); + let r = prevalidate(&conn, "ABEAM T100 BEACN T100 CROSS", 200, None).unwrap(); + assert!(r.accepted, "{:?}", r.errors); + assert_eq!(r.expanded, vec!["ABEAM", "BEACN", "CROSS"]); + } + + #[test] + fn rejects_fl_outside_airway_band() { + let conn = db_from_fixtures(); + // U200 band is FL245..FL460; FL100 is below it. + let r = prevalidate(&conn, "CROSS U200 DOVER", 100, None).unwrap(); + assert!(!r.accepted); + assert!( + r.errors.iter().any(|e| e.contains("U200")), + "{:?}", + r.errors + ); + } + + #[test] + fn rejects_point_not_on_airway() { + let conn = db_from_fixtures(); + let r = prevalidate(&conn, "ABEAM T100 DOVER", 200, None).unwrap(); + assert!(!r.accepted); + assert!(r.errors.iter().any(|e| e.contains("not on airway"))); + } + + #[test] + fn dct_between_known_points_is_accepted() { + let conn = db_from_fixtures(); + let r = prevalidate(&conn, "ABEAM DCT DOVER", 200, None).unwrap(); + assert!(r.accepted, "{:?}", r.errors); + assert_eq!(r.expanded, vec!["ABEAM", "DOVER"]); + } + + #[test] + fn unknown_token_is_an_error() { + let conn = db_from_fixtures(); + let r = prevalidate(&conn, "ABEAM ZZZ99 BEACN", 200, None).unwrap(); + assert!(!r.accepted); + } + + #[test] + fn flags_rad_forbidden_dct() { + let conn = db_from_fixtures(); + // Same DCT as `dct_between_known_points_is_accepted`, but the RAD forbids it. + let rad = RadData { + areas: vec![], + dct: vec![crate::rad::DctRestriction { + id: "TEST01".into(), + from: "ABEAM".into(), + to: "DOVER".into(), + lower_fl: Some(0), + upper_fl: Some(400), + available: true, + utilization: "NOT AVBL FOR TFC X".into(), + direction: String::new(), + }], + fra_edges: vec![], + level_caps: vec![], + fra_points: vec![], + }; + let r = prevalidate(&conn, "ABEAM DCT DOVER", 200, Some(&rad)).unwrap(); + assert!(!r.accepted, "RAD should reject the forbidden direct"); + assert!( + r.errors + .iter() + .any(|e| e.contains("RAD") && e.contains("ABEAM") && e.contains("DOVER")), + "{:?}", + r.errors + ); + } +} diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs new file mode 100644 index 0000000..b212271 --- /dev/null +++ b/crates/core/src/lib.rs @@ -0,0 +1,26 @@ +//! `flightplanner-core` — offline flight planning building blocks. +//! +//! Module map (implemented incrementally, see `TODO.md`): +//! - [`error`] : typed error enum shared across the crate. +//! - [`model`] : shared domain types (positions, waypoints, ...). +//! - [`navdata`] : X-Plane `.dat` parsers (step 2). +//! - [`db`] : SQLite schema + import/query (step 2). +//! - [`routing`] : airway graph + A* routing (step 3). +//! - [`perf`] : aircraft profiles + fuel/time computation (step 4). +//! - [`ifps`] : offline structural IFPS pre-check (best-effort, non-authoritative). +//! - [`export`] : `.pln` / `.fms` / OFP writers (step 5). + +pub mod api; +pub mod db; +pub mod error; +pub mod export; +pub mod ifps; +pub mod model; +pub mod navdata; +pub mod perf; +pub mod pfpx; +pub mod rad; +pub mod routes; +pub mod routing; + +pub use error::{CoreError, Result}; diff --git a/crates/core/src/model.rs b/crates/core/src/model.rs new file mode 100644 index 0000000..c5133f2 --- /dev/null +++ b/crates/core/src/model.rs @@ -0,0 +1,145 @@ +//! Shared domain types produced by navdata parsing and consumed by routing, +//! performance and export. + +use geographiclib_rs::{Geodesic, InverseGeodesic}; +use serde::{Deserialize, Serialize}; + +/// A geographic position in decimal degrees (WGS84). +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub struct LatLon { + pub lat: f64, + pub lon: f64, +} + +impl LatLon { + pub const fn new(lat: f64, lon: f64) -> Self { + Self { lat, lon } + } + + /// Geodesic distance to `other` in nautical miles, on the WGS84 ellipsoid + /// (Karney's algorithm — sub-millimetre accurate, unlike a spherical model). + pub fn distance_nm(&self, other: &LatLon) -> f64 { + const METERS_PER_NM: f64 = 1852.0; + let geod = Geodesic::wgs84(); + let s12_m: f64 = geod.inverse(self.lat, self.lon, other.lat, other.lon); + s12_m / METERS_PER_NM + } +} + +/// An enroute/terminal fix from `earth_fix.dat`. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Waypoint { + pub ident: String, + /// 2-letter ICAO region code (matches airway endpoint regions). + pub region: String, + pub pos: LatLon, +} + +/// Kinds of navaid we keep for planning (others in `earth_nav.dat` are skipped). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum NavaidKind { + Ndb, + Vor, + Dme, +} + +impl NavaidKind { + /// Map an `earth_nav.dat` row code, or `None` for kinds we ignore + /// (ILS/LOC/GS/markers, DME collocated with a VOR, SBAS/GBAS, ...). + pub fn from_row_code(code: i32) -> Option { + match code { + 2 => Some(Self::Ndb), + 3 => Some(Self::Vor), + 13 => Some(Self::Dme), + _ => None, + } + } + + pub fn as_str(&self) -> &'static str { + match self { + Self::Ndb => "NDB", + Self::Vor => "VOR", + Self::Dme => "DME", + } + } +} + +/// A navaid from `earth_nav.dat`. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Navaid { + pub ident: String, + pub region: String, + pub kind: NavaidKind, + /// Frequency as stored by X-Plane (VOR: MHz×100, NDB: kHz). + pub freq: i64, + pub pos: LatLon, + pub name: String, +} + +/// An airport reference point (derived from CIFP runway thresholds). +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Airport { + pub icao: String, + pub pos: LatLon, +} + +/// Low- (Victor) vs high-altitude (Jet) airway layer. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum AirwayLayer { + Low, + High, +} + +impl AirwayLayer { + pub fn from_code(code: i32) -> Option { + match code { + 1 => Some(Self::Low), + 2 => Some(Self::High), + _ => None, + } + } + + pub fn as_str(&self) -> &'static str { + match self { + Self::Low => "Low", + Self::High => "High", + } + } +} + +/// One airway segment between two endpoints, as parsed from `earth_awy.dat`. +/// A physical line may belong to several named airways (`A-B`), hence `airways`. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct AirwaySegment { + pub from_ident: String, + pub from_region: String, + pub to_ident: String, + pub to_region: String, + /// Direction of use: `N` (both), `F` (forward), `B` (backward). + pub direction: char, + pub layer: AirwayLayer, + pub base_fl: i32, + pub top_fl: i32, + pub airways: Vec, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn latlon_roundtrips_through_json() { + let p = LatLon::new(49.0097, 2.5479); + let json = serde_json::to_string(&p).unwrap(); + let back: LatLon = serde_json::from_str(&json).unwrap(); + assert_eq!(p, back); + } + + #[test] + fn great_circle_lfpg_egll() { + let lfpg = LatLon::new(49.0097, 2.5479); + let egll = LatLon::new(51.4706, -0.4619); + let d = lfpg.distance_nm(&egll); + assert!((d - 188.0).abs() < 5.0, "distance = {d} nm"); + } +} diff --git a/crates/core/src/navdata/airport.rs b/crates/core/src/navdata/airport.rs new file mode 100644 index 0000000..fd296a5 --- /dev/null +++ b/crates/core/src/navdata/airport.rs @@ -0,0 +1,111 @@ +//! Airport reference points from CIFP files. +//! +//! X-Plane `earth_*.dat` carry no airport coordinates, but each `CIFP/.dat` +//! file lists runway thresholds as ARINC-packed coordinates: +//! +//! ```text +//! RWY:RW08L, , ,00338, ,GLE ,3, ;N48594447,E002330988,0000; +//! ``` +//! +//! We take the centroid of all thresholds as the airport reference point. + +use std::io::BufRead; + +use crate::error::{CoreError, Result}; +use crate::model::{Airport, LatLon}; + +/// Parse an ARINC-packed coordinate such as `N48594447` (lat) or `E002330988` +/// (lon): hemisphere letter, then `D…D MM SS ss` (seconds×100), degrees being +/// 2 digits for latitude and 3 for longitude. +pub fn parse_arinc_coord(tok: &str) -> std::result::Result { + if tok.len() < 8 { + return Err(format!("coordinate too short: '{tok}'")); + } + let (hemi, digits) = tok.split_at(1); + let sign = match hemi { + "N" | "E" => 1.0, + "S" | "W" => -1.0, + _ => return Err(format!("bad hemisphere in '{tok}'")), + }; + // Trailing 6 digits are always MM SS ss; the rest are degrees. + let deg_len = digits.len() - 6; + let field = |range: std::ops::Range, what: &str| -> std::result::Result { + digits + .get(range) + .ok_or_else(|| format!("truncated {what} in '{tok}'"))? + .parse::() + .map_err(|_| format!("invalid {what} in '{tok}'")) + }; + let deg = field(0..deg_len, "degrees")?; + let min = field(deg_len..deg_len + 2, "minutes")?; + let sec = field(deg_len + 2..deg_len + 4, "seconds")?; + let hund = field(deg_len + 4..deg_len + 6, "sub-seconds")?; + Ok(sign * (deg + min / 60.0 + (sec + hund / 100.0) / 3600.0)) +} + +/// Build an [`Airport`] from a CIFP reader, or `None` if it has no runways. +pub fn parse_airport_from_cifp(icao: &str, reader: impl BufRead) -> Result> { + let mut sum_lat = 0.0; + let mut sum_lon = 0.0; + let mut n = 0u32; + for line in reader.lines() { + let line = line?; + if !line.starts_with("RWY:") { + continue; + } + // Coordinates live after the first ';': "N48594447,E002330988,0000". + let coords = match line.split(';').nth(1) { + Some(s) => s, + None => continue, + }; + let mut parts = coords.split(','); + let (lat_s, lon_s) = match (parts.next(), parts.next()) { + (Some(a), Some(b)) => (a, b), + _ => continue, + }; + let to_err = |reason| CoreError::Parse { + file: format!("CIFP/{icao}.dat"), + line: 0, + reason, + }; + sum_lat += parse_arinc_coord(lat_s).map_err(to_err)?; + sum_lon += parse_arinc_coord(lon_s).map_err(to_err)?; + n += 1; + } + if n == 0 { + return Ok(None); + } + Ok(Some(Airport { + icao: icao.to_owned(), + pos: LatLon::new(sum_lat / n as f64, sum_lon / n as f64), + })) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn decodes_arinc_coordinates() { + let lat = parse_arinc_coord("N48594447").unwrap(); + let lon = parse_arinc_coord("E002330988").unwrap(); + assert!((lat - (48.0 + 59.0 / 60.0 + 44.47 / 3600.0)).abs() < 1e-6); + assert!((lon - (2.0 + 33.0 / 60.0 + 9.88 / 3600.0)).abs() < 1e-6); + assert!(parse_arinc_coord("W000273600").unwrap() < 0.0); + } + + #[test] + fn centroid_of_thresholds() { + let data = "\ +RWY:RW08L, , ,00338, ,GLE ,3, ;N48594447,E002330988,0000; +RWY:RW26R, , ,00318, ,GAU ,3, ;N48595395,E002360724,1725; +SID:010,4,AGOP6A,RW27R,DE27R,LF,P,C,EY; +"; + let ap = parse_airport_from_cifp("LFPG", data.as_bytes()) + .unwrap() + .unwrap(); + assert_eq!(ap.icao, "LFPG"); + assert!((ap.pos.lat - 48.99).abs() < 0.05); + assert!((ap.pos.lon - 2.56).abs() < 0.05); + } +} diff --git a/crates/core/src/navdata/airway.rs b/crates/core/src/navdata/airway.rs new file mode 100644 index 0000000..5b007fa --- /dev/null +++ b/crates/core/src/navdata/airway.rs @@ -0,0 +1,72 @@ +//! Parser for `earth_awy.dat` (version 1100). +//! +//! Data columns: `from freg ftype to treg ttype dir layer baseFL topFL name(s)`. +//! `name(s)` may join several airways with `-` (e.g. `J121-J584`). + +use super::{col_i32, col_str, is_meta_line, LineResult}; +use crate::model::{AirwayLayer, AirwaySegment}; + +pub fn parse_awy_line(line: &str) -> LineResult { + let t = line.trim(); + if is_meta_line(t) { + return Ok(None); + } + let cols: Vec<&str> = t.split_whitespace().collect(); + let from_ident = col_str(&cols, 0, "from ident")?; + let from_region = col_str(&cols, 1, "from region")?; + let to_ident = col_str(&cols, 3, "to ident")?; + let to_region = col_str(&cols, 4, "to region")?; + let direction = col_str(&cols, 6, "direction")? + .chars() + .next() + .ok_or_else(|| "empty direction".to_owned())?; + let layer_code = col_i32(&cols, 7, "layer")?; + let layer = AirwayLayer::from_code(layer_code) + .ok_or_else(|| format!("invalid layer: '{layer_code}'"))?; + let base_fl = col_i32(&cols, 8, "base FL")?; + let top_fl = col_i32(&cols, 9, "top FL")?; + let airways: Vec = col_str(&cols, 10, "airway name")? + .split('-') + .filter(|s| !s.is_empty()) + .map(str::to_owned) + .collect(); + Ok(Some(AirwaySegment { + from_ident: from_ident.to_owned(), + from_region: from_region.to_owned(), + to_ident: to_ident.to_owned(), + to_region: to_region.to_owned(), + direction, + layer, + base_fl, + top_fl, + airways, + })) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_a_low_segment() { + let s = parse_awy_line("07EBA DT 11 GILEX DT 11 N 1 95 245 G869") + .unwrap() + .unwrap(); + assert_eq!(s.from_ident, "07EBA"); + assert_eq!(s.to_ident, "GILEX"); + assert_eq!(s.direction, 'N'); + assert_eq!(s.layer, AirwayLayer::Low); + assert_eq!(s.base_fl, 95); + assert_eq!(s.top_fl, 245); + assert_eq!(s.airways, vec!["G869".to_owned()]); + } + + #[test] + fn splits_multiple_airway_names() { + let s = parse_awy_line("A LF 11 B LF 11 N 2 245 460 J121-J584") + .unwrap() + .unwrap(); + assert_eq!(s.layer, AirwayLayer::High); + assert_eq!(s.airways, vec!["J121".to_owned(), "J584".to_owned()]); + } +} diff --git a/crates/core/src/navdata/fix.rs b/crates/core/src/navdata/fix.rs new file mode 100644 index 0000000..1bb4391 --- /dev/null +++ b/crates/core/src/navdata/fix.rs @@ -0,0 +1,56 @@ +//! Parser for `earth_fix.dat` (version 1101). +//! +//! Data columns: `lat lon ident termArea region typecode`. + +use super::{col_f64, col_str, is_meta_line, LineResult}; +use crate::model::{LatLon, Waypoint}; + +pub fn parse_fix_line(line: &str) -> LineResult { + let t = line.trim(); + if is_meta_line(t) { + return Ok(None); + } + let cols: Vec<&str> = t.split_whitespace().collect(); + let lat = col_f64(&cols, 0, "latitude")?; + let lon = col_f64(&cols, 1, "longitude")?; + let ident = col_str(&cols, 2, "ident")?; + // cols[3] = terminal area airport ICAO or "ENRT" (unused for now) + let region = col_str(&cols, 4, "region")?; + Ok(Some(Waypoint { + ident: ident.to_owned(), + region: region.to_owned(), + pos: LatLon::new(lat, lon), + })) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn skips_header_and_terminator() { + assert!(parse_fix_line("I").unwrap().is_none()); + assert!(parse_fix_line("1101 Version - data cycle 2608") + .unwrap() + .is_none()); + assert!(parse_fix_line("").unwrap().is_none()); + assert!(parse_fix_line("99").unwrap().is_none()); + } + + #[test] + fn parses_a_fix() { + let wp = parse_fix_line(" 33.492513889 9.217400000 07EBA ENRT DT 2118994") + .unwrap() + .unwrap(); + assert_eq!(wp.ident, "07EBA"); + assert_eq!(wp.region, "DT"); + assert!((wp.pos.lat - 33.492513889).abs() < 1e-9); + assert!((wp.pos.lon - 9.2174).abs() < 1e-9); + } + + #[test] + fn errors_on_bad_latitude() { + let err = parse_fix_line("xx 9.2 07EBA ENRT DT 1").unwrap_err(); + assert!(err.contains("latitude"), "{err}"); + } +} diff --git a/crates/core/src/navdata/mod.rs b/crates/core/src/navdata/mod.rs new file mode 100644 index 0000000..540a93d --- /dev/null +++ b/crates/core/src/navdata/mod.rs @@ -0,0 +1,92 @@ +//! X-Plane navdata parsers (`earth_fix.dat`, `earth_nav.dat`, `earth_awy.dat`) +//! plus airport reference points from CIFP files. +//! +//! Parsing is streaming (line-by-line): a multi-MB file is never buffered whole. +//! Each line parser is a pure `&str -> LineResult` function so it can be unit +//! tested on tiny hand-made inputs; [`stream_file`] drives them over a reader and +//! attaches file/line context to any error. + +pub mod airport; +pub mod airway; +pub mod fix; +pub mod nav; +pub mod procedure; + +use std::io::BufRead; + +use crate::error::{CoreError, Result}; + +/// Outcome of parsing one physical line: `Some` = a record, `None` = skip +/// (header / blank / terminator), `Err(reason)` = malformed data line. +pub type LineResult = std::result::Result, String>; + +/// Header / blank / terminator lines shared by every X-Plane `.dat` file. +pub(crate) fn is_meta_line(trimmed: &str) -> bool { + trimmed.is_empty() + || trimmed == "I" + || trimmed == "A" + || trimmed == "99" + || trimmed.contains("Version") +} + +/// Parse a whitespace-separated column as `f64`. +pub(crate) fn col_f64(cols: &[&str], i: usize, field: &str) -> std::result::Result { + let s = cols + .get(i) + .ok_or_else(|| format!("missing field: {field}"))?; + s.parse::() + .map_err(|_| format!("invalid {field}: '{s}'")) +} + +/// Parse a whitespace-separated column as `i32`. +pub(crate) fn col_i32(cols: &[&str], i: usize, field: &str) -> std::result::Result { + let s = cols + .get(i) + .ok_or_else(|| format!("missing field: {field}"))?; + s.parse::() + .map_err(|_| format!("invalid {field}: '{s}'")) +} + +/// Borrow a whitespace-separated column as `&str`. +pub(crate) fn col_str<'a>( + cols: &[&'a str], + i: usize, + field: &str, +) -> std::result::Result<&'a str, String> { + cols.get(i) + .copied() + .ok_or_else(|| format!("missing field: {field}")) +} + +/// Drive a line parser over a reader, invoking `visit` for each parsed record. +/// Returns the number of records produced. Parse errors are wrapped with the +/// file label and 1-based line number. +pub fn stream_file( + reader: R, + file_label: &str, + parse: impl Fn(&str) -> LineResult, + mut visit: impl FnMut(T) -> Result<()>, +) -> Result +where + R: BufRead, +{ + let mut count = 0usize; + for (i, line) in reader.lines().enumerate() { + let line = line?; + match parse(&line) { + Ok(Some(rec)) => { + visit(rec)?; + count += 1; + } + Ok(None) => {} + Err(reason) => { + return Err(CoreError::Parse { + file: file_label.to_owned(), + line: i + 1, + reason, + }) + } + } + } + Ok(count) +} diff --git a/crates/core/src/navdata/nav.rs b/crates/core/src/navdata/nav.rs new file mode 100644 index 0000000..249b4cd --- /dev/null +++ b/crates/core/src/navdata/nav.rs @@ -0,0 +1,69 @@ +//! Parser for `earth_nav.dat` (version 1150). +//! +//! Data columns: `code lat lon elev freq range bearing ident termArea region name…`. +//! Only NDB/VOR/DME rows are kept; other codes yield `Ok(None)`. + +use super::{col_f64, col_i32, col_str, is_meta_line, LineResult}; +use crate::model::{LatLon, Navaid, NavaidKind}; + +pub fn parse_nav_line(line: &str) -> LineResult { + let t = line.trim(); + if is_meta_line(t) { + return Ok(None); + } + let cols: Vec<&str> = t.split_whitespace().collect(); + let code = col_i32(&cols, 0, "row code")?; + let kind = match NavaidKind::from_row_code(code) { + Some(k) => k, + None => return Ok(None), + }; + let lat = col_f64(&cols, 1, "latitude")?; + let lon = col_f64(&cols, 2, "longitude")?; + // cols[3] elevation, cols[5] range, cols[6] bearing — unused for now. + let freq = col_i32(&cols, 4, "frequency")? as i64; + let ident = col_str(&cols, 7, "ident")?; + let region = col_str(&cols, 9, "region")?; + let name = cols.get(10..).map(|r| r.join(" ")).unwrap_or_default(); + Ok(Some(Navaid { + ident: ident.to_owned(), + region: region.to_owned(), + kind, + freq, + pos: LatLon::new(lat, lon), + name, + })) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_a_vor() { + let nv = parse_nav_line( + " 3 9.037805556 7.285111111 1191 11630 130 -0.000 ABC ENRT DN ABUJA VOR/DME", + ) + .unwrap() + .unwrap(); + assert_eq!(nv.ident, "ABC"); + assert_eq!(nv.region, "DN"); + assert_eq!(nv.kind, NavaidKind::Vor); + assert_eq!(nv.freq, 11630); + assert_eq!(nv.name, "ABUJA VOR/DME"); + } + + #[test] + fn skips_ils_and_collocated_dme() { + // code 4 = ILS/LOC, code 12 = DME component of a VOR/DME + assert!( + parse_nav_line(" 4 49.0 2.55 50 11000 25 0.0 ILP ENRT LF PARIS ILS") + .unwrap() + .is_none() + ); + assert!( + parse_nav_line(" 12 9.0 7.2 1191 11630 130 0.0 ABC ENRT DN ABUJA DME") + .unwrap() + .is_none() + ); + } +} diff --git a/crates/core/src/navdata/procedure.rs b/crates/core/src/navdata/procedure.rs new file mode 100644 index 0000000..eb83956 --- /dev/null +++ b/crates/core/src/navdata/procedure.rs @@ -0,0 +1,212 @@ +//! CIFP SID/STAR procedure parsing (ARINC 424-derived). +//! +//! Each airport's CIFP file holds `SID:` and `STAR:` records. A record is one +//! leg of a procedure; legs sharing the same procedure name + transition form +//! the ordered fix sequence. Field layout after the `SID:`/`STAR:` prefix: +//! `seq, routeType, name, transition, fix, fixRegion, …`. +//! +//! v1 keeps just what routing needs: the ordered enroute **fixes** per +//! (name, transition). A SID's last fix is where it joins the airway network +//! ([`Procedure::exit_fix`]); a STAR's first fix is where it leaves it +//! ([`Procedure::entry_fix`]). + +use std::collections::HashMap; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use std::path::Path; + +use serde::{Deserialize, Serialize}; + +use crate::error::Result; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum ProcKind { + Sid, + Star, +} + +/// One departure/arrival procedure variant (a name + transition + fix sequence). +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Procedure { + pub kind: ProcKind, + /// Procedure identifier, e.g. `AGOP6A`. + pub name: String, + /// Transition: a runway (`RW27L`), `ALL`, or an enroute transition name. + pub transition: String, + /// Ordered fix idents along the procedure. + pub fixes: Vec, +} + +impl Procedure { + /// Fix where a SID joins the airway network (its last fix). + pub fn exit_fix(&self) -> Option<&str> { + self.fixes.last().map(String::as_str) + } + /// Fix where a STAR leaves the airway network (its first fix). + pub fn entry_fix(&self) -> Option<&str> { + self.fixes.first().map(String::as_str) + } +} + +/// Parse all SID/STAR procedures from a CIFP airport file. +pub fn parse_procedures(reader: R) -> Result> { + type Key = (ProcKind, String, String); + let mut order: Vec = Vec::new(); + let mut legs: HashMap> = HashMap::new(); + + for line in reader.lines() { + let line = line?; + let (kind, rest) = if let Some(r) = line.strip_prefix("SID:") { + (ProcKind::Sid, r) + } else if let Some(r) = line.strip_prefix("STAR:") { + (ProcKind::Star, r) + } else { + continue; + }; + let f: Vec<&str> = rest.split(',').collect(); + let name = field(&f, 2); + if name.is_empty() { + continue; + } + let transition = field(&f, 3); + let fix = field(&f, 4); + let seq: u32 = field(&f, 0).parse().unwrap_or(0); + + let key = (kind, name, transition); + if !legs.contains_key(&key) { + order.push(key.clone()); + } + let entry = legs.entry(key).or_default(); + if !fix.is_empty() { + entry.push((seq, fix)); + } + } + + let mut procs = Vec::with_capacity(order.len()); + for key in order { + let mut group = legs.remove(&key).unwrap_or_default(); + group.sort_by_key(|(s, _)| *s); + let mut fixes: Vec = Vec::new(); + for (_, fix) in group { + if fixes.last() != Some(&fix) { + fixes.push(fix); + } + } + if fixes.is_empty() { + continue; + } + procs.push(Procedure { + kind: key.0, + name: key.1, + transition: key.2, + fixes, + }); + } + Ok(procs) +} + +fn field(f: &[&str], i: usize) -> String { + f.get(i).map(|s| s.trim()).unwrap_or("").to_string() +} + +/// Ordered fixes of the procedure named `name` (of `kind`) whose connector fix +/// (SID exit / STAR entry) equals `connector_fix` — for drawing the full +/// SID/STAR track on the map. Empty if not found. +pub fn procedure_track( + cifp_dir: &Path, + icao: &str, + kind: ProcKind, + name: &str, + connector_fix: &str, +) -> Result> { + let path = cifp_dir.join(format!("{}.dat", icao.to_uppercase())); + let Ok(file) = File::open(path) else { + return Ok(Vec::new()); + }; + let procs = parse_procedures(BufReader::new(file))?; + let cf = connector_fix.to_uppercase(); + for p in procs + .iter() + .filter(|p| p.kind == kind && p.name.eq_ignore_ascii_case(name)) + { + let matches = match kind { + ProcKind::Sid => p.exit_fix() == Some(cf.as_str()), + ProcKind::Star => p.entry_fix() == Some(cf.as_str()), + }; + if matches { + return Ok(p.fixes.clone()); + } + } + Ok(Vec::new()) +} + +/// Connectors for an airport read from `/.dat`: pairs of +/// (procedure name, connector fix) — SID **exit** fixes for [`ProcKind::Sid`], +/// STAR **entry** fixes for [`ProcKind::Star`], deduplicated by fix. Empty when +/// the CIFP file is absent. +pub fn connectors(cifp_dir: &Path, icao: &str, kind: ProcKind) -> Result> { + let path = cifp_dir.join(format!("{}.dat", icao.to_uppercase())); + let Ok(file) = File::open(path) else { + return Ok(Vec::new()); + }; + let procs = parse_procedures(BufReader::new(file))?; + let mut out: Vec<(String, String)> = Vec::new(); + for p in procs.iter().filter(|p| p.kind == kind) { + let fix = match kind { + ProcKind::Sid => p.exit_fix(), + ProcKind::Star => p.entry_fix(), + }; + if let Some(f) = fix { + if !out.iter().any(|(_, x)| x == f) { + out.push((p.name.clone(), f.to_string())); + } + } + } + Ok(out) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs::File; + use std::io::{BufReader, Cursor}; + + #[test] + fn groups_sid_legs_into_ordered_fixes() { + let data = "\ +SID:010,4,TEST1,RW27L,AAA,LF,P,C\n\ +SID:030,4,TEST1,RW27L,CCC,LF\n\ +SID:020,4,TEST1,RW27L,BBB,LF\n\ +STAR:010,5,ARR1,ALL,ZZZ,LF\n"; + let procs = parse_procedures(Cursor::new(data)).unwrap(); + assert_eq!(procs.len(), 2); + let sid = &procs[0]; + assert_eq!(sid.kind, ProcKind::Sid); + assert_eq!(sid.name, "TEST1"); + assert_eq!(sid.transition, "RW27L"); + assert_eq!(sid.fixes, vec!["AAA", "BBB", "CCC"]); // sorted by seq + assert_eq!(sid.exit_fix(), Some("CCC")); + assert_eq!(procs[1].entry_fix(), Some("ZZZ")); + } + + /// Parses the real LFPG CIFP when present (skips otherwise). + #[test] + fn parses_real_lfpg_when_present() { + let p = "../../navdata/CIFP/LFPG.dat"; + let Ok(file) = File::open(p) else { + return; + }; + let procs = parse_procedures(BufReader::new(file)).unwrap(); + let sids = procs.iter().filter(|p| p.kind == ProcKind::Sid).count(); + let stars = procs.iter().filter(|p| p.kind == ProcKind::Star).count(); + assert!(sids > 10, "sids = {sids}"); + assert!(stars > 5, "stars = {stars}"); + assert!(procs.iter().all(|p| !p.fixes.is_empty())); + for s in procs.iter().filter(|p| p.kind == ProcKind::Sid).take(4) { + eprintln!("SID {:8} rwy {:6} exits→ {:?}", s.name, s.transition, s.exit_fix()); + } + for s in procs.iter().filter(|p| p.kind == ProcKind::Star).take(4) { + eprintln!("STAR {:8} trans {:6} enters→ {:?}", s.name, s.transition, s.entry_fix()); + } + } +} diff --git a/crates/core/src/perf/mod.rs b/crates/core/src/perf/mod.rs new file mode 100644 index 0000000..f14ae6d --- /dev/null +++ b/crates/core/src/perf/mod.rs @@ -0,0 +1,438 @@ +//! Aircraft performance & fuel planning over a computed [`Route`]. +//! +//! A simple 3-phase profile (climb / cruise / descent) is laid out along the +//! total route distance: climb and descent occupy the ground distance implied by +//! their rate of climb/descent and TAS, cruise fills the middle. Each route leg +//! is then split across whatever phases it overlaps, giving per-leg time and fuel +//! with running totals, plus regulatory reserves and a block fuel figure. + +pub mod openap; +pub mod profile; + +pub use openap::PerfModel; +pub use profile::AircraftProfile; + +use crate::routing::Route; + +/// Time, distance and fuel for one flight phase. +#[derive(Debug, Clone, Copy, Default, PartialEq)] +pub struct PhaseResult { + pub dist_nm: f64, + pub time_min: f64, + pub fuel_kg: f64, +} + +/// Per-leg time/fuel with cumulative running totals. +#[derive(Debug, Clone, PartialEq)] +pub struct LegFuel { + pub from: String, + pub to: String, + pub airway: String, + pub dist_nm: f64, + pub time_min: f64, + pub fuel_kg: f64, + pub cum_time_min: f64, + pub cum_fuel_kg: f64, +} + +/// Mass breakdown for the flight (only available with a physics/OpenAP profile). +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Masses { + /// Payload (pax + cargo), kg. + pub payload_kg: f64, + /// Zero-fuel weight = OEW + payload, kg. + pub zfw_kg: f64, + /// Take-off weight = ZFW + take-off fuel (block − taxi), kg. + pub takeoff_kg: f64, + /// Landing weight = take-off weight − trip fuel, kg. + pub landing_kg: f64, + /// True if take-off weight exceeds MTOW (plan is infeasible as loaded). + pub over_mtow: bool, + /// True if landing weight exceeds MLW. + pub over_mlw: bool, +} + +/// A complete fuel plan for a route. +#[derive(Debug, Clone, PartialEq)] +pub struct FuelPlan { + pub cruise_fl: i32, + pub climb: PhaseResult, + pub cruise: PhaseResult, + pub descent: PhaseResult, + pub legs: Vec, + pub trip_fuel_kg: f64, + pub trip_time_min: f64, + pub taxi_kg: f64, + pub contingency_kg: f64, + pub alternate_kg: f64, + pub final_reserve_kg: f64, + pub block_fuel_kg: f64, + /// Mass breakdown, when the profile carries OpenAP mass data. + pub masses: Option, +} + +/// Result of one fuel-accounting pass over the route at a fixed representative +/// mass (fuel flows already resolved for that mass). +struct Pass { + climb: PhaseResult, + cruise: PhaseResult, + descent: PhaseResult, + legs: Vec, + trip_fuel_kg: f64, + trip_time_min: f64, + contingency_kg: f64, + final_reserve_kg: f64, + alternate_kg: f64, + block_fuel_kg: f64, +} + +/// Compute a fuel plan for `route` using `profile`, cruising at `cruise_fl` +/// (×100 ft). `alternate_nm`, if given, adds a cruise-only alternate leg. +/// `payload_kg` sets the load (pax + cargo); with an OpenAP profile the block +/// fuel is solved by iterating mass (heavier fuel load ⇒ more burn ⇒ more fuel). +/// Without OpenAP coefficients, fuel flow is mass-independent and `payload_kg` +/// only affects the reported mass breakdown (which is then `None`). +pub fn compute_fuel_plan( + profile: &AircraftProfile, + route: &Route, + cruise_fl: i32, + alternate_nm: Option, + payload_kg: Option, +) -> FuelPlan { + let d_total: f64 = route.legs.iter().map(|l| l.dist_nm).sum(); + let alt_ft = cruise_fl as f64 * 100.0; + let (c, cr, de) = ( + &profile.phases.climb, + &profile.phases.cruise, + &profile.phases.descent, + ); + + // Ground distance covered by climb and descent (top-of-climb / top-of-descent). + let mut climb_dist = c.tas_kt * (alt_ft / c.roc_fpm) / 60.0; + let mut descent_dist = de.tas_kt * (alt_ft / de.rod_fpm) / 60.0; + if climb_dist + descent_dist > d_total && climb_dist + descent_dist > 0.0 { + // Short flight: cruise never reached, compress climb/descent to fit. + let scale = d_total / (climb_dist + descent_dist); + climb_dist *= scale; + descent_dist *= scale; + } + let cruise_dist = (d_total - climb_dist - descent_dist).max(0.0); + let taxi_kg = profile.reserves.taxi_kg; + + // One fuel-accounting pass at a given fuel-flow evaluation mass. + let run = |ff_mass: f64| -> Pass { + let (climb_ff, cruise_ff, descent_ff) = + phase_fuel_flows(profile, cruise_fl, alt_ft, ff_mass); + // (start_nm, end_nm, tas_kt, fuel_flow_kgph) per phase, in route order. + let phases = [ + (0.0, climb_dist, c.tas_kt, climb_ff), + (climb_dist, climb_dist + cruise_dist, cr.tas_kt, cruise_ff), + (climb_dist + cruise_dist, d_total, de.tas_kt, descent_ff), + ]; + + let mut totals = [PhaseResult::default(); 3]; + let mut legs = Vec::with_capacity(route.legs.len()); + let mut traveled = 0.0; + let mut cum_time = 0.0; + let mut cum_fuel = 0.0; + + for leg in &route.legs { + let (start, end) = (traveled, traveled + leg.dist_nm); + let mut leg_time = 0.0; + let mut leg_fuel = 0.0; + for (i, &(ps, pe, tas, ff)) in phases.iter().enumerate() { + let overlap = (end.min(pe) - start.max(ps)).max(0.0); + if overlap <= 0.0 || tas <= 0.0 { + continue; + } + let time = overlap / tas * 60.0; + let fuel = ff * overlap / tas; + leg_time += time; + leg_fuel += fuel; + totals[i].dist_nm += overlap; + totals[i].time_min += time; + totals[i].fuel_kg += fuel; + } + cum_time += leg_time; + cum_fuel += leg_fuel; + legs.push(LegFuel { + from: leg.from.clone(), + to: leg.to.clone(), + airway: leg.airway.clone(), + dist_nm: leg.dist_nm, + time_min: leg_time, + fuel_kg: leg_fuel, + cum_time_min: cum_time, + cum_fuel_kg: cum_fuel, + }); + traveled = end; + } + + let [climb, cruise, descent] = totals; + let trip_fuel_kg = climb.fuel_kg + cruise.fuel_kg + descent.fuel_kg; + let trip_time_min = climb.time_min + cruise.time_min + descent.time_min; + let contingency_kg = profile.reserves.contingency_pct / 100.0 * trip_fuel_kg; + let final_reserve_kg = cruise_ff * profile.reserves.final_reserve_min / 60.0; + let alternate_kg = alternate_nm + .map(|d| cruise_ff * (d / cr.tas_kt)) + .unwrap_or(0.0); + let block_fuel_kg = + taxi_kg + trip_fuel_kg + contingency_kg + alternate_kg + final_reserve_kg; + Pass { + climb, + cruise, + descent, + legs, + trip_fuel_kg, + trip_time_min, + contingency_kg, + final_reserve_kg, + alternate_kg, + block_fuel_kg, + } + }; + + // With an OpenAP profile, solve block fuel by fixed-point iteration on mass: + // start empty (ZFW), then feed take-off fuel back into the evaluation mass + // until the block figure stops moving. Without it, one mass-agnostic pass. + let (pass, masses) = match &profile.openap { + None => (run(0.0), None), + Some(params) => { + let payload = payload_kg.unwrap_or_else(|| params.default_payload_kg()); + let zfw = params.oew_kg + payload; + let mut pass = run(zfw); + for _ in 0..12 { + let takeoff = zfw + (pass.block_fuel_kg - taxi_kg).max(0.0); + // Represent the whole flight by its average all-up mass. + let avg = takeoff - pass.trip_fuel_kg / 2.0; + let next = run(avg); + let converged = (next.block_fuel_kg - pass.block_fuel_kg).abs() < 0.5; + pass = next; + if converged { + break; + } + } + let takeoff = zfw + (pass.block_fuel_kg - taxi_kg).max(0.0); + let landing = takeoff - pass.trip_fuel_kg; + let masses = Masses { + payload_kg: payload, + zfw_kg: zfw, + takeoff_kg: takeoff, + landing_kg: landing, + over_mtow: takeoff > params.mtow_kg, + over_mlw: landing > params.mlw_kg, + }; + (pass, Some(masses)) + } + }; + + FuelPlan { + cruise_fl, + climb: pass.climb, + cruise: pass.cruise, + descent: pass.descent, + legs: pass.legs, + trip_fuel_kg: pass.trip_fuel_kg, + trip_time_min: pass.trip_time_min, + taxi_kg, + contingency_kg: pass.contingency_kg, + alternate_kg: pass.alternate_kg, + final_reserve_kg: pass.final_reserve_kg, + block_fuel_kg: pass.block_fuel_kg, + masses, + } +} + +/// Fuel flow (kg/h) for climb, cruise and descent at all-up mass `mass_kg`. Uses +/// the physics model when the profile has OpenAP coefficients (burn depends on +/// weight and flight level), otherwise the fixed per-phase JSON figures (and +/// `mass_kg` is ignored). +fn phase_fuel_flows( + profile: &AircraftProfile, + cruise_fl: i32, + cruise_alt_ft: f64, + mass_kg: f64, +) -> (f64, f64, f64) { + let (c, cr, de) = ( + &profile.phases.climb, + &profile.phases.cruise, + &profile.phases.descent, + ); + let Some(params) = &profile.openap else { + return (c.fuel_flow_kgph, cr.fuel_flow_kgph, de.fuel_flow_kgph); + }; + + let model = params.model(); + // Evaluate climb/descent at a representative mid-altitude of the phase. + let mid_ft = cruise_alt_ft / 2.0; + + let cruise_ff = model.cruise_fuel_flow_kgph(mass_kg, cruise_fl, params.cruise_mach); + + let climb_tas = openap::kt_to_ms(c.tas_kt); + let climb_gamma = (c.roc_fpm * openap_fpm_to_ms() / climb_tas).asin(); + let climb_ff = model.fuel_flow_kgs(mass_kg, climb_tas, mid_ft, climb_gamma) * 3600.0; + + let descent_tas = openap::kt_to_ms(de.tas_kt); + let descent_gamma = -(de.rod_fpm * openap_fpm_to_ms() / descent_tas).asin(); + let descent_ff = model.fuel_flow_kgs(mass_kg, descent_tas, mid_ft, descent_gamma) * 3600.0; + + (climb_ff, cruise_ff, descent_ff) +} + +/// Feet-per-minute to metres-per-second. +fn openap_fpm_to_ms() -> f64 { + 0.3048 / 60.0 +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::routing::{Leg, Route}; + + fn a320() -> AircraftProfile { + AircraftProfile::from_json_str( + r#"{ + "icao":"A320","name":"t","default_cruise_fl":360, + "phases":{ + "climb":{"ias_kt":290,"mach":0.78,"tas_kt":380,"fuel_flow_kgph":2600,"roc_fpm":2000}, + "cruise":{"mach":0.78,"tas_kt":450,"fuel_flow_kgph":2400}, + "descent":{"ias_kt":290,"mach":0.78,"tas_kt":320,"fuel_flow_kgph":1200,"rod_fpm":1800} + }, + "reserves":{"final_reserve_min":30,"contingency_pct":5.0,"taxi_kg":200} + }"#, + ) + .unwrap() + } + + fn route(total_nm: f64) -> Route { + Route { + legs: vec![Leg { + from: "A".into(), + to: "B".into(), + airway: "DCT".into(), + dist_nm: total_nm, + }], + total_nm, + via_airways: true, + } + } + + #[test] + fn phases_cover_total_distance() { + let plan = compute_fuel_plan(&a320(), &route(400.0), 360, None, None); + let covered = plan.climb.dist_nm + plan.cruise.dist_nm + plan.descent.dist_nm; + assert!((covered - 400.0).abs() < 1e-6, "covered = {covered}"); + assert!(plan.cruise.dist_nm > 0.0); + } + + #[test] + fn block_exceeds_trip_and_reserves_are_positive() { + let plan = compute_fuel_plan(&a320(), &route(400.0), 360, Some(120.0), None); + assert!(plan.trip_fuel_kg > 0.0); + assert!(plan.contingency_kg > 0.0); + assert!(plan.final_reserve_kg > 0.0); + assert!(plan.alternate_kg > 0.0); + assert!(plan.block_fuel_kg > plan.trip_fuel_kg); + // Cumulative fuel on the last leg equals trip fuel. + let last = plan.legs.last().unwrap(); + assert!((last.cum_fuel_kg - plan.trip_fuel_kg).abs() < 1e-6); + } + + #[test] + fn short_flight_has_no_cruise() { + let plan = compute_fuel_plan(&a320(), &route(20.0), 360, None, None); + assert!( + plan.cruise.dist_nm < 1e-6, + "cruise = {}", + plan.cruise.dist_nm + ); + } + + #[test] + fn openap_profile_makes_cruise_burn_altitude_dependent() { + use std::path::Path; + let dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../data/aircraft"); + let p = AircraftProfile::load(&dir, "A320").unwrap(); + assert!( + p.openap.is_some(), + "bundled A320 should carry OpenAP coeffs" + ); + + let (_c_lo, cruise_lo, _d_lo) = phase_fuel_flows(&p, 240, 24_000.0, 64_000.0); + let (_c_hi, cruise_hi, _d_hi) = phase_fuel_flows(&p, 360, 36_000.0, 64_000.0); + // Same weight, higher FL → less burn; and in a realistic A320 band. + assert!( + cruise_hi < cruise_lo, + "hi {cruise_hi:.0} < lo {cruise_lo:.0}" + ); + assert!( + (1800.0..=2800.0).contains(&cruise_hi), + "cruise ff {cruise_hi:.0} kg/h" + ); + } + + #[test] + fn openap_and_fixed_profiles_both_produce_positive_trip_fuel() { + use std::path::Path; + let dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../data/aircraft"); + let p = AircraftProfile::load(&dir, "A320").unwrap(); + let plan = compute_fuel_plan(&p, &route(400.0), 360, None, None); + assert!(plan.trip_fuel_kg > 0.0); + assert!(plan.cruise.fuel_kg > 0.0); + } + + fn bundled_a320() -> AircraftProfile { + use std::path::Path; + let dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../data/aircraft"); + AircraftProfile::load(&dir, "A320").unwrap() + } + + #[test] + fn mass_breakdown_is_consistent() { + let p = bundled_a320(); + let plan = compute_fuel_plan(&p, &route(1500.0), 360, None, Some(16_000.0)); + let m = plan.masses.expect("OpenAP profile yields a mass breakdown"); + let params = p.openap.as_ref().unwrap(); + // ZFW = OEW + payload; TOW = ZFW + block − taxi; LDW = TOW − trip. + assert!((m.zfw_kg - (params.oew_kg + 16_000.0)).abs() < 1e-6); + assert!((m.takeoff_kg - (m.zfw_kg + plan.block_fuel_kg - plan.taxi_kg)).abs() < 1e-6); + assert!((m.landing_kg - (m.takeoff_kg - plan.trip_fuel_kg)).abs() < 1e-6); + // Take-off weight must stay within MTOW for a sane load. + assert!( + m.takeoff_kg <= params.mtow_kg, + "TOW {:.0} > MTOW", + m.takeoff_kg + ); + assert!(!m.over_mtow); + } + + #[test] + fn heavier_payload_burns_more_trip_fuel() { + let p = bundled_a320(); + let light = compute_fuel_plan(&p, &route(1500.0), 360, None, Some(8_000.0)); + let heavy = compute_fuel_plan(&p, &route(1500.0), 360, None, Some(20_000.0)); + assert!( + heavy.trip_fuel_kg > light.trip_fuel_kg, + "heavy {:.0} should exceed light {:.0}", + heavy.trip_fuel_kg, + light.trip_fuel_kg + ); + assert!(heavy.masses.unwrap().takeoff_kg > light.masses.unwrap().takeoff_kg); + } + + #[test] + fn block_fuel_iteration_converges() { + // The reported block must be self-consistent with the mass it implies: + // re-running at the converged take-off mass reproduces the same block. + let p = bundled_a320(); + let plan = compute_fuel_plan(&p, &route(2000.0), 360, None, Some(15_000.0)); + let m = plan.masses.unwrap(); + let avg = m.takeoff_kg - plan.trip_fuel_kg / 2.0; + let (_c, cruise_ff, _d) = phase_fuel_flows(&p, 360, 36_000.0, avg); + // Cruise burn recomputed at the average mass is a sane A320 figure. + assert!( + (1800.0..=3000.0).contains(&cruise_ff), + "cruise ff {cruise_ff:.0}" + ); + } +} diff --git a/crates/core/src/perf/openap.rs b/crates/core/src/perf/openap.rs new file mode 100644 index 0000000..94a790f --- /dev/null +++ b/crates/core/src/perf/openap.rs @@ -0,0 +1,249 @@ +//! Physics-based aircraft performance, in the spirit of OpenAP (TU Delft, +//! Junzi Sun) — an open, first-principles alternative to EUROCONTROL BADA. +//! +//! Fuel flow is derived from the actual aerodynamic drag at the current mass, +//! altitude and speed (via an ISA atmosphere and a parabolic drag polar), then +//! turned into fuel burn through a thrust-specific fuel consumption (TSFC). +//! Unlike a fixed `fuel_flow_kgph`, this makes burn depend on **weight** and +//! **flight level** — the two things that dominate real trip fuel. +//! +//! Coefficients (`cd0`, `k`, wing area, engine thrust/TSFC/idle flow) come from +//! OpenAP's open dataset. The cruise TSFC is calibrated to a validated installed +//! cruise fuel flow (OpenAP's ideal `cruise_sfc` is uninstalled and runs a bit +//! optimistic); BADA datasets can be dropped in later behind the same interface. + +/// Standard gravity (m/s²). +const G0: f64 = 9.80665; +/// Specific gas constant for dry air (J/(kg·K)). +const R_AIR: f64 = 287.05287; +/// Ratio of specific heats for air. +const GAMMA: f64 = 1.4; +/// ISA sea-level temperature (K) and pressure (Pa). +const T0: f64 = 288.15; +const P0: f64 = 101_325.0; +/// Tropospheric lapse rate (K/m) and tropopause height (m). +const LAPSE: f64 = 0.0065; +const H_TROP: f64 = 11_000.0; +const T_TROP: f64 = 216.65; +/// Metres per foot; metres/second per knot. +const M_PER_FT: f64 = 0.3048; +const MS_PER_KT: f64 = 0.514_444; +/// Seconds per hour, for kg/s ↔ kg/h. +const S_PER_H: f64 = 3600.0; + +/// ISA atmospheric state at a geopotential altitude. +#[derive(Debug, Clone, Copy)] +pub struct Atmosphere { + /// Static temperature (K). + pub temperature_k: f64, + /// Static pressure (Pa). + pub pressure_pa: f64, + /// Air density (kg/m³). + pub density: f64, + /// Speed of sound (m/s). + pub sound_speed: f64, +} + +impl Atmosphere { + /// ISA state at `alt_ft` (International Standard Atmosphere, troposphere + + /// lower stratosphere; valid to ~20 km, i.e. well above any airliner). + pub fn isa(alt_ft: f64) -> Self { + let h = alt_ft * M_PER_FT; + let (t, p) = if h <= H_TROP { + let t = T0 - LAPSE * h; + // Barometric formula, troposphere: p = p0 (T/T0)^(g/(L·R)). + let p = P0 * (t / T0).powf(G0 / (LAPSE * R_AIR)); + (t, p) + } else { + let p_trop = P0 * (T_TROP / T0).powf(G0 / (LAPSE * R_AIR)); + // Isothermal layer: p = p_trop · exp(-g (h-11000)/(R·T)). + let p = p_trop * (-G0 * (h - H_TROP) / (R_AIR * T_TROP)).exp(); + (T_TROP, p) + }; + let density = p / (R_AIR * t); + let sound_speed = (GAMMA * R_AIR * t).sqrt(); + Self { + temperature_k: t, + pressure_pa: p, + density, + sound_speed, + } + } +} + +/// A parabolic drag polar plus the engine data needed to turn drag into fuel. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct PerfModel { + /// Reference wing area (m²). + pub wing_area_m2: f64, + /// Zero-lift drag coefficient (clean configuration). + pub cd0: f64, + /// Lift-induced drag factor `k` in `CD = CD0 + k·CL²`. + pub induced_k: f64, + /// Number of engines. + pub n_engines: u32, + /// Maximum (sea-level static) thrust per engine (N). + pub max_thrust_n: f64, + /// Cruise thrust-specific fuel consumption at the reference altitude, + /// in grams of fuel per newton of thrust per second — g/(N·s). + pub tsfc_cruise_g_per_ns: f64, + /// Idle fuel flow per engine (kg/s); the descent floor. + pub ff_idle_kgs: f64, + /// Altitude (ft) at which `tsfc_cruise_g_per_ns` is quoted. + pub ref_cruise_alt_ft: f64, +} + +impl PerfModel { + /// True airspeed (m/s) for a given Mach number at `alt_ft`. + pub fn tas_ms(&self, mach: f64, alt_ft: f64) -> f64 { + mach * Atmosphere::isa(alt_ft).sound_speed + } + + /// Total aerodynamic drag (N) in steady level flight at `mass_kg`, true + /// airspeed `tas_ms`, altitude `alt_ft`. + pub fn drag_n(&self, mass_kg: f64, tas_ms: f64, alt_ft: f64) -> f64 { + let atmos = Atmosphere::isa(alt_ft); + let q = 0.5 * atmos.density * tas_ms * tas_ms; // dynamic pressure (Pa) + let cl = (mass_kg * G0) / (q * self.wing_area_m2); + let cd = self.cd0 + self.induced_k * cl * cl; + q * self.wing_area_m2 * cd + } + + /// Effective TSFC at `alt_ft`. Turbofan TSFC scales roughly with √θ (θ = + /// local/reference temperature ratio): colder air aloft burns less per + /// newton, which is why jets climb to cruise. + fn tsfc_g_per_ns(&self, alt_ft: f64) -> f64 { + let t = Atmosphere::isa(alt_ft).temperature_k; + let t_ref = Atmosphere::isa(self.ref_cruise_alt_ft).temperature_k; + self.tsfc_cruise_g_per_ns * (t / t_ref).sqrt() + } + + /// Total fuel flow (kg/s) at the given state. `path_angle_rad` is the climb + /// (+) or descent (−) flight-path angle; the weight component along the path + /// adds to (climb) or subtracts from (descent) the thrust required. Never + /// falls below combined engine idle flow. + pub fn fuel_flow_kgs( + &self, + mass_kg: f64, + tas_ms: f64, + alt_ft: f64, + path_angle_rad: f64, + ) -> f64 { + let drag = self.drag_n(mass_kg, tas_ms, alt_ft); + let thrust_req = drag + mass_kg * G0 * path_angle_rad.sin(); + let ff_from_thrust = self.tsfc_g_per_ns(alt_ft) * thrust_req.max(0.0) / 1000.0; + let idle_floor = self.n_engines as f64 * self.ff_idle_kgs; + ff_from_thrust.max(idle_floor) + } + + /// Level-flight fuel flow in kg/h (convenience for cruise). + pub fn fuel_flow_kgph(&self, mass_kg: f64, tas_ms: f64, alt_ft: f64) -> f64 { + self.fuel_flow_kgs(mass_kg, tas_ms, alt_ft, 0.0) * S_PER_H + } + + /// Cruise fuel flow (kg/h) at `mass_kg` and `cruise_fl` (×100 ft), flying at + /// `mach`. + pub fn cruise_fuel_flow_kgph(&self, mass_kg: f64, cruise_fl: i32, mach: f64) -> f64 { + let alt_ft = cruise_fl as f64 * 100.0; + let tas = self.tas_ms(mach, alt_ft); + self.fuel_flow_kgph(mass_kg, tas, alt_ft) + } +} + +/// Convert a true airspeed in knots to m/s. +pub fn kt_to_ms(kt: f64) -> f64 { + kt * MS_PER_KT +} + +#[cfg(test)] +mod tests { + use super::*; + + fn a320() -> PerfModel { + PerfModel { + wing_area_m2: 124.0, + cd0: 0.018, + induced_k: 0.039, + n_engines: 2, + max_thrust_n: 117_900.0, + tsfc_cruise_g_per_ns: 0.0170, + ff_idle_kgs: 0.107, + ref_cruise_alt_ft: 35_000.0, + } + } + + #[test] + fn isa_matches_known_values() { + let sl = Atmosphere::isa(0.0); + assert!((sl.temperature_k - 288.15).abs() < 0.01); + assert!((sl.pressure_pa - 101_325.0).abs() < 1.0); + assert!((sl.density - 1.225).abs() < 0.001); + assert!((sl.sound_speed - 340.3).abs() < 0.5); + + // FL350: T ≈ 218.8 K, p ≈ 23.8 kPa, ρ ≈ 0.380 kg/m³. + let cruise = Atmosphere::isa(35_000.0); + assert!( + (cruise.temperature_k - 218.8).abs() < 0.5, + "{}", + cruise.temperature_k + ); + assert!( + (cruise.pressure_pa - 23_842.0).abs() < 200.0, + "{}", + cruise.pressure_pa + ); + assert!((cruise.density - 0.380).abs() < 0.005, "{}", cruise.density); + + // Tropopause is continuous across the layer boundary. + let below = Atmosphere::isa(36_089.0 - 1.0); + let above = Atmosphere::isa(36_089.0 + 1.0); + assert!((below.pressure_pa - above.pressure_pa).abs() < 5.0); + } + + #[test] + fn a320_cruise_fuel_flow_is_realistic() { + // ~64 t A320 at FL350, M0.78 burns roughly 2.0–2.5 t/h (both engines). + let ff = a320().cruise_fuel_flow_kgph(64_000.0, 350, 0.78); + assert!((2000.0..=2600.0).contains(&ff), "cruise ff = {ff:.0} kg/h"); + } + + #[test] + fn heavier_aircraft_burns_more() { + let m = a320(); + let light = m.cruise_fuel_flow_kgph(58_000.0, 350, 0.78); + let heavy = m.cruise_fuel_flow_kgph(72_000.0, 350, 0.78); + assert!( + heavy > light, + "heavy {heavy:.0} should exceed light {light:.0}" + ); + } + + #[test] + fn optimum_altitude_beats_low_altitude_for_same_mass() { + // For a given weight, cruising higher (thinner air) is more efficient + // until induced drag takes over — FL350 should beat FL200. + let m = a320(); + let low = m.cruise_fuel_flow_kgph(64_000.0, 200, 0.78); + let high = m.cruise_fuel_flow_kgph(64_000.0, 350, 0.78); + assert!(high < low, "high {high:.0} should beat low {low:.0}"); + } + + #[test] + fn descent_is_floored_at_idle() { + let m = a320(); + let tas = m.tas_ms(0.6, 20_000.0); + // A steep idle descent must not go below combined idle flow. + let ff = m.fuel_flow_kgs(64_000.0, tas, 20_000.0, (-6.0_f64).to_radians()); + let idle = m.n_engines as f64 * m.ff_idle_kgs; + assert!((ff - idle).abs() < 1e-9, "descent ff {ff} vs idle {idle}"); + } + + #[test] + fn climb_burns_more_than_cruise() { + let m = a320(); + let tas = m.tas_ms(0.60, 20_000.0); + let climb = m.fuel_flow_kgs(64_000.0, tas, 20_000.0, 5.0_f64.to_radians()); + let level = m.fuel_flow_kgs(64_000.0, tas, 20_000.0, 0.0); + assert!(climb > level, "climb {climb} should exceed level {level}"); + } +} diff --git a/crates/core/src/perf/profile.rs b/crates/core/src/perf/profile.rs new file mode 100644 index 0000000..75a6d36 --- /dev/null +++ b/crates/core/src/perf/profile.rs @@ -0,0 +1,147 @@ +//! Aircraft performance profile, loaded from `data/aircraft/.json`. + +use std::path::Path; + +use serde::{Deserialize, Serialize}; + +use crate::error::{CoreError, Result}; +use crate::perf::openap::PerfModel; + +/// Per-phase speeds and fuel flow plus regulatory reserves for one aircraft type. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct AircraftProfile { + pub icao: String, + pub name: String, + pub default_cruise_fl: i32, + pub phases: Phases, + pub reserves: Reserves, + /// Optional physics-based (OpenAP) coefficients. When present, fuel flow is + /// computed from drag at the actual mass/altitude instead of the fixed + /// per-phase `fuel_flow_kgph` figures. + #[serde(default)] + pub openap: Option, +} + +/// OpenAP-derived aerodynamic and engine coefficients plus mass envelope. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct OpenApParams { + pub wing_area_m2: f64, + pub cd0: f64, + pub induced_k: f64, + pub n_engines: u32, + pub engine: String, + pub max_thrust_n: f64, + pub tsfc_cruise_g_per_ns: f64, + pub ff_idle_kgs: f64, + pub ref_cruise_alt_ft: f64, + pub oew_kg: f64, + pub mtow_kg: f64, + pub mlw_kg: f64, + pub max_fuel_kg: f64, + pub cruise_mach: f64, +} + +impl OpenApParams { + /// Build the runtime physics model from these coefficients. + pub fn model(&self) -> PerfModel { + PerfModel { + wing_area_m2: self.wing_area_m2, + cd0: self.cd0, + induced_k: self.induced_k, + n_engines: self.n_engines, + max_thrust_n: self.max_thrust_n, + tsfc_cruise_g_per_ns: self.tsfc_cruise_g_per_ns, + ff_idle_kgs: self.ff_idle_kgs, + ref_cruise_alt_ft: self.ref_cruise_alt_ft, + } + } + + /// Default payload (kg) when the caller gives none: 70 % of a max-payload + /// proxy (MLW − OEW). A stand-in until real max-zero-fuel-weight data is + /// added; yields a realistic ~medium load factor. + pub fn default_payload_kg(&self) -> f64 { + 0.70 * (self.mlw_kg - self.oew_kg) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Phases { + pub climb: ClimbPhase, + pub cruise: CruisePhase, + pub descent: DescentPhase, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ClimbPhase { + pub ias_kt: f64, + pub mach: f64, + pub tas_kt: f64, + pub fuel_flow_kgph: f64, + pub roc_fpm: f64, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct CruisePhase { + pub mach: f64, + pub tas_kt: f64, + pub fuel_flow_kgph: f64, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct DescentPhase { + pub ias_kt: f64, + pub mach: f64, + pub tas_kt: f64, + pub fuel_flow_kgph: f64, + pub rod_fpm: f64, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Reserves { + pub final_reserve_min: f64, + pub contingency_pct: f64, + pub taxi_kg: f64, +} + +impl AircraftProfile { + /// Deserialize a profile from a JSON string. + pub fn from_json_str(json: &str) -> Result { + Ok(serde_json::from_str(json)?) + } + + /// Load `/.json`. + pub fn load(dir: &Path, icao: &str) -> Result { + let path = dir.join(format!("{}.json", icao.to_lowercase())); + let json = std::fs::read_to_string(&path).map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + CoreError::NotFound(format!("aircraft profile '{icao}' ({})", path.display())) + } else { + CoreError::Io(e) + } + })?; + Self::from_json_str(&json) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn loads_bundled_a320_profile() { + // data/aircraft lives at the workspace root, two levels up from this crate. + let dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../data/aircraft"); + let p = AircraftProfile::load(&dir, "A320").unwrap(); + assert_eq!(p.icao, "A320"); + assert_eq!(p.default_cruise_fl, 360); + assert!(p.phases.cruise.tas_kt > 400.0); + assert_eq!(p.reserves.final_reserve_min, 30.0); + } + + #[test] + fn missing_profile_is_not_found() { + let dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../data/aircraft"); + let err = AircraftProfile::load(&dir, "ZZZZ").unwrap_err(); + assert!(err.to_string().contains("ZZZZ"), "{err}"); + } +} diff --git a/crates/core/src/pfpx.rs b/crates/core/src/pfpx.rs new file mode 100644 index 0000000..c590c31 --- /dev/null +++ b/crates/core/src/pfpx.rs @@ -0,0 +1,120 @@ +//! Import PFPX `.route` files as seeds for our **own** route DB. +//! +//! PFPX stores one XML `.route` file per city-pair variant. We extract only the +//! filed route string (item-15 ``), keyed by the ADEP/ADES in the filename, +//! and store it in our `routes` table as an **unvalidated seed** (`source="pfpx"`). +//! These seeds are often years old, so they are re-validated / repaired against +//! the live IFPUV oracle (and OUR RAD) before use. Nothing PFPX-specific (its RAD +//! or navdata) is imported — only the route string, which we then make current. + +use std::fs; +use std::path::Path; + +use rusqlite::{params, Connection}; + +use crate::error::Result; + +/// A filed route extracted from a PFPX `.route` file. +#[derive(Debug, Clone, PartialEq)] +pub struct PfpxRoute { + pub adep: String, + pub ades: String, + /// Item-15 (airways + DCT), from ``. + pub route: String, + pub cycle: String, + pub dist_nm: f64, +} + +/// Value of the first `` element. +fn tag<'a>(s: &'a str, name: &str) -> Option<&'a str> { + let open = format!("<{name}>"); + let close = format!(""); + let i = s.find(&open)? + open.len(); + let rest = &s[i..]; + let j = rest.find(&close)?; + Some(rest[..j].trim()) +} + +/// Parse a `.route` XML body for the given ADEP/ADES. +pub fn parse_route_str(adep: &str, ades: &str, text: &str) -> Option { + let route = tag(text, "ATC")?.split_whitespace().collect::>().join(" "); + if route.is_empty() { + return None; + } + let cycle = tag(text, "Cycle").unwrap_or("").to_string(); + let dist_nm = tag(text, "TotalDistance").and_then(|s| s.parse().ok()).unwrap_or(0.0); + Some(PfpxRoute { + adep: adep.to_uppercase(), + ades: ades.to_uppercase(), + route, + cycle, + dist_nm, + }) +} + +/// Parse one `.route` file. ADEP/ADES come from the 8-char filename prefix +/// (`LFPGBIKF01.route` → LFPG, BIKF). `None` if it has no `` route. +pub fn parse_route_file(path: &Path) -> Option { + let stem = path.file_stem()?.to_str()?; + if stem.len() < 8 { + return None; + } + let (adep, ades) = (&stem[0..4], &stem[4..8]); + if !adep.chars().chain(ades.chars()).all(|c| c.is_ascii_alphanumeric()) { + return None; + } + let text = fs::read_to_string(path).ok()?; + parse_route_str(adep, ades, &text) +} + +/// Import every `.route` file in `dir` as an unvalidated seed into the `routes` +/// table (existing dep/dest/route rows are left untouched). Returns +/// `(parsed, inserted)`. +pub fn import_dir(conn: &mut Connection, dir: &Path) -> Result<(usize, usize)> { + let mut parsed = 0usize; + let mut inserted = 0usize; + let tx = conn.transaction()?; + for entry in fs::read_dir(dir)? { + let path = entry?.path(); + if path.extension().and_then(|e| e.to_str()) != Some("route") { + continue; + } + let Some(r) = parse_route_file(&path) else { continue }; + parsed += 1; + let source = if r.cycle.is_empty() { "pfpx".to_string() } else { format!("pfpx {}", r.cycle) }; + let n = tx.execute( + "INSERT INTO routes \ + (dep,dest,cruise_fl,route_string,dist_nm,via_airways,ifps_ok,ifps_errors,source,generated_at) \ + VALUES (?1,?2,0,?3,?4,0,0,'', ?5, datetime('now')) \ + ON CONFLICT(dep,dest,cruise_fl,route_string) DO NOTHING", + params![r.adep, r.ades, r.route, r.dist_nm, source], + )?; + inserted += n; + } + tx.commit()?; + Ok((parsed, inserted)) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_atc_route() { + let xml = "\ + OPALE UT421 BIG UT420 TNT DCT KEF\ + 1236.700000\ + AS1302"; + let r = parse_route_str("lfpg", "bikf", xml).unwrap(); + assert_eq!(r.adep, "LFPG"); + assert_eq!(r.ades, "BIKF"); + assert_eq!(r.route, "OPALE UT421 BIG UT420 TNT DCT KEF"); + assert_eq!(r.cycle, "AS1302"); + assert!((r.dist_nm - 1236.7).abs() < 0.1); + } + + #[test] + fn none_without_atc() { + assert!(parse_route_str("LFPG", "EGLL", "").is_none()); + } +} diff --git a/crates/core/src/rad.rs b/crates/core/src/rad.rs new file mode 100644 index 0000000..92e095a --- /dev/null +++ b/crates/core/src/rad.rs @@ -0,0 +1,262 @@ +//! Eurocontrol RAD (Route Availability Document) model + application. +//! +//! The *parsing* of the RAD Excel workbook lives in the `flightplanner-rad` +//! crate (it needs `calamine`); this module only holds the plain data model and +//! the logic to apply restrictions during routing/validation, so `core` stays +//! dependency-light. Callers load a [`RadData`] once and pass it in. + +use serde::{Deserialize, Serialize}; + +/// A named area (Annex 1): an ID mapping to a set of aerodrome ICAOs. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Area { + pub id: String, + pub airports: Vec, + pub region: String, +} + +/// Coarse classification of a DCT restriction's utilization text. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum DctKind { + /// The direct is not available (for some/all traffic). + Forbidden, + /// Available only for specific traffic (ARR/DEP a place, via a point, …). + ConditionalOnly, + /// Mandatory routing. + Compulsory, + Other, +} + +/// A DCT (direct) restriction (Annex 3B DCT). +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DctRestriction { + pub id: String, + pub from: String, + pub to: String, + pub lower_fl: Option, + pub upper_fl: Option, + /// `Y/N` column: is this direct available at all. + pub available: bool, + /// Free-text condition ("NOT AVBL FOR TFC …", "ONLY AVBL …", "COMPULSORY …"). + pub utilization: String, + /// `Even` / `Odd` / empty — permitted cruising-level parity. + pub direction: String, +} + +impl DctRestriction { + pub fn kind(&self) -> DctKind { + let u = self.utilization.to_uppercase(); + if u.contains("COMPULSORY") { + DctKind::Compulsory + } else if u.starts_with("NOT AVBL") || !self.available { + DctKind::Forbidden + } else if u.starts_with("ONLY AVBL") { + DctKind::ConditionalOnly + } else { + DctKind::Other + } + } + + /// Does this restriction's flight-level band contain `fl`? + /// (`lower` missing ⇒ 0, `upper` missing ⇒ unlimited.) + pub fn covers_fl(&self, fl: i32) -> bool { + fl >= self.lower_fl.unwrap_or(0) && fl <= self.upper_fl.unwrap_or(i32::MAX) + } +} + +/// A directed "allowed FRA direct" edge, extracted from the `A DCT B` point +/// sequences published in the RAD Annex 2 VIA-clauses. Together these form the +/// FRA connectivity graph that IFPS accepts in Free Route Airspace. +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct FraEdge { + pub from: String, + pub to: String, +} + +/// A published Free-Route-Airspace significant point (official EUROCONTROL FRA +/// points list). Roles: en-route `E`ntry/e`X`it/`I`ntermediate (`EX` = both); +/// arr/dep `A`/`D`. `level_lo`/`level_hi` are the point's usable FL band; `flos` +/// is its cruising-level orientation (ODD/EVEN/ALL…). +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct FraPoint { + pub name: String, + pub lat: f64, + pub lon: f64, + /// FRA area(s) the point belongs to (e.g. "SECSI", "SEE"). + pub areas: Vec, + /// En-route relevance: `E`, `X`, `I`, `EX`, or empty. + pub enroute: String, + /// Arr/dep relevance: `A`, `D`, `AD`, or empty. + pub arrdep: String, + pub arr_airports: Vec, + pub dep_airports: Vec, + pub flos: String, + pub level_lo: Option, + pub level_hi: Option, + /// FIR/ACC location indicators the point belongs to. + pub loc_ind: Vec, +} + +impl FraPoint { + /// Usable as an en-route waypoint (not withdrawn / not purely arr-dep). + pub fn is_enroute(&self) -> bool { + matches!(self.enroute.as_str(), "E" | "X" | "I" | "EX") + } + /// Is `fl` within the point's published level band? + pub fn covers_fl(&self, fl: i32) -> bool { + fl >= self.level_lo.unwrap_or(0) && fl <= self.level_hi.unwrap_or(i32::MAX) + } +} + +/// A city-pair flight-level cap (Annex 2A): traffic from `from` to `to` may not +/// file above `cap_fl`. `from`/`to` may name Annex-1 groups (expanded via areas). +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct LevelCap { + pub id: String, + pub from: Vec, + pub to: Vec, + /// The routing condition ("VIA …" / "EXC VIA …"); kept verbatim, ignored in v1. + pub condition: String, + /// Ceiling flight level (lowest FL mentioned in the capping cell). + pub cap_fl: Option, +} + +/// The parsed RAD (the parts we currently model). +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +pub struct RadData { + pub areas: Vec, + pub dct: Vec, + /// FRA connectivity edges (Annex 2 VIA-clauses); empty if not parsed. + #[serde(default)] + pub fra_edges: Vec, + /// City-pair flight-level caps (Annex 2A); empty if not parsed. + #[serde(default)] + pub level_caps: Vec, + /// Official EUROCONTROL FRA significant points (separate file); empty if not loaded. + #[serde(default)] + pub fra_points: Vec, +} + +impl RadData { + /// A **forbidden** DCT restriction matching `from`→`to` at `fl`, if any — + /// i.e. flying this direct would violate the RAD. + pub fn forbidden_dct(&self, from: &str, to: &str, fl: i32) -> Option<&DctRestriction> { + self.dct.iter().find(|d| { + d.kind() == DctKind::Forbidden + && d.from.eq_ignore_ascii_case(from) + && d.to.eq_ignore_ascii_case(to) + && d.covers_fl(fl) + }) + } + + /// Undirected adjacency map of the FRA connectivity graph (point → neighbours). + pub fn fra_adjacency(&self) -> std::collections::HashMap> { + let mut m: std::collections::HashMap> = std::collections::HashMap::new(); + for e in &self.fra_edges { + m.entry(e.from.clone()).or_default().push(e.to.clone()); + m.entry(e.to.clone()).or_default().push(e.from.clone()); + } + m + } + + /// The lowest RAD flight-level cap (Annex 2A) applying to `from`→`to`, or + /// `None` if uncapped. Group names in the From/To sets are expanded to their + /// Annex-1 airports. v1 applies matches unconditionally (ignores conditions). + pub fn max_cruise_fl(&self, from: &str, to: &str) -> Option { + let icao_in = |icao: &str, set: &[String]| -> bool { + set.iter().any(|s| { + s.eq_ignore_ascii_case(icao) + || self.areas.iter().any(|a| { + a.id.eq_ignore_ascii_case(s) + && a.airports.iter().any(|ap| ap.eq_ignore_ascii_case(icao)) + }) + }) + }; + self.level_caps + .iter() + .filter(|c| icao_in(from, &c.from) && icao_in(to, &c.to)) + .filter_map(|c| c.cap_fl) + .min() + } + + /// Count of restrictions by kind — for summaries/status. + pub fn dct_counts(&self) -> (usize, usize, usize) { + let mut forbidden = 0; + let mut only = 0; + let mut comp = 0; + for d in &self.dct { + match d.kind() { + DctKind::Forbidden => forbidden += 1, + DctKind::ConditionalOnly => only += 1, + DctKind::Compulsory => comp += 1, + DctKind::Other => {} + } + } + (forbidden, only, comp) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn restr(from: &str, to: &str, lo: i32, hi: i32, util: &str) -> DctRestriction { + DctRestriction { + id: "X".into(), + from: from.into(), + to: to.into(), + lower_fl: Some(lo), + upper_fl: Some(hi), + available: true, + utilization: util.into(), + direction: String::new(), + } + } + + #[test] + fn detects_forbidden_dct_in_band() { + let rad = RadData { + areas: vec![], + dct: vec![restr("ABC", "DEF", 100, 300, "NOT AVBL FOR TFC ARR EDDF")], + fra_edges: vec![], + level_caps: vec![], + fra_points: vec![], + }; + assert!(rad.forbidden_dct("ABC", "DEF", 200).is_some()); + assert!(rad.forbidden_dct("abc", "def", 200).is_some()); // case-insensitive + assert!(rad.forbidden_dct("ABC", "DEF", 350).is_none()); // above band + assert!(rad.forbidden_dct("DEF", "ABC", 200).is_none()); // directional + } + + #[test] + fn kind_classification() { + assert_eq!(restr("A", "B", 0, 999, "NOT AVBL FOR TFC X").kind(), DctKind::Forbidden); + assert_eq!(restr("A", "B", 0, 999, "ONLY AVBL FOR TFC ARR X").kind(), DctKind::ConditionalOnly); + assert_eq!(restr("A", "B", 0, 999, "ONLY AVBL AND COMPULSORY FOR X").kind(), DctKind::Compulsory); + } + + #[test] + fn max_cruise_fl_matches_and_expands_groups() { + let rad = RadData { + areas: vec![Area { + id: "GENEVA_AREA".into(), + airports: vec!["LSGG".into(), "LSGE".into()], + region: "LS".into(), + }], + dct: vec![], + fra_edges: vec![], + level_caps: vec![ + LevelCap { id: "R1".into(), from: vec!["LFPG".into()], to: vec!["GENEVA_AREA".into()], condition: String::new(), cap_fl: Some(345) }, + LevelCap { id: "R2".into(), from: vec!["LFPG".into()], to: vec!["LSGG".into()], condition: String::new(), cap_fl: Some(295) }, + LevelCap { id: "R3".into(), from: vec!["EGLL".into()], to: vec!["LSGG".into()], condition: String::new(), cap_fl: Some(200) }, + ], + fra_points: vec![], + }; + // LFPG→LSGG matches R1 (via group) and R2 → min cap 295. + assert_eq!(rad.max_cruise_fl("LFPG", "LSGG"), Some(295)); + // LFPG→LSGE only matches R1 (group) → 345. + assert_eq!(rad.max_cruise_fl("LFPG", "LSGE"), Some(345)); + // No matching pair. + assert_eq!(rad.max_cruise_fl("EDDF", "LEMD"), None); + } +} diff --git a/crates/core/src/routes.rs b/crates/core/src/routes.rs new file mode 100644 index 0000000..8beea53 --- /dev/null +++ b/crates/core/src/routes.rs @@ -0,0 +1,99 @@ +//! Our own database of flight plans — routes we've generated and IFPS-pre-checked, +//! cached per city pair in the `routes` table (see `db::schema`). + +use rusqlite::{params, Connection}; + +use crate::error::Result; + +const SEP: &str = " ||| "; + +/// A stored (generated + pre-checked) flight plan. +#[derive(Debug, Clone)] +pub struct CachedRoute { + pub dep: String, + pub dest: String, + pub cruise_fl: i32, + pub route_string: String, + pub dist_nm: f64, + pub via_airways: bool, + pub ifps_ok: bool, + pub ifps_errors: Vec, + pub source: String, + pub generated_at: String, +} + +/// Insert or refresh a route (unique on dep/dest/FL/route_string). +#[allow(clippy::too_many_arguments)] +pub fn record( + conn: &Connection, + dep: &str, + dest: &str, + cruise_fl: i32, + route_string: &str, + dist_nm: f64, + via_airways: bool, + ifps_ok: bool, + ifps_errors: &[String], + source: &str, +) -> Result<()> { + conn.execute( + "INSERT INTO routes \ + (dep,dest,cruise_fl,route_string,dist_nm,via_airways,ifps_ok,ifps_errors,source,generated_at) \ + VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9, datetime('now')) \ + ON CONFLICT(dep,dest,cruise_fl,route_string) DO UPDATE SET \ + dist_nm=excluded.dist_nm, via_airways=excluded.via_airways, ifps_ok=excluded.ifps_ok, \ + ifps_errors=excluded.ifps_errors, source=excluded.source, generated_at=excluded.generated_at", + params![ + dep.to_uppercase(), + dest.to_uppercase(), + cruise_fl, + route_string, + dist_nm, + via_airways as i32, + ifps_ok as i32, + ifps_errors.join(SEP), + source, + ], + )?; + Ok(()) +} + +/// Stored routes for a city pair, most recent first. +pub fn recent(conn: &Connection, dep: &str, dest: &str, limit: usize) -> Result> { + let mut stmt = conn.prepare( + "SELECT dep,dest,cruise_fl,route_string,dist_nm,via_airways,ifps_ok,ifps_errors,source,generated_at \ + FROM routes WHERE dep=?1 AND dest=?2 ORDER BY generated_at DESC LIMIT ?3", + )?; + let rows = stmt.query_map( + params![dep.to_uppercase(), dest.to_uppercase(), limit as i64], + |r| { + let errs: String = r.get(7)?; + Ok(CachedRoute { + dep: r.get(0)?, + dest: r.get(1)?, + cruise_fl: r.get(2)?, + route_string: r.get(3)?, + dist_nm: r.get(4)?, + via_airways: r.get::<_, i32>(5)? != 0, + ifps_ok: r.get::<_, i32>(6)? != 0, + ifps_errors: if errs.is_empty() { + Vec::new() + } else { + errs.split(SEP).map(str::to_string).collect() + }, + source: r.get(8)?, + generated_at: r.get(9)?, + }) + }, + )?; + let mut out = Vec::new(); + for row in rows { + out.push(row?); + } + Ok(out) +} + +/// Total number of stored routes. +pub fn count(conn: &Connection) -> Result { + Ok(conn.query_row("SELECT COUNT(*) FROM routes", [], |r| r.get(0))?) +} diff --git a/crates/core/src/routing/discover.rs b/crates/core/src/routing/discover.rs new file mode 100644 index 0000000..bf16956 --- /dev/null +++ b/crates/core/src/routing/discover.rs @@ -0,0 +1,607 @@ +//! Oracle-in-the-loop route discovery. +//! +//! Offline synthesis can't guarantee IFPS validity (the RAD is thousands of +//! conditional rules). Instead we generate a candidate, submit it to an +//! authoritative [`IfpsValidator`] (the public Eurocontrol IFPUV), read its +//! precise feedback, mechanically repair the route, and re-validate — until it +//! is ACCEPTED. The loop is **monotonic**: a repair is kept only if it strictly +//! reduces the error count, so the result is never worse than the first draft. +//! +//! v1 repairs the mechanical, high-impact error classes: +//! * `ROUTE165` (DCT too long in a TMA/area) → reroute that segment via airways +//! * `PROF204/205` flight-level caps → move the cruise level into the window +//! * `ROUTE130` unknown designator → drop the token +//! Mandatory-routing / FRA-border errors (`PROF205 mandatory`, `ROUTE52`) are +//! reported, not auto-fixed, in v1. + +use rusqlite::Connection; +use serde::{Deserialize, Serialize}; + +use std::collections::HashSet; + +use crate::error::Result; + +use super::{airway_path, plan_preferred, Leg, Route}; + +/// One IFPS message (code + text). +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct IfpsErr { + pub code: String, + pub msg: String, +} + +/// Verdict from an authoritative IFPS validator. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct IfpsVerdict { + pub accepted: bool, + pub errors: Vec, +} + +/// Something that can validate an ICAO route against IFPS. Implemented in the app +/// layer by spawning the IFPUV scraper; mocked in tests. +pub trait IfpsValidator { + /// Validate item-15 `route` from `adep` to `ades` at flight level `fl`. + fn validate(&self, adep: &str, ades: &str, route: &str, fl: i32) -> Result; +} + +/// Outcome of a discovery run. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DiscoverResult { + pub accepted: bool, + pub route_string: String, + /// Item-15 (enroute) portion that was validated. + pub item15: String, + pub fl: i32, + pub total_nm: f64, + pub errors: Vec, + pub iterations: usize, + pub log: Vec, +} + +/// ICAO item-15 (enroute) string for a route: start at the SID exit fix, then +/// `airway to` for each enroute leg, ending at the STAR entry fix. The leading +/// SID and trailing STAR (first/last leg) are omitted — IFPS derives them. +pub fn route_item15(route: &Route) -> String { + let legs = &route.legs; + match legs.len() { + 0 => String::new(), + 1 => "DCT".to_owned(), + n => { + let mut s = legs[0].to.clone(); + for leg in &legs[1..n - 1] { + s.push(' '); + s.push_str(&leg.airway); + s.push(' '); + s.push_str(&leg.to); + } + s + } + } +} + +fn fl3(fl: i32) -> String { + format!("F{:03}", fl) +} + +// ── error parsing ─────────────────────────────────────────────────────────── + +/// The `A..B` fix pair from a `ROUTE165` "DCT SEGMENT A..B (n NM) IS TOO LONG". +fn parse_too_long(msg: &str) -> Option<(String, String)> { + let up = msg.to_uppercase(); + let seg = up.split("SEGMENT ").nth(1)?; + let pair = seg.split(" (").next()?.trim(); // "A..B" + let (a, b) = pair.split_once("..")?; + let (a, b) = (a.trim(), b.trim()); + // Only simple single-token idents (skip the verbose ROUTE52 form with spaces). + if a.is_empty() || b.is_empty() || a.contains(' ') || b.contains(' ') { + return None; + } + Some((a.to_owned(), b.to_owned())) +} + +/// The `(A, B)` fix pair from a `PROF195` "A AWY B DOES NOT EXIST IN FL RANGE …" +/// (an airway that isn't valid at the current flight level). +fn parse_fl_gap(msg: &str) -> Option<(String, String)> { + let up = msg.to_uppercase(); + let head = up.split(" DOES NOT EXIST").next()?; // "DIK T856 ADUSU" + let toks: Vec<&str> = head.split_whitespace().collect(); + if toks.len() < 3 { + return None; + } + let (a, b) = (toks[0], toks[toks.len() - 1]); + if a.is_empty() || b.is_empty() { + return None; + } + Some((a.to_owned(), b.to_owned())) +} + +/// A forbidden flight-level band expressed by a PROF204/205 message. +#[derive(Default, Clone, Copy)] +struct Band { + ceiling: Option, // forbidden at/above this FL + floor: Option, // forbidden at/below this FL +} + +fn parse_band(msg: &str) -> Option { + let up = msg.to_uppercase(); + let mut band = Band::default(); + // `F..F` + if let Some(i) = up.find("..F") { + let before = &up[..i]; + if let Some(fpos) = before.rfind('F') { + let lo: String = before[fpos + 1..].chars().take_while(|c| c.is_ascii_digit()).collect(); + let hi: String = up[i + 3..].chars().take_while(|c| c.is_ascii_digit()).collect(); + if let (Ok(lo), Ok(hi)) = (lo.parse::(), hi.parse::()) { + if lo == 0 { + band.floor = Some(hi); // forbidden below hi → fly above + } else { + // `Fa..F999` (ceiling) OR a narrow hole `Fa..Fb`: in both + // cases flying below `a` avoids it → treat as a ceiling at a. + band.ceiling = Some(lo); + } + } + } + } + // `NOT ABV FL` (also covers `RFL NOT ABV FL335/FL355` → the lower cap) + if let Some(i) = up.find("NOT ABV FL") { + let x: String = up[i + "NOT ABV FL".len()..].chars().take_while(|c| c.is_ascii_digit()).collect(); + if let Ok(x) = x.parse::() { + band.ceiling = Some(band.ceiling.map_or(x, |c| c.min(x))); + } + } + (band.ceiling.is_some() || band.floor.is_some()).then_some(band) +} + +/// The `X` from `ROUTE130 UNKNOWN DESIGNATOR X`. +fn parse_unknown(msg: &str) -> Option { + let up = msg.to_uppercase(); + let rest = up.split("UNKNOWN DESIGNATOR ").nth(1)?; + rest.split_whitespace().next().map(str::to_owned).filter(|s| !s.is_empty()) +} + +// ── repairs ───────────────────────────────────────────────────────────────── + +fn total_nm(legs: &[Leg]) -> f64 { + legs.iter().map(|l| l.dist_nm).sum() +} + +/// Try to repair `route`/`fl` from `errors`. Returns the new route/fl and a note, +/// or `None` when no repair applies. One class of repair per call. `from`/`to` +/// and the connector fixes let the FL repair re-plan the route at the new level. +#[allow(clippy::too_many_arguments)] +fn apply_repairs( + conn: &Connection, + from: &str, + to: &str, + dep_fixes: &[String], + dest_fixes: &[String], + route: &Route, + fl: i32, + errors: &[IfpsErr], +) -> Result> { + // 1) Re-route a broken segment through the FL-filtered airway graph: + // ROUTE165 (DCT too long in a TMA) and PROF195 (airway not valid at this + // FL — e.g. we lowered FL for a RAD cap and broke a high-level airway). + let mut segs: Vec<(String, String)> = errors + .iter() + .filter_map(|e| match e.code.as_str() { + "ROUTE165" => parse_too_long(&e.msg), + "PROF195" => parse_fl_gap(&e.msg), + _ => None, + }) + .collect(); + segs.sort(); + segs.dedup(); + if !segs.is_empty() { + let mut legs: Vec = Vec::with_capacity(route.legs.len()); + let mut spliced = Vec::new(); + for leg in &route.legs { + // Any leg matching a broken segment (DCT or airway) is re-routed. + let hit = segs.iter().any(|(a, b)| a == &leg.from && b == &leg.to); + if hit { + if let Some(path) = airway_path(conn, &leg.from, &leg.to, Some(fl))? { + spliced.push(format!("{}..{}", leg.from, leg.to)); + legs.extend(path); + continue; + } + } + legs.push(leg.clone()); + } + if !spliced.is_empty() { + let nm = total_nm(&legs); + return Ok(Some(( + Route { legs, total_nm: nm, via_airways: true }, + fl, + format!("airway-splice {}", spliced.join(", ")), + ))); + } + } + + // 2) FL caps → move into the allowed window. + let mut ceiling = i32::MAX; + let mut floor = 0; + let mut saw = false; + for e in errors { + if e.code != "PROF204" && e.code != "PROF205" { + continue; + } + if let Some(b) = parse_band(&e.msg) { + saw = true; + if let Some(c) = b.ceiling { + ceiling = ceiling.min(c); + } + if let Some(f) = b.floor { + floor = floor.max(f); + } + } + } + // Move the cruise level into the allowed window `(floor, ceiling)`. Handles + // both a ceiling (fly lower) and a floor (fly higher — e.g. after we over- + // lowered). Empty window (floor ≥ ceiling) ⇒ genuine conflict, no fix. + if saw { + let ceil = if ceiling == i32::MAX { 600 } else { ceiling }; + let hi_bound = ((ceil - 5) / 10) * 10; // highest 10s FL below the ceiling + let lo_bound = (floor / 10 + 1) * 10; // lowest 10s FL above the floor + let outside = fl >= ceil || fl <= floor; + if outside && lo_bound <= hi_bound { + // prefer a standard cruise level inside the window + let target = 360.clamp(lo_bound, hi_bound); + if target != fl && target >= 60 { + // Re-plan at the new level so airways are valid there (a route + // planned at F360 may use airways that don't exist at F190). + let replanned = super::plan_route_best(conn, from, to, Some(target), dep_fixes, dest_fixes) + .ok() + .filter(|r| r.legs.len() >= 2); + let (route, how) = match replanned { + Some(r) => (r, "re-planned"), + None => (route.clone(), "same route"), + }; + return Ok(Some((route, target, format!("RAD level window → {} ({how})", fl3(target))))); + } + } + } + + // 3) unknown designators → drop the token. + let drop: Vec = errors + .iter() + .filter(|e| e.code == "ROUTE130") + .filter_map(|e| parse_unknown(&e.msg)) + .collect(); + if !drop.is_empty() { + let legs: Vec = route + .legs + .iter() + .filter(|l| !drop.iter().any(|d| d == &l.to || d == &l.airway)) + .cloned() + .collect(); + if legs.len() != route.legs.len() && legs.len() >= 1 { + let nm = total_nm(&legs); + return Ok(Some(( + Route { legs, total_nm: nm, via_airways: route.via_airways }, + fl, + format!("drop {}", drop.join(", ")), + ))); + } + } + + Ok(None) +} + +// ── the loop ──────────────────────────────────────────────────────────────── + +/// Maximum validate/repair iterations (each is one live IFPUV round-trip). +const MAX_ITERS: usize = 8; + +/// Max attempts with different SID/STAR gateways (each is a full inner run). +const MAX_GATEWAY_ATTEMPTS: usize = 3; + +/// Discover an IFPS-valid route from `from` to `to`. Runs the candidate/repair +/// loop; if it stalls on a SID/STAR **gateway limit** (`ROUTE135`/`ROUTE134`), it +/// excludes that gateway fix and retries via another, up to +/// [`MAX_GATEWAY_ATTEMPTS`]. Returns the best (fewest-error) result seen; +/// `accepted` means IFPS no-error. +#[allow(clippy::too_many_arguments)] +pub fn find_valid_route( + conn: &Connection, + from: &str, + to: &str, + dep_sid: &[(String, String)], + dest_star: &[(String, String)], + start_fl: i32, + rad: Option<&crate::rad::RadData>, + validator: &dyn IfpsValidator, +) -> Result { + let mut excl_dep: HashSet = HashSet::new(); + let mut excl_dest: HashSet = HashSet::new(); + let mut full_log: Vec = Vec::new(); + let mut best: Option = None; + + for attempt in 1..=MAX_GATEWAY_ATTEMPTS { + let dsid: Vec<(String, String)> = + dep_sid.iter().filter(|(_, f)| !excl_dep.contains(&f.to_uppercase())).cloned().collect(); + let dstar: Vec<(String, String)> = + dest_star.iter().filter(|(_, f)| !excl_dest.contains(&f.to_uppercase())).cloned().collect(); + if attempt > 1 { + full_log.push(format!("— gateway attempt {attempt} —")); + } + + let res = attempt_once(conn, from, to, &dsid, &dstar, start_fl, rad, validator)?; + full_log.extend(res.log.iter().cloned()); + if res.accepted { + let mut r = res; + r.log = full_log; + return Ok(r); + } + let swap = res.errors.iter().find_map(gateway_fix); + if best.as_ref().map(|b| res.errors.len() < b.errors.len()).unwrap_or(true) { + best = Some(res); + } + match swap { + Some((is_dep, fix)) if attempt < MAX_GATEWAY_ATTEMPTS => { + full_log.push(format!("gateway limit on {fix} → excluding and retrying")); + if is_dep { + excl_dep.insert(fix); + } else { + excl_dest.insert(fix); + } + } + _ => break, + } + } + let mut r = best.expect("at least one attempt ran"); + r.log = full_log; + Ok(r) +} + +/// One discovery attempt with a fixed set of allowed gateways: generate the seed +/// / FRA / airway candidates, start the repair loop from whichever the oracle +/// rates best. +#[allow(clippy::too_many_arguments)] +fn attempt_once( + conn: &Connection, + from: &str, + to: &str, + dep_sid: &[(String, String)], + dest_star: &[(String, String)], + start_fl: i32, + rad: Option<&crate::rad::RadData>, + validator: &dyn IfpsValidator, +) -> Result { + let dep_fixes: Vec = dep_sid.iter().map(|(_, f)| f.clone()).collect(); + let dest_fixes: Vec = dest_star.iter().map(|(_, f)| f.clone()).collect(); + let mut candidates: Vec<(&str, Route)> = Vec::new(); + // Official FRA-points corridor first — routes the *right* points (dep/arr/ + // intermediate roles + level availability) from the EUROCONTROL FRA list. + if let Some(r) = rad.filter(|r| !r.fra_points.is_empty()).and_then(|r| { + super::fra_points::plan_fra_points(conn, from, to, start_fl, &r.fra_points, Some(r)) + .ok() + .flatten() + }) { + if r.legs.len() >= 2 { + candidates.push(("fra-points", r)); + } + } + // Real filed seeds next (e.g. imported PFPX routes) — a real route, even if + // stale, is a far better starting point for the oracle than pure synthesis. + if let Ok(stored) = crate::routes::recent(conn, from, to, 6) { + if let Some(seed) = stored.iter().find(|s| s.source.starts_with("pfpx")) { + if let Ok(Some(r)) = super::parse_route_string(conn, from, to, &seed.route_string) { + if r.legs.len() >= 2 { + candidates.push(("seed", r)); + } + } + } + } + if let Ok(r) = plan_preferred(conn, from, to, dep_sid, dest_star, Some(start_fl), rad) { + candidates.push(("fra", r)); + } + if let Ok(r) = super::plan_route_best(conn, from, to, Some(start_fl), &dep_fixes, &dest_fixes) { + candidates.push(("airway", r)); + } + + let mut pre_log: Vec = Vec::new(); + let mut chosen: Option<(Route, IfpsVerdict)> = None; + for (tag, cand) in candidates { + let v = validator.validate(from, to, &route_item15(&cand), start_fl)?; + pre_log.push(format!("candidate {tag}: {} err{}", v.errors.len(), if v.accepted { " (ACCEPTED)" } else { "" })); + let better = chosen.as_ref().map(|(_, cv)| v.errors.len() < cv.errors.len()).unwrap_or(true); + let accepted = v.accepted; + if better { + chosen = Some((cand, v)); + } + if accepted { + break; + } + } + let (initial, verdict) = + chosen.ok_or_else(|| crate::error::CoreError::Routing("no route candidate".into()))?; + + let mut res = run_loop(conn, from, to, &dep_fixes, &dest_fixes, initial, verdict, start_fl, validator)?; + pre_log.append(&mut res.log); + res.log = pre_log; + Ok(res) +} + +/// A SID/STAR gateway fix to exclude, parsed from a `ROUTE135` (SID) / `ROUTE134` +/// (STAR) "…LIMIT IS EXCEEDED … CONNECTING TO ." Returns `(is_dep_sid, fix)`. +fn gateway_fix(e: &IfpsErr) -> Option<(bool, String)> { + let is_dep = match e.code.as_str() { + "ROUTE135" => true, // SID limit + "ROUTE134" => false, // STAR limit + _ => return None, + }; + let up = e.msg.to_uppercase(); + let fix = up + .split("CONNECTING TO ") + .nth(1)? + .split_whitespace() + .next()? + .trim_end_matches('.') + .to_string(); + (!fix.is_empty()).then_some((is_dep, fix)) +} + +/// The validate/repair loop over a chosen `initial` candidate and its already +/// obtained `initial_verdict`. Separated so it can be unit-tested with a mock +/// validator and injected verdicts. +#[allow(clippy::too_many_arguments)] +pub fn run_loop( + conn: &Connection, + from: &str, + to: &str, + dep_fixes: &[String], + dest_fixes: &[String], + initial: Route, + initial_verdict: IfpsVerdict, + start_fl: i32, + validator: &dyn IfpsValidator, +) -> Result { + let mut cur = initial; + let mut fl = start_fl; + let mut verdict = initial_verdict; + let mut log: Vec = Vec::new(); + let mut best: Option<(Route, i32, Vec)> = None; + let mut iterations = 0; + + for i in 1..=MAX_ITERS { + iterations = i; + if verdict.accepted { + log.push(format!("iter {i}: {} → ACCEPTED", fl3(fl))); + best = Some((cur, fl, Vec::new())); + break; + } + if let Some((_, _, berr)) = &best { + if verdict.errors.len() >= berr.len() { + log.push(format!( + "iter {i}: {} → {} err (not better than {}) — reverting", + fl3(fl), + verdict.errors.len(), + berr.len() + )); + break; + } + } + let codes: Vec<&str> = verdict.errors.iter().map(|e| e.code.as_str()).collect(); + best = Some((cur.clone(), fl, verdict.errors.clone())); + match apply_repairs(conn, from, to, dep_fixes, dest_fixes, &cur, fl, &verdict.errors)? { + Some((r, nfl, note)) => { + log.push(format!("iter {i}: {} → {} err [{}] | fix: {note}", fl3(fl), verdict.errors.len(), codes.join(","))); + cur = r; + fl = nfl; + verdict = validator.validate(from, to, &route_item15(&cur), fl)?; + } + None => { + log.push(format!("iter {i}: {} → {} err [{}] | no auto-fix", fl3(fl), verdict.errors.len(), codes.join(","))); + break; + } + } + } + + let (route, vfl, errors) = best.expect("loop runs at least once"); + Ok(DiscoverResult { + accepted: errors.is_empty(), + route_string: route.route_string(), + item15: route_item15(&route), + fl: vfl, + total_nm: route.total_nm, + errors, + iterations, + log, + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::cell::RefCell; + + fn leg(from: &str, awy: &str, to: &str, nm: f64) -> Leg { + Leg { from: from.into(), airway: awy.into(), to: to.into(), dist_nm: nm } + } + + #[test] + fn item15_skips_sid_star_and_keeps_airways() { + let route = Route { + legs: vec![ + leg("LFPG", "OPAL6A", "OPALE", 20.0), + leg("OPALE", "DCT", "KESAX", 15.0), + leg("KESAX", "UN491", "DIMAL", 30.0), + leg("DIMAL", "ALES1H", "EGLL", 40.0), + ], + total_nm: 105.0, + via_airways: false, + }; + assert_eq!(route_item15(&route), "OPALE DCT KESAX UN491 DIMAL"); + } + + #[test] + fn parses_error_messages() { + assert_eq!( + parse_too_long("THE DCT SEGMENT KOGAS..VEVAR (66 NM) IS TOO LONG FOR LFMMDCTX. MAXIMUM IS 0 NM"), + Some(("KOGAS".into(), "VEVAR".into())) + ); + assert_eq!(parse_unknown("UNKNOWN DESIGNATOR AGOP6A").as_deref(), Some("AGOP6A")); + assert_eq!(parse_band("VIA EG LF:F245..F999 IS ON FORBIDDEN ROUTE").unwrap().ceiling, Some(245)); + assert_eq!(parse_band("RFL NOT ABV FL335/FL355").unwrap().ceiling, Some(335)); + // narrow forbidden band F355..F365 → fly below 355 (ceiling), not a floor + let hole = parse_band("VIA BOMBI GIGET:F355..F365 IS ON FORBIDDEN ROUTE").unwrap(); + assert_eq!((hole.ceiling, hole.floor), (Some(355), None)); + assert_eq!( + parse_fl_gap("DIK T856 ADUSU DOES NOT EXIST IN FL RANGE F000..F245"), + Some(("DIK".into(), "ADUSU".into())) + ); + } + + /// A mock validator that replays a scripted sequence of verdicts, so we can + /// test the loop's monotonicity + repair ordering without any network. + struct Mock { + script: RefCell>, + } + impl IfpsValidator for Mock { + fn validate(&self, _a: &str, _b: &str, _r: &str, _fl: i32) -> Result { + let mut s = self.script.borrow_mut(); + Ok(if s.is_empty() { IfpsVerdict { accepted: true, errors: vec![] } } else { s.remove(0) }) + } + } + + fn err(code: &str, msg: &str) -> IfpsErr { + IfpsErr { code: code.into(), msg: msg.into() } + } + + fn route3() -> Route { + // A short enroute route so item-15 has a fix; no airways to splice. + Route { + legs: vec![leg("LFPG", "SID1A", "AAAAA", 20.0), leg("AAAAA", "DCT", "BBBBB", 40.0), leg("BBBBB", "STAR1", "LFMN", 30.0)], + total_nm: 90.0, + via_airways: false, + } + } + + #[test] + fn loop_reverts_when_a_fix_makes_it_worse() { + let conn = Connection::open_in_memory().unwrap(); + // iter1: one FL-cap error (fixable) → lower FL; iter2: 3 errors (worse) + // → revert and report the F360 / 1-error state. + let initial = IfpsVerdict { accepted: false, errors: vec![err("PROF204", "EG LF:F245..F999 IS ON FORBIDDEN ROUTE")] }; + let mock = Mock { + script: RefCell::new(vec![IfpsVerdict { + accepted: false, + errors: vec![err("X1", "a"), err("X2", "b"), err("X3", "c")], + }]), + }; + let r = run_loop(&conn, "LFPG", "LFMN", &[], &[], route3(), initial, 360, &mock).unwrap(); + assert!(!r.accepted); + assert_eq!(r.fl, 360, "reverted to the pre-fix level"); + assert_eq!(r.errors.len(), 1, "best (fewest-error) state is kept"); + } + + #[test] + fn loop_accepts_after_level_fix() { + let conn = Connection::open_in_memory().unwrap(); + let initial = IfpsVerdict { accepted: false, errors: vec![err("PROF204", "LF:F245..F999 IS ON FORBIDDEN ROUTE")] }; + let mock = Mock { script: RefCell::new(vec![IfpsVerdict { accepted: true, errors: vec![] }]) }; + let r = run_loop(&conn, "LFPG", "LFMN", &[], &[], route3(), initial, 360, &mock).unwrap(); + assert!(r.accepted, "log: {:?}", r.log); + assert_eq!(r.fl, 240, "lowered below the 245 cap"); + } +} diff --git a/crates/core/src/routing/fra.rs b/crates/core/src/routing/fra.rs new file mode 100644 index 0000000..06d6f20 --- /dev/null +++ b/crates/core/src/routing/fra.rs @@ -0,0 +1,205 @@ +//! Free Route Airspace (FRA) routing. +//! +//! Modern European enroute airspace is *free route*: flight plans are filed as a +//! chain of **DCT** (directs) between published points, not along airways. This +//! router builds such a chain from the SID exit fix to the STAR entry fix, +//! anchoring on real waypoints roughly along the great circle, and skipping +//! directs the RAD marks as forbidden. +//! +//! It is a heuristic (it can't know the exact FRA horizontal entry/exit points), +//! so it produces FRA-*style* routes — closer to reality than airway routing — +//! but, like any offline engine, it can't *guarantee* IFPS acceptance. + +use rusqlite::{params, Connection}; + +use crate::error::Result; +use crate::model::LatLon; +use crate::rad::RadData; + +use super::{airport_pos, Leg, Route}; + +/// Spacing between DCT anchor points along the route. +const ANCHOR_STEP_NM: f64 = 170.0; +/// Max cross-track distance to accept a waypoint as an anchor. +const ANCHOR_MAX_XTK_NM: f64 = 55.0; + +/// Plan a FRA route from `from_icao` to `to_icao`. `dep_exits` are the SID exit +/// fixes, `star_entries` the STAR entry fixes; the enroute portion is a DCT chain +/// between them. `rad`, when given, removes RAD-forbidden directs. +pub fn plan_fra( + conn: &Connection, + from_icao: &str, + to_icao: &str, + dep_sids: &[(String, String)], + star_entries: &[(String, String)], + cruise_fl: i32, + rad: Option<&RadData>, +) -> Result { + let dep = airport_pos(conn, from_icao)?; + let dst = airport_pos(conn, to_icao)?; + + // Pick the SID exit / STAR entry that lies most *on the way* (minimises the + // dep→fix→dest detour), not just the first that resolves — otherwise a SID + // heading the wrong way (e.g. LFPG AGOP6A→RBT, south) gets chosen for a + // northbound flight. + let start = resolve_fix(conn, dep_sids, dep, dep, dst); // (sid_name, fix, pos) + let end = resolve_fix(conn, star_entries, dst, dep, dst); // (star_name, fix, pos) + let start_pos = start.as_ref().map(|(_, _, p)| *p).unwrap_or(dep); + let end_pos = end.as_ref().map(|(_, _, p)| *p).unwrap_or(dst); + + let wps = load_box(conn, dep, dst, 2.5)?; + + // Ordered points: DEP → [SID exit] → anchors → [STAR entry] → DEST. + let mut points: Vec<(String, LatLon)> = vec![(from_icao.to_uppercase(), dep)]; + if let Some((_, fix, pos)) = &start { + points.push((fix.clone(), *pos)); + } + + let span = start_pos.distance_nm(&end_pos); + let n = (span / ANCHOR_STEP_NM).floor() as usize; + for i in 1..=n { + let frac = i as f64 / (n + 1) as f64; + let target = interpolate(start_pos, end_pos, frac); + if let Some((id, pos)) = nearest_wp(&wps, target, ANCHOR_MAX_XTK_NM) { + let prev = &points.last().unwrap().0; + if prev == &id { + continue; + } + if let Some(rad) = rad { + if rad.forbidden_dct(prev, &id, cruise_fl).is_some() { + continue; // RAD forbids this direct — skip the anchor + } + } + points.push((id, pos)); + } + } + + if let Some((_, fix, pos)) = &end { + if points.last().map(|(id, _)| id != fix).unwrap_or(true) { + points.push((fix.clone(), *pos)); + } + } + points.push((to_icao.to_uppercase(), dst)); + + // First leg = SID (dep → its exit fix), last leg = STAR (entry fix → dest), + // middle legs are DCT. + let sid = start.as_ref().map(|(n, _, _)| n.clone()); + let star = end.as_ref().map(|(n, _, _)| n.clone()); + let last = points.len().saturating_sub(2); + let mut legs = Vec::with_capacity(last + 1); + let mut total_nm = 0.0; + for (i, w) in points.windows(2).enumerate() { + let d = w[0].1.distance_nm(&w[1].1); + total_nm += d; + let airway = if i == 0 { + sid.clone().unwrap_or_else(|| "DCT".to_owned()) + } else if i == last { + star.clone().unwrap_or_else(|| "DCT".to_owned()) + } else { + "DCT".to_owned() + }; + legs.push(Leg { + from: w[0].0.clone(), + to: w[1].0.clone(), + airway, + dist_nm: d, + }); + } + Ok(Route { + legs, + total_nm, + via_airways: false, + }) +} + +/// The (procedure, fix) best aligned with the flight: among connectors whose fix +/// resolves to a position (disambiguated nearest `near`), the one minimising the +/// `dep → fix → dst` detour. Returns `(procedure_name, fix_ident, position)`. +fn resolve_fix( + conn: &Connection, + procs: &[(String, String)], + near: LatLon, + dep: LatLon, + dst: LatLon, +) -> Option<(String, String, LatLon)> { + procs + .iter() + .filter_map(|(name, fix)| { + point_pos(conn, fix, near).map(|p| (name.clone(), fix.to_uppercase(), p)) + }) + .min_by(|a, b| { + let da = dep.distance_nm(&a.2) + a.2.distance_nm(&dst); + let db = dep.distance_nm(&b.2) + b.2.distance_nm(&dst); + da.total_cmp(&db) + }) +} + +/// Position of `ident` (waypoint or navaid), nearest to `near` when ambiguous. +fn point_pos(conn: &Connection, ident: &str, near: LatLon) -> Option { + let mut cands: Vec = Vec::new(); + for sql in [ + "SELECT lat, lon FROM waypoints WHERE ident = ?1", + "SELECT lat, lon FROM navaids WHERE ident = ?1", + ] { + if let Ok(mut stmt) = conn.prepare(sql) { + if let Ok(rows) = + stmt.query_map(params![ident], |r| Ok(LatLon::new(r.get(0)?, r.get(1)?))) + { + cands.extend(rows.flatten()); + } + } + } + cands + .into_iter() + .min_by(|a, b| a.distance_nm(&near).total_cmp(&b.distance_nm(&near))) +} + +/// Load waypoints + navaids inside the dep/dest bounding box (+`margin` degrees). +fn load_box(conn: &Connection, a: LatLon, b: LatLon, margin: f64) -> Result> { + let (min_lat, max_lat) = (a.lat.min(b.lat) - margin, a.lat.max(b.lat) + margin); + let (min_lon, max_lon) = (a.lon.min(b.lon) - margin, a.lon.max(b.lon) + margin); + let mut out = Vec::new(); + for table in ["waypoints", "navaids"] { + let mut stmt = conn.prepare(&format!( + "SELECT ident, lat, lon FROM {table} \ + WHERE lat BETWEEN ?1 AND ?2 AND lon BETWEEN ?3 AND ?4" + ))?; + let rows = stmt.query_map(params![min_lat, max_lat, min_lon, max_lon], |r| { + Ok((r.get::<_, String>(0)?, LatLon::new(r.get(1)?, r.get(2)?))) + })?; + for row in rows { + out.push(row?); + } + } + Ok(out) +} + +/// Nearest waypoint to `target` within `max_xtk_nm`. +fn nearest_wp(wps: &[(String, LatLon)], target: LatLon, max_xtk_nm: f64) -> Option<(String, LatLon)> { + wps.iter() + .map(|(id, p)| (p.distance_nm(&target), id, p)) + .filter(|(d, _, _)| *d <= max_xtk_nm) + .min_by(|a, b| a.0.total_cmp(&b.0)) + .map(|(_, id, p)| (id.clone(), *p)) +} + +/// Spherical (great-circle) interpolation between two positions at fraction `f`. +fn interpolate(a: LatLon, b: LatLon, f: f64) -> LatLon { + let (lat1, lon1) = (a.lat.to_radians(), a.lon.to_radians()); + let (lat2, lon2) = (b.lat.to_radians(), b.lon.to_radians()); + let dlat = (lat2 - lat1) / 2.0; + let dlon = (lon2 - lon1) / 2.0; + let hav = dlat.sin().powi(2) + lat1.cos() * lat2.cos() * dlon.sin().powi(2); + let d = 2.0 * hav.sqrt().asin(); + if d.abs() < 1e-9 { + return a; + } + let ca = ((1.0 - f) * d).sin() / d.sin(); + let cb = (f * d).sin() / d.sin(); + let x = ca * lat1.cos() * lon1.cos() + cb * lat2.cos() * lon2.cos(); + let y = ca * lat1.cos() * lon1.sin() + cb * lat2.cos() * lon2.sin(); + let z = ca * lat1.sin() + cb * lat2.sin(); + let lat = z.atan2((x * x + y * y).sqrt()); + let lon = y.atan2(x); + LatLon::new(lat.to_degrees(), lon.to_degrees()) +} diff --git a/crates/core/src/routing/fra_graph.rs b/crates/core/src/routing/fra_graph.rs new file mode 100644 index 0000000..8f87ff3 --- /dev/null +++ b/crates/core/src/routing/fra_graph.rs @@ -0,0 +1,192 @@ +//! FRA routing over the **published** connectivity graph. +//! +//! [`crate::rad`] extracts the `A DCT B` point sequences from the RAD Annex 2 +//! VIA-clauses into a graph of allowed Free-Route directs. This router finds the +//! shortest great-circle path through that graph from a SID exit fix to a STAR +//! entry fix — so the enroute portion uses *real* published FRA points and +//! directs (what IFPS accepts), instead of invented anchors. + +use std::cmp::Ordering; +use std::collections::{BinaryHeap, HashMap}; + +use rusqlite::{params, Connection}; + +use crate::error::Result; +use crate::model::LatLon; + +use super::{airport_pos, Leg, Route}; + +/// Min-heap state for Dijkstra (ordered by ascending cost). +struct State { + cost: f64, + node: String, +} +impl PartialEq for State { + fn eq(&self, o: &Self) -> bool { + self.cost == o.cost + } +} +impl Eq for State {} +impl PartialOrd for State { + fn partial_cmp(&self, o: &Self) -> Option { + Some(self.cmp(o)) + } +} +impl Ord for State { + fn cmp(&self, o: &Self) -> Ordering { + // reversed: smaller cost = higher priority + o.cost.total_cmp(&self.cost) + } +} + +/// Plan a route through the FRA graph `adj` (point → neighbours). Chooses the SID +/// exit / STAR entry and the intermediate directs that minimise total distance. +/// Returns `None` when no SID exit and STAR entry are connected in the graph. +pub fn plan_fra_graph( + conn: &Connection, + from_icao: &str, + to_icao: &str, + dep_sids: &[(String, String)], + star_entries: &[(String, String)], + adj: &HashMap>, +) -> Result> { + if adj.is_empty() { + return Ok(None); + } + let dep = airport_pos(conn, from_icao)?; + let dst = airport_pos(conn, to_icao)?; + let mid = LatLon::new((dep.lat + dst.lat) / 2.0, (dep.lon + dst.lon) / 2.0); + + // Load every navdata point inside the dep→dest corridor (2 queries), keeping + // the one nearest the corridor mid per ident. FRA nodes outside the corridor + // are dropped — they can't be on a sensible path anyway. This bounds both the + // query count and the graph size (fast enough for interactive planning). + let pos = load_corridor(conn, dep, dst, mid, 3.0)?; + + // SID exit / STAR entry candidates that are present (and placeable) in the graph. + let name_of = |list: &[(String, String)]| -> HashMap { + let mut m = HashMap::new(); + for (name, fix) in list { + m.entry(fix.to_uppercase()).or_insert_with(|| name.clone()); + } + m + }; + let sid_name = name_of(dep_sids); + let star_name = name_of(star_entries); + let starts: Vec = sid_name.keys().filter(|f| pos.contains_key(*f)).cloned().collect(); + let goals: std::collections::HashSet = + star_name.keys().filter(|f| pos.contains_key(*f)).cloned().collect(); + if starts.is_empty() || goals.is_empty() { + return Ok(None); + } + + // Dijkstra from all starts (seeded by the DEP→exit leg distance) to any goal; + // goal cost includes the goal→DEST leg so we pick the best overall gateway. + let mut dist: HashMap = HashMap::new(); + let mut prev: HashMap = HashMap::new(); + let mut heap = BinaryHeap::new(); + for s in &starts { + let d0 = dep.distance_nm(&pos[s]); + if dist.get(s).map(|&d| d0 < d).unwrap_or(true) { + dist.insert(s.clone(), d0); + heap.push(State { cost: d0, node: s.clone() }); + } + } + + let mut best_goal: Option<(String, f64)> = None; + while let Some(State { cost, node }) = heap.pop() { + if cost > *dist.get(&node).unwrap_or(&f64::INFINITY) { + continue; + } + if goals.contains(&node) { + let total = cost + pos[&node].distance_nm(&dst); + if best_goal.as_ref().map(|(_, c)| total < *c).unwrap_or(true) { + best_goal = Some((node.clone(), total)); + } + } + let pu = pos[&node]; + for v in adj.get(&node).into_iter().flatten() { + let Some(pv) = pos.get(v) else { continue }; + let nd = cost + pu.distance_nm(pv); + if nd < *dist.get(v).unwrap_or(&f64::INFINITY) { + dist.insert(v.clone(), nd); + prev.insert(v.clone(), node.clone()); + heap.push(State { cost: nd, node: v.clone() }); + } + } + } + + let Some((goal, _)) = best_goal else { + return Ok(None); + }; + + // Reconstruct the point path start → … → goal. + let mut path = vec![goal.clone()]; + let mut cur = goal.clone(); + while let Some(p) = prev.get(&cur) { + path.push(p.clone()); + cur = p.clone(); + } + path.reverse(); + + // Assemble the route: DEP →(SID) path[0] → DCT … → path[last] →(STAR) DEST. + let mut pts: Vec<(String, LatLon)> = vec![(from_icao.to_uppercase(), dep)]; + for id in &path { + pts.push((id.clone(), pos[id])); + } + pts.push((to_icao.to_uppercase(), dst)); + + let sid = sid_name.get(&path[0]).cloned().unwrap_or_else(|| "DCT".into()); + let star = star_name.get(&goal).cloned().unwrap_or_else(|| "DCT".into()); + let last = pts.len().saturating_sub(2); + let mut legs = Vec::with_capacity(last + 1); + let mut total_nm = 0.0; + for (i, w) in pts.windows(2).enumerate() { + let d = w[0].1.distance_nm(&w[1].1); + total_nm += d; + let airway = if i == 0 { + sid.clone() + } else if i == last { + star.clone() + } else { + "DCT".to_owned() + }; + legs.push(Leg { from: w[0].0.clone(), to: w[1].0.clone(), airway, dist_nm: d }); + } + Ok(Some(Route { legs, total_nm, via_airways: false })) +} + +/// All navdata points (waypoints + navaids) inside the dep/dest bounding box +/// (+`margin` degrees), as ident → position, keeping the one nearest `near` when +/// an ident occurs more than once. +fn load_corridor( + conn: &Connection, + a: LatLon, + b: LatLon, + near: LatLon, + margin: f64, +) -> Result> { + let (min_lat, max_lat) = (a.lat.min(b.lat) - margin, a.lat.max(b.lat) + margin); + let (min_lon, max_lon) = (a.lon.min(b.lon) - margin, a.lon.max(b.lon) + margin); + let mut out: HashMap = HashMap::new(); + for table in ["waypoints", "navaids"] { + let mut stmt = conn.prepare(&format!( + "SELECT ident, lat, lon FROM {table} \ + WHERE lat BETWEEN ?1 AND ?2 AND lon BETWEEN ?3 AND ?4" + ))?; + let rows = stmt.query_map(params![min_lat, max_lat, min_lon, max_lon], |r| { + Ok((r.get::<_, String>(0)?, LatLon::new(r.get(1)?, r.get(2)?))) + })?; + for row in rows.flatten() { + let (ident, p) = row; + out.entry(ident) + .and_modify(|cur| { + if p.distance_nm(&near) < cur.distance_nm(&near) { + *cur = p; + } + }) + .or_insert(p); + } + } + Ok(out) +} diff --git a/crates/core/src/routing/fra_points.rs b/crates/core/src/routing/fra_points.rs new file mode 100644 index 0000000..e461dc2 --- /dev/null +++ b/crates/core/src/routing/fra_points.rs @@ -0,0 +1,147 @@ +//! Routing over the **official EUROCONTROL FRA points** with a connectivity graph. +//! +//! The FRA points list gives the point catalog + roles (E/X/I, A/D) + level +//! bands, but not which points connect. In Free Route Airspace you may DCT +//! between two points **only within the same FRA area** (a point in several areas +//! bridges them); crossing longer legs or wrong-area pairs is what IFPS rejects +//! (`ROUTE52`, `ROUTE165`). So this router builds a graph whose edges join points +//! that **share an FRA area** (within a DCT-length cap, both level-valid, not +//! RAD-forbidden) and A*-searches from a real **departure** point (`D`/`E`) to a +//! real **arrival** point (`A`/`X`). The IFPUV oracle + repair loop handle the +//! residual (TMA airway splices, mandatory routings). + +use petgraph::algo::astar; +use petgraph::graph::{DiGraph, NodeIndex}; +use rusqlite::Connection; + +use crate::error::Result; +use crate::model::LatLon; +use crate::rad::{FraPoint, RadData}; + +use super::{airport_pos, Leg, Route}; + +/// How far from the airport a departure/arrival FRA point may sit. +const TERMINAL_RADIUS_NM: f64 = 500.0; +/// Corridor bounding-box margin (degrees) around the dep→dest line. +const CORRIDOR_MARGIN: f64 = 3.0; +/// Max length of a single FRA DCT edge (nm). Nearby FRA points (incl. across an +/// area boundary — the border crossing) connect; longer TMA legs are caught by +/// the oracle (`ROUTE165`) and repaired with airways. +const MAX_FRA_DCT_NM: f64 = 150.0; +/// Per-hop penalty (nm) added to each edge so A* prefers fewer, longer DCTs +/// (real routes use ~8 points, not one per nearby FRA point). +const HOP_PENALTY_NM: f64 = 25.0; + +fn pos(p: &FraPoint) -> LatLon { + LatLon::new(p.lat, p.lon) +} + +/// Plan a Free-Route path through the official FRA points from `from` to `to` at +/// `cruise_fl`, routing only along same-area DCT edges. `None` if no connected +/// path between a departure and an arrival FRA point exists. +pub fn plan_fra_points( + conn: &Connection, + from: &str, + to: &str, + cruise_fl: i32, + points: &[FraPoint], + rad: Option<&RadData>, +) -> Result> { + if points.is_empty() { + return Ok(None); + } + let dep = airport_pos(conn, from)?; + let dst = airport_pos(conn, to)?; + let fl = cruise_fl; + let d0 = dep.distance_nm(&dst); + + // Corridor: level-valid FRA points inside the dep→dest bounding box. + let (min_lat, max_lat) = (dep.lat.min(dst.lat) - CORRIDOR_MARGIN, dep.lat.max(dst.lat) + CORRIDOR_MARGIN); + let (min_lon, max_lon) = (dep.lon.min(dst.lon) - CORRIDOR_MARGIN, dep.lon.max(dst.lon) + CORRIDOR_MARGIN); + let corridor: Vec<&FraPoint> = points + .iter() + .filter(|p| { + p.covers_fl(fl) + && p.lat >= min_lat && p.lat <= max_lat + && p.lon >= min_lon && p.lon <= max_lon + }) + .collect(); + if corridor.len() < 2 { + return Ok(None); + } + + // Departure / arrival points (indices into `corridor`). + let dep_i = corridor + .iter() + .enumerate() + .filter(|(_, p)| (p.arrdep.contains('D') || p.enroute == "E" || p.enroute == "EX") + && dep.distance_nm(&pos(p)) <= TERMINAL_RADIUS_NM + && pos(p).distance_nm(&dst) < d0) + .min_by(|(_, a), (_, b)| dep.distance_nm(&pos(a)).total_cmp(&dep.distance_nm(&pos(b)))) + .map(|(i, _)| i); + let arr_i = corridor + .iter() + .enumerate() + .filter(|(_, p)| (p.arrdep.contains('A') || p.enroute == "X" || p.enroute == "EX") + && dst.distance_nm(&pos(p)) <= TERMINAL_RADIUS_NM + && pos(p).distance_nm(&dep) < d0) + .min_by(|(_, a), (_, b)| dst.distance_nm(&pos(a)).total_cmp(&dst.distance_nm(&pos(b)))) + .map(|(i, _)| i); + let (Some(dep_i), Some(arr_i)) = (dep_i, arr_i) else { + return Ok(None); + }; + if dep_i == arr_i { + return Ok(None); + } + + // Graph: each corridor FRA point → its K nearest within the DCT cap (not + // RAD-forbidden at this FL). Node weight = corridor index. + let mut g: DiGraph = DiGraph::new(); + let node: Vec = (0..corridor.len()).map(|i| g.add_node(i)).collect(); + // (RAD-forbidden directs are left to the IFPUV oracle — checking every one of + // the thousands of DCT restrictions inside this O(N²) loop is too slow.) + let _ = rad; + for i in 0..corridor.len() { + let pi = pos(corridor[i]); + for j in 0..corridor.len() { + if i == j { + continue; + } + let d = pi.distance_nm(&pos(corridor[j])); + if d > MAX_FRA_DCT_NM { + continue; + } + // Per-hop penalty ⇒ A* prefers fewer, longer DCTs. + g.add_edge(node[i], node[j], d + HOP_PENALTY_NM); + } + } + + let target = pos(corridor[arr_i]); + let result = astar( + &g, + node[dep_i], + |n| n == node[arr_i], + |e| *e.weight(), + |n| pos(corridor[g[n]]).distance_nm(&target), + ); + let Some((_, path)) = result else { + return Ok(None); + }; + + // Route: DEP → dep_pt → … → arr_pt → DEST (all DCT; IFPS derives SID/STAR). + let mut pts: Vec<(String, LatLon)> = vec![(from.to_uppercase(), dep)]; + for n in &path { + let p = corridor[g[*n]]; + pts.push((p.name.clone(), pos(p))); + } + pts.push((to.to_uppercase(), dst)); + + let mut legs = Vec::with_capacity(pts.len() - 1); + let mut total_nm = 0.0; + for w in pts.windows(2) { + let d = w[0].1.distance_nm(&w[1].1); + total_nm += d; + legs.push(Leg { from: w[0].0.clone(), to: w[1].0.clone(), airway: "DCT".to_owned(), dist_nm: d }); + } + Ok(Some(Route { legs, total_nm, via_airways: false })) +} diff --git a/crates/core/src/routing/graph.rs b/crates/core/src/routing/graph.rs new file mode 100644 index 0000000..ded58a5 --- /dev/null +++ b/crates/core/src/routing/graph.rs @@ -0,0 +1,191 @@ +//! In-memory airway graph built from SQLite, used by A* routing. + +use std::collections::HashMap; + +use petgraph::graph::{DiGraph, NodeIndex}; +use rusqlite::Connection; + +use crate::error::Result; +use crate::model::LatLon; + +/// A routable point (airway endpoint) in the graph. +#[derive(Debug, Clone)] +pub struct NodeData { + pub ident: String, + pub region: String, + pub pos: LatLon, +} + +/// An airway (or DCT connector) edge between two points. +#[derive(Debug, Clone)] +pub struct EdgeData { + pub airway: String, + pub dist_nm: f64, + pub base_fl: i32, + pub top_fl: i32, +} + +/// Whether a flight level lies within an airway segment's `base…top` band +/// (`top <= 0` means unlimited/unknown). +pub fn fl_in_band(fl: i32, base_fl: i32, top_fl: i32) -> bool { + fl >= base_fl && (top_fl <= 0 || fl <= top_fl) +} + +/// The directed airway network. +pub struct RouteGraph { + pub g: DiGraph, +} + +impl RouteGraph { + /// Build the graph from `waypoints`/`navaids` (positions) and + /// `airway_segments` (edges). Segments whose endpoints have no known + /// position are skipped. When `cruise_fl` is `Some`, only airways valid at + /// that flight level (within their `base…top` band) are included. + pub fn build(conn: &Connection, cruise_fl: Option) -> Result { + let positions = load_positions(conn)?; + let mut g = DiGraph::new(); + let mut index: HashMap<(String, String), NodeIndex> = HashMap::new(); + + let mut stmt = conn.prepare( + "SELECT from_ident, from_region, to_ident, to_region, direction, airway_name, base_fl, top_fl \ + FROM airway_segments", + )?; + let rows = stmt.query_map([], |r| { + Ok(( + r.get::<_, String>(0)?, + r.get::<_, String>(1)?, + r.get::<_, String>(2)?, + r.get::<_, String>(3)?, + r.get::<_, String>(4)?, + r.get::<_, String>(5)?, + r.get::<_, i32>(6)?, + r.get::<_, i32>(7)?, + )) + })?; + + for row in rows { + let (fi, fr, ti, tr, dir, awy, base_fl, top_fl) = row?; + if let Some(fl) = cruise_fl { + if !fl_in_band(fl, base_fl, top_fl) { + continue; + } + } + let (fp, tp) = match ( + positions.get(&(fi.clone(), fr.clone())), + positions.get(&(ti.clone(), tr.clone())), + ) { + (Some(fp), Some(tp)) => (*fp, *tp), + _ => continue, + }; + let a = node_or_insert(&mut g, &mut index, fi, fr, fp); + let b = node_or_insert(&mut g, &mut index, ti, tr, tp); + let dist_nm = fp.distance_nm(&tp); + let forward = matches!(dir.chars().next(), Some('N') | Some('F')); + let backward = matches!(dir.chars().next(), Some('N') | Some('B')); + if forward { + g.add_edge( + a, + b, + EdgeData { + airway: awy.clone(), + dist_nm, + base_fl, + top_fl, + }, + ); + } + if backward { + g.add_edge( + b, + a, + EdgeData { + airway: awy, + dist_nm, + base_fl, + top_fl, + }, + ); + } + } + Ok(Self { g }) + } + + /// Number of graph nodes (airway endpoints). + pub fn node_count(&self) -> usize { + self.g.node_count() + } + + /// Any graph node with `ident` (first match). Used when a rough position + /// hint isn't available (e.g. splicing an airway sub-path between two fixes). + pub fn find_ident(&self, ident: &str) -> Option { + self.g + .node_indices() + .find(|&ix| self.g[ix].ident.eq_ignore_ascii_case(ident)) + } + + /// The graph node with `ident` (nearest to `near` when it repeats across + /// regions). Used to connect an airport to a named SID/STAR fix. + pub fn node_by_ident(&self, ident: &str, near: LatLon) -> Option { + self.g + .node_indices() + .filter(|&ix| self.g[ix].ident.eq_ignore_ascii_case(ident)) + .min_by(|&a, &b| { + self.g[a] + .pos + .distance_nm(&near) + .total_cmp(&self.g[b].pos.distance_nm(&near)) + }) + } + + /// The `k` graph nodes closest to `from`, within `max_nm`, nearest first. + pub fn nearest_nodes(&self, from: LatLon, k: usize, max_nm: f64) -> Vec { + let mut candidates: Vec<(f64, NodeIndex)> = self + .g + .node_indices() + .filter_map(|ix| { + let d = self.g[ix].pos.distance_nm(&from); + (d <= max_nm).then_some((d, ix)) + }) + .collect(); + candidates.sort_by(|a, b| a.0.total_cmp(&b.0)); + candidates.truncate(k); + candidates.into_iter().map(|(_, ix)| ix).collect() + } +} + +fn node_or_insert( + g: &mut DiGraph, + index: &mut HashMap<(String, String), NodeIndex>, + ident: String, + region: String, + pos: LatLon, +) -> NodeIndex { + if let Some(ix) = index.get(&(ident.clone(), region.clone())) { + return *ix; + } + let ix = g.add_node(NodeData { + ident: ident.clone(), + region: region.clone(), + pos, + }); + index.insert((ident, region), ix); + ix +} + +fn load_positions(conn: &Connection) -> Result> { + let mut map: HashMap<(String, String), LatLon> = HashMap::new(); + for table in ["waypoints", "navaids"] { + let mut stmt = conn.prepare(&format!("SELECT ident, region, lat, lon FROM {table}"))?; + let rows = stmt.query_map([], |r| { + Ok(( + (r.get::<_, String>(0)?, r.get::<_, String>(1)?), + LatLon::new(r.get(2)?, r.get(3)?), + )) + })?; + for row in rows { + let (key, pos) = row?; + map.entry(key).or_insert(pos); + } + } + Ok(map) +} diff --git a/crates/core/src/routing/hybrid.rs b/crates/core/src/routing/hybrid.rs new file mode 100644 index 0000000..13e8ea4 --- /dev/null +++ b/crates/core/src/routing/hybrid.rs @@ -0,0 +1,203 @@ +//! Dense free-route (DCT) routing over the navdata point cloud. +//! +//! Modern European enroute is Free Route Airspace: you may fly DCT between +//! (almost) any two published points, subject to length limits. Our RAD-derived +//! FRA graph ([`super::fra_graph`]) only has the *explicitly published* VIA pairs, +//! so it's far too sparse to find real routes (e.g. Paris–Nice `LATRA DCT LAMUT +//! … NISAR`). This router instead builds a **k-nearest-neighbour DCT graph** over +//! every waypoint/navaid in the dep→dest corridor and runs A* — yielding the +//! near-great-circle path through real points (the optimal free-route shape). +//! RAD-forbidden directs are skipped; the IFPUV oracle repairs residual issues +//! (e.g. TMA segments where DCT is banned → airway splice) in [`super::discover`]. + +use petgraph::algo::astar; +use petgraph::graph::{DiGraph, NodeIndex}; +use rusqlite::{params, Connection}; + +use crate::error::Result; +use crate::model::LatLon; +use crate::rad::RadData; + +use super::{airport_pos, Leg, Route}; + +/// Max length of a single DCT edge (nm). Most FRA areas allow long directs; TMAs +/// don't, but the oracle repairs those. Keeps the kNN graph sparse. +const MAX_DCT_NM: f64 = 220.0; +/// Neighbours per node in the DCT graph. +const K: usize = 10; +/// How many nearest corridor points an airport connects to (when no SID/STAR). +const CONNECT_K: usize = 12; + +/// Plan a dense free-route (DCT) path from `from` to `to`. `dep_conn`/`dest_conn` +/// are SID exit / STAR entry fix idents used to anchor the terminal connection. +pub fn plan_hybrid( + conn: &Connection, + from: &str, + to: &str, + dep_conn: &[String], + dest_conn: &[String], + cruise_fl: i32, + rad: Option<&RadData>, +) -> Result> { + let dep = airport_pos(conn, from)?; + let dst = airport_pos(conn, to)?; + let pts = load_corridor(conn, dep, dst, 2.5)?; + if pts.len() < 2 { + return Ok(None); + } + + let mut g: DiGraph<(String, LatLon), f64> = DiGraph::new(); + let node: Vec = pts.iter().map(|(id, p)| g.add_node((id.clone(), *p))).collect(); + + // kNN DCT edges (bidirectional), skipping RAD-forbidden directs at this FL. + for i in 0..pts.len() { + let mut nbrs: Vec<(f64, usize)> = (0..pts.len()) + .filter(|&j| j != i) + .map(|j| (pts[i].1.distance_nm(&pts[j].1), j)) + .filter(|(d, _)| *d <= MAX_DCT_NM) + .collect(); + nbrs.sort_by(|a, b| a.0.total_cmp(&b.0)); + for (d, j) in nbrs.into_iter().take(K) { + if let Some(rad) = rad { + if rad.forbidden_dct(&pts[i].0, &pts[j].0, cruise_fl).is_some() { + continue; + } + } + g.add_edge(node[i], node[j], d); + } + } + + // Terminal connection: airport → SID exit fixes (or nearest corridor points). + let dep_ix = g.add_node((from.to_uppercase(), dep)); + let dst_ix = g.add_node((to.to_uppercase(), dst)); + connect(&mut g, &pts, &node, dep_ix, dep, dep_conn, true); + connect(&mut g, &pts, &node, dst_ix, dst, dest_conn, false); + + let result = astar( + &g, + dep_ix, + |n| n == dst_ix, + |e| *e.weight(), + |n| g[n].1.distance_nm(&dst), + ); + let Some((total_nm, path)) = result else { + return Ok(None); + }; + if path.len() < 2 { + return Ok(None); + } + + let mut legs = Vec::with_capacity(path.len() - 1); + for w in path.windows(2) { + let (a, b) = (&g[w[0]], &g[w[1]]); + legs.push(Leg { + from: a.0.clone(), + to: b.0.clone(), + airway: "DCT".to_owned(), + dist_nm: a.1.distance_nm(&b.1), + }); + } + Ok(Some(Route { legs, total_nm, via_airways: false })) +} + +/// Wire an airport node to its SID/STAR connector fixes (matched by ident), or to +/// the nearest corridor points when none resolve. `outbound` = airport→fix. +fn connect( + g: &mut DiGraph<(String, LatLon), f64>, + pts: &[(String, LatLon)], + node: &[NodeIndex], + apt_ix: NodeIndex, + apt: LatLon, + conn_fixes: &[String], + outbound: bool, +) { + let mut targets: Vec = conn_fixes + .iter() + .filter_map(|f| pts.iter().position(|(id, _)| id.eq_ignore_ascii_case(f))) + .collect(); + if targets.is_empty() { + let mut near: Vec<(f64, usize)> = + pts.iter().enumerate().map(|(i, (_, p))| (apt.distance_nm(p), i)).collect(); + near.sort_by(|a, b| a.0.total_cmp(&b.0)); + targets = near.into_iter().take(CONNECT_K).map(|(_, i)| i).collect(); + } + for i in targets { + let d = apt.distance_nm(&pts[i].1); + if outbound { + g.add_edge(apt_ix, node[i], d); + } else { + g.add_edge(node[i], apt_ix, d); + } + } +} + +/// A filable **enroute** waypoint ident: a 5-letter name code (5LNC), all +/// alphabetic. Terminal/procedure fixes (e.g. `AT410`, `MA13`, `DE27R`, `PG271`) +/// contain digits and are NOT valid enroute points — IFPS rejects them. +fn is_enroute_wpt(ident: &str) -> bool { + ident.len() == 5 && ident.chars().all(|c| c.is_ascii_uppercase()) +} + +/// Navdata points inside the dep/dest bounding box (+`margin`°) usable for +/// enroute DCT: 5LNC waypoints + all navaids. One per ident (nearest the corridor +/// mid when repeated). +fn load_corridor(conn: &Connection, a: LatLon, b: LatLon, margin: f64) -> Result> { + let mid = LatLon::new((a.lat + b.lat) / 2.0, (a.lon + b.lon) / 2.0); + let (min_lat, max_lat) = (a.lat.min(b.lat) - margin, a.lat.max(b.lat) + margin); + let (min_lon, max_lon) = (a.lon.min(b.lon) - margin, a.lon.max(b.lon) + margin); + let mut best: std::collections::HashMap = std::collections::HashMap::new(); + for table in ["waypoints", "navaids"] { + let enroute_only = table == "waypoints"; + let mut stmt = conn.prepare(&format!( + "SELECT ident, lat, lon FROM {table} WHERE lat BETWEEN ?1 AND ?2 AND lon BETWEEN ?3 AND ?4" + ))?; + let rows = stmt.query_map(params![min_lat, max_lat, min_lon, max_lon], |r| { + Ok((r.get::<_, String>(0)?, LatLon::new(r.get(1)?, r.get(2)?))) + })?; + for row in rows.flatten() { + let (ident, p) = row; + if enroute_only && !is_enroute_wpt(&ident) { + continue; + } + best.entry(ident) + .and_modify(|cur| { + if p.distance_nm(&mid) < cur.distance_nm(&mid) { + *cur = p; + } + }) + .or_insert(p); + } + } + Ok(best.into_iter().collect()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn enroute_ident_filter() { + assert!(is_enroute_wpt("KESAX") && is_enroute_wpt("LATRA") && is_enroute_wpt("NISAR")); + assert!(!is_enroute_wpt("AT410") && !is_enroute_wpt("MA13") && !is_enroute_wpt("DE27R")); + assert!(!is_enroute_wpt("RBT")); // navaids come from the navaids table + } + + /// Prints the offline hybrid route for a few pairs (needs real.db). Ignored. + /// `cargo test -p flightplanner-core prints_hybrid -- --ignored --nocapture` + #[test] + #[ignore = "needs real.db"] + fn prints_hybrid_routes() { + let Ok(conn) = Connection::open("../../real.db") else { return }; + for (f, t) in [("LFPG", "EGLL"), ("LFPG", "LFMN"), ("LFPG", "EDDF")] { + match plan_hybrid(&conn, f, t, &[], &[], 360, None) { + Ok(Some(r)) => { + let n = r.legs.len(); + let item15: Vec = + r.legs.iter().take(n.saturating_sub(1)).map(|l| l.to.clone()).collect(); + eprintln!("{f}->{t} ({:.0} nm, {n} legs): {}", r.total_nm, item15.join(" DCT ")); + } + other => eprintln!("{f}->{t}: {other:?}"), + } + } + } +} diff --git a/crates/core/src/routing/mod.rs b/crates/core/src/routing/mod.rs new file mode 100644 index 0000000..5229c9e --- /dev/null +++ b/crates/core/src/routing/mod.rs @@ -0,0 +1,462 @@ +//! Airway routing: build a graph from the airway network and run A* between two +//! airports, connecting each airport to nearby airway points with DCT legs, and +//! falling back to a single direct great-circle leg when no path is found. + +pub mod discover; +pub mod fra; +pub mod fra_graph; +pub mod fra_points; +pub mod graph; +pub mod hybrid; + +use petgraph::algo::astar; +use petgraph::graph::NodeIndex; +use rusqlite::{params, Connection}; + +use crate::error::{CoreError, Result}; +use crate::model::LatLon; +use crate::rad::RadData; +use graph::{EdgeData, NodeData, RouteGraph}; + +/// Radius within which an airport is connected to airway points (DCT), and how +/// many such entry/exit points to consider. +const CONNECT_MAX_NM: f64 = 100.0; +const CONNECT_K: usize = 30; + +/// One leg of a computed route. +#[derive(Debug, Clone, PartialEq)] +pub struct Leg { + pub from: String, + pub to: String, + /// Airway name, or `"DCT"` for a direct leg. + pub airway: String, + pub dist_nm: f64, +} + +/// A computed route from departure to destination. +#[derive(Debug, Clone)] +pub struct Route { + pub legs: Vec, + pub total_nm: f64, + /// `true` if routed through the airway graph, `false` for the direct fallback. + pub via_airways: bool, +} + +impl Route { + /// Flight-plan style string: `LFPG DCT ABEAM T100 BEACN … EGLL`. + pub fn route_string(&self) -> String { + let mut s = self + .legs + .first() + .map(|l| l.from.clone()) + .unwrap_or_default(); + for leg in &self.legs { + s.push_str(&format!(" {} {}", leg.airway, leg.to)); + } + s + } +} + +/// Plan a route between two airport ICAO codes. When `cruise_fl` is `Some`, only +/// airways valid at that flight level are used. +pub fn plan_route( + conn: &Connection, + from_icao: &str, + to_icao: &str, + cruise_fl: Option, +) -> Result { + plan_route_conn(conn, from_icao, to_icao, cruise_fl, &[], &[]) +} + +/// Like [`plan_route`], but the departure/destination connect to the network via +/// the given SID **exit** fixes / STAR **entry** fixes when any resolve to graph +/// nodes; otherwise it falls back to the nearest airway points (DCT). +pub fn plan_route_conn( + conn: &Connection, + from_icao: &str, + to_icao: &str, + cruise_fl: Option, + dep_conn: &[String], + dest_conn: &[String], +) -> Result { + let dep = airport_pos(conn, from_icao)?; + let dst = airport_pos(conn, to_icao)?; + + let mut rg = RouteGraph::build(conn, cruise_fl)?; + let entries = resolve_conn(&rg, dep_conn, dep) + .unwrap_or_else(|| rg.nearest_nodes(dep, CONNECT_K, CONNECT_MAX_NM)); + let exits = resolve_conn(&rg, dest_conn, dst) + .unwrap_or_else(|| rg.nearest_nodes(dst, CONNECT_K, CONNECT_MAX_NM)); + + if entries.is_empty() || exits.is_empty() { + return Ok(direct_route(from_icao, to_icao, dep, dst)); + } + + // Add departure/destination as temporary nodes wired to nearby airway points. + let dep_ix = rg.g.add_node(NodeData { + ident: from_icao.to_owned(), + region: String::new(), + pos: dep, + }); + for e in entries { + let dist_nm = dep.distance_nm(&rg.g[e].pos); + rg.g.add_edge( + dep_ix, + e, + EdgeData { + airway: "DCT".to_owned(), + dist_nm, + base_fl: 0, + top_fl: 0, + }, + ); + } + let dst_ix = rg.g.add_node(NodeData { + ident: to_icao.to_owned(), + region: String::new(), + pos: dst, + }); + for e in exits { + let dist_nm = rg.g[e].pos.distance_nm(&dst); + rg.g.add_edge( + e, + dst_ix, + EdgeData { + airway: "DCT".to_owned(), + dist_nm, + base_fl: 0, + top_fl: 0, + }, + ); + } + + let result = astar( + &rg.g, + dep_ix, + |n| n == dst_ix, + |e| e.weight().dist_nm, + |n| rg.g[n].pos.distance_nm(&dst), + ); + + match result { + Some((total_nm, path)) => { + let mut legs = Vec::with_capacity(path.len().saturating_sub(1)); + for pair in path.windows(2) { + let (a, b) = (pair[0], pair[1]); + let airway = + rg.g.find_edge(a, b) + .and_then(|e| rg.g.edge_weight(e)) + .map(|ed| ed.airway.clone()) + .unwrap_or_else(|| "DCT".to_owned()); + legs.push(Leg { + from: rg.g[a].ident.clone(), + to: rg.g[b].ident.clone(), + airway, + dist_nm: rg.g[a].pos.distance_nm(&rg.g[b].pos), + }); + } + Ok(Route { + legs, + total_nm, + via_airways: true, + }) + } + None => Ok(direct_route(from_icao, to_icao, dep, dst)), + } +} + +/// Resolve connector fix idents (SID exits / STAR entries) to graph nodes. +/// `None` when the list is empty or none resolve, so the caller falls back to +/// nearest-airway-point connection. +fn resolve_conn(rg: &RouteGraph, idents: &[String], near: LatLon) -> Option> { + if idents.is_empty() { + return None; + } + let nodes: Vec = idents + .iter() + .filter_map(|id| rg.node_by_ident(id, near)) + .collect(); + (!nodes.is_empty()).then_some(nodes) +} + +/// Filtering airways to the cruise FL yields an IFPS-coherent route, but on some +/// pairs the upper network is fragmented and forces an absurd detour; the full +/// network gives the short route but may cite airways invalid at the FL. So we +/// compute both and keep the FL-valid one unless it detours by >60 %. +const FL_ROUTE_MAX_RATIO: f64 = 1.6; + +/// Best airway route: FL-filtered when it doesn't detour too much, else full. +pub fn plan_route_best( + conn: &Connection, + from: &str, + to: &str, + cruise_fl: Option, + dep_conn: &[String], + dest_conn: &[String], +) -> Result { + let full = plan_route_conn(conn, from, to, None, dep_conn, dest_conn)?; + match cruise_fl { + Some(fl) => { + let fl_route = plan_route_conn(conn, from, to, Some(fl), dep_conn, dest_conn)?; + if fl_route.via_airways && fl_route.total_nm <= FL_ROUTE_MAX_RATIO * full.total_nm.max(1.0) { + Ok(fl_route) + } else { + Ok(full) + } + } + None => Ok(full), + } +} + +/// The route to file for modern European airspace, in preference order: +/// 1. FRA **graph** (published Annex-2 directs), 2. FRA heuristic (great-circle +/// anchors), 3. airway routing. `dep_sid`/`dest_star` are (procedure, fix) pairs. +pub fn plan_preferred( + conn: &Connection, + from: &str, + to: &str, + dep_sid: &[(String, String)], + dest_star: &[(String, String)], + cruise_fl: Option, + rad: Option<&RadData>, +) -> Result { + // Official FRA-points corridor first (real dep/arr/intermediate points). + if let Some(r) = rad.filter(|r| !r.fra_points.is_empty()).and_then(|r| { + fra_points::plan_fra_points(conn, from, to, cruise_fl.unwrap_or(350), &r.fra_points, Some(r)) + .ok() + .flatten() + }) { + if r.legs.len() >= 2 { + return Ok(r); + } + } + let fra_adj = rad.map(|r| r.fra_adjacency()).unwrap_or_default(); + if let Some(r) = fra_graph::plan_fra_graph(conn, from, to, dep_sid, dest_star, &fra_adj) + .ok() + .flatten() + .filter(|r| r.legs.len() >= 2) + { + return Ok(r); + } + let dep_fixes: Vec = dep_sid.iter().map(|(_, f)| f.clone()).collect(); + let dest_fixes: Vec = dest_star.iter().map(|(_, f)| f.clone()).collect(); + match fra::plan_fra(conn, from, to, dep_sid, dest_star, cruise_fl.unwrap_or(350), rad) { + Ok(r) if r.legs.len() >= 2 => Ok(r), + _ => plan_route_best(conn, from, to, cruise_fl, &dep_fixes, &dest_fixes), + } +} + +/// Whether `t` looks like an airway designator (`UT421`, `UN570`, `L613`, `Y8`) +/// rather than a fix: 1–3 leading letters, ≥1 digit, optional trailing letters. +fn is_airway(t: &str) -> bool { + let b = t.as_bytes(); + let mut i = 0; + while i < b.len() && b[i].is_ascii_uppercase() { + i += 1; + } + if i == 0 || i > 3 { + return false; + } + let after_letters = i; + while i < b.len() && b[i].is_ascii_digit() { + i += 1; + } + if i == after_letters { + return false; // needs at least one digit + } + while i < b.len() && b[i].is_ascii_uppercase() { + i += 1; + } + i == b.len() +} + +/// Position of `ident` (waypoint or navaid), nearest `near` when ambiguous. +fn ident_pos(conn: &Connection, ident: &str, near: LatLon) -> Option { + let mut cands: Vec = Vec::new(); + for sql in [ + "SELECT lat, lon FROM waypoints WHERE ident = ?1", + "SELECT lat, lon FROM navaids WHERE ident = ?1", + ] { + if let Ok(mut stmt) = conn.prepare(sql) { + if let Ok(rows) = stmt.query_map(params![ident], |r| Ok(LatLon::new(r.get(0)?, r.get(1)?))) { + cands.extend(rows.flatten()); + } + } + } + cands.into_iter().min_by(|a, b| a.distance_nm(&near).total_cmp(&b.distance_nm(&near))) +} + +/// Parse a filed item-15 string (`OPALE UT421 BIG DCT KEF`) into a [`Route`] +/// DEP → … → DEST, resolving fix positions from the DB. Airway tokens attach to +/// the following leg; unresolvable tokens (e.g. lat/lon shorthand) are skipped. +/// `None` when fewer than one usable enroute fix resolves. Used to turn a stored +/// (e.g. imported PFPX) route seed into a repairable candidate. +pub fn parse_route_string(conn: &Connection, from: &str, to: &str, item15: &str) -> Result> { + let dep = airport_pos(conn, from)?; + let dst = airport_pos(conn, to)?; + let mid = LatLon::new((dep.lat + dst.lat) / 2.0, (dep.lon + dst.lon) / 2.0); + let mut points: Vec<(String, LatLon)> = vec![(from.to_uppercase(), dep)]; + let mut awys: Vec = Vec::new(); + let mut pending = "DCT".to_string(); + for tok in item15.split_whitespace() { + let t = tok.to_uppercase(); + if t == "DCT" || is_airway(&t) { + pending = t; + continue; + } + if let Some(p) = ident_pos(conn, &t, mid) { + awys.push(std::mem::replace(&mut pending, "DCT".to_owned())); + points.push((t, p)); + } + } + awys.push(pending); // DEP-last-fix … DEST hop + points.push((to.to_uppercase(), dst)); + if points.len() < 3 { + return Ok(None); + } + let mut legs = Vec::with_capacity(points.len() - 1); + let mut total_nm = 0.0; + for i in 0..points.len() - 1 { + let d = points[i].1.distance_nm(&points[i + 1].1); + total_nm += d; + legs.push(Leg { + from: points[i].0.clone(), + to: points[i + 1].0.clone(), + airway: awys[i].clone(), + dist_nm: d, + }); + } + Ok(Some(Route { legs, total_nm, via_airways: true })) +} + +/// Route the sub-segment between two enroute fixes through the airway network, +/// returning the ordered legs (with airway names) — used to repair a DCT that +/// IFPS rejects as "too long" (DCT not allowed in that TMA/area). `None` when +/// either fix isn't an airway node or no path exists at `cruise_fl`. +pub fn airway_path( + conn: &Connection, + from_ident: &str, + to_ident: &str, + cruise_fl: Option, +) -> Result>> { + let rg = RouteGraph::build(conn, cruise_fl)?; + let (Some(a), Some(b)) = (rg.find_ident(from_ident), rg.find_ident(to_ident)) else { + return Ok(None); + }; + let target = rg.g[b].pos; + let result = astar( + &rg.g, + a, + |n| n == b, + |e| e.weight().dist_nm, + |n| rg.g[n].pos.distance_nm(&target), + ); + let Some((_, path)) = result else { + return Ok(None); + }; + if path.len() < 2 { + return Ok(None); + } + let mut legs = Vec::with_capacity(path.len() - 1); + for pair in path.windows(2) { + let (x, y) = (pair[0], pair[1]); + let airway = rg + .g + .find_edge(x, y) + .and_then(|e| rg.g.edge_weight(e)) + .map(|ed| ed.airway.clone()) + .unwrap_or_else(|| "DCT".to_owned()); + legs.push(Leg { + from: rg.g[x].ident.clone(), + to: rg.g[y].ident.clone(), + airway, + dist_nm: rg.g[x].pos.distance_nm(&rg.g[y].pos), + }); + } + Ok(Some(legs)) +} + +fn direct_route(from: &str, to: &str, dep: LatLon, dst: LatLon) -> Route { + let dist_nm = dep.distance_nm(&dst); + Route { + legs: vec![Leg { + from: from.to_owned(), + to: to.to_owned(), + airway: "DCT".to_owned(), + dist_nm, + }], + total_nm: dist_nm, + via_airways: false, + } +} + +fn airport_pos(conn: &Connection, icao: &str) -> Result { + conn.query_row( + "SELECT lat, lon FROM airports WHERE icao = ?1", + params![icao], + |r| Ok(LatLon::new(r.get(0)?, r.get(1)?)), + ) + .map_err(|e| match e { + rusqlite::Error::QueryReturnedNoRows => { + CoreError::NotFound(format!("airport {icao} (import navdata first?)")) + } + other => other.into(), + }) +} + +/// Resolve the ordered waypoints of a computed `route` to geographic positions +/// (for drawing on a map). Endpoints match airports first, then en-route +/// fixes/navaids; when an ident repeats across regions the candidate nearest the +/// previous point is chosen. Idents that can't be resolved are skipped. +pub fn resolve_geometry(conn: &Connection, route: &Route) -> Result> { + let mut idents: Vec<&str> = Vec::new(); + if let Some(first) = route.legs.first() { + idents.push(first.from.as_str()); + } + for l in &route.legs { + idents.push(l.to.as_str()); + } + + let mut out = Vec::with_capacity(idents.len()); + let mut prev: Option = None; + for id in idents { + if let Some(pos) = lookup_pos(conn, id, prev)? { + out.push((id.to_owned(), pos)); + prev = Some(pos); + } + } + Ok(out) +} + +fn lookup_pos(conn: &Connection, ident: &str, near: Option) -> Result> { + // Airports resolve uniquely by ICAO. + if let Ok(pos) = conn.query_row( + "SELECT lat, lon FROM airports WHERE icao = ?1", + params![ident], + |r| Ok(LatLon::new(r.get(0)?, r.get(1)?)), + ) { + return Ok(Some(pos)); + } + + // En-route fixes and navaids may repeat across regions; collect candidates. + let mut cands: Vec = Vec::new(); + for sql in [ + "SELECT lat, lon FROM waypoints WHERE ident = ?1", + "SELECT lat, lon FROM navaids WHERE ident = ?1", + ] { + let mut stmt = conn.prepare(sql)?; + let rows = stmt.query_map(params![ident], |r| Ok(LatLon::new(r.get(0)?, r.get(1)?)))?; + for row in rows { + cands.push(row?); + } + } + let pick = match near { + Some(p) => cands.into_iter().min_by(|a, b| { + a.distance_nm(&p) + .partial_cmp(&b.distance_nm(&p)) + .unwrap_or(std::cmp::Ordering::Equal) + }), + None => cands.into_iter().next(), + }; + Ok(pick) +} diff --git a/crates/core/tests/export.rs b/crates/core/tests/export.rs new file mode 100644 index 0000000..75d990c --- /dev/null +++ b/crates/core/tests/export.rs @@ -0,0 +1,36 @@ +//! Step-5 test: export a fixture route to `.pln`, `.fms` and OFP text. + +use std::path::PathBuf; + +use flightplanner_core::{db, export, routing}; +use rusqlite::Connection; + +fn fixtures_db() -> Connection { + let dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures"); + let mut conn = Connection::open_in_memory().unwrap(); + db::import_navdata(&mut conn, &dir).unwrap(); + conn +} + +#[test] +fn exports_pln_fms_and_ofp() { + let conn = fixtures_db(); + let route = routing::plan_route(&conn, "LFPG", "EGLL", None).unwrap(); + + let pln = export::pln::to_pln(&conn, &route, 34000).unwrap(); + assert!(pln.contains("LFPG")); + assert!(pln.contains("EGLL")); + assert!(pln.contains("Airport")); + + let fms = export::fms::to_fms(&conn, &route, 34000).unwrap(); + assert!(fms.starts_with("I\n1100 Version")); + assert!(fms.contains("ADEP LFPG")); + assert!(fms.contains("ADES EGLL")); + assert!(fms.contains("NUMENR ")); + + let ofp = export::ofp::to_ofp(&route, None, Some("A320"), Some(340)); + assert!(ofp.contains("OPERATIONAL FLIGHT PLAN")); + assert!(ofp.contains("LFPG -> EGLL")); + assert!(ofp.contains("FL340")); +} diff --git a/crates/core/tests/fixtures/CIFP/EGLL.dat b/crates/core/tests/fixtures/CIFP/EGLL.dat new file mode 100644 index 0000000..ad28437 --- /dev/null +++ b/crates/core/tests/fixtures/CIFP/EGLL.dat @@ -0,0 +1,2 @@ +RWY:RW09L, , ,00079, , ,3, ;N51285200,W000273600,0000; +RWY:RW27R, , ,00078, , ,3, ;N51284900,W000260900,0000; diff --git a/crates/core/tests/fixtures/CIFP/LFPG.dat b/crates/core/tests/fixtures/CIFP/LFPG.dat new file mode 100644 index 0000000..8ff3fc7 --- /dev/null +++ b/crates/core/tests/fixtures/CIFP/LFPG.dat @@ -0,0 +1,2 @@ +RWY:RW08L, , ,00338, ,GLE ,3, ;N48594447,E002330988,0000; +RWY:RW26R, , ,00318, ,GAU ,3, ;N48595395,E002360724,1725; diff --git a/crates/core/tests/fixtures/earth_awy.dat b/crates/core/tests/fixtures/earth_awy.dat new file mode 100644 index 0000000..c4e4b38 --- /dev/null +++ b/crates/core/tests/fixtures/earth_awy.dat @@ -0,0 +1,8 @@ +I +1100 Version - test fixture, not real navdata + +ABEAM LF 11 BEACN LF 11 N 1 35 245 T100 +BEACN LF 11 CROSS LF 11 N 1 35 245 T100 +CROSS LF 11 DOVER EG 11 N 2 245 460 U200 +DOVER EG 11 ENTRY EG 11 N 2 245 460 U200 +99 diff --git a/crates/core/tests/fixtures/earth_fix.dat b/crates/core/tests/fixtures/earth_fix.dat new file mode 100644 index 0000000..a60060a --- /dev/null +++ b/crates/core/tests/fixtures/earth_fix.dat @@ -0,0 +1,9 @@ +I +1101 Version - test fixture, not real navdata + + 49.000000000 2.500000000 ABEAM ENRT LF 1000001 + 49.500000000 2.000000000 BEACN ENRT LF 1000002 + 50.000000000 1.000000000 CROSS ENRT LF 1000003 + 50.500000000 0.000000000 DOVER ENRT EG 1000004 + 51.000000000 -0.500000000 ENTRY ENRT EG 1000005 +99 diff --git a/crates/core/tests/fixtures/earth_nav.dat b/crates/core/tests/fixtures/earth_nav.dat new file mode 100644 index 0000000..964f2ce --- /dev/null +++ b/crates/core/tests/fixtures/earth_nav.dat @@ -0,0 +1,7 @@ +I +1150 Version - test fixture, not real navdata + + 3 49.010000000 2.600000000 300 11400 130 1.000 PGV ENRT LF PARIS VOR + 2 50.900000000 -0.400000000 100 3700 50 0.000 EGN ENRT EG ENTRY NDB + 4 49.000000000 2.550000000 50 11000 25 0.000 ILP ENRT LF PARIS ILS +99 diff --git a/crates/core/tests/navdata_import.rs b/crates/core/tests/navdata_import.rs new file mode 100644 index 0000000..6d27876 --- /dev/null +++ b/crates/core/tests/navdata_import.rs @@ -0,0 +1,57 @@ +//! End-to-end step-2 test: parse the hand-made fixtures and import them into an +//! in-memory SQLite database, then assert row counts and a couple of lookups. + +use std::path::PathBuf; + +use flightplanner_core::db; +use rusqlite::Connection; + +fn fixtures_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures") +} + +fn count(conn: &Connection, table: &str) -> i64 { + conn.query_row(&format!("SELECT COUNT(*) FROM {table}"), [], |r| r.get(0)) + .unwrap() +} + +#[test] +fn imports_fixture_navdata() { + let mut conn = Connection::open_in_memory().unwrap(); + let stats = db::import_navdata(&mut conn, &fixtures_dir()).unwrap(); + + // Fixtures: 5 fixes, 1 VOR + 1 NDB (ILS skipped), 4 airway segments, 2 airports. + assert_eq!(stats.waypoints, 5); + assert_eq!(stats.navaids, 2); + assert_eq!(stats.airway_segments, 4); + assert_eq!(stats.airports, 2); + + assert_eq!(count(&conn, "waypoints"), 5); + assert_eq!(count(&conn, "navaids"), 2); + assert_eq!(count(&conn, "airway_segments"), 4); + assert_eq!(count(&conn, "airports"), 2); + + // A specific fix carries the right region. + let region: String = conn + .query_row( + "SELECT region FROM waypoints WHERE ident = 'DOVER'", + [], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(region, "EG"); + + // LFPG reference point is the centroid of its two runway thresholds. + let (lat, lon): (f64, f64) = conn + .query_row( + "SELECT lat, lon FROM airports WHERE icao = 'LFPG'", + [], + |r| Ok((r.get(0)?, r.get(1)?)), + ) + .unwrap(); + assert!((lat - 48.99).abs() < 0.05, "lat = {lat}"); + assert!((lon - 2.56).abs() < 0.05, "lon = {lon}"); + + // Distinct airway names were recorded. + assert_eq!(count(&conn, "airways"), 2); +} diff --git a/crates/core/tests/routing.rs b/crates/core/tests/routing.rs new file mode 100644 index 0000000..9df65df --- /dev/null +++ b/crates/core/tests/routing.rs @@ -0,0 +1,89 @@ +//! End-to-end step-3 test: import the fixtures, then route LFPG→EGLL through the +//! hand-made airway network and check the result is sensible. + +use std::path::PathBuf; + +use flightplanner_core::routing::graph::RouteGraph; +use flightplanner_core::{db, routing}; +use rusqlite::Connection; + +fn fixtures_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures") +} + +fn fixtures_db() -> Connection { + let mut conn = Connection::open_in_memory().unwrap(); + db::import_navdata(&mut conn, &fixtures_dir()).unwrap(); + conn +} + +#[test] +fn routes_lfpg_to_egll_via_airways() { + let conn = fixtures_db(); + + let route = routing::plan_route(&conn, "LFPG", "EGLL", None).unwrap(); + + assert!(route.via_airways, "expected an airway route, got {route:?}"); + assert_eq!(route.legs.first().unwrap().from, "LFPG"); + assert_eq!(route.legs.last().unwrap().to, "EGLL"); + + // The fixture network forces travel over the T100/U200 airways. + let airways: Vec<&str> = route.legs.iter().map(|l| l.airway.as_str()).collect(); + assert!( + airways.iter().any(|a| *a != "DCT"), + "route used no airway: {airways:?}" + ); + + // Sanity on total distance (direct LFPG-EGLL ≈ 188 nm; via fixtures a bit more). + assert!( + route.total_nm > 150.0 && route.total_nm < 400.0, + "total = {} nm", + route.total_nm + ); +} + +#[test] +fn unknown_airport_is_reported() { + let conn = fixtures_db(); + let err = routing::plan_route(&conn, "LFPG", "ZZZZ", None).unwrap_err(); + assert!(err.to_string().contains("ZZZZ"), "{err}"); +} + +#[test] +fn graph_filters_airways_by_flight_level() { + let conn = fixtures_db(); + // Fixtures: T100 (low, FL35..245) links ABEAM/BEACN/CROSS, + // U200 (high, FL245..460) links CROSS/DOVER/ENTRY. + assert_eq!(RouteGraph::build(&conn, None).unwrap().node_count(), 5); + assert_eq!(RouteGraph::build(&conn, Some(200)).unwrap().node_count(), 3); // T100 only + assert_eq!(RouteGraph::build(&conn, Some(300)).unwrap().node_count(), 3); // U200 only + assert_eq!(RouteGraph::build(&conn, Some(500)).unwrap().node_count(), 0); // above both +} + +#[test] +fn fra_produces_a_dct_chain() { + let conn = fixtures_db(); + let route = routing::fra::plan_fra(&conn, "LFPG", "EGLL", &[], &[], 360, None).unwrap(); + assert!(!route.via_airways, "FRA is DCT-based: {route:?}"); + assert!(route.legs.iter().all(|l| l.airway == "DCT"), "{route:?}"); + assert_eq!(route.legs.first().unwrap().from, "LFPG"); + assert_eq!(route.legs.last().unwrap().to, "EGLL"); + assert!( + route.total_nm > 150.0 && route.total_nm < 400.0, + "total = {} nm", + route.total_nm + ); +} + +#[test] +fn connects_departure_via_given_fix() { + let conn = fixtures_db(); + // Force LFPG to join the network at CROSS (a SID exit fix, say) rather than + // the nearest airway point. + let route = + routing::plan_route_conn(&conn, "LFPG", "EGLL", None, &["CROSS".to_string()], &[]).unwrap(); + assert!(route.via_airways, "{route:?}"); + let first = route.legs.first().unwrap(); + assert_eq!(first.from, "LFPG"); + assert_eq!(first.to, "CROSS", "should connect via the given fix: {route:?}"); +} diff --git a/crates/rad/Cargo.toml b/crates/rad/Cargo.toml new file mode 100644 index 0000000..24efbf5 --- /dev/null +++ b/crates/rad/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "flightplanner-rad" +version = "0.1.0" +edition = "2021" + +[lib] +name = "flightplanner_rad" +path = "src/lib.rs" + +[[bin]] +name = "rad-tool" +path = "src/main.rs" + +[dependencies] +flightplanner-core = { workspace = true } +calamine = "0.26" +serde = { workspace = true } +anyhow = { workspace = true } diff --git a/crates/rad/src/lib.rs b/crates/rad/src/lib.rs new file mode 100644 index 0000000..62f8417 --- /dev/null +++ b/crates/rad/src/lib.rs @@ -0,0 +1,355 @@ +//! Eurocontrol RAD (Route Availability Document) parsing. +//! +//! The RAD is a public per-AIRAC Excel workbook (see the `rad-data-source` +//! reference). This crate reads it with `calamine` and turns the annexes into a +//! restriction model the routing/validation engine can apply. + +use anyhow::Result; +use calamine::{open_workbook, Data, Reader, Xlsx}; + +// The RAD data model lives in `core` (so routing/validation can use it without +// pulling in `calamine`); this crate produces those types. +pub use flightplanner_core::rad::{Area, DctKind, DctRestriction, FraEdge, FraPoint, LevelCap, RadData}; + +/// Parse the official EUROCONTROL "FRA Points" list (a separate `.xlsx` — see the +/// `fra-points-official` note). Sheet `"FRA Points"`, one row per point. +pub fn parse_fra_points(path: &str) -> Result> { + let rows = rows(path, "FRA Points")?; + Ok(rows + .iter() + .skip(1) // header + .filter_map(|r| { + let name = cell(r, 2); + let lat = parse_lat(&cell(r, 3)); + let lon = parse_lon(&cell(r, 4)); + let (name, lat, lon) = match (name.is_empty(), lat, lon) { + (false, Some(la), Some(lo)) => (name, la, lo), + _ => return None, + }; + let (level_lo, level_hi) = parse_levels(&cell(r, 11)); + Some(FraPoint { + name, + lat, + lon, + areas: split_amp(&cell(r, 5)), + enroute: cell(r, 6).trim_matches('-').trim().to_string(), + arrdep: cell(r, 7).trim_matches('-').trim().to_string(), + arr_airports: split_ws(&cell(r, 8)), + dep_airports: split_ws(&cell(r, 9)), + flos: cell(r, 10).trim_matches('-').trim().to_string(), + level_lo, + level_hi, + loc_ind: split_ws(&cell(r, 13)), + }) + }) + .collect()) +} + +/// Latitude `XDDMMSS` (X = N/S) → signed decimal degrees. +fn parse_lat(s: &str) -> Option { + let s = s.trim(); + let b = s.as_bytes(); + if b.len() < 7 { + return None; + } + let sign = match b[0] { + b'N' => 1.0, + b'S' => -1.0, + _ => return None, + }; + let d: f64 = s[1..3].parse().ok()?; + let m: f64 = s[3..5].parse().ok()?; + let sec: f64 = s[5..7].parse().ok()?; + Some(sign * (d + m / 60.0 + sec / 3600.0)) +} + +/// Longitude `XDDDMMSS` (X = E/W) → signed decimal degrees. +fn parse_lon(s: &str) -> Option { + let s = s.trim(); + let b = s.as_bytes(); + if b.len() < 8 { + return None; + } + let sign = match b[0] { + b'E' => 1.0, + b'W' => -1.0, + _ => return None, + }; + let d: f64 = s[1..4].parse().ok()?; + let m: f64 = s[4..6].parse().ok()?; + let sec: f64 = s[6..8].parse().ok()?; + Some(sign * (d + m / 60.0 + sec / 3600.0)) +} + +/// "FL195 / FL660" → (Some(195), Some(660)); "GND / FL245" → (Some(0), Some(245)). +fn parse_levels(s: &str) -> (Option, Option) { + let up = s.to_uppercase(); + let mut fls: Vec = Vec::new(); + let mut rest = up.as_str(); + while let Some(p) = rest.find("FL") { + rest = &rest[p + 2..]; + let num: String = rest.chars().take_while(char::is_ascii_digit).collect(); + rest = &rest[num.len()..]; + if let Ok(n) = num.parse::() { + fls.push(n); + } + } + let lo = fls.first().copied().or_else(|| up.contains("GND").then_some(0)); + let hi = fls.get(1).copied().or_else(|| if fls.len() == 1 { None } else { fls.first().copied() }); + (lo, hi) +} + +fn split_amp(s: &str) -> Vec { + s.split('&').map(|x| x.trim().to_string()).filter(|x| !x.is_empty()).collect() +} + +fn split_ws(s: &str) -> Vec { + s.split([' ', ',', '\n']).map(|x| x.trim().to_string()).filter(|x| !x.is_empty()).collect() +} + +/// Parse the annexes we currently model from the workbook at `path`. +pub fn parse(path: &str) -> Result { + Ok(RadData { + areas: parse_areas(path)?, + dct: parse_dct(path)?, + fra_edges: parse_fra_edges(path)?, + level_caps: parse_level_caps(path)?, + fra_points: Vec::new(), // loaded separately via parse_fra_points + }) +} + +/// Annex 2A — city-pair flight-level caps. +pub fn parse_level_caps(path: &str) -> Result> { + let rows = rows(path, "Annex 2A")?; + Ok(rows + .iter() + .skip(1) // header + .filter_map(|r| { + let from = parse_idents(&cell(r, 4)); + let to = parse_idents(&cell(r, 6)); + let cap_fl = min_fl(&cell(r, 8)); + if from.is_empty() || to.is_empty() || cap_fl.is_none() { + return None; + } + Some(LevelCap { + id: cell(r, 3), + from, + to, + condition: cell(r, 7), + cap_fl, + }) + }) + .collect()) +} + +/// Lowest flight level mentioned in a capping cell like `FL345` or `FL355FL375`. +fn min_fl(s: &str) -> Option { + let up = s.to_uppercase(); + let mut out: Option = None; + let mut rest = up.as_str(); + while let Some(pos) = rest.find("FL") { + rest = &rest[pos + 2..]; + let num: String = rest.chars().take_while(char::is_ascii_digit).collect(); + rest = &rest[num.len()..]; + if let Ok(fl) = num.parse::() { + out = Some(out.map_or(fl, |m| m.min(fl))); + } + } + out +} + +/// Annex 1 — area definitions. +pub fn parse_areas(path: &str) -> Result> { + let rows = rows(path, "Annex 1")?; + Ok(rows + .iter() + .skip(1) // header + .filter_map(|r| { + let id = cell(r, 3); + let def = cell(r, 4); + if id.is_empty() { + return None; + } + Some(Area { + id, + airports: parse_idents(&def), + region: cell(r, 6), + }) + }) + .collect()) +} + +/// Annex 3B — DCT restrictions. +pub fn parse_dct(path: &str) -> Result> { + let rows = rows(path, "Annex 3B DCT")?; + Ok(rows + .iter() + .skip(1) // header + .filter_map(|r| { + let from = cell(r, 4); + let to = cell(r, 5); + if from.is_empty() || to.is_empty() { + return None; + } + let avail = cell(r, 8).to_uppercase(); + Some(DctRestriction { + id: cell(r, 3), + from, + to, + lower_fl: parse_fl(&cell(r, 6)), + upper_fl: parse_fl(&cell(r, 7)), + available: avail.starts_with('Y'), + utilization: cell(r, 9), + direction: cell(r, 13), + }) + }) + .collect()) +} + +/// Scan Annex 2A/2B/2C for `A DCT B` fix pairs and return the de-duplicated set +/// of allowed FRA direct edges. This is our FRA connectivity catalog: routing +/// through these points/edges is what IFPS accepts in Free Route Airspace. +pub fn parse_fra_edges(path: &str) -> Result> { + use std::collections::HashSet; + let mut seen: HashSet = HashSet::new(); + let mut out = Vec::new(); + // Annex 2A/2B/2C hold the enroute FRA routings; Annex 3A DEP/ARR hold the + // compulsory departure/arrival routings (e.g. LF7352: LFPG deps via + // `OPALE DCT KESAX DCT DIMAL DCT ALESO`) — both are needed for the graph. + for sheet in ["Annex 2A", "Annex 2B", "Annex 2C", "Annex 3A DEP", "Annex 3A ARR"] { + let Ok(rows) = rows(path, sheet) else { continue }; + for row in rows { + // Normalise separators so `DCT` always stands alone as a token. + let text = row.join(" ").replace(['(', ')', ',', '\n'], " "); + let toks: Vec<&str> = text.split_whitespace().collect(); + for w in toks.windows(3) { + if w[1] == "DCT" && is_fix(w[0]) && is_fix(w[2]) { + let e = FraEdge { from: w[0].to_string(), to: w[2].to_string() }; + if seen.insert(e.clone()) { + out.push(e); + } + } + } + } + } + Ok(out) +} + +/// A plausible navaid/waypoint ident: 2–6 chars, letters+digits, ≥1 letter, not +/// a RAD keyword. Excludes airway designators would be nice but they rarely sit +/// on both sides of a literal `DCT`, so the DCT-pair test already filters them. +fn is_fix(s: &str) -> bool { + let s = s.trim(); + let len = s.len(); + if !(2..=6).contains(&len) { + return false; + } + if !s.chars().all(|c| c.is_ascii_uppercase() || c.is_ascii_digit()) { + return false; + } + if !s.chars().any(|c| c.is_ascii_uppercase()) { + return false; + } + !matches!( + s, + "DCT" | "VIA" | "AND" | "THEN" | "ARR" | "DEP" | "EXC" | "RFL" | "BLW" + | "ABV" | "BTN" | "IAW" | "LOA" | "TFC" | "AVBL" | "NOT" | "ONLY" + | "H24" | "UFN" | "FL" | "AT" | "IN" | "OR" | "TO" | "VItoken" + ) +} + +// ── low-level helpers ────────────────────────────────────────────────────── + +/// List the sheet (annex) names in the workbook. +pub fn sheets(path: &str) -> Result> { + let wb: Xlsx<_> = open_workbook(path)?; + Ok(wb.sheet_names().to_vec()) +} + +/// Dimensions (rows, cols) of a sheet. +pub fn dims(path: &str, sheet: &str) -> Result<(usize, usize)> { + let mut wb: Xlsx<_> = open_workbook(path)?; + Ok(wb.worksheet_range(sheet)?.get_size()) +} + +/// All rows of `sheet` as trimmed strings. +pub fn rows(path: &str, sheet: &str) -> Result>> { + let mut wb: Xlsx<_> = open_workbook(path)?; + Ok(wb + .worksheet_range(sheet)? + .rows() + .map(|r| r.iter().map(cell_str).collect()) + .collect()) +} + +/// First `n` rows of `sheet` (for exploration). +pub fn dump(path: &str, sheet: &str, n: usize) -> Result>> { + Ok(rows(path, sheet)?.into_iter().take(n).collect()) +} + +fn cell(row: &[String], i: usize) -> String { + row.get(i).cloned().unwrap_or_default().trim().to_string() +} + +fn cell_str(c: &Data) -> String { + match c { + Data::Empty => String::new(), + Data::String(s) => s.trim().to_string(), + Data::Float(f) => f.to_string(), + Data::Int(i) => i.to_string(), + Data::Bool(b) => b.to_string(), + other => other.to_string(), + } +} + +/// First flight level found in a cell like `FL245`, `MEAFL025`, `FL195FL315`. +fn parse_fl(s: &str) -> Option { + let up = s.to_uppercase(); + let pos = up.find("FL")?; + let num: String = up[pos + 2..].chars().take_while(char::is_ascii_digit).collect(); + num.parse().ok() +} + +/// Split an Annex-1 definition like `(EGBB, EGBE, EGNX)` into idents. +fn parse_idents(def: &str) -> Vec { + def.trim() + .trim_matches(|c| c == '(' || c == ')') + .split([',', '\n']) + .map(|s| s.trim().trim_matches(|c| c == '(' || c == ')').to_string()) + .filter(|s| !s.is_empty()) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + /// Parses the real RAD workbook when it's present (CWD = crate dir in tests). + /// Skips (passes) otherwise so the test stays portable. + #[test] + fn parses_real_rad_when_present() { + let f = "../../rad/RAD_current.xlsx"; + if !std::path::Path::new(f).exists() { + return; + } + let rad = parse(f).unwrap(); + assert!(rad.areas.len() > 50, "areas = {}", rad.areas.len()); + assert!(rad.dct.len() > 1000, "dct = {}", rad.dct.len()); + assert!(rad.dct.iter().any(|d| d.kind() == DctKind::Forbidden)); + assert!(rad.dct.iter().any(|d| d.kind() == DctKind::Compulsory)); + // FL bands parse to plausible values. + assert!(rad + .dct + .iter() + .filter_map(|d| d.upper_fl) + .all(|fl| (0..=700).contains(&fl))); + } + + #[test] + fn parses_fl_variants() { + assert_eq!(parse_fl("FL245"), Some(245)); + assert_eq!(parse_fl("MEAFL025"), Some(25)); + assert_eq!(parse_fl("FL195FL315"), Some(195)); + assert_eq!(parse_fl(""), None); + } +} diff --git a/crates/rad/src/main.rs b/crates/rad/src/main.rs new file mode 100644 index 0000000..11206b6 --- /dev/null +++ b/crates/rad/src/main.rs @@ -0,0 +1,148 @@ +//! `rad-tool` — explore/parse the Eurocontrol RAD workbook. +//! +//! Usage: +//! rad-tool sheets +//! rad-tool dump "" [rows] +//! RAD file path from $RAD_FILE, default `rad/RAD_current.xlsx`. + +use anyhow::Result; + +fn main() -> Result<()> { + let args: Vec = std::env::args().collect(); + let path = std::env::var("RAD_FILE").unwrap_or_else(|_| "rad/RAD_current.xlsx".into()); + + match args.get(1).map(String::as_str) { + Some("sheets") => { + for s in flightplanner_rad::sheets(&path)? { + let (r, c) = flightplanner_rad::dims(&path, &s).unwrap_or((0, 0)); + println!("{s} ({r} rows x {c} cols)"); + } + } + Some("dump") => { + let sheet = args.get(2).cloned().unwrap_or_default(); + let n: usize = args.get(3).and_then(|s| s.parse().ok()).unwrap_or(15); + for (i, row) in flightplanner_rad::dump(&path, &sheet, n)?.into_iter().enumerate() { + println!("[{i:>3}] {}", row.join(" | ")); + } + } + Some("find") => { + // find "" [max] — print rows containing . + let sheet = args.get(2).cloned().unwrap_or_default(); + let needle = args.get(3).cloned().unwrap_or_default().to_uppercase(); + let max: usize = args.get(4).and_then(|s| s.parse().ok()).unwrap_or(20); + let mut hits = 0; + for (i, row) in flightplanner_rad::rows(&path, &sheet)?.into_iter().enumerate() { + let joined = row.join(" | "); + if joined.to_uppercase().contains(&needle) { + println!("[{i:>4}] {joined}"); + hits += 1; + if hits >= max { + break; + } + } + } + println!("-- {hits} row(s) matched '{needle}' in {sheet}"); + } + Some("summary") => { + use flightplanner_rad::DctKind; + let rad = flightplanner_rad::parse(&path)?; + println!("Parsed RAD: {}", path); + println!(" Areas (Annex 1) : {}", rad.areas.len()); + println!(" DCT restrictions (3B) : {}", rad.dct.len()); + let forbidden = rad.dct.iter().filter(|d| d.kind() == DctKind::Forbidden).count(); + let only = rad.dct.iter().filter(|d| d.kind() == DctKind::ConditionalOnly).count(); + let comp = rad.dct.iter().filter(|d| d.kind() == DctKind::Compulsory).count(); + println!(" forbidden={forbidden} conditional-only={only} compulsory={comp}"); + println!(" sample areas:"); + for a in rad.areas.iter().take(3) { + println!(" {} [{}] = {:?}", a.id, a.region, a.airports); + } + println!(" sample DCT restrictions:"); + for d in rad.dct.iter().take(4) { + println!( + " {} {}->{} FL{:?}-{:?} avail={} [{:?}] {}", + d.id, d.from, d.to, d.lower_fl, d.upper_fl, d.available, d.kind(), + d.utilization.replace('\n', " ").chars().take(60).collect::() + ); + } + } + Some("fra") => { + // fra [point] — extract allowed FRA DCT edges; if a point is given, + // list its neighbours. + let edges = flightplanner_rad::parse_fra_edges(&path)?; + use std::collections::BTreeSet; + let points: BTreeSet<&str> = + edges.iter().flat_map(|e| [e.from.as_str(), e.to.as_str()]).collect(); + println!("FRA edges: {} | distinct points: {}", edges.len(), points.len()); + match args.get(2) { + Some(p) => { + let p = p.to_uppercase(); + let nbrs: BTreeSet<&str> = edges + .iter() + .filter_map(|e| { + if e.from == p { + Some(e.to.as_str()) + } else if e.to == p { + Some(e.from.as_str()) + } else { + None + } + }) + .collect(); + println!("{p} present: {} neighbours ({}): {:?}", points.contains(p.as_str()), nbrs.len(), nbrs); + } + None => { + for e in edges.iter().take(25) { + println!(" {} -> {}", e.from, e.to); + } + } + } + } + Some("caps") => { + // caps [FROM TO] — total level caps, or the cap for a city pair. + let rad = flightplanner_rad::parse(&path)?; + println!("Level caps (Annex 2A): {}", rad.level_caps.len()); + match (args.get(2), args.get(3)) { + (Some(f), Some(t)) => { + let f = f.to_uppercase(); + let t = t.to_uppercase(); + match rad.max_cruise_fl(&f, &t) { + Some(cap) => println!("{f}->{t}: max cruise FL{cap:03}"), + None => println!("{f}->{t}: no cap"), + } + } + _ => { + for c in rad.level_caps.iter().take(6) { + println!(" {} {:?}->{:?} FL{:?} [{}]", c.id, c.from, c.to, c.cap_fl, c.condition.replace('\n', " ").chars().take(30).collect::()); + } + } + } + } + Some("frapts") => { + // frapts [file] [POINT] — parse the official FRA points list. + let file = args.get(2).cloned().unwrap_or_else(|| "rad/fra-points.xlsx".into()); + let pts = flightplanner_rad::parse_fra_points(&file)?; + println!("FRA points: {}", pts.len()); + let roles = |r: &str| pts.iter().filter(|p| p.enroute == r).count(); + println!(" roles: E={} X={} EX={} I={}", roles("E"), roles("X"), roles("EX"), roles("I")); + match args.get(3) { + Some(name) => { + let name = name.to_uppercase(); + for p in pts.iter().filter(|p| p.name.eq_ignore_ascii_case(&name)) { + println!( + " {} @{:.4},{:.4} area={:?} enroute={} arrdep={} FL{:?}-{:?} flos={} loc={:?}", + p.name, p.lat, p.lon, p.areas, p.enroute, p.arrdep, p.level_lo, p.level_hi, p.flos, p.loc_ind + ); + } + } + None => { + for p in pts.iter().take(4) { + println!(" {} @{:.3},{:.3} {:?} {} FL{:?}-{:?}", p.name, p.lat, p.lon, p.areas, p.enroute, p.level_lo, p.level_hi); + } + } + } + } + _ => println!("usage: rad-tool sheets | dump | find | summary | fra [point] | caps [FROM TO] | frapts [file] [POINT]"), + } + Ok(()) +} diff --git a/crates/server/Cargo.toml b/crates/server/Cargo.toml new file mode 100644 index 0000000..a1fc2f5 --- /dev/null +++ b/crates/server/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "flightplanner-server" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "flightplanner-server" +path = "src/main.rs" + +[dependencies] +flightplanner-core = { workspace = true } +flightplanner-rad = { path = "../rad" } +axum = "0.7" +tokio = { version = "1", features = ["rt-multi-thread", "macros", "net"] } +tower-http = { version = "0.5", features = ["cors"] } +serde = { workspace = true } +serde_json = { workspace = true } diff --git a/crates/server/src/main.rs b/crates/server/src/main.rs new file mode 100644 index 0000000..8a6a4c3 --- /dev/null +++ b/crates/server/src/main.rs @@ -0,0 +1,134 @@ +//! Custom HTTP backend for Flight Planner — the "server" mode of the app. +//! +//! Exposes the same `core::api::plan` engine over HTTP so several clients can +//! share one navdata DB / route database. The GUI can point at this instead of +//! computing locally (chosen by the end user in Settings). +//! +//! Config via env: `FP_DB` (navdata SQLite), `FP_AIRCRAFT_DIR`, `FP_BIND`. + +use std::net::SocketAddr; +use std::sync::Arc; + +use axum::{ + extract::{Query, State}, + http::StatusCode, + routing::{get, post}, + Json, Router, +}; +use serde::Deserialize; +use tower_http::cors::CorsLayer; + +use flightplanner_core::api::{self, CachedRouteDto, PlanRequest, PlanResult}; +use flightplanner_core::rad::RadData; + +/// Server-side data locations (the client never dictates server file paths). +#[derive(Clone)] +struct Cfg { + db: String, + aircraft_dir: String, + cifp: String, + rad: Option>, +} + +async fn health() -> &'static str { + "ok" +} + +#[derive(Deserialize)] +struct RoutesQuery { + dep: String, + dest: String, + limit: Option, +} + +/// Our own database of stored flight plans for a city pair. +async fn routes( + State(cfg): State, + Query(q): Query, +) -> Result>, (StatusCode, String)> { + let db = cfg.db.clone(); + let res = tokio::task::spawn_blocking(move || { + api::recent_routes(&db, &q.dep, &q.dest, q.limit.unwrap_or(10)) + }) + .await + .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?; + res.map(Json) + .map_err(|e| (StatusCode::BAD_REQUEST, e.to_string())) +} + +async fn stats(State(cfg): State) -> Result, (StatusCode, String)> { + let db = cfg.db.clone(); + let n = tokio::task::spawn_blocking(move || api::route_db_count(&db)) + .await + .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))? + .map_err(|e| (StatusCode::BAD_REQUEST, e.to_string()))?; + Ok(Json(serde_json::json!({ "routes": n }))) +} + +async fn plan( + State(cfg): State, + Json(mut req): Json, +) -> Result, (StatusCode, String)> { + // Force the server's own data paths, ignoring whatever the client sent. + req.db_path = cfg.db.clone(); + req.aircraft_dir = cfg.aircraft_dir.clone(); + req.cifp_dir = Some(cfg.cifp.clone()); + let rad = cfg.rad.clone(); + // `api::plan` is blocking (SQLite + compute) — keep it off the async pool. + let res = tokio::task::spawn_blocking(move || api::plan(&req, rad.as_deref())) + .await + .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?; + res.map(Json) + .map_err(|e| (StatusCode::BAD_REQUEST, e.to_string())) +} + +/// Load the RAD workbook once (env `FP_RAD`, default `rad/RAD_current.xlsx`). +fn load_rad() -> Option { + let path = std::env::var("FP_RAD").unwrap_or_else(|_| "rad/RAD_current.xlsx".into()); + if !std::path::Path::new(&path).exists() { + eprintln!("RAD: file not found ({path}) — RAD checks disabled"); + return None; + } + match flightplanner_rad::parse(&path) { + Ok(rad) => { + let (f, o, c) = rad.dct_counts(); + println!( + "RAD loaded: {} areas, {} DCT ({f} forbidden / {o} conditional / {c} compulsory)", + rad.areas.len(), + rad.dct.len() + ); + Some(rad) + } + Err(e) => { + eprintln!("RAD: parse failed ({e}) — RAD checks disabled"); + None + } + } +} + +#[tokio::main] +async fn main() { + let rad = load_rad(); + let cfg = Cfg { + db: std::env::var("FP_DB").unwrap_or_else(|_| "real.db".into()), + aircraft_dir: std::env::var("FP_AIRCRAFT_DIR").unwrap_or_else(|_| "data/aircraft".into()), + cifp: std::env::var("FP_CIFP").unwrap_or_else(|_| "navdata/CIFP".into()), + rad: rad.map(Arc::new), + }; + let bind = std::env::var("FP_BIND").unwrap_or_else(|_| "0.0.0.0:8787".into()); + + let app = Router::new() + .route("/health", get(health)) + .route("/plan", post(plan)) + .route("/routes", get(routes)) + .route("/stats", get(stats)) + .layer(CorsLayer::permissive()) + .with_state(cfg.clone()); + + let addr: SocketAddr = bind.parse().expect("invalid FP_BIND"); + println!("Flight Planner server → http://{addr}"); + println!(" navdata DB : {}", cfg.db); + println!(" aircraft dir : {}", cfg.aircraft_dir); + let listener = tokio::net::TcpListener::bind(addr).await.expect("bind failed"); + axum::serve(listener, app).await.expect("server crashed"); +} diff --git a/data/aircraft/a320.json b/data/aircraft/a320.json new file mode 100644 index 0000000..be88390 --- /dev/null +++ b/data/aircraft/a320.json @@ -0,0 +1,31 @@ +{ + "icao": "A320", + "name": "Airbus A320-200 (CFM56-5B)", + "default_cruise_fl": 360, + "phases": { + "climb": { "ias_kt": 290, "mach": 0.78, "tas_kt": 380, "fuel_flow_kgph": 2600, "roc_fpm": 2000 }, + "cruise": { "mach": 0.78, "tas_kt": 447, "fuel_flow_kgph": 2400 }, + "descent": { "ias_kt": 290, "mach": 0.78, "tas_kt": 320, "fuel_flow_kgph": 1200, "rod_fpm": 1800 } + }, + "reserves": { + "final_reserve_min": 30, + "contingency_pct": 5.0, + "taxi_kg": 200 + }, + "openap": { + "wing_area_m2": 124, + "cd0": 0.018, + "induced_k": 0.039, + "n_engines": 2, + "engine": "CFM56-5B4", + "max_thrust_n": 117900, + "tsfc_cruise_g_per_ns": 0.0170, + "ff_idle_kgs": 0.107, + "ref_cruise_alt_ft": 35000, + "oew_kg": 42600, + "mtow_kg": 78000, + "mlw_kg": 66000, + "max_fuel_kg": 24210, + "cruise_mach": 0.78 + } +} diff --git a/data/aircraft/b738.json b/data/aircraft/b738.json new file mode 100644 index 0000000..44f7c98 --- /dev/null +++ b/data/aircraft/b738.json @@ -0,0 +1,31 @@ +{ + "icao": "B738", + "name": "Boeing 737-800 (CFM56-7B)", + "default_cruise_fl": 370, + "phases": { + "climb": { "ias_kt": 280, "mach": 0.78, "tas_kt": 370, "fuel_flow_kgph": 2800, "roc_fpm": 2200 }, + "cruise": { "mach": 0.785, "tas_kt": 450, "fuel_flow_kgph": 2500 }, + "descent": { "ias_kt": 280, "mach": 0.78, "tas_kt": 320, "fuel_flow_kgph": 1100, "rod_fpm": 1800 } + }, + "reserves": { + "final_reserve_min": 30, + "contingency_pct": 5.0, + "taxi_kg": 250 + }, + "openap": { + "wing_area_m2": 124.6, + "cd0": 0.019, + "induced_k": 0.042, + "n_engines": 2, + "engine": "CFM56-7B26", + "max_thrust_n": 116990, + "tsfc_cruise_g_per_ns": 0.0172, + "ff_idle_kgs": 0.113, + "ref_cruise_alt_ft": 35000, + "oew_kg": 41400, + "mtow_kg": 79000, + "mlw_kg": 66300, + "max_fuel_kg": 26000, + "cruise_mach": 0.789 + } +} diff --git a/gui/.gitignore b/gui/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/gui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/gui/.vscode/extensions.json b/gui/.vscode/extensions.json new file mode 100644 index 0000000..24d7cc6 --- /dev/null +++ b/gui/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] +} diff --git a/gui/README.md b/gui/README.md new file mode 100644 index 0000000..102e366 --- /dev/null +++ b/gui/README.md @@ -0,0 +1,7 @@ +# Tauri + React + Typescript + +This template should help get you started developing with Tauri, React and Typescript in Vite. + +## Recommended IDE Setup + +- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) diff --git a/gui/index.html b/gui/index.html new file mode 100644 index 0000000..ff93803 --- /dev/null +++ b/gui/index.html @@ -0,0 +1,14 @@ + + + + + + + Tauri + React + Typescript + + + +
+ + + diff --git a/gui/package-lock.json b/gui/package-lock.json new file mode 100644 index 0000000..8504e43 --- /dev/null +++ b/gui/package-lock.json @@ -0,0 +1,4061 @@ +{ + "name": "gui", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gui", + "version": "0.1.0", + "dependencies": { + "@fluentui/react-components": "^9.74.6", + "@fluentui/react-icons": "^2.0.337", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "7.css": "^0.21.1", + "maplibre-gl": "^6.4.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "devDependencies": { + "@tauri-apps/cli": "^2", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.6.0", + "typescript": "~5.8.3", + "vite": "^7.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/devtools": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@floating-ui/devtools/-/devtools-0.2.3.tgz", + "integrity": "sha512-ZTcxTvgo9CRlP7vJV62yCxdqmahHTGpSTi5QaTDgGoyQq0OyjaVZhUhXv/qdkQFOI3Sxlfmz0XGG4HaZMsDf8Q==", + "license": "MIT", + "peerDependencies": { + "@floating-ui/dom": "^1.0.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@fluentui/keyboard-keys": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-keys/-/keyboard-keys-9.0.9.tgz", + "integrity": "sha512-DjX4z+dDCB49rsmyDuOwtD28Zbe9CUf86JKi8aUEvO5/TetsiuGPokgJiFIR0S9SGeFbquj5CUmAslk1RpgMzw==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/priority-overflow": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.4.2.tgz", + "integrity": "sha512-xjjOolrrFWXny0RQFazheFnQ6O5qEm2cmHrsl8sUveRyARGmlzZQFxSQ4NAvtpnhx/GHXcqCKfINH+9ciyJX0w==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react-accordion": { + "version": "9.12.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.12.2.tgz", + "integrity": "sha512-j4uWILIw3jnVduQVxttQUZV26eHfkqlzsOavrdf7cjTtfJItmiicqvP520jZgfFLR3FsQhLQmcJvzxXbB9GQuw==", + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-alert": { + "version": "9.0.1-0", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.1-0.tgz", + "integrity": "sha512-pzV5sFD6JX38PegV+rmV2i0psTO1yCTODYewg0PPEz/g/hpLsbUCpLoPn0Ga3Nqc/szMcWbY4b/2c7cAkO79fg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-avatar": "^9.11.5", + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-aria": { + "version": "9.17.14", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.17.14.tgz", + "integrity": "sha512-/oBdrvWcIpziaVj5b5e8lDR2DLzVztvQQXuJqscM7ztYxhLYK2wZG0rAVxlAv+Bhyvx1Zqf/YtPCv/6mItx3zw==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-utilities": "^9.26.6", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-avatar": { + "version": "9.11.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.11.5.tgz", + "integrity": "sha512-frrqEbOKTGyff3aW5kaal7TNa+Slguwc6nVj+CvxV4AidEmf0r1Vk0QnIj/ioNT1UoG1/PNzaLfz3uu8ce6aSg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-badge": "^9.5.5", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-popover": "^9.14.6", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-tooltip": "^9.10.5", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-badge": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.5.5.tgz", + "integrity": "sha512-1BtuzPTsIgV6edHwV9oVKnZRhOIP/3RZTMDd3gSHt3nmXV/R8CcpOxxFhDuG+4AtKC26cvk6DV3hy5BKhw9bPg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-breadcrumb": { + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.4.5.tgz", + "integrity": "sha512-WUfOJSsiWLuNT7QCTGGWGi7bx5gRjspEE0B14eQIj5bfYhu5svfjfbf4Cgxi0Q3VYootiCciPHgom8/pFi0ItQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-link": "^9.8.4", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-button": { + "version": "9.11.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.11.0.tgz", + "integrity": "sha512-81zsqSvJSZx1SEG0kztcmEZb2kS8YUX0uPYsPp2bZCPEJB9YIBQn9kPrdt0M0YeAkoPKXQXG5gudSun9M80maA==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-card": { + "version": "9.7.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.7.2.tgz", + "integrity": "sha512-FsSmSYguIorjDPKcIfaXKIYRo+ZgQfu7toyKLRZsxtUiPa2i+C0bBTDwYVd0lLTo9oJN5dIiPshy9JBvw94BZw==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-text": "^9.6.19", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-carousel": { + "version": "9.9.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-carousel/-/react-carousel-9.9.12.tgz", + "integrity": "sha512-N8QUMzrKP/n+e+xJl9UO6tJhpMl5+S0/KZzUWYL7UxYwZ+cPJ1IdC45JOxI+iOwnFDXPpt+aAjU3WkPFo2PyLQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-tooltip": "^9.10.5", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1", + "embla-carousel": "^8.5.1", + "embla-carousel-autoplay": "^8.5.1", + "embla-carousel-fade": "^8.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-checkbox": { + "version": "9.6.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.6.4.tgz", + "integrity": "sha512-3OQaUJPXsMbi4ODVLl4zmRn4XqQBlfJS93cSnSYAAYHsA162D1UlsqwfZoTbnuUEJS+st9cWgbEcuZTYYQxm0Q==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-label": "^9.4.4", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-color-picker": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-color-picker/-/react-color-picker-9.3.0.tgz", + "integrity": "sha512-2pNHOcDe0aci5hyqsnA+0YvJ1CMfHKt1+a4UUrgssb6i5S1l1rcwnljonAQ4sCve4bMx6FVqNybx9tJ+g7CNXg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-combobox": { + "version": "9.17.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.17.5.tgz", + "integrity": "sha512-roH1DwhPslUxvtOnI9lnnIn+YtEqnmd5SIBgqDB1pQVqcznDZsbGSNXk/8IoVntM5LsMOa0YKKOd8N+8+/7aQg==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-positioning": "^9.23.1", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-components": { + "version": "9.74.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.74.6.tgz", + "integrity": "sha512-JfAbId8J0W+dMh2KFxZbpX2ag7ZbpchIQam8Twc15k0qis+OkrCCxts+DF1xVb403PTFz/5n2YFxGWmEajUlDA==", + "license": "MIT", + "dependencies": { + "@fluentui/react-accordion": "^9.12.2", + "@fluentui/react-alert": "9.0.1-0", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-avatar": "^9.11.5", + "@fluentui/react-badge": "^9.5.5", + "@fluentui/react-breadcrumb": "^9.4.5", + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-card": "^9.7.2", + "@fluentui/react-carousel": "^9.9.12", + "@fluentui/react-checkbox": "^9.6.4", + "@fluentui/react-color-picker": "^9.3.0", + "@fluentui/react-combobox": "^9.17.5", + "@fluentui/react-dialog": "^9.18.3", + "@fluentui/react-divider": "^9.7.4", + "@fluentui/react-drawer": "^9.13.2", + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-image": "^9.4.4", + "@fluentui/react-infobutton": "9.0.0-beta.119", + "@fluentui/react-infolabel": "^9.4.24", + "@fluentui/react-input": "^9.8.6", + "@fluentui/react-label": "^9.4.4", + "@fluentui/react-link": "^9.8.4", + "@fluentui/react-list": "^9.6.17", + "@fluentui/react-menu": "^9.25.3", + "@fluentui/react-message-bar": "^9.7.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-nav": "^9.4.4", + "@fluentui/react-overflow": "^9.9.2", + "@fluentui/react-persona": "^9.7.7", + "@fluentui/react-popover": "^9.14.6", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-positioning": "^9.23.1", + "@fluentui/react-progress": "^9.5.4", + "@fluentui/react-provider": "^9.22.20", + "@fluentui/react-radio": "^9.6.5", + "@fluentui/react-rating": "^9.4.4", + "@fluentui/react-search": "^9.4.6", + "@fluentui/react-select": "^9.5.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-skeleton": "^9.7.5", + "@fluentui/react-slider": "^9.6.5", + "@fluentui/react-spinbutton": "^9.6.5", + "@fluentui/react-spinner": "^9.8.5", + "@fluentui/react-swatch-picker": "^9.6.0", + "@fluentui/react-switch": "^9.7.5", + "@fluentui/react-table": "^9.19.19", + "@fluentui/react-tabs": "^9.12.4", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-tag-picker": "^9.10.2", + "@fluentui/react-tags": "^9.9.4", + "@fluentui/react-teaching-popover": "^9.7.4", + "@fluentui/react-text": "^9.6.19", + "@fluentui/react-textarea": "^9.7.6", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-toast": "^9.8.2", + "@fluentui/react-toolbar": "^9.8.4", + "@fluentui/react-tooltip": "^9.10.5", + "@fluentui/react-tree": "^9.16.5", + "@fluentui/react-utilities": "^9.26.6", + "@fluentui/react-virtualizer": "9.0.0-alpha.115", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-context-selector": { + "version": "9.2.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.2.19.tgz", + "integrity": "sha512-NfBKjtaWxXGFI4ZC75aPeQRTKPJOSQDwpdsiX6L4miewLnEwBKtK7+8Tbj2eTLh6fKY0aRwBfHwGqydF2kXVzQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.26.6", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0", + "scheduler": ">=0.19.0" + } + }, + "node_modules/@fluentui/react-dialog": { + "version": "9.18.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.18.3.tgz", + "integrity": "sha512-fI87iSHyncgeGKxiXquGDORm2vRAjygZOQkjVehEPsyX1RFlEDZxjqvW82NX41f4wv4ie6/qLclOOSkHzCTG3w==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-divider": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.7.4.tgz", + "integrity": "sha512-Ue7mwFIVSpyiATZPl5g0H/08Gaj6M0OzA9SVGVVpYK90zIYvP1Da23tlUpr80OkFTDCjSNUP1NSYtBGG27AH3g==", + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-drawer": { + "version": "9.13.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.13.2.tgz", + "integrity": "sha512-VM50S0Lr7PmA1DP770q+tZxCY9GmnAbQoKrlQWNJbhy74759dXbV2PVT0JnIWRkCqvNP0S2RDN4Z6SRJArIzQw==", + "license": "MIT", + "dependencies": { + "@fluentui/react-dialog": "^9.18.3", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-field": { + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.5.4.tgz", + "integrity": "sha512-RoVtH7/GK/45V45NPvCuVVG3K3/FeBXF+Jkk2Gw12XKqfKru2eI8MIhDofKsSH5l6ZkLclZ0ElmQvrYrJSvqJQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-label": "^9.4.4", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-icons": { + "version": "2.0.337", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.337.tgz", + "integrity": "sha512-0lhTfPAMnRaozExvwIB0fWb8Iluz6pvz2Xj6Jgfq9CYmMmdoIYRLCqxhxFGOw1ZHBIQWs6tRgH1zATrWcXlQMA==", + "license": "MIT", + "dependencies": { + "@griffel/react": "^1.6.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-image": { + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.4.4.tgz", + "integrity": "sha512-vjBHrUTuuDVp/IvIiz4bB0iqebU00EJHGJZpF5NlMd+TL7bcMhLU29MrbxQdvlNch78C+XCqoexbjHYoAUET9w==", + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-infobutton": { + "version": "9.0.0-beta.119", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.119.tgz", + "integrity": "sha512-6BsHqXEOxqWmSo3yqLynEht1uQTJO5snD+GbuyGJgnNWW2BuJ9Fzq/ZxaJNgY6t6c7T7W9JqRMPerXi0YsnNqQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.237", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-label": "^9.4.4", + "@fluentui/react-popover": "^9.14.6", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-infolabel": { + "version": "9.4.24", + "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.4.24.tgz", + "integrity": "sha512-AfApeHDRMxWMT1JsxJpDW+5Q2JfDX3HUxMhaj4q1Zz9204rqPN8r4VB3+fTqEC8SNghqiiDhIfI1bNeQ4baPwg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-label": "^9.4.4", + "@fluentui/react-popover": "^9.14.6", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <20.0.0", + "@types/react-dom": ">=16.8.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-input": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.8.6.tgz", + "integrity": "sha512-4EAMOTN5DCXB5DFKLwsFkCbMMelqOfl+jnB4kbH9Nu6nLwhJj89EYYGzzs2V3bctmJN9mtd7xkGITAZLYhUpTQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-jsx-runtime": { + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.4.5.tgz", + "integrity": "sha512-T791vRKj9l3WhJd6oWZ30J9xA8Pyv32VfB55PlywSqH8PchO+EzteG6q2yZ+6j919WRRMy45ElYebe1DulnGOA==", + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.26.6", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "react": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-label": { + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.4.4.tgz", + "integrity": "sha512-Xsi+K+c0SawFQFr72zpmzTHFhSqBpI8Lo6uqrfnVHtoF6lQyL11LyAIk0JtoLq82Pikqy4vvRta14fvwy0UM2g==", + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-link": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.8.4.tgz", + "integrity": "sha512-wwyA/wRJOozyT2C0RK6maGKZM6xFgfoNt196WN5g+WApbNlgDEgqOLUScj14o+MNOe8H/bnfuNN1U6KEGtD09A==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-list": { + "version": "9.6.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-list/-/react-list-9.6.17.tgz", + "integrity": "sha512-KytdJlezG06DByb9uLfdnXtlaM1VxEpMXeaINfgjxwlHa/uohJVpwN3il+NSchYfTh/kle6telVRWG515Klhhg==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-checkbox": "^9.6.4", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <20.0.0", + "@types/react-dom": ">=16.8.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-menu": { + "version": "9.25.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.25.3.tgz", + "integrity": "sha512-TLOIxNwrZG0vqLoQRQPPOcVJm+q8X6CiFBLHmEeomFgV1BWcxKkjo4Qohcqd2UEiBzGbSNc9vP1UZAC2wNc+5w==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-positioning": "^9.23.1", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-message-bar": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.7.5.tgz", + "integrity": "sha512-Q5VM6EkW3D0P7+/XCUO/4IBZW8tRLcsd9/yqLRk4ec9egxVrZZ6l5Z+SUK/MCEyoHXKP7GcErjcDGR1jm6JzxQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-link": "^9.8.4", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <20.0.0", + "@types/react-dom": ">=16.8.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-motion": { + "version": "9.16.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion/-/react-motion-9.16.2.tgz", + "integrity": "sha512-fraG2s/UlduW5JYbvP619S2755DlG7kiPKd/rlXEebgPRTSVgkuSWW5suvYVqO64/PJpZrnJD23sweAeqol6PA==", + "license": "MIT", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-utilities": "^9.26.6", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <20.0.0", + "@types/react-dom": ">=16.8.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-motion-components-preview": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-components-preview/-/react-motion-components-preview-0.15.7.tgz", + "integrity": "sha512-YeG5cPkmODOGfmVktpPCFCe/0mKj3CCrquHOREcf+gug2aXLp/0jFy8LY4LUhYeJw7wVzVr9XzBxuzo5dE4XIg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-motion": "*", + "@fluentui/react-utilities": "*", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-nav": { + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-nav/-/react-nav-9.4.4.tgz", + "integrity": "sha512-JIIC/QuWE+ySEEW6jF414Vh/wMNbO210wU+qC2U5+r6KiPFBvgkog5Pqr5qRY62XHlmJz2Zl+pDXBwoX9RSe4Q==", + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-divider": "^9.7.4", + "@fluentui/react-drawer": "^9.13.2", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-tooltip": "^9.10.5", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-overflow": { + "version": "9.9.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.9.2.tgz", + "integrity": "sha512-11NL9YtysCKQrgcPkty4271MQ6cVsBANEU09qHtDkNpN2bODddwzrvK5ggCBaK7n7cTVlpJWYZzQZV+YxZ5EQQ==", + "license": "MIT", + "dependencies": { + "@fluentui/priority-overflow": "^9.4.2", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-persona": { + "version": "9.7.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.7.7.tgz", + "integrity": "sha512-+xrJIClBzH6ua0yWRum0+9McEuZ/lCcOpdC9cmltcBag0Gb3/rjmf5Dr2w4tLPTIGzbLuDE00Yoexy6jJLWm2A==", + "license": "MIT", + "dependencies": { + "@fluentui/react-avatar": "^9.11.5", + "@fluentui/react-badge": "^9.5.5", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-popover": { + "version": "9.14.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.14.6.tgz", + "integrity": "sha512-BMDS4acfZbg/44za41s38PzRplqid5ardTA2Xcjq77YPwhoaLRVAPztU1/9/ivss3tuPDn1+20knyv+bBhInzw==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-positioning": "^9.23.1", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-portal": { + "version": "9.8.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.8.15.tgz", + "integrity": "sha512-1lXeUn+K31DwpJGQNKIRs6wz1iZOQWsH0gfLF6qy69m1EdR16SqfjprLZ3jI97xJDVatHIuYAvO/5EmmVv60/g==", + "license": "MIT", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-positioning": { + "version": "9.23.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.23.1.tgz", + "integrity": "sha512-QtnF1gOc0pQx5ks0DADpl5Jxh8mh4R82ddtaYu9XdyqBIfRz/SdYOPD6eB99qc7ynZnywuHsNH144W77jO+vdQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/devtools": "^0.2.3", + "@floating-ui/dom": "^1.6.12", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-progress": { + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.5.4.tgz", + "integrity": "sha512-SLVw/NCrW3pglcF2J7Cu9hc5CAnDq6yyeDuRd4FTxUtMnOpqH+k3AkkLAZDmELKlHe2ZJs5E7jHwFb5kPYcV7A==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-provider": { + "version": "9.22.20", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.22.20.tgz", + "integrity": "sha512-Cu97d65ry3t+nbGWxBmkfbmQo3IPyFjxxskQWUkd4yQcC2OB5VKbuaO28gHP8EgZglxkQmoEMf/0sWCo5HI0rQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/core": "^1.16.0", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-radio": { + "version": "9.6.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.6.5.tgz", + "integrity": "sha512-xcyyGvklsmvcSYa95jPVKreJRwfOWVXFmPzWQ4OTSqDKe3zVRvPmkqiBVMwHAORsjkchMUQ6Gdvh0BG0hh6DLw==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-label": "^9.4.4", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-rating": { + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-rating/-/react-rating-9.4.4.tgz", + "integrity": "sha512-GhM49vZ5018vE/FBDs8LXZVmK1SVdG/KNbJ0jDvQSUp4acgonnSxe9dPej2l8l6l3TZ2aEGmeUKwYhxQC3DcJg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <20.0.0", + "@types/react-dom": ">=16.8.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-search": { + "version": "9.4.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.4.6.tgz", + "integrity": "sha512-cKe1nPhl08ity4wEktUdX2UGWlcVkwSjVckmCHoyVKKP1w/9jlL9KqzkEHaOUpo0NUr8vHWyOLjZSG5mcJox+g==", + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-input": "^9.8.6", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-select": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.5.5.tgz", + "integrity": "sha512-cUu9gTlrlXdnVJ0GhzjTXfpMckyiFgNc1eY4HmcWbAIN6si250CsPkrdyvuqCwklWR9A/JHH3RD8RU+GUFmn7g==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-shared-contexts": { + "version": "9.26.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.26.3.tgz", + "integrity": "sha512-+FvkVJqX9yuZaZ//FWtNA4O0V33UA8Q82/5shp2fCox6HItENn87E5QecUobsodeYJ6xCAbTHccMh+LRiZhHJA==", + "license": "MIT", + "dependencies": { + "@fluentui/react-theme": "^9.2.2", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "react": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-skeleton": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.7.5.tgz", + "integrity": "sha512-CpjtweojZjeDzOYdOgMneKfKrLosxR5xe1Fw3sySws8fZP0bqF7u6MKaJYUhRL6sFt4XK1e2gBFzJLe5IbAgRA==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-slider": { + "version": "9.6.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.6.5.tgz", + "integrity": "sha512-GTDrlMaacPsXzrHPmmb+HdwOlJ6DSk9svFYHq/uDlneHPqGaBHH5RkkpRi3iqAQySd9YjqXVhUk9yOAgbci4OQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-spinbutton": { + "version": "9.6.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.6.5.tgz", + "integrity": "sha512-ooGgs1QJM2inLGlO0LDLAtOTw/erG78ZfPNhbeKTkOAcNYnoOykw9WQ3rTqYRuNmFfhIRyusjcDky5aiYYCqJg==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-spinner": { + "version": "9.8.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.8.5.tgz", + "integrity": "sha512-75LFy1x95R6UB50uaxNCgrlQJ72PodO15vrCawcWkVF4DkR+RynpZLoQNIPAABpbNM6ZD+Cdq9fnvYF+d1U1ww==", + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-label": "^9.4.4", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-swatch-picker": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-swatch-picker/-/react-swatch-picker-9.6.0.tgz", + "integrity": "sha512-5s8P3MQyTOsCNoGiKMUvVufJXJ+0Hb0KDWL79CvGsJGpwnN9uhKHuVft3MkfUl+SOExacv+OqqzzMFk+wB4HTg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <20.0.0", + "@types/react-dom": ">=16.8.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-switch": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.7.5.tgz", + "integrity": "sha512-YTHlC8FA47A/0zspQq2K31FQ9lPhe0bO3Y30FRpaubmia1I+XqbmenyGNRxMhz7CYYVU7kbMb6o458eDrfutxQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-label": "^9.4.4", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-table": { + "version": "9.19.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.19.19.tgz", + "integrity": "sha512-w2T+EsBATODdu9zbzXL3dho2ZTVvW5ep57yXFT9r+6X2gz+cNUejVGCChWaSxL+/1y3KTt1dyE0JCquRfEST3g==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-avatar": "^9.11.5", + "@fluentui/react-checkbox": "^9.6.4", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-radio": "^9.6.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-tabs": { + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.12.4.tgz", + "integrity": "sha512-YsaqjDFXcC8nvEAW3QpwdD1xIpzzyLFdftqXDA8ULmb2gmeRNWqPClCHftLa0QEIyLAIhX5pXDejHLDPFnQ2mg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-tabster": { + "version": "9.26.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.26.17.tgz", + "integrity": "sha512-kr6el429OvaMD1sSIOt9qyoQTbbgz2zLar81qM9OTi2lj9vhclHSgwaHT7x5yTV0a2LfYQ02emEJeG5NHVAn2w==", + "license": "MIT", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1", + "keyborg": "^2.14.1", + "tabster": "^8.8.0" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-tag-picker": { + "version": "9.10.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-tag-picker/-/react-tag-picker-9.10.2.tgz", + "integrity": "sha512-9T+XWOgBBcPwV4vTOyrawVNxnYvIZbngQ1lpcEwec0Ap51pRIr7DxG0Z459S2HB4qZbF2JJ+xX2z4Snx9Y9QUQ==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-combobox": "^9.17.5", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-positioning": "^9.23.1", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-tags": "^9.9.4", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-tags": { + "version": "9.9.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.9.4.tgz", + "integrity": "sha512-vwE56xx1sWdem1PejayTquRg7a+Uef/o10tf8fJ2z2w+y4jS98DcXVlH4BG57ZPWef1DGVuCFh1xUPldYLt8Zg==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-avatar": "^9.11.5", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-teaching-popover": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.7.4.tgz", + "integrity": "sha512-XPnHrNlb6/wj1Gl0hLL306ANtlgDLxfXdjApdGS2aSNp136C1I3pJvRmHxW9byEaY26Wbn4Gb+cC1NI2Fb9lEQ==", + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-popover": "^9.14.6", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <20.0.0", + "@types/react-dom": ">=16.8.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-text": { + "version": "9.6.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.6.19.tgz", + "integrity": "sha512-mgGdeRfDHOWJHUeywwebJAVOqZeQLUK09YMbJsETskELsDH1JOVHOGPBrBs+OKnoVNh43hYwqpDqScFT5z+nrg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-textarea": { + "version": "9.7.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.7.6.tgz", + "integrity": "sha512-7evgM3j9uUaXUHDhsCygrL0xsWwG+AUs3w6gQgBb8YNzXZa4q2sQJaxv2IRyDxNIoIp6pBZDI4F9nZlNlLtrdg==", + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.5.4", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-theme": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.2.2.tgz", + "integrity": "sha512-yUQMQkMLGvo6+Q/RITxpLh00STvI299gnk1IV/QHc2DW5EKiCcmIp9xma7+lJzfLACfDkwJDy5hZSl+7MIYf9w==", + "license": "MIT", + "dependencies": { + "@fluentui/tokens": "1.0.0-alpha.24", + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react-toast": { + "version": "9.8.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.8.2.tgz", + "integrity": "sha512-Zm6J35ZBQ6si/tnWdEZnrhtoqkCUBjr+2z5uNJAZUP8RQSyZA78JwgkRXn7GxJ7VHeNQVUQN4SjuRCFmD6oJ4w==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-toolbar": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.8.4.tgz", + "integrity": "sha512-fFLTzT6lV4u58xkLy6mdWFTxdQAPYk8wDAKplHHKtCfV1hilFH2IPIcRakyN2aLS3c3hS87QDWtEBO6nfXum+g==", + "license": "MIT", + "dependencies": { + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-divider": "^9.7.4", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-radio": "^9.6.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-tooltip": { + "version": "9.10.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.10.5.tgz", + "integrity": "sha512-GiQiu2NeD9GTJHOCqjARMR4eQIN2815a73ZBvXOxyB0H1Z4I/IpiHdsoHMiBIGv6OhKWASO4KYh0RPuJ1TiRSg==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-portal": "^9.8.15", + "@fluentui/react-positioning": "^9.23.1", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-tree": { + "version": "9.16.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.16.5.tgz", + "integrity": "sha512-KTlUEjfcYHq02Hd63KXvqIBxBbXT1uheuu5Bzr202FlY7lsIEveF6EJU9h09GLJQkFYro/SYy/V3qxapM3nDHg==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-aria": "^9.17.14", + "@fluentui/react-avatar": "^9.11.5", + "@fluentui/react-button": "^9.11.0", + "@fluentui/react-checkbox": "^9.6.4", + "@fluentui/react-context-selector": "^9.2.19", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-motion": "^9.16.2", + "@fluentui/react-motion-components-preview": "^0.15.7", + "@fluentui/react-radio": "^9.6.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-tabster": "^9.26.17", + "@fluentui/react-theme": "^9.2.2", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-utilities": { + "version": "9.26.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.26.6.tgz", + "integrity": "sha512-a14Iihg2MmRSq1fxqr/4ffMl8VO0gYWRHAYKENz2PoL+oWnCtkMz4PDglIY8rVa7RADwXYI65XOjui0BjIFMvQ==", + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.9", + "@fluentui/react-shared-contexts": "^9.26.3", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "react": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/react-virtualizer": { + "version": "9.0.0-alpha.115", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.115.tgz", + "integrity": "sha512-8ZOFmt5eSkiH9jWYvfmMkef+2jGvWrDeXjUptZeesgn4VRXwQu4SUKPLWqZ+ETcYXX/0leGEDl6KItdp/XxbmA==", + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.4.5", + "@fluentui/react-shared-contexts": "^9.26.3", + "@fluentui/react-utilities": "^9.26.6", + "@griffel/react": "^1.5.32", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <20.0.0", + "@types/react-dom": ">=16.9.0 <20.0.0", + "react": ">=16.14.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@fluentui/tokens": { + "version": "1.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.24.tgz", + "integrity": "sha512-YrjGQfnxBR+9o8wXyTflON3Ohsv7OrZWYLVRU+7RaiFO1gcu36iDm3WjudlVmYuWRLDO0Gmxotm6RQNhbZuEQQ==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@griffel/core": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.21.3.tgz", + "integrity": "sha512-FMnlwhtmCRWvXEg2j/6W90wzvW+PFqdrsWFslfmxwS6l9X73gO0dnndKphht9ZOsJODvmLdqlnU1Lh8igg2mKw==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@griffel/style-types": "^1.4.2", + "csstype": "^3.2.3", + "rtl-css-js": "^1.16.1", + "stylis": "^4.4.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@griffel/react": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.7.7.tgz", + "integrity": "sha512-XNBfZTgyOJOn1Buk70q4DgtwsQt71yH6R34lleImLVhvcIANP1yim86qLBnQSP03eQFXV5wgSmUVPxRUpdvYhg==", + "license": "MIT", + "dependencies": { + "@griffel/core": "^1.21.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.14.0 <20.0.0" + } + }, + "node_modules/@griffel/style-types": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.4.2.tgz", + "integrity": "sha512-MsSghfpyxR2MpTrYdcCozISsSLkmFjNw94wNPi4bDBRLW8W43718W/ZjmUdVkoM0KXMtJPYuEkx8Mzibqb03qA==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.3" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.3.tgz", + "integrity": "sha512-0SElaV0uMxEnxzBhhX9WTuPyUeMsAN/SS0i16tjuba4/mio63MG9khjC1a0JAiPGXAwvwm4UfHJURCN7nyudQg==", + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", + "license": "ISC" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.2.0.tgz", + "integrity": "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-1.0.0.tgz", + "integrity": "sha512-fqd515fjBmANKGGsQ286E2Wvj/XvDFpGzwJxq4CI6jMQue6Oy04uCKp+JWKF00xRTmk6cEu1jPJ9p3xqH8YWqQ==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-3.0.0.tgz", + "integrity": "sha512-Qf10S1uIHMk20ri/IVBnpS+esUEkVaR5Hftmz88jTInrpmWgPGJfPe3LVjjlE77trLx8tH6qjTG7uWH9hIq/0Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~1.1.0", + "@types/geojson": "^7946.0.16", + "pbf": "^5.0.0" + } + }, + "node_modules/@maplibre/geojson-vt": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-6.1.1.tgz", + "integrity": "sha512-FVMOcmSP/yqol45t7StApEyTL5/vmqBCuFhH9n+fFuINenhaX+YgHHIt1yJ86S8kln3uJLcMvmEU2cfn6E2eCQ==", + "license": "ISC", + "dependencies": { + "kdbush": "^4.1.0" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "26.2.1", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-26.2.1.tgz", + "integrity": "sha512-QFKCXkOeSzOr8jF75jm6kySOg+dUvOehPhRi68gcOYPHb7U5JloUq0dJW0Y5/fZV8ygfT0Vp2RWodvq+fyxFWA==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "^2.0.3", + "@mapbox/unitbezier": "^1.0.0", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^3.0.0", + "tinyqueue": "^3.0.0" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/@maplibre/mlt": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.1.12.tgz", + "integrity": "sha512-ZeK5w2TTeHOajcLaEQs1KZXw2V9wIKo1PmThlxlsHoXsQsYlBqLJzPOd6tJHRtGTChUY3DPPmjXRArYVvAbmZw==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0" + } + }, + "node_modules/@maplibre/vt-pbf": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.3.2.tgz", + "integrity": "sha512-j6p0AdjvAR19Z3XaCysle7A4ZSo08tYOzxD0Y9NQylwPAkwJJeYub5b2eVucdeDh7erhv69DahoLOevDRERRUw==", + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0", + "@types/geojson": "^7946.0.16", + "pbf": "^5.1.0" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tauri-apps/api": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.1.tgz", + "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.11.4.tgz", + "integrity": "sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.11.4", + "@tauri-apps/cli-darwin-x64": "2.11.4", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.4", + "@tauri-apps/cli-linux-arm64-gnu": "2.11.4", + "@tauri-apps/cli-linux-arm64-musl": "2.11.4", + "@tauri-apps/cli-linux-riscv64-gnu": "2.11.4", + "@tauri-apps/cli-linux-x64-gnu": "2.11.4", + "@tauri-apps/cli-linux-x64-musl": "2.11.4", + "@tauri-apps/cli-win32-arm64-msvc": "2.11.4", + "@tauri-apps/cli-win32-ia32-msvc": "2.11.4", + "@tauri-apps/cli-win32-x64-msvc": "2.11.4" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.11.4.tgz", + "integrity": "sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.11.4.tgz", + "integrity": "sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.11.4.tgz", + "integrity": "sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.11.4.tgz", + "integrity": "sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.11.4.tgz", + "integrity": "sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.11.4.tgz", + "integrity": "sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.11.4.tgz", + "integrity": "sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.11.4.tgz", + "integrity": "sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.11.4.tgz", + "integrity": "sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.11.4.tgz", + "integrity": "sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.11.4.tgz", + "integrity": "sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/plugin-opener": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.4.tgz", + "integrity": "sha512-1HnPkb+AmgO29HBazm4uPLKB+r7zzcTBW1d0fyYp1uP+jwtpoiNDGKMMzz58SFp49nOIrxdE3aUJtT57lfO9CQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.11.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/7.css": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/7.css/-/7.css-0.21.1.tgz", + "integrity": "sha512-Q+/aFUpGemoR/Zltj4a7yvHonyxfb+9cgiwBL+j/Lm+H28EOoLzWoJki7MdGPV+3mLCvKSCVqr3M2x2uNYyeWw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.15.tgz", + "integrity": "sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/earcut": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.2.3.tgz", + "integrity": "sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==", + "license": "ISC" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.409", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.409.tgz", + "integrity": "sha512-ChI4N44d0B4A6C8prnNjMOaGgE59fUyEVYcRYm2XEXIjMbbvF5i9UL1cblDbpGqiU0uS8FE8UcKxqZqTXdmzbQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "license": "MIT" + }, + "node_modules/embla-carousel-autoplay": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.6.0.tgz", + "integrity": "sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-fade": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-fade/-/embla-carousel-fade-8.6.0.tgz", + "integrity": "sha512-qaYsx5mwCz72ZrjlsXgs1nKejSrW+UhkbOMwLgfRT7w2LtdEB03nPRI06GHuHv5ac2USvbEiX2/nAHctcDwvpg==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kdbush": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.1.0.tgz", + "integrity": "sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ==", + "license": "ISC" + }, + "node_modules/keyborg": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.14.1.tgz", + "integrity": "sha512-/WmmVBa6Me3hIKAOIyIq1sql+6oydQZzGMBDLNfOcJ8710byMsq3KSLS8GQhBJHOMtvnXnUBrDAIbABcZVipcg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/maplibre-gl": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-6.4.1.tgz", + "integrity": "sha512-KzxQKtfBu/pSz1C+yW1hNS9eyj2h2lC7ufdAi6/SEt177n3oAfDfmUmslRfJdXY7ReAFBcnvwsqmiyoDhtA9GQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "^1.1.0", + "@mapbox/tiny-sdf": "^2.2.0", + "@mapbox/unitbezier": "^1.0.0", + "@mapbox/vector-tile": "^3.0.0", + "@maplibre/geojson-vt": "^6.1.1", + "@maplibre/maplibre-gl-style-spec": "^26.2.1", + "@maplibre/mlt": "^1.1.12", + "@maplibre/vt-pbf": "^4.3.2", + "@types/geojson": "^7946.0.16", + "earcut": "^3.2.3", + "gl-matrix": "^3.4.4", + "kdbush": "^4.1.0", + "murmurhash-js": "^1.0.0", + "pbf": "^5.1.2", + "potpack": "^2.1.0", + "quickselect": "^3.0.0", + "tinyqueue": "^3.0.0" + }, + "engines": { + "node": ">=16.14.0", + "npm": ">=8.1.0" + }, + "funding": { + "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/pbf": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-5.1.2.tgz", + "integrity": "sha512-mnvGdvOrIvJOBGUEdGkrVXjN8E/VkIJCkf2eS1DH2yv82ORUlLttmDt0rWY38yYZmVwciZwBUvHM20qxBZf40w==", + "license": "BSD-3-Clause", + "dependencies": { + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/potpack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", + "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", + "license": "ISC" + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", + "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", + "license": "MIT" + }, + "node_modules/quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/tabster": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-8.8.0.tgz", + "integrity": "sha512-eGFXgtvKOQP5BywDI9Ngs+Atm6TRj45epAAqWKyVoi+HmOmdamEB//1H/FttLdNly/+Cz+GJ4RN8TnXTw0KwfA==", + "license": "MIT", + "dependencies": { + "keyborg": "^2.14.0", + "tslib": "^2.8.1" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/gui/package.json b/gui/package.json new file mode 100644 index 0000000..42c58af --- /dev/null +++ b/gui/package.json @@ -0,0 +1,30 @@ +{ + "name": "gui", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@fluentui/react-components": "^9.74.6", + "@fluentui/react-icons": "^2.0.337", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "7.css": "^0.21.1", + "maplibre-gl": "^6.4.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "devDependencies": { + "@tauri-apps/cli": "^2", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.6.0", + "typescript": "~5.8.3", + "vite": "^7.0.4" + } +} diff --git a/gui/public/tauri.svg b/gui/public/tauri.svg new file mode 100644 index 0000000..31b62c9 --- /dev/null +++ b/gui/public/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/gui/public/vite.svg b/gui/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/gui/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gui/public/world.geojson b/gui/public/world.geojson new file mode 100644 index 0000000..1e6ab74 --- /dev/null +++ b/gui/public/world.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","name":"ne_110m_admin_0_countries","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Fiji","SOV_A3":"FJI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Fiji","ADM0_A3":"FJI","GEOU_DIF":0,"GEOUNIT":"Fiji","GU_A3":"FJI","SU_DIF":0,"SUBUNIT":"Fiji","SU_A3":"FJI","BRK_DIFF":0,"NAME":"Fiji","NAME_LONG":"Fiji","BRK_A3":"FJI","BRK_NAME":"Fiji","BRK_GROUP":null,"ABBREV":"Fiji","POSTAL":"FJ","FORMAL_EN":"Republic of Fiji","FORMAL_FR":null,"NAME_CIAWF":"Fiji","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Fiji","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":889953,"POP_RANK":11,"POP_YEAR":2019,"GDP_MD":5496,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"FJ","ISO_A2":"FJ","ISO_A2_EH":"FJ","ISO_A3":"FJI","ISO_A3_EH":"FJI","ISO_N3":"242","ISO_N3_EH":"242","UN_A3":"242","WB_A2":"FJ","WB_A3":"FJI","WOE_ID":23424813,"WOE_ID_EH":23424813,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"FJI","ADM0_DIFF":null,"ADM0_TLC":"FJI","ADM0_A3_US":"FJI","ADM0_A3_FR":"FJI","ADM0_A3_RU":"FJI","ADM0_A3_ES":"FJI","ADM0_A3_CN":"FJI","ADM0_A3_TW":"FJI","ADM0_A3_IN":"FJI","ADM0_A3_NP":"FJI","ADM0_A3_PK":"FJI","ADM0_A3_DE":"FJI","ADM0_A3_GB":"FJI","ADM0_A3_BR":"FJI","ADM0_A3_IL":"FJI","ADM0_A3_PS":"FJI","ADM0_A3_SA":"FJI","ADM0_A3_EG":"FJI","ADM0_A3_MA":"FJI","ADM0_A3_PT":"FJI","ADM0_A3_AR":"FJI","ADM0_A3_JP":"FJI","ADM0_A3_KO":"FJI","ADM0_A3_VN":"FJI","ADM0_A3_TR":"FJI","ADM0_A3_ID":"FJI","ADM0_A3_PL":"FJI","ADM0_A3_GR":"FJI","ADM0_A3_IT":"FJI","ADM0_A3_NL":"FJI","ADM0_A3_SE":"FJI","ADM0_A3_BD":"FJI","ADM0_A3_UA":"FJI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":177.975427,"LABEL_Y":-17.826099,"NE_ID":1159320625,"WIKIDATAID":"Q712","NAME_AR":"فيجي","NAME_BN":"ফিজি","NAME_DE":"Fidschi","NAME_EN":"Fiji","NAME_ES":"Fiyi","NAME_FA":"فیجی","NAME_FR":"Fidji","NAME_EL":"Φίτζι","NAME_HE":"פיג'י","NAME_HI":"फ़िजी","NAME_HU":"Fidzsi-szigetek","NAME_ID":"Fiji","NAME_IT":"Figi","NAME_JA":"フィジー","NAME_KO":"피지","NAME_NL":"Fiji","NAME_PL":"Fidżi","NAME_PT":"Fiji","NAME_RU":"Фиджи","NAME_SV":"Fiji","NAME_TR":"Fiji","NAME_UK":"Фіджі","NAME_UR":"فجی","NAME_VI":"Fiji","NAME_ZH":"斐济","NAME_ZHT":"斐濟","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-180,-18.28799,180,-16.020882],"geometry":{"type":"MultiPolygon","coordinates":[[[[180,-16.067133],[180,-16.555217],[179.364143,-16.801354],[178.725059,-17.012042],[178.596839,-16.63915],[179.096609,-16.433984],[179.413509,-16.379054],[180,-16.067133]]],[[[178.12557,-17.50481],[178.3736,-17.33992],[178.71806,-17.62846],[178.55271,-18.15059],[177.93266,-18.28799],[177.38146,-18.16432],[177.28504,-17.72465],[177.67087,-17.38114],[178.12557,-17.50481]]],[[[-179.79332,-16.020882],[-179.917369,-16.501783],[-180,-16.555217],[-180,-16.067133],[-179.79332,-16.020882]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"United Republic of Tanzania","SOV_A3":"TZA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"United Republic of Tanzania","ADM0_A3":"TZA","GEOU_DIF":0,"GEOUNIT":"Tanzania","GU_A3":"TZA","SU_DIF":0,"SUBUNIT":"Tanzania","SU_A3":"TZA","BRK_DIFF":0,"NAME":"Tanzania","NAME_LONG":"Tanzania","BRK_A3":"TZA","BRK_NAME":"Tanzania","BRK_GROUP":null,"ABBREV":"Tanz.","POSTAL":"TZ","FORMAL_EN":"United Republic of Tanzania","FORMAL_FR":null,"NAME_CIAWF":"Tanzania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Tanzania","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":58005463,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":63177,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"TZ","ISO_A2":"TZ","ISO_A2_EH":"TZ","ISO_A3":"TZA","ISO_A3_EH":"TZA","ISO_N3":"834","ISO_N3_EH":"834","UN_A3":"834","WB_A2":"TZ","WB_A3":"TZA","WOE_ID":23424973,"WOE_ID_EH":23424973,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TZA","ADM0_DIFF":null,"ADM0_TLC":"TZA","ADM0_A3_US":"TZA","ADM0_A3_FR":"TZA","ADM0_A3_RU":"TZA","ADM0_A3_ES":"TZA","ADM0_A3_CN":"TZA","ADM0_A3_TW":"TZA","ADM0_A3_IN":"TZA","ADM0_A3_NP":"TZA","ADM0_A3_PK":"TZA","ADM0_A3_DE":"TZA","ADM0_A3_GB":"TZA","ADM0_A3_BR":"TZA","ADM0_A3_IL":"TZA","ADM0_A3_PS":"TZA","ADM0_A3_SA":"TZA","ADM0_A3_EG":"TZA","ADM0_A3_MA":"TZA","ADM0_A3_PT":"TZA","ADM0_A3_AR":"TZA","ADM0_A3_JP":"TZA","ADM0_A3_KO":"TZA","ADM0_A3_VN":"TZA","ADM0_A3_TR":"TZA","ADM0_A3_ID":"TZA","ADM0_A3_PL":"TZA","ADM0_A3_GR":"TZA","ADM0_A3_IT":"TZA","ADM0_A3_NL":"TZA","ADM0_A3_SE":"TZA","ADM0_A3_BD":"TZA","ADM0_A3_UA":"TZA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":34.959183,"LABEL_Y":-6.051866,"NE_ID":1159321337,"WIKIDATAID":"Q924","NAME_AR":"تنزانيا","NAME_BN":"তানজানিয়া","NAME_DE":"Tansania","NAME_EN":"Tanzania","NAME_ES":"Tanzania","NAME_FA":"تانزانیا","NAME_FR":"Tanzanie","NAME_EL":"Τανζανία","NAME_HE":"טנזניה","NAME_HI":"तंज़ानिया","NAME_HU":"Tanzánia","NAME_ID":"Tanzania","NAME_IT":"Tanzania","NAME_JA":"タンザニア","NAME_KO":"탄자니아","NAME_NL":"Tanzania","NAME_PL":"Tanzania","NAME_PT":"Tanzânia","NAME_RU":"Танзания","NAME_SV":"Tanzania","NAME_TR":"Tanzanya","NAME_UK":"Танзанія","NAME_UR":"تنزانیہ","NAME_VI":"Tanzania","NAME_ZH":"坦桑尼亚","NAME_ZHT":"坦尚尼亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[29.339998,-11.720938,40.31659,-0.95],"geometry":{"type":"Polygon","coordinates":[[[33.903711,-0.95],[34.07262,-1.05982],[37.69869,-3.09699],[37.7669,-3.67712],[39.20222,-4.67677],[38.74054,-5.90895],[38.79977,-6.47566],[39.44,-6.84],[39.47,-7.1],[39.19469,-7.7039],[39.25203,-8.00781],[39.18652,-8.48551],[39.53574,-9.11237],[39.9496,-10.0984],[40.316586,-10.317098],[40.31659,-10.3171],[39.521,-10.89688],[38.427557,-11.285202],[37.82764,-11.26879],[37.47129,-11.56876],[36.775151,-11.594537],[36.514082,-11.720938],[35.312398,-11.439146],[34.559989,-11.52002],[34.28,-10.16],[33.940838,-9.693674],[33.73972,-9.41715],[32.759375,-9.230599],[32.191865,-8.930359],[31.556348,-8.762049],[31.157751,-8.594579],[30.74001,-8.340006],[30.740015,-8.340007],[30.199997,-7.079981],[29.620032,-6.520015],[29.419993,-5.939999],[29.519987,-5.419979],[29.339998,-4.499983],[29.753512,-4.452389],[30.11632,-4.09012],[30.50554,-3.56858],[30.75224,-3.35931],[30.74301,-3.03431],[30.52766,-2.80762],[30.469674,-2.413855],[30.46967,-2.41383],[30.758309,-2.28725],[30.816135,-1.698914],[30.419105,-1.134659],[30.76986,-1.01455],[31.86617,-1.02736],[33.903711,-0.95]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":7,"SOVEREIGNT":"Western Sahara","SOV_A3":"SAH","ADM0_DIF":0,"LEVEL":2,"TYPE":"Indeterminate","TLC":"1","ADMIN":"Western Sahara","ADM0_A3":"SAH","GEOU_DIF":0,"GEOUNIT":"Western Sahara","GU_A3":"SAH","SU_DIF":0,"SUBUNIT":"Western Sahara","SU_A3":"SAH","BRK_DIFF":1,"NAME":"W. Sahara","NAME_LONG":"Western Sahara","BRK_A3":"B28","BRK_NAME":"W. Sahara","BRK_GROUP":null,"ABBREV":"W. Sah.","POSTAL":"WS","FORMAL_EN":"Sahrawi Arab Democratic Republic","FORMAL_FR":null,"NAME_CIAWF":"Western Sahara","NOTE_ADM0":null,"NOTE_BRK":"Self admin.; Claimed by Morocco","NAME_SORT":"Western Sahara","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":7,"MAPCOLOR9":4,"MAPCOLOR13":4,"POP_EST":603253,"POP_RANK":11,"POP_YEAR":2017,"GDP_MD":907,"GDP_YEAR":2007,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"WI","ISO_A2":"EH","ISO_A2_EH":"EH","ISO_A3":"ESH","ISO_A3_EH":"ESH","ISO_N3":"732","ISO_N3_EH":"732","UN_A3":"732","WB_A2":"-99","WB_A3":"-99","WOE_ID":23424990,"WOE_ID_EH":23424990,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"B28","ADM0_DIFF":null,"ADM0_TLC":"B28","ADM0_A3_US":"SAH","ADM0_A3_FR":"MAR","ADM0_A3_RU":"SAH","ADM0_A3_ES":"SAH","ADM0_A3_CN":"SAH","ADM0_A3_TW":"SAH","ADM0_A3_IN":"MAR","ADM0_A3_NP":"SAH","ADM0_A3_PK":"SAH","ADM0_A3_DE":"SAH","ADM0_A3_GB":"SAH","ADM0_A3_BR":"SAH","ADM0_A3_IL":"SAH","ADM0_A3_PS":"MAR","ADM0_A3_SA":"MAR","ADM0_A3_EG":"SAH","ADM0_A3_MA":"MAR","ADM0_A3_PT":"SAH","ADM0_A3_AR":"SAH","ADM0_A3_JP":"SAH","ADM0_A3_KO":"SAH","ADM0_A3_VN":"SAH","ADM0_A3_TR":"MAR","ADM0_A3_ID":"MAR","ADM0_A3_PL":"MAR","ADM0_A3_GR":"SAH","ADM0_A3_IT":"SAH","ADM0_A3_NL":"MAR","ADM0_A3_SE":"SAH","ADM0_A3_BD":"SAH","ADM0_A3_UA":"SAH","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":9,"LONG_LEN":14,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":4.7,"MIN_LABEL":6,"MAX_LABEL":11,"LABEL_X":-12.630304,"LABEL_Y":23.967592,"NE_ID":1159321223,"WIKIDATAID":"Q6250","NAME_AR":"الصحراء الغربية","NAME_BN":"পশ্চিম সাহারা","NAME_DE":"Westsahara","NAME_EN":"Western Sahara","NAME_ES":"Sahara Occidental","NAME_FA":"صحرای غربی","NAME_FR":"Sahara occidental","NAME_EL":"Δυτική Σαχάρα","NAME_HE":"סהרה המערבית","NAME_HI":"पश्चिमी सहारा","NAME_HU":"Nyugat-Szahara","NAME_ID":"Sahara Barat","NAME_IT":"Sahara Occidentale","NAME_JA":"西サハラ","NAME_KO":"서사하라","NAME_NL":"Westelijke Sahara","NAME_PL":"Sahara Zachodnia","NAME_PT":"Sara Ocidental","NAME_RU":"Западная Сахара","NAME_SV":"Västsahara","NAME_TR":"Batı Sahra","NAME_UK":"Західна Сахара","NAME_UR":"مغربی صحارا","NAME_VI":"Tây Sahara","NAME_ZH":"西撒哈拉","NAME_ZHT":"西撒哈拉","FCLASS_ISO":"Admin-0 dependency","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 dependency","FCLASS_US":null,"FCLASS_FR":"Unrecognized","FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":"Unrecognized","FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":"Unrecognized","FCLASS_SA":"Unrecognized","FCLASS_EG":null,"FCLASS_MA":"Unrecognized","FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":"Unrecognized","FCLASS_ID":"Unrecognized","FCLASS_PL":"Unrecognized","FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":"Unrecognized","FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-17.063423,20.999752,-8.665124,27.656426],"geometry":{"type":"Polygon","coordinates":[[[-8.66559,27.656426],[-8.665124,27.589479],[-8.6844,27.395744],[-8.687294,25.881056],[-11.969419,25.933353],[-11.937224,23.374594],[-12.874222,23.284832],[-13.118754,22.77122],[-12.929102,21.327071],[-16.845194,21.333323],[-17.063423,20.999752],[-17.020428,21.42231],[-17.002962,21.420734],[-14.750955,21.5006],[-14.630833,21.86094],[-14.221168,22.310163],[-13.89111,23.691009],[-12.500963,24.770116],[-12.030759,26.030866],[-11.71822,26.104092],[-11.392555,26.883424],[-10.551263,26.990808],[-10.189424,26.860945],[-9.735343,26.860945],[-9.413037,27.088476],[-8.794884,27.120696],[-8.817828,27.656426],[-8.66559,27.656426]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Canada","SOV_A3":"CAN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Canada","ADM0_A3":"CAN","GEOU_DIF":0,"GEOUNIT":"Canada","GU_A3":"CAN","SU_DIF":0,"SUBUNIT":"Canada","SU_A3":"CAN","BRK_DIFF":0,"NAME":"Canada","NAME_LONG":"Canada","BRK_A3":"CAN","BRK_NAME":"Canada","BRK_GROUP":null,"ABBREV":"Can.","POSTAL":"CA","FORMAL_EN":"Canada","FORMAL_FR":null,"NAME_CIAWF":"Canada","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Canada","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":37589262,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":1736425,"GDP_YEAR":2019,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","FIPS_10":"CA","ISO_A2":"CA","ISO_A2_EH":"CA","ISO_A3":"CAN","ISO_A3_EH":"CAN","ISO_N3":"124","ISO_N3_EH":"124","UN_A3":"124","WB_A2":"CA","WB_A3":"CAN","WOE_ID":23424775,"WOE_ID_EH":23424775,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CAN","ADM0_DIFF":null,"ADM0_TLC":"CAN","ADM0_A3_US":"CAN","ADM0_A3_FR":"CAN","ADM0_A3_RU":"CAN","ADM0_A3_ES":"CAN","ADM0_A3_CN":"CAN","ADM0_A3_TW":"CAN","ADM0_A3_IN":"CAN","ADM0_A3_NP":"CAN","ADM0_A3_PK":"CAN","ADM0_A3_DE":"CAN","ADM0_A3_GB":"CAN","ADM0_A3_BR":"CAN","ADM0_A3_IL":"CAN","ADM0_A3_PS":"CAN","ADM0_A3_SA":"CAN","ADM0_A3_EG":"CAN","ADM0_A3_MA":"CAN","ADM0_A3_PT":"CAN","ADM0_A3_AR":"CAN","ADM0_A3_JP":"CAN","ADM0_A3_KO":"CAN","ADM0_A3_VN":"CAN","ADM0_A3_TR":"CAN","ADM0_A3_ID":"CAN","ADM0_A3_PL":"CAN","ADM0_A3_GR":"CAN","ADM0_A3_IT":"CAN","ADM0_A3_NL":"CAN","ADM0_A3_SE":"CAN","ADM0_A3_BD":"CAN","ADM0_A3_UA":"CAN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Northern America","REGION_WB":"North America","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7,"LABEL_X":-101.9107,"LABEL_Y":60.324287,"NE_ID":1159320467,"WIKIDATAID":"Q16","NAME_AR":"كندا","NAME_BN":"কানাডা","NAME_DE":"Kanada","NAME_EN":"Canada","NAME_ES":"Canadá","NAME_FA":"کانادا","NAME_FR":"Canada","NAME_EL":"Καναδάς","NAME_HE":"קנדה","NAME_HI":"कनाडा","NAME_HU":"Kanada","NAME_ID":"Kanada","NAME_IT":"Canada","NAME_JA":"カナダ","NAME_KO":"캐나다","NAME_NL":"Canada","NAME_PL":"Kanada","NAME_PT":"Canadá","NAME_RU":"Канада","NAME_SV":"Kanada","NAME_TR":"Kanada","NAME_UK":"Канада","NAME_UR":"کینیڈا","NAME_VI":"Canada","NAME_ZH":"加拿大","NAME_ZHT":"加拿大","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-140.99778,41.675105,-52.648099,83.23324],"geometry":{"type":"MultiPolygon","coordinates":[[[[-122.84,49],[-122.97421,49.002538],[-124.91024,49.98456],[-125.62461,50.41656],[-127.43561,50.83061],[-127.99276,51.71583],[-127.85032,52.32961],[-129.12979,52.75538],[-129.30523,53.56159],[-130.51497,54.28757],[-130.536109,54.802754],[-130.53611,54.80278],[-129.98,55.285],[-130.00778,55.91583],[-131.70781,56.55212],[-132.73042,57.69289],[-133.35556,58.41028],[-134.27111,58.86111],[-134.945,59.27056],[-135.47583,59.78778],[-136.47972,59.46389],[-137.4525,58.905],[-138.34089,59.56211],[-139.039,60],[-140.013,60.27682],[-140.99778,60.30639],[-140.9925,66.00003],[-140.986,69.712],[-140.985988,69.711998],[-139.12052,69.47102],[-137.54636,68.99002],[-136.50358,68.89804],[-135.62576,69.31512],[-134.41464,69.62743],[-132.92925,69.50534],[-131.43136,69.94451],[-129.79471,70.19369],[-129.10773,69.77927],[-128.36156,70.01286],[-128.13817,70.48384],[-127.44712,70.37721],[-125.75632,69.48058],[-124.42483,70.1584],[-124.28968,69.39969],[-123.06108,69.56372],[-122.6835,69.85553],[-121.47226,69.79778],[-119.94288,69.37786],[-117.60268,69.01128],[-116.22643,68.84151],[-115.2469,68.90591],[-113.89794,68.3989],[-115.30489,67.90261],[-113.49727,67.68815],[-110.798,67.80612],[-109.94619,67.98104],[-108.8802,67.38144],[-107.79239,67.88736],[-108.81299,68.31164],[-108.16721,68.65392],[-106.95,68.7],[-106.15,68.8],[-105.34282,68.56122],[-104.33791,68.018],[-103.22115,68.09775],[-101.45433,67.64689],[-99.90195,67.80566],[-98.4432,67.78165],[-98.5586,68.40394],[-97.66948,68.57864],[-96.11991,68.23939],[-96.12588,67.29338],[-95.48943,68.0907],[-94.685,68.06383],[-94.23282,69.06903],[-95.30408,69.68571],[-96.47131,70.08976],[-96.39115,71.19482],[-95.2088,71.92053],[-93.88997,71.76015],[-92.87818,71.31869],[-91.51964,70.19129],[-92.40692,69.69997],[-90.5471,69.49766],[-90.55151,68.47499],[-89.21515,69.25873],[-88.01966,68.61508],[-88.31749,67.87338],[-87.35017,67.19872],[-86.30607,67.92146],[-85.57664,68.78456],[-85.52197,69.88211],[-84.10081,69.80539],[-82.62258,69.65826],[-81.28043,69.16202],[-81.2202,68.66567],[-81.96436,68.13253],[-81.25928,67.59716],[-81.38653,67.11078],[-83.34456,66.41154],[-84.73542,66.2573],[-85.76943,66.55833],[-86.0676,66.05625],[-87.03143,65.21297],[-87.32324,64.77563],[-88.48296,64.09897],[-89.91444,64.03273],[-90.70398,63.61017],[-90.77004,62.96021],[-91.93342,62.83508],[-93.15698,62.02469],[-94.24153,60.89865],[-94.62931,60.11021],[-94.6846,58.94882],[-93.21502,58.78212],[-92.76462,57.84571],[-92.29703,57.08709],[-90.89769,57.28468],[-89.03953,56.85172],[-88.03978,56.47162],[-87.32421,55.99914],[-86.07121,55.72383],[-85.01181,55.3026],[-83.36055,55.24489],[-82.27285,55.14832],[-82.4362,54.28227],[-82.12502,53.27703],[-81.40075,52.15788],[-79.91289,51.20842],[-79.14301,51.53393],[-78.60191,52.56208],[-79.12421,54.14145],[-79.82958,54.66772],[-78.22874,55.13645],[-77.0956,55.83741],[-76.54137,56.53423],[-76.62319,57.20263],[-77.30226,58.05209],[-78.51688,58.80458],[-77.33676,59.85261],[-77.77272,60.75788],[-78.10687,62.31964],[-77.41067,62.55053],[-75.69621,62.2784],[-74.6682,62.18111],[-73.83988,62.4438],[-72.90853,62.10507],[-71.67708,61.52535],[-71.37369,61.13717],[-69.59042,61.06141],[-69.62033,60.22125],[-69.2879,58.95736],[-68.37455,58.80106],[-67.64976,58.21206],[-66.20178,58.76731],[-65.24517,59.87071],[-64.58352,60.33558],[-63.80475,59.4426],[-62.50236,58.16708],[-61.39655,56.96745],[-61.79866,56.33945],[-60.46853,55.77548],[-59.56962,55.20407],[-57.97508,54.94549],[-57.3332,54.6265],[-56.93689,53.78032],[-56.15811,53.64749],[-55.75632,53.27036],[-55.68338,52.14664],[-56.40916,51.7707],[-57.12691,51.41972],[-58.77482,51.0643],[-60.03309,50.24277],[-61.72366,50.08046],[-63.86251,50.29099],[-65.36331,50.2982],[-66.39905,50.22897],[-67.23631,49.51156],[-68.51114,49.06836],[-69.95362,47.74488],[-71.10458,46.82171],[-70.25522,46.98606],[-68.65,48.3],[-66.55243,49.1331],[-65.05626,49.23278],[-64.17099,48.74248],[-65.11545,48.07085],[-64.79854,46.99297],[-64.47219,46.23849],[-63.17329,45.73902],[-61.52072,45.88377],[-60.51815,47.00793],[-60.4486,46.28264],[-59.80287,45.9204],[-61.03988,45.26525],[-63.25471,44.67014],[-64.24656,44.26553],[-65.36406,43.54523],[-66.1234,43.61867],[-66.16173,44.46512],[-64.42549,45.29204],[-66.02605,45.25931],[-67.13741,45.13753],[-67.79134,45.70281],[-67.79046,47.06636],[-68.23444,47.35486],[-68.905,47.185],[-69.237216,47.447781],[-69.99997,46.69307],[-70.305,45.915],[-70.66,45.46],[-71.08482,45.30524],[-71.405,45.255],[-71.50506,45.0082],[-73.34783,45.00738],[-74.867,45.00048],[-75.31821,44.81645],[-76.375,44.09631],[-76.5,44.018459],[-76.820034,43.628784],[-77.737885,43.629056],[-78.72028,43.625089],[-79.171674,43.466339],[-79.01,43.27],[-78.92,42.965],[-78.939362,42.863611],[-80.247448,42.3662],[-81.277747,42.209026],[-82.439278,41.675105],[-82.690089,41.675105],[-83.02981,41.832796],[-83.142,41.975681],[-83.12,42.08],[-82.9,42.43],[-82.43,42.98],[-82.137642,43.571088],[-82.337763,44.44],[-82.550925,45.347517],[-83.592851,45.816894],[-83.469551,45.994686],[-83.616131,46.116927],[-83.890765,46.116927],[-84.091851,46.275419],[-84.14212,46.512226],[-84.3367,46.40877],[-84.6049,46.4396],[-84.543749,46.538684],[-84.779238,46.637102],[-84.87608,46.900083],[-85.652363,47.220219],[-86.461991,47.553338],[-87.439793,47.94],[-88.378114,48.302918],[-89.272917,48.019808],[-89.6,48.01],[-90.83,48.27],[-91.64,48.14],[-92.61,48.45],[-93.63087,48.60926],[-94.32914,48.67074],[-94.64,48.84],[-94.81758,49.38905],[-95.15609,49.38425],[-95.15907,49],[-97.22872,49.0007],[-100.65,49],[-104.04826,48.99986],[-107.05,49],[-110.05,49],[-113,49],[-116.04818,49],[-117.03121,49],[-120,49],[-122.84,49]]],[[[-83.99367,62.4528],[-83.25048,62.91409],[-81.87699,62.90458],[-81.89825,62.7108],[-83.06857,62.15922],[-83.77462,62.18231],[-83.99367,62.4528]]],[[[-79.775833,72.802902],[-80.876099,73.333183],[-80.833885,73.693184],[-80.353058,73.75972],[-78.064438,73.651932],[-76.34,73.102685],[-76.251404,72.826385],[-77.314438,72.855545],[-78.39167,72.876656],[-79.486252,72.742203],[-79.775833,72.802902]]],[[[-80.315395,62.085565],[-79.92939,62.3856],[-79.52002,62.36371],[-79.26582,62.158675],[-79.65752,61.63308],[-80.09956,61.7181],[-80.36215,62.01649],[-80.315395,62.085565]]],[[[-93.612756,74.979997],[-94.156909,74.592347],[-95.608681,74.666864],[-96.820932,74.927623],[-96.288587,75.377828],[-94.85082,75.647218],[-93.977747,75.29649],[-93.612756,74.979997]]],[[[-93.840003,77.519997],[-94.295608,77.491343],[-96.169654,77.555111],[-96.436304,77.834629],[-94.422577,77.820005],[-93.720656,77.634331],[-93.840003,77.519997]]],[[[-96.754399,78.765813],[-95.559278,78.418315],[-95.830295,78.056941],[-97.309843,77.850597],[-98.124289,78.082857],[-98.552868,78.458105],[-98.631984,78.87193],[-97.337231,78.831984],[-96.754399,78.765813]]],[[[-88.15035,74.392307],[-89.764722,74.515555],[-92.422441,74.837758],[-92.768285,75.38682],[-92.889906,75.882655],[-93.893824,76.319244],[-95.962457,76.441381],[-97.121379,76.751078],[-96.745123,77.161389],[-94.684086,77.097878],[-93.573921,76.776296],[-91.605023,76.778518],[-90.741846,76.449597],[-90.969661,76.074013],[-89.822238,75.847774],[-89.187083,75.610166],[-87.838276,75.566189],[-86.379192,75.482421],[-84.789625,75.699204],[-82.753445,75.784315],[-81.128531,75.713983],[-80.057511,75.336849],[-79.833933,74.923127],[-80.457771,74.657304],[-81.948843,74.442459],[-83.228894,74.564028],[-86.097452,74.410032],[-88.15035,74.392307]]],[[[-111.264443,78.152956],[-109.854452,77.996325],[-110.186938,77.697015],[-112.051191,77.409229],[-113.534279,77.732207],[-112.724587,78.05105],[-111.264443,78.152956]]],[[[-110.963661,78.804441],[-109.663146,78.601973],[-110.881314,78.40692],[-112.542091,78.407902],[-112.525891,78.550555],[-111.50001,78.849994],[-110.963661,78.804441]]],[[[-55.600218,51.317075],[-56.134036,50.68701],[-56.795882,49.812309],[-56.143105,50.150117],[-55.471492,49.935815],[-55.822401,49.587129],[-54.935143,49.313011],[-54.473775,49.556691],[-53.476549,49.249139],[-53.786014,48.516781],[-53.086134,48.687804],[-52.958648,48.157164],[-52.648099,47.535548],[-53.069158,46.655499],[-53.521456,46.618292],[-54.178936,46.807066],[-53.961869,47.625207],[-54.240482,47.752279],[-55.400773,46.884994],[-55.997481,46.91972],[-55.291219,47.389562],[-56.250799,47.632545],[-57.325229,47.572807],[-59.266015,47.603348],[-59.419494,47.899454],[-58.796586,48.251525],[-59.231625,48.523188],[-58.391805,49.125581],[-57.35869,50.718274],[-56.73865,51.287438],[-55.870977,51.632094],[-55.406974,51.588273],[-55.600218,51.317075]]],[[[-83.882626,65.109618],[-82.787577,64.766693],[-81.642014,64.455136],[-81.55344,63.979609],[-80.817361,64.057486],[-80.103451,63.725981],[-80.99102,63.411246],[-82.547178,63.651722],[-83.108798,64.101876],[-84.100417,63.569712],[-85.523405,63.052379],[-85.866769,63.637253],[-87.221983,63.541238],[-86.35276,64.035833],[-86.224886,64.822917],[-85.883848,65.738778],[-85.161308,65.657285],[-84.975764,65.217518],[-84.464012,65.371772],[-83.882626,65.109618]]],[[[-78.770639,72.352173],[-77.824624,72.749617],[-75.605845,72.243678],[-74.228616,71.767144],[-74.099141,71.33084],[-72.242226,71.556925],[-71.200015,70.920013],[-68.786054,70.525024],[-67.91497,70.121948],[-66.969033,69.186087],[-68.805123,68.720198],[-66.449866,68.067163],[-64.862314,67.847539],[-63.424934,66.928473],[-61.851981,66.862121],[-62.163177,66.160251],[-63.918444,64.998669],[-65.14886,65.426033],[-66.721219,66.388041],[-68.015016,66.262726],[-68.141287,65.689789],[-67.089646,65.108455],[-65.73208,64.648406],[-65.320168,64.382737],[-64.669406,63.392927],[-65.013804,62.674185],[-66.275045,62.945099],[-68.783186,63.74567],[-67.369681,62.883966],[-66.328297,62.280075],[-66.165568,61.930897],[-68.877367,62.330149],[-71.023437,62.910708],[-72.235379,63.397836],[-71.886278,63.679989],[-73.378306,64.193963],[-74.834419,64.679076],[-74.818503,64.389093],[-77.70998,64.229542],[-78.555949,64.572906],[-77.897281,65.309192],[-76.018274,65.326969],[-73.959795,65.454765],[-74.293883,65.811771],[-73.944912,66.310578],[-72.651167,67.284576],[-72.92606,67.726926],[-73.311618,68.069437],[-74.843307,68.554627],[-76.869101,68.894736],[-76.228649,69.147769],[-77.28737,69.76954],[-78.168634,69.826488],[-78.957242,70.16688],[-79.492455,69.871808],[-81.305471,69.743185],[-84.944706,69.966634],[-87.060003,70.260001],[-88.681713,70.410741],[-89.51342,70.762038],[-88.467721,71.218186],[-89.888151,71.222552],[-90.20516,72.235074],[-89.436577,73.129464],[-88.408242,73.537889],[-85.826151,73.803816],[-86.562179,73.157447],[-85.774371,72.534126],[-84.850112,73.340278],[-82.31559,73.750951],[-80.600088,72.716544],[-80.748942,72.061907],[-78.770639,72.352173]]],[[[-94.503658,74.134907],[-92.420012,74.100025],[-90.509793,73.856732],[-92.003965,72.966244],[-93.196296,72.771992],[-94.269047,72.024596],[-95.409856,72.061881],[-96.033745,72.940277],[-96.018268,73.43743],[-95.495793,73.862417],[-94.503658,74.134907]]],[[[-122.854924,76.116543],[-122.854925,76.116543],[-121.157535,76.864508],[-119.103939,77.51222],[-117.570131,77.498319],[-116.198587,77.645287],[-116.335813,76.876962],[-117.106051,76.530032],[-118.040412,76.481172],[-119.899318,76.053213],[-121.499995,75.900019],[-122.854924,76.116543]]],[[[-132.710008,54.040009],[-131.74999,54.120004],[-132.04948,52.984621],[-131.179043,52.180433],[-131.57783,52.182371],[-132.180428,52.639707],[-132.549992,53.100015],[-133.054611,53.411469],[-133.239664,53.85108],[-133.180004,54.169975],[-132.710008,54.040009]]],[[[-105.492289,79.301594],[-103.529282,79.165349],[-100.825158,78.800462],[-100.060192,78.324754],[-99.670939,77.907545],[-101.30394,78.018985],[-102.949809,78.343229],[-105.176133,78.380332],[-104.210429,78.67742],[-105.41958,78.918336],[-105.492289,79.301594]]],[[[-123.510002,48.510011],[-124.012891,48.370846],[-125.655013,48.825005],[-125.954994,49.179996],[-126.850004,49.53],[-127.029993,49.814996],[-128.059336,49.994959],[-128.444584,50.539138],[-128.358414,50.770648],[-127.308581,50.552574],[-126.695001,50.400903],[-125.755007,50.295018],[-125.415002,49.950001],[-124.920768,49.475275],[-123.922509,49.062484],[-123.510002,48.510011]]],[[[-121.53788,74.44893],[-120.10978,74.24135],[-117.55564,74.18577],[-116.58442,73.89607],[-115.51081,73.47519],[-116.76794,73.22292],[-119.22,72.52],[-120.46,71.82],[-120.46,71.383602],[-123.09219,70.90164],[-123.62,71.34],[-125.928949,71.868688],[-125.5,72.292261],[-124.80729,73.02256],[-123.94,73.68],[-124.91775,74.29275],[-121.53788,74.44893]]],[[[-107.81943,75.84552],[-106.92893,76.01282],[-105.881,75.9694],[-105.70498,75.47951],[-106.31347,75.00527],[-109.7,74.85],[-112.22307,74.41696],[-113.74381,74.39427],[-113.87135,74.72029],[-111.79421,75.1625],[-116.31221,75.04343],[-117.7104,75.2222],[-116.34602,76.19903],[-115.40487,76.47887],[-112.59056,76.14134],[-110.81422,75.54919],[-109.0671,75.47321],[-110.49726,76.42982],[-109.5811,76.79417],[-108.54859,76.67832],[-108.21141,76.20168],[-107.81943,75.84552]]],[[[-106.52259,73.07601],[-105.40246,72.67259],[-104.77484,71.6984],[-104.46476,70.99297],[-102.78537,70.49776],[-100.98078,70.02432],[-101.08929,69.58447],[-102.73116,69.50402],[-102.09329,69.11962],[-102.43024,68.75282],[-104.24,68.91],[-105.96,69.18],[-107.12254,69.11922],[-109,68.78],[-111.534149,68.630059],[-113.3132,68.53554],[-113.85496,69.00744],[-115.22,69.28],[-116.10794,69.16821],[-117.34,69.96],[-116.67473,70.06655],[-115.13112,70.2373],[-113.72141,70.19237],[-112.4161,70.36638],[-114.35,70.6],[-116.48684,70.52045],[-117.9048,70.54056],[-118.43238,70.9092],[-116.11311,71.30918],[-117.65568,71.2952],[-119.40199,71.55859],[-118.56267,72.30785],[-117.86642,72.70594],[-115.18909,73.31459],[-114.16717,73.12145],[-114.66634,72.65277],[-112.44102,72.9554],[-111.05039,72.4504],[-109.92035,72.96113],[-109.00654,72.63335],[-108.18835,71.65089],[-107.68599,72.06548],[-108.39639,73.08953],[-107.51645,73.23598],[-106.52259,73.07601]]],[[[-100.43836,72.70588],[-101.54,73.36],[-100.35642,73.84389],[-99.16387,73.63339],[-97.38,73.76],[-97.12,73.47],[-98.05359,72.99052],[-96.54,72.56],[-96.72,71.66],[-98.35966,71.27285],[-99.32286,71.35639],[-100.01482,71.73827],[-102.5,72.51],[-102.48,72.83],[-100.43836,72.70588]]],[[[-106.6,73.6],[-105.26,73.64],[-104.5,73.42],[-105.38,72.76],[-106.94,73.46],[-106.6,73.6]]],[[[-98.5,76.72],[-97.735585,76.25656],[-97.704415,75.74344],[-98.16,75],[-99.80874,74.89744],[-100.88366,75.05736],[-100.86292,75.64075],[-102.50209,75.5638],[-102.56552,76.3366],[-101.48973,76.30537],[-99.98349,76.64634],[-98.57699,76.58859],[-98.5,76.72]]],[[[-96.01644,80.60233],[-95.32345,80.90729],[-94.29843,80.97727],[-94.73542,81.20646],[-92.40984,81.25739],[-91.13289,80.72345],[-89.45,80.509322],[-87.81,80.32],[-87.02,79.66],[-85.81435,79.3369],[-87.18756,79.0393],[-89.03535,78.28723],[-90.80436,78.21533],[-92.87669,78.34333],[-93.95116,78.75099],[-93.93574,79.11373],[-93.14524,79.3801],[-94.974,79.37248],[-96.07614,79.70502],[-96.70972,80.15777],[-96.01644,80.60233]]],[[[-91.58702,81.89429],[-90.1,82.085],[-88.93227,82.11751],[-86.97024,82.27961],[-85.5,82.652273],[-84.260005,82.6],[-83.18,82.32],[-82.42,82.86],[-81.1,83.02],[-79.30664,83.13056],[-76.25,83.172059],[-75.71878,83.06404],[-72.83153,83.23324],[-70.665765,83.169781],[-68.5,83.106322],[-65.82735,83.02801],[-63.68,82.9],[-61.85,82.6286],[-61.89388,82.36165],[-64.334,81.92775],[-66.75342,81.72527],[-67.65755,81.50141],[-65.48031,81.50657],[-67.84,80.9],[-69.4697,80.61683],[-71.18,79.8],[-73.2428,79.63415],[-73.88,79.430162],[-76.90773,79.32309],[-75.52924,79.19766],[-76.22046,79.01907],[-75.39345,78.52581],[-76.34354,78.18296],[-77.88851,77.89991],[-78.36269,77.50859],[-79.75951,77.20968],[-79.61965,76.98336],[-77.91089,77.022045],[-77.88911,76.777955],[-80.56125,76.17812],[-83.17439,76.45403],[-86.11184,76.29901],[-87.6,76.42],[-89.49068,76.47239],[-89.6161,76.95213],[-87.76739,77.17833],[-88.26,77.9],[-87.65,77.970222],[-84.97634,77.53873],[-86.34,78.18],[-87.96192,78.37181],[-87.15198,78.75867],[-85.37868,78.9969],[-85.09495,79.34543],[-86.50734,79.73624],[-86.93179,80.25145],[-84.19844,80.20836],[-83.408696,80.1],[-81.84823,80.46442],[-84.1,80.58],[-87.59895,80.51627],[-89.36663,80.85569],[-90.2,81.26],[-91.36786,81.5531],[-91.58702,81.89429]]],[[[-75.21597,67.44425],[-75.86588,67.14886],[-76.98687,67.09873],[-77.2364,67.58809],[-76.81166,68.14856],[-75.89521,68.28721],[-75.1145,68.01036],[-75.10333,67.58202],[-75.21597,67.44425]]],[[[-96.257401,69.49003],[-95.647681,69.10769],[-96.269521,68.75704],[-97.617401,69.06003],[-98.431801,68.9507],[-99.797401,69.40003],[-98.917401,69.71003],[-98.218261,70.14354],[-97.157401,69.86003],[-96.557401,69.68003],[-96.257401,69.49003]]],[[[-64.51912,49.87304],[-64.17322,49.95718],[-62.85829,49.70641],[-61.835585,49.28855],[-61.806305,49.10506],[-62.29318,49.08717],[-63.58926,49.40069],[-64.51912,49.87304]]],[[[-64.01486,47.03601],[-63.6645,46.55001],[-62.9393,46.41587],[-62.01208,46.44314],[-62.50391,46.03339],[-62.87433,45.96818],[-64.1428,46.39265],[-64.39261,46.72747],[-64.01486,47.03601]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"United States of America","SOV_A3":"US1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"United States of America","ADM0_A3":"USA","GEOU_DIF":0,"GEOUNIT":"United States of America","GU_A3":"USA","SU_DIF":0,"SUBUNIT":"United States","SU_A3":"USA","BRK_DIFF":0,"NAME":"United States of America","NAME_LONG":"United States","BRK_A3":"USA","BRK_NAME":"United States","BRK_GROUP":null,"ABBREV":"U.S.A.","POSTAL":"US","FORMAL_EN":"United States of America","FORMAL_FR":null,"NAME_CIAWF":"United States","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"United States of America","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":1,"MAPCOLOR13":1,"POP_EST":328239523,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":21433226,"GDP_YEAR":2019,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","FIPS_10":"US","ISO_A2":"US","ISO_A2_EH":"US","ISO_A3":"USA","ISO_A3_EH":"USA","ISO_N3":"840","ISO_N3_EH":"840","UN_A3":"840","WB_A2":"US","WB_A3":"USA","WOE_ID":23424977,"WOE_ID_EH":23424977,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"USA","ADM0_DIFF":null,"ADM0_TLC":"USA","ADM0_A3_US":"USA","ADM0_A3_FR":"USA","ADM0_A3_RU":"USA","ADM0_A3_ES":"USA","ADM0_A3_CN":"USA","ADM0_A3_TW":"USA","ADM0_A3_IN":"USA","ADM0_A3_NP":"USA","ADM0_A3_PK":"USA","ADM0_A3_DE":"USA","ADM0_A3_GB":"USA","ADM0_A3_BR":"USA","ADM0_A3_IL":"USA","ADM0_A3_PS":"USA","ADM0_A3_SA":"USA","ADM0_A3_EG":"USA","ADM0_A3_MA":"USA","ADM0_A3_PT":"USA","ADM0_A3_AR":"USA","ADM0_A3_JP":"USA","ADM0_A3_KO":"USA","ADM0_A3_VN":"USA","ADM0_A3_TR":"USA","ADM0_A3_ID":"USA","ADM0_A3_PL":"USA","ADM0_A3_GR":"USA","ADM0_A3_IT":"USA","ADM0_A3_NL":"USA","ADM0_A3_SE":"USA","ADM0_A3_BD":"USA","ADM0_A3_UA":"USA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Northern America","REGION_WB":"North America","NAME_LEN":24,"LONG_LEN":13,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7,"LABEL_X":-97.482602,"LABEL_Y":39.538479,"NE_ID":1159321369,"WIKIDATAID":"Q30","NAME_AR":"الولايات المتحدة","NAME_BN":"মার্কিন যুক্তরাষ্ট্র","NAME_DE":"Vereinigte Staaten","NAME_EN":"United States of America","NAME_ES":"Estados Unidos","NAME_FA":"ایالات متحده آمریکا","NAME_FR":"États-Unis","NAME_EL":"Ηνωμένες Πολιτείες Αμερικής","NAME_HE":"ארצות הברית","NAME_HI":"संयुक्त राज्य अमेरिका","NAME_HU":"Amerikai Egyesült Államok","NAME_ID":"Amerika Serikat","NAME_IT":"Stati Uniti d'America","NAME_JA":"アメリカ合衆国","NAME_KO":"미국","NAME_NL":"Verenigde Staten van Amerika","NAME_PL":"Stany Zjednoczone","NAME_PT":"Estados Unidos","NAME_RU":"США","NAME_SV":"USA","NAME_TR":"Amerika Birleşik Devletleri","NAME_UK":"Сполучені Штати Америки","NAME_UR":"ریاستہائے متحدہ امریکا","NAME_VI":"Hoa Kỳ","NAME_ZH":"美国","NAME_ZHT":"美國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-171.791111,18.91619,-66.96466,71.357764],"geometry":{"type":"MultiPolygon","coordinates":[[[[-122.84,49],[-120,49],[-117.03121,49],[-116.04818,49],[-113,49],[-110.05,49],[-107.05,49],[-104.04826,48.99986],[-100.65,49],[-97.22872,49.0007],[-95.15907,49],[-95.15609,49.38425],[-94.81758,49.38905],[-94.64,48.84],[-94.32914,48.67074],[-93.63087,48.60926],[-92.61,48.45],[-91.64,48.14],[-90.83,48.27],[-89.6,48.01],[-89.272917,48.019808],[-88.378114,48.302918],[-87.439793,47.94],[-86.461991,47.553338],[-85.652363,47.220219],[-84.87608,46.900083],[-84.779238,46.637102],[-84.543749,46.538684],[-84.6049,46.4396],[-84.3367,46.40877],[-84.14212,46.512226],[-84.091851,46.275419],[-83.890765,46.116927],[-83.616131,46.116927],[-83.469551,45.994686],[-83.592851,45.816894],[-82.550925,45.347517],[-82.337763,44.44],[-82.137642,43.571088],[-82.43,42.98],[-82.9,42.43],[-83.12,42.08],[-83.142,41.975681],[-83.02981,41.832796],[-82.690089,41.675105],[-82.439278,41.675105],[-81.277747,42.209026],[-80.247448,42.3662],[-78.939362,42.863611],[-78.92,42.965],[-79.01,43.27],[-79.171674,43.466339],[-78.72028,43.625089],[-77.737885,43.629056],[-76.820034,43.628784],[-76.5,44.018459],[-76.375,44.09631],[-75.31821,44.81645],[-74.867,45.00048],[-73.34783,45.00738],[-71.50506,45.0082],[-71.405,45.255],[-71.08482,45.30524],[-70.66,45.46],[-70.305,45.915],[-69.99997,46.69307],[-69.237216,47.447781],[-68.905,47.185],[-68.23444,47.35486],[-67.79046,47.06636],[-67.79134,45.70281],[-67.13741,45.13753],[-66.96466,44.8097],[-68.03252,44.3252],[-69.06,43.98],[-70.11617,43.68405],[-70.645476,43.090238],[-70.81489,42.8653],[-70.825,42.335],[-70.495,41.805],[-70.08,41.78],[-70.185,42.145],[-69.88497,41.92283],[-69.96503,41.63717],[-70.64,41.475],[-71.12039,41.49445],[-71.86,41.32],[-72.295,41.27],[-72.87643,41.22065],[-73.71,40.931102],[-72.24126,41.11948],[-71.945,40.93],[-73.345,40.63],[-73.982,40.628],[-73.952325,40.75075],[-74.25671,40.47351],[-73.96244,40.42763],[-74.17838,39.70926],[-74.90604,38.93954],[-74.98041,39.1964],[-75.20002,39.24845],[-75.52805,39.4985],[-75.32,38.96],[-75.071835,38.782032],[-75.05673,38.40412],[-75.37747,38.01551],[-75.94023,37.21689],[-76.03127,37.2566],[-75.72205,37.93705],[-76.23287,38.319215],[-76.35,39.15],[-76.542725,38.717615],[-76.32933,38.08326],[-76.989998,38.239992],[-76.30162,37.917945],[-76.25874,36.9664],[-75.9718,36.89726],[-75.86804,36.55125],[-75.72749,35.55074],[-76.36318,34.80854],[-77.397635,34.51201],[-78.05496,33.92547],[-78.55435,33.86133],[-79.06067,33.49395],[-79.20357,33.15839],[-80.301325,32.509355],[-80.86498,32.0333],[-81.33629,31.44049],[-81.49042,30.72999],[-81.31371,30.03552],[-80.98,29.18],[-80.535585,28.47213],[-80.53,28.04],[-80.056539,26.88],[-80.088015,26.205765],[-80.13156,25.816775],[-80.38103,25.20616],[-80.68,25.08],[-81.17213,25.20126],[-81.33,25.64],[-81.71,25.87],[-82.24,26.73],[-82.70515,27.49504],[-82.85526,27.88624],[-82.65,28.55],[-82.93,29.1],[-83.70959,29.93656],[-84.1,30.09],[-85.10882,29.63615],[-85.28784,29.68612],[-85.7731,30.15261],[-86.4,30.4],[-87.53036,30.27433],[-88.41782,30.3849],[-89.18049,30.31598],[-89.593831,30.159994],[-89.413735,29.89419],[-89.43,29.48864],[-89.21767,29.29108],[-89.40823,29.15961],[-89.77928,29.30714],[-90.15463,29.11743],[-90.880225,29.148535],[-91.626785,29.677],[-92.49906,29.5523],[-93.22637,29.78375],[-93.84842,29.71363],[-94.69,29.48],[-95.60026,28.73863],[-96.59404,28.30748],[-97.14,27.83],[-97.37,27.38],[-97.38,26.69],[-97.33,26.21],[-97.14,25.87],[-97.53,25.84],[-98.24,26.06],[-99.02,26.37],[-99.3,26.84],[-99.52,27.54],[-100.11,28.11],[-100.45584,28.69612],[-100.9576,29.38071],[-101.6624,29.7793],[-102.48,29.76],[-103.11,28.97],[-103.94,29.27],[-104.45697,29.57196],[-104.70575,30.12173],[-105.03737,30.64402],[-105.63159,31.08383],[-106.1429,31.39995],[-106.50759,31.75452],[-108.24,31.754854],[-108.24194,31.34222],[-109.035,31.34194],[-111.02361,31.33472],[-113.30498,32.03914],[-114.815,32.52528],[-114.72139,32.72083],[-115.99135,32.61239],[-117.12776,32.53534],[-117.295938,33.046225],[-117.944,33.621236],[-118.410602,33.740909],[-118.519895,34.027782],[-119.081,34.078],[-119.438841,34.348477],[-120.36778,34.44711],[-120.62286,34.60855],[-120.74433,35.15686],[-121.71457,36.16153],[-122.54747,37.55176],[-122.51201,37.78339],[-122.95319,38.11371],[-123.7272,38.95166],[-123.86517,39.76699],[-124.39807,40.3132],[-124.17886,41.14202],[-124.2137,41.99964],[-124.53284,42.76599],[-124.14214,43.70838],[-124.020535,44.615895],[-123.89893,45.52341],[-124.079635,46.86475],[-124.39567,47.72017],[-124.68721,48.184433],[-124.566101,48.379715],[-123.12,48.04],[-122.58736,47.096],[-122.34,47.36],[-122.5,48.18],[-122.84,49]]],[[[-155.40214,20.07975],[-155.22452,19.99302],[-155.06226,19.8591],[-154.80741,19.50871],[-154.83147,19.45328],[-155.22217,19.23972],[-155.54211,19.08348],[-155.68817,18.91619],[-155.93665,19.05939],[-155.90806,19.33888],[-156.07347,19.70294],[-156.02368,19.81422],[-155.85008,19.97729],[-155.91907,20.17395],[-155.86108,20.26721],[-155.78505,20.2487],[-155.40214,20.07975]]],[[[-155.99566,20.76404],[-156.07926,20.64397],[-156.41445,20.57241],[-156.58673,20.783],[-156.70167,20.8643],[-156.71055,20.92676],[-156.61258,21.01249],[-156.25711,20.91745],[-155.99566,20.76404]]],[[[-156.75824,21.17684],[-156.78933,21.06873],[-157.32521,21.09777],[-157.25027,21.21958],[-156.75824,21.17684]]],[[[-158.0252,21.71696],[-157.94161,21.65272],[-157.65283,21.32217],[-157.70703,21.26442],[-157.7786,21.27729],[-158.12667,21.31244],[-158.2538,21.53919],[-158.29265,21.57912],[-158.0252,21.71696]]],[[[-159.36569,22.21494],[-159.34512,21.982],[-159.46372,21.88299],[-159.80051,22.06533],[-159.74877,22.1382],[-159.5962,22.23618],[-159.36569,22.21494]]],[[[-166.467792,60.38417],[-165.67443,60.293607],[-165.579164,59.909987],[-166.19277,59.754441],[-166.848337,59.941406],[-167.455277,60.213069],[-166.467792,60.38417]]],[[[-153.228729,57.968968],[-152.564791,57.901427],[-152.141147,57.591059],[-153.006314,57.115842],[-154.00509,56.734677],[-154.516403,56.992749],[-154.670993,57.461196],[-153.76278,57.816575],[-153.228729,57.968968]]],[[[-140.985988,69.711998],[-140.986,69.712],[-140.9925,66.00003],[-140.99778,60.30639],[-140.013,60.27682],[-139.039,60],[-138.34089,59.56211],[-137.4525,58.905],[-136.47972,59.46389],[-135.47583,59.78778],[-134.945,59.27056],[-134.27111,58.86111],[-133.35556,58.41028],[-132.73042,57.69289],[-131.70781,56.55212],[-130.00778,55.91583],[-129.98,55.285],[-130.53611,54.80278],[-130.536109,54.802754],[-130.53611,54.802753],[-131.085818,55.178906],[-131.967211,55.497776],[-132.250011,56.369996],[-133.539181,57.178887],[-134.078063,58.123068],[-135.038211,58.187715],[-136.628062,58.212209],[-137.800006,58.499995],[-139.867787,59.537762],[-140.825274,59.727517],[-142.574444,60.084447],[-143.958881,59.99918],[-145.925557,60.45861],[-147.114374,60.884656],[-148.224306,60.672989],[-148.018066,59.978329],[-148.570823,59.914173],[-149.727858,59.705658],[-150.608243,59.368211],[-151.716393,59.155821],[-151.859433,59.744984],[-151.409719,60.725803],[-150.346941,61.033588],[-150.621111,61.284425],[-151.895839,60.727198],[-152.57833,60.061657],[-154.019172,59.350279],[-153.287511,58.864728],[-154.232492,58.146374],[-155.307491,57.727795],[-156.308335,57.422774],[-156.556097,56.979985],[-158.117217,56.463608],[-158.433321,55.994154],[-159.603327,55.566686],[-160.28972,55.643581],[-161.223048,55.364735],[-162.237766,55.024187],[-163.069447,54.689737],[-164.785569,54.404173],[-164.942226,54.572225],[-163.84834,55.039431],[-162.870001,55.348043],[-161.804175,55.894986],[-160.563605,56.008055],[-160.07056,56.418055],[-158.684443,57.016675],[-158.461097,57.216921],[-157.72277,57.570001],[-157.550274,58.328326],[-157.041675,58.918885],[-158.194731,58.615802],[-158.517218,58.787781],[-159.058606,58.424186],[-159.711667,58.93139],[-159.981289,58.572549],[-160.355271,59.071123],[-161.355003,58.670838],[-161.968894,58.671665],[-162.054987,59.266925],[-161.874171,59.633621],[-162.518059,59.989724],[-163.818341,59.798056],[-164.662218,60.267484],[-165.346388,60.507496],[-165.350832,61.073895],[-166.121379,61.500019],[-165.734452,62.074997],[-164.919179,62.633076],[-164.562508,63.146378],[-163.753332,63.219449],[-163.067224,63.059459],[-162.260555,63.541936],[-161.53445,63.455817],[-160.772507,63.766108],[-160.958335,64.222799],[-161.518068,64.402788],[-160.777778,64.788604],[-161.391926,64.777235],[-162.45305,64.559445],[-162.757786,64.338605],[-163.546394,64.55916],[-164.96083,64.446945],[-166.425288,64.686672],[-166.845004,65.088896],[-168.11056,65.669997],[-166.705271,66.088318],[-164.47471,66.57666],[-163.652512,66.57666],[-163.788602,66.077207],[-161.677774,66.11612],[-162.489715,66.735565],[-163.719717,67.116395],[-164.430991,67.616338],[-165.390287,68.042772],[-166.764441,68.358877],[-166.204707,68.883031],[-164.430811,68.915535],[-163.168614,69.371115],[-162.930566,69.858062],[-161.908897,70.33333],[-160.934797,70.44769],[-159.039176,70.891642],[-158.119723,70.824721],[-156.580825,71.357764],[-155.06779,71.147776],[-154.344165,70.696409],[-153.900006,70.889989],[-152.210006,70.829992],[-152.270002,70.600006],[-150.739992,70.430017],[-149.720003,70.53001],[-147.613362,70.214035],[-145.68999,70.12001],[-144.920011,69.989992],[-143.589446,70.152514],[-142.07251,69.851938],[-140.985988,69.711998],[-140.985988,69.711998]]],[[[-171.731657,63.782515],[-171.114434,63.592191],[-170.491112,63.694975],[-169.682505,63.431116],[-168.689439,63.297506],[-168.771941,63.188598],[-169.52944,62.976931],[-170.290556,63.194438],[-170.671386,63.375822],[-171.553063,63.317789],[-171.791111,63.405846],[-171.731657,63.782515]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Kazakhstan","SOV_A3":"KA1","ADM0_DIF":1,"LEVEL":1,"TYPE":"Sovereignty","TLC":"1","ADMIN":"Kazakhstan","ADM0_A3":"KAZ","GEOU_DIF":0,"GEOUNIT":"Kazakhstan","GU_A3":"KAZ","SU_DIF":0,"SUBUNIT":"Kazakhstan","SU_A3":"KAZ","BRK_DIFF":0,"NAME":"Kazakhstan","NAME_LONG":"Kazakhstan","BRK_A3":"KAZ","BRK_NAME":"Kazakhstan","BRK_GROUP":null,"ABBREV":"Kaz.","POSTAL":"KZ","FORMAL_EN":"Republic of Kazakhstan","FORMAL_FR":null,"NAME_CIAWF":"Kazakhstan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kazakhstan","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":1,"MAPCOLOR9":6,"MAPCOLOR13":1,"POP_EST":18513930,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":181665,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"KZ","ISO_A2":"KZ","ISO_A2_EH":"KZ","ISO_A3":"KAZ","ISO_A3_EH":"KAZ","ISO_N3":"398","ISO_N3_EH":"398","UN_A3":"398","WB_A2":"KZ","WB_A3":"KAZ","WOE_ID":-90,"WOE_ID_EH":23424871,"WOE_NOTE":"Includes Baykonur Cosmodrome as an Admin-1 states provinces","ADM0_ISO":"KAZ","ADM0_DIFF":null,"ADM0_TLC":"KAZ","ADM0_A3_US":"KAZ","ADM0_A3_FR":"KAZ","ADM0_A3_RU":"KAZ","ADM0_A3_ES":"KAZ","ADM0_A3_CN":"KAZ","ADM0_A3_TW":"KAZ","ADM0_A3_IN":"KAZ","ADM0_A3_NP":"KAZ","ADM0_A3_PK":"KAZ","ADM0_A3_DE":"KAZ","ADM0_A3_GB":"KAZ","ADM0_A3_BR":"KAZ","ADM0_A3_IL":"KAZ","ADM0_A3_PS":"KAZ","ADM0_A3_SA":"KAZ","ADM0_A3_EG":"KAZ","ADM0_A3_MA":"KAZ","ADM0_A3_PT":"KAZ","ADM0_A3_AR":"KAZ","ADM0_A3_JP":"KAZ","ADM0_A3_KO":"KAZ","ADM0_A3_VN":"KAZ","ADM0_A3_TR":"KAZ","ADM0_A3_ID":"KAZ","ADM0_A3_PL":"KAZ","ADM0_A3_GR":"KAZ","ADM0_A3_IT":"KAZ","ADM0_A3_NL":"KAZ","ADM0_A3_SE":"KAZ","ADM0_A3_BD":"KAZ","ADM0_A3_UA":"KAZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":7,"LABEL_X":68.685548,"LABEL_Y":49.054149,"NE_ID":1159320967,"WIKIDATAID":"Q232","NAME_AR":"كازاخستان","NAME_BN":"কাজাখস্তান","NAME_DE":"Kasachstan","NAME_EN":"Kazakhstan","NAME_ES":"Kazajistán","NAME_FA":"قزاقستان","NAME_FR":"Kazakhstan","NAME_EL":"Καζακστάν","NAME_HE":"קזחסטן","NAME_HI":"कज़ाख़िस्तान","NAME_HU":"Kazahsztán","NAME_ID":"Kazakhstan","NAME_IT":"Kazakistan","NAME_JA":"カザフスタン","NAME_KO":"카자흐스탄","NAME_NL":"Kazachstan","NAME_PL":"Kazachstan","NAME_PT":"Cazaquistão","NAME_RU":"Казахстан","NAME_SV":"Kazakstan","NAME_TR":"Kazakistan","NAME_UK":"Казахстан","NAME_UR":"قازقستان","NAME_VI":"Kazakhstan","NAME_ZH":"哈萨克斯坦","NAME_ZHT":"哈薩克","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[46.466446,40.662325,87.35997,55.38525],"geometry":{"type":"Polygon","coordinates":[[[87.35997,49.214981],[86.598776,48.549182],[85.768233,48.455751],[85.720484,47.452969],[85.16429,47.000956],[83.180484,47.330031],[82.458926,45.53965],[81.947071,45.317027],[79.966106,44.917517],[80.866206,43.180362],[80.18015,42.920068],[80.25999,42.349999],[79.643645,42.496683],[79.142177,42.856092],[77.658392,42.960686],[76.000354,42.988022],[75.636965,42.8779],[74.212866,43.298339],[73.645304,43.091272],[73.489758,42.500894],[71.844638,42.845395],[71.186281,42.704293],[70.962315,42.266154],[70.388965,42.081308],[69.070027,41.384244],[68.632483,40.668681],[68.259896,40.662325],[67.985856,41.135991],[66.714047,41.168444],[66.510649,41.987644],[66.023392,41.994646],[66.098012,42.99766],[64.900824,43.728081],[63.185787,43.650075],[62.0133,43.504477],[61.05832,44.405817],[60.239972,44.784037],[58.689989,45.500014],[58.503127,45.586804],[55.928917,44.995858],[55.968191,41.308642],[55.455251,41.259859],[54.755345,42.043971],[54.079418,42.324109],[52.944293,42.116034],[52.50246,41.783316],[52.446339,42.027151],[52.692112,42.443895],[52.501426,42.792298],[51.342427,43.132975],[50.891292,44.031034],[50.339129,44.284016],[50.305643,44.609836],[51.278503,44.514854],[51.316899,45.245998],[52.16739,45.408391],[53.040876,45.259047],[53.220866,46.234646],[53.042737,46.853006],[52.042023,46.804637],[51.191945,47.048705],[50.034083,46.60899],[49.10116,46.39933],[48.59325,46.56104],[48.694734,47.075628],[48.05725,47.74377],[47.31524,47.71585],[46.466446,48.394152],[47.043672,49.152039],[46.751596,49.356006],[47.54948,50.454698],[48.577841,49.87476],[48.702382,50.605128],[50.766648,51.692762],[52.328724,51.718652],[54.532878,51.02624],[55.71694,50.62171],[56.77798,51.04355],[58.36332,51.06364],[59.642282,50.545442],[59.932807,50.842194],[61.337424,50.79907],[61.588003,51.272659],[59.967534,51.96042],[60.927269,52.447548],[60.739993,52.719986],[61.699986,52.979996],[60.978066,53.664993],[61.4366,54.00625],[65.178534,54.354228],[65.66687,54.60125],[68.1691,54.970392],[69.068167,55.38525],[70.865267,55.169734],[71.180131,54.133285],[72.22415,54.376655],[73.508516,54.035617],[73.425679,53.48981],[74.38482,53.54685],[76.8911,54.490524],[76.525179,54.177003],[77.800916,53.404415],[80.03556,50.864751],[80.568447,51.388336],[81.945986,50.812196],[83.383004,51.069183],[83.935115,50.889246],[84.416377,50.3114],[85.11556,50.117303],[85.54127,49.692859],[86.829357,49.826675],[87.35997,49.214981]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Uzbekistan","SOV_A3":"UZB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Uzbekistan","ADM0_A3":"UZB","GEOU_DIF":0,"GEOUNIT":"Uzbekistan","GU_A3":"UZB","SU_DIF":0,"SUBUNIT":"Uzbekistan","SU_A3":"UZB","BRK_DIFF":0,"NAME":"Uzbekistan","NAME_LONG":"Uzbekistan","BRK_A3":"UZB","BRK_NAME":"Uzbekistan","BRK_GROUP":null,"ABBREV":"Uzb.","POSTAL":"UZ","FORMAL_EN":"Republic of Uzbekistan","FORMAL_FR":null,"NAME_CIAWF":"Uzbekistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Uzbekistan","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":5,"MAPCOLOR13":4,"POP_EST":33580650,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":57921,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"UZ","ISO_A2":"UZ","ISO_A2_EH":"UZ","ISO_A3":"UZB","ISO_A3_EH":"UZB","ISO_N3":"860","ISO_N3_EH":"860","UN_A3":"860","WB_A2":"UZ","WB_A3":"UZB","WOE_ID":23424980,"WOE_ID_EH":23424980,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"UZB","ADM0_DIFF":null,"ADM0_TLC":"UZB","ADM0_A3_US":"UZB","ADM0_A3_FR":"UZB","ADM0_A3_RU":"UZB","ADM0_A3_ES":"UZB","ADM0_A3_CN":"UZB","ADM0_A3_TW":"UZB","ADM0_A3_IN":"UZB","ADM0_A3_NP":"UZB","ADM0_A3_PK":"UZB","ADM0_A3_DE":"UZB","ADM0_A3_GB":"UZB","ADM0_A3_BR":"UZB","ADM0_A3_IL":"UZB","ADM0_A3_PS":"UZB","ADM0_A3_SA":"UZB","ADM0_A3_EG":"UZB","ADM0_A3_MA":"UZB","ADM0_A3_PT":"UZB","ADM0_A3_AR":"UZB","ADM0_A3_JP":"UZB","ADM0_A3_KO":"UZB","ADM0_A3_VN":"UZB","ADM0_A3_TR":"UZB","ADM0_A3_ID":"UZB","ADM0_A3_PL":"UZB","ADM0_A3_GR":"UZB","ADM0_A3_IT":"UZB","ADM0_A3_NL":"UZB","ADM0_A3_SE":"UZB","ADM0_A3_BD":"UZB","ADM0_A3_UA":"UZB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":5,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":64.005429,"LABEL_Y":41.693603,"NE_ID":1159321405,"WIKIDATAID":"Q265","NAME_AR":"أوزبكستان","NAME_BN":"উজবেকিস্তান","NAME_DE":"Usbekistan","NAME_EN":"Uzbekistan","NAME_ES":"Uzbekistán","NAME_FA":"ازبکستان","NAME_FR":"Ouzbékistan","NAME_EL":"Ουζμπεκιστάν","NAME_HE":"אוזבקיסטן","NAME_HI":"उज़्बेकिस्तान","NAME_HU":"Üzbegisztán","NAME_ID":"Uzbekistan","NAME_IT":"Uzbekistan","NAME_JA":"ウズベキスタン","NAME_KO":"우즈베키스탄","NAME_NL":"Oezbekistan","NAME_PL":"Uzbekistan","NAME_PT":"Uzbequistão","NAME_RU":"Узбекистан","NAME_SV":"Uzbekistan","NAME_TR":"Özbekistan","NAME_UK":"Узбекистан","NAME_UR":"ازبکستان","NAME_VI":"Uzbekistan","NAME_ZH":"乌兹别克斯坦","NAME_ZHT":"烏茲別克","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[55.928917,37.144994,73.055417,45.586804],"geometry":{"type":"Polygon","coordinates":[[[55.968191,41.308642],[55.928917,44.995858],[58.503127,45.586804],[58.689989,45.500014],[60.239972,44.784037],[61.05832,44.405817],[62.0133,43.504477],[63.185787,43.650075],[64.900824,43.728081],[66.098012,42.99766],[66.023392,41.994646],[66.510649,41.987644],[66.714047,41.168444],[67.985856,41.135991],[68.259896,40.662325],[68.632483,40.668681],[69.070027,41.384244],[70.388965,42.081308],[70.962315,42.266154],[71.259248,42.167711],[70.420022,41.519998],[71.157859,41.143587],[71.870115,41.3929],[73.055417,40.866033],[71.774875,40.145844],[71.014198,40.244366],[70.601407,40.218527],[70.45816,40.496495],[70.666622,40.960213],[69.329495,40.727824],[69.011633,40.086158],[68.536416,39.533453],[67.701429,39.580478],[67.44222,39.140144],[68.176025,38.901553],[68.392033,38.157025],[67.83,37.144994],[67.075782,37.356144],[66.518607,37.362784],[66.54615,37.974685],[65.215999,38.402695],[64.170223,38.892407],[63.518015,39.363257],[62.37426,40.053886],[61.882714,41.084857],[61.547179,41.26637],[60.465953,41.220327],[60.083341,41.425146],[59.976422,42.223082],[58.629011,42.751551],[57.78653,42.170553],[56.932215,41.826026],[57.096391,41.32231],[55.968191,41.308642]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Papua New Guinea","SOV_A3":"PNG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Papua New Guinea","ADM0_A3":"PNG","GEOU_DIF":0,"GEOUNIT":"Papua New Guinea","GU_A3":"PNG","SU_DIF":1,"SUBUNIT":"Papua New Guinea","SU_A3":"PN1","BRK_DIFF":0,"NAME":"Papua New Guinea","NAME_LONG":"Papua New Guinea","BRK_A3":"PN1","BRK_NAME":"Papua New Guinea","BRK_GROUP":null,"ABBREV":"P.N.G.","POSTAL":"PG","FORMAL_EN":"Independent State of Papua New Guinea","FORMAL_FR":null,"NAME_CIAWF":"Papua New Guinea","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Papua New Guinea","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":1,"POP_EST":8776109,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":24829,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"PP","ISO_A2":"PG","ISO_A2_EH":"PG","ISO_A3":"PNG","ISO_A3_EH":"PNG","ISO_N3":"598","ISO_N3_EH":"598","UN_A3":"598","WB_A2":"PG","WB_A3":"PNG","WOE_ID":23424926,"WOE_ID_EH":23424926,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PN1","ADM0_DIFF":null,"ADM0_TLC":"PN1","ADM0_A3_US":"PNG","ADM0_A3_FR":"PNG","ADM0_A3_RU":"PNG","ADM0_A3_ES":"PNG","ADM0_A3_CN":"PNG","ADM0_A3_TW":"PNG","ADM0_A3_IN":"PNG","ADM0_A3_NP":"PNG","ADM0_A3_PK":"PNG","ADM0_A3_DE":"PNG","ADM0_A3_GB":"PNG","ADM0_A3_BR":"PNG","ADM0_A3_IL":"PNG","ADM0_A3_PS":"PNG","ADM0_A3_SA":"PNG","ADM0_A3_EG":"PNG","ADM0_A3_MA":"PNG","ADM0_A3_PT":"PNG","ADM0_A3_AR":"PNG","ADM0_A3_JP":"PNG","ADM0_A3_KO":"PNG","ADM0_A3_VN":"PNG","ADM0_A3_TR":"PNG","ADM0_A3_ID":"PNG","ADM0_A3_PL":"PNG","ADM0_A3_GR":"PNG","ADM0_A3_IT":"PNG","ADM0_A3_NL":"PNG","ADM0_A3_SE":"PNG","ADM0_A3_BD":"PNG","ADM0_A3_UA":"PNG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":16,"LONG_LEN":16,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":7.5,"LABEL_X":143.910216,"LABEL_Y":-5.695285,"NE_ID":1159321173,"WIKIDATAID":"Q691","NAME_AR":"بابوا غينيا الجديدة","NAME_BN":"পাপুয়া নিউগিনি","NAME_DE":"Papua-Neuguinea","NAME_EN":"Papua New Guinea","NAME_ES":"Papúa Nueva Guinea","NAME_FA":"پاپوآ گینه نو","NAME_FR":"Papouasie-Nouvelle-Guinée","NAME_EL":"Παπούα Νέα Γουινέα","NAME_HE":"פפואה גינאה החדשה","NAME_HI":"पापुआ न्यू गिनी","NAME_HU":"Pápua Új-Guinea","NAME_ID":"Papua Nugini","NAME_IT":"Papua Nuova Guinea","NAME_JA":"パプアニューギニア","NAME_KO":"파푸아뉴기니","NAME_NL":"Papoea-Nieuw-Guinea","NAME_PL":"Papua-Nowa Gwinea","NAME_PT":"Papua-Nova Guiné","NAME_RU":"Папуа — Новая Гвинея","NAME_SV":"Papua Nya Guinea","NAME_TR":"Papua Yeni Gine","NAME_UK":"Папуа Нова Гвінея","NAME_UR":"پاپوا نیو گنی","NAME_VI":"Papua New Guinea","NAME_ZH":"巴布亚新几内亚","NAME_ZHT":"巴布亞紐幾內亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[141.00021,-10.652476,156.019965,-2.500002],"geometry":{"type":"MultiPolygon","coordinates":[[[[141.00021,-2.600151],[142.735247,-3.289153],[144.583971,-3.861418],[145.27318,-4.373738],[145.829786,-4.876498],[145.981922,-5.465609],[147.648073,-6.083659],[147.891108,-6.614015],[146.970905,-6.721657],[147.191874,-7.388024],[148.084636,-8.044108],[148.734105,-9.104664],[149.306835,-9.071436],[149.266631,-9.514406],[150.038728,-9.684318],[149.738798,-9.872937],[150.801628,-10.293687],[150.690575,-10.582713],[150.028393,-10.652476],[149.78231,-10.393267],[148.923138,-10.280923],[147.913018,-10.130441],[147.135443,-9.492444],[146.567881,-8.942555],[146.048481,-8.067414],[144.744168,-7.630128],[143.897088,-7.91533],[143.286376,-8.245491],[143.413913,-8.983069],[142.628431,-9.326821],[142.068259,-9.159596],[141.033852,-9.117893],[141.017057,-5.859022],[141.00021,-2.600151]]],[[[152.640017,-3.659983],[153.019994,-3.980015],[153.140038,-4.499983],[152.827292,-4.766427],[152.638673,-4.176127],[152.406026,-3.789743],[151.953237,-3.462062],[151.384279,-3.035422],[150.66205,-2.741486],[150.939965,-2.500002],[151.479984,-2.779985],[151.820015,-2.999972],[152.239989,-3.240009],[152.640017,-3.659983]]],[[[151.30139,-5.840728],[150.754447,-6.083763],[150.241197,-6.317754],[149.709963,-6.316513],[148.890065,-6.02604],[148.318937,-5.747142],[148.401826,-5.437756],[149.298412,-5.583742],[149.845562,-5.505503],[149.99625,-5.026101],[150.139756,-5.001348],[150.236908,-5.53222],[150.807467,-5.455842],[151.089672,-5.113693],[151.647881,-4.757074],[151.537862,-4.167807],[152.136792,-4.14879],[152.338743,-4.312966],[152.318693,-4.867661],[151.982796,-5.478063],[151.459107,-5.56028],[151.30139,-5.840728]]],[[[154.759991,-5.339984],[155.062918,-5.566792],[155.547746,-6.200655],[156.019965,-6.540014],[155.880026,-6.819997],[155.599991,-6.919991],[155.166994,-6.535931],[154.729192,-5.900828],[154.514114,-5.139118],[154.652504,-5.042431],[154.759991,-5.339984]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Indonesia","SOV_A3":"IDN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Indonesia","ADM0_A3":"IDN","GEOU_DIF":0,"GEOUNIT":"Indonesia","GU_A3":"IDN","SU_DIF":0,"SUBUNIT":"Indonesia","SU_A3":"IDN","BRK_DIFF":0,"NAME":"Indonesia","NAME_LONG":"Indonesia","BRK_A3":"IDN","BRK_NAME":"Indonesia","BRK_GROUP":null,"ABBREV":"Indo.","POSTAL":"INDO","FORMAL_EN":"Republic of Indonesia","FORMAL_FR":null,"NAME_CIAWF":"Indonesia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Indonesia","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":11,"POP_EST":270625568,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":1119190,"GDP_YEAR":2019,"ECONOMY":"4. Emerging region: MIKT","INCOME_GRP":"4. Lower middle income","FIPS_10":"ID","ISO_A2":"ID","ISO_A2_EH":"ID","ISO_A3":"IDN","ISO_A3_EH":"IDN","ISO_N3":"360","ISO_N3_EH":"360","UN_A3":"360","WB_A2":"ID","WB_A3":"IDN","WOE_ID":23424846,"WOE_ID_EH":23424846,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"IDN","ADM0_DIFF":null,"ADM0_TLC":"IDN","ADM0_A3_US":"IDN","ADM0_A3_FR":"IDN","ADM0_A3_RU":"IDN","ADM0_A3_ES":"IDN","ADM0_A3_CN":"IDN","ADM0_A3_TW":"IDN","ADM0_A3_IN":"IDN","ADM0_A3_NP":"IDN","ADM0_A3_PK":"IDN","ADM0_A3_DE":"IDN","ADM0_A3_GB":"IDN","ADM0_A3_BR":"IDN","ADM0_A3_IL":"IDN","ADM0_A3_PS":"IDN","ADM0_A3_SA":"IDN","ADM0_A3_EG":"IDN","ADM0_A3_MA":"IDN","ADM0_A3_PT":"IDN","ADM0_A3_AR":"IDN","ADM0_A3_JP":"IDN","ADM0_A3_KO":"IDN","ADM0_A3_VN":"IDN","ADM0_A3_TR":"IDN","ADM0_A3_ID":"IDN","ADM0_A3_PL":"IDN","ADM0_A3_GR":"IDN","ADM0_A3_IT":"IDN","ADM0_A3_NL":"IDN","ADM0_A3_SE":"IDN","ADM0_A3_BD":"IDN","ADM0_A3_UA":"IDN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":101.892949,"LABEL_Y":-0.954404,"NE_ID":1159320845,"WIKIDATAID":"Q252","NAME_AR":"إندونيسيا","NAME_BN":"ইন্দোনেশিয়া","NAME_DE":"Indonesien","NAME_EN":"Indonesia","NAME_ES":"Indonesia","NAME_FA":"اندونزی","NAME_FR":"Indonésie","NAME_EL":"Ινδονησία","NAME_HE":"אינדונזיה","NAME_HI":"इंडोनेशिया","NAME_HU":"Indonézia","NAME_ID":"Indonesia","NAME_IT":"Indonesia","NAME_JA":"インドネシア","NAME_KO":"인도네시아","NAME_NL":"Indonesië","NAME_PL":"Indonezja","NAME_PT":"Indonésia","NAME_RU":"Индонезия","NAME_SV":"Indonesien","NAME_TR":"Endonezya","NAME_UK":"Індонезія","NAME_UR":"انڈونیشیا","NAME_VI":"Indonesia","NAME_ZH":"印度尼西亚","NAME_ZHT":"印度尼西亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[95.293026,-10.359987,141.033852,5.479821],"geometry":{"type":"MultiPolygon","coordinates":[[[[141.00021,-2.600151],[141.017057,-5.859022],[141.033852,-9.117893],[140.143415,-8.297168],[139.127767,-8.096043],[138.881477,-8.380935],[137.614474,-8.411683],[138.039099,-7.597882],[138.668621,-7.320225],[138.407914,-6.232849],[137.92784,-5.393366],[135.98925,-4.546544],[135.164598,-4.462931],[133.66288,-3.538853],[133.367705,-4.024819],[132.983956,-4.112979],[132.756941,-3.746283],[132.753789,-3.311787],[131.989804,-2.820551],[133.066845,-2.460418],[133.780031,-2.479848],[133.696212,-2.214542],[132.232373,-2.212526],[131.836222,-1.617162],[130.94284,-1.432522],[130.519558,-0.93772],[131.867538,-0.695461],[132.380116,-0.369538],[133.985548,-0.78021],[134.143368,-1.151867],[134.422627,-2.769185],[135.457603,-3.367753],[136.293314,-2.307042],[137.440738,-1.703513],[138.329727,-1.702686],[139.184921,-2.051296],[139.926684,-2.409052],[141.00021,-2.600151]]],[[[124.968682,-8.89279],[125.07002,-9.089987],[125.08852,-9.393173],[124.43595,-10.140001],[123.579982,-10.359987],[123.459989,-10.239995],[123.550009,-9.900016],[123.980009,-9.290027],[124.968682,-8.89279]]],[[[134.210134,-6.895238],[134.112776,-6.142467],[134.290336,-5.783058],[134.499625,-5.445042],[134.727002,-5.737582],[134.724624,-6.214401],[134.210134,-6.895238]]],[[[117.882035,4.137551],[117.313232,3.234428],[118.04833,2.28769],[117.875627,1.827641],[118.996747,0.902219],[117.811858,0.784242],[117.478339,0.102475],[117.521644,-0.803723],[116.560048,-1.487661],[116.533797,-2.483517],[116.148084,-4.012726],[116.000858,-3.657037],[114.864803,-4.106984],[114.468652,-3.495704],[113.755672,-3.43917],[113.256994,-3.118776],[112.068126,-3.478392],[111.703291,-2.994442],[111.04824,-3.049426],[110.223846,-2.934032],[110.070936,-1.592874],[109.571948,-1.314907],[109.091874,-0.459507],[108.952658,0.415375],[109.069136,1.341934],[109.66326,2.006467],[109.830227,1.338136],[110.514061,0.773131],[111.159138,0.976478],[111.797548,0.904441],[112.380252,1.410121],[112.859809,1.49779],[113.80585,1.217549],[114.621355,1.430688],[115.134037,2.821482],[115.519078,3.169238],[115.865517,4.306559],[117.015214,4.306094],[117.882035,4.137551]]],[[[129.370998,-2.802154],[130.471344,-3.093764],[130.834836,-3.858472],[129.990547,-3.446301],[129.155249,-3.362637],[128.590684,-3.428679],[127.898891,-3.393436],[128.135879,-2.84365],[129.370998,-2.802154]]],[[[126.874923,-3.790983],[126.183802,-3.607376],[125.989034,-3.177273],[127.000651,-3.129318],[127.249215,-3.459065],[126.874923,-3.790983]]],[[[127.932378,2.174596],[128.004156,1.628531],[128.594559,1.540811],[128.688249,1.132386],[128.635952,0.258486],[128.12017,0.356413],[127.968034,-0.252077],[128.379999,-0.780004],[128.100016,-0.899996],[127.696475,-0.266598],[127.39949,1.011722],[127.600512,1.810691],[127.932378,2.174596]]],[[[122.927567,0.875192],[124.077522,0.917102],[125.065989,1.643259],[125.240501,1.419836],[124.437035,0.427881],[123.685505,0.235593],[122.723083,0.431137],[121.056725,0.381217],[120.183083,0.237247],[120.04087,-0.519658],[120.935905,-1.408906],[121.475821,-0.955962],[123.340565,-0.615673],[123.258399,-1.076213],[122.822715,-0.930951],[122.38853,-1.516858],[121.508274,-1.904483],[122.454572,-3.186058],[122.271896,-3.5295],[123.170963,-4.683693],[123.162333,-5.340604],[122.628515,-5.634591],[122.236394,-5.282933],[122.719569,-4.464172],[121.738234,-4.851331],[121.489463,-4.574553],[121.619171,-4.188478],[120.898182,-3.602105],[120.972389,-2.627643],[120.305453,-2.931604],[120.390047,-4.097579],[120.430717,-5.528241],[119.796543,-5.6734],[119.366906,-5.379878],[119.653606,-4.459417],[119.498835,-3.494412],[119.078344,-3.487022],[118.767769,-2.801999],[119.180974,-2.147104],[119.323394,-1.353147],[119.825999,0.154254],[120.035702,0.566477],[120.885779,1.309223],[121.666817,1.013944],[122.927567,0.875192]]],[[[120.295014,-10.25865],[118.967808,-9.557969],[119.90031,-9.36134],[120.425756,-9.665921],[120.775502,-9.969675],[120.715609,-10.239581],[120.295014,-10.25865]]],[[[121.341669,-8.53674],[122.007365,-8.46062],[122.903537,-8.094234],[122.756983,-8.649808],[121.254491,-8.933666],[119.924391,-8.810418],[119.920929,-8.444859],[120.715092,-8.236965],[121.341669,-8.53674]]],[[[118.260616,-8.362383],[118.87846,-8.280683],[119.126507,-8.705825],[117.970402,-8.906639],[117.277731,-9.040895],[116.740141,-9.032937],[117.083737,-8.457158],[117.632024,-8.449303],[117.900018,-8.095681],[118.260616,-8.362383]]],[[[108.486846,-6.421985],[108.623479,-6.777674],[110.539227,-6.877358],[110.759576,-6.465186],[112.614811,-6.946036],[112.978768,-7.594213],[114.478935,-7.776528],[115.705527,-8.370807],[114.564511,-8.751817],[113.464734,-8.348947],[112.559672,-8.376181],[111.522061,-8.302129],[110.58615,-8.122605],[109.427667,-7.740664],[108.693655,-7.6416],[108.277763,-7.766657],[106.454102,-7.3549],[106.280624,-6.9249],[105.365486,-6.851416],[106.051646,-5.895919],[107.265009,-5.954985],[108.072091,-6.345762],[108.486846,-6.421985]]],[[[104.369991,-1.084843],[104.53949,-1.782372],[104.887893,-2.340425],[105.622111,-2.428844],[106.108593,-3.061777],[105.857446,-4.305525],[105.817655,-5.852356],[104.710384,-5.873285],[103.868213,-5.037315],[102.584261,-4.220259],[102.156173,-3.614146],[101.399113,-2.799777],[100.902503,-2.050262],[100.141981,-0.650348],[99.26374,0.183142],[98.970011,1.042882],[98.601351,1.823507],[97.699598,2.453184],[97.176942,3.308791],[96.424017,3.86886],[95.380876,4.970782],[95.293026,5.479821],[95.936863,5.439513],[97.484882,5.246321],[98.369169,4.26837],[99.142559,3.59035],[99.693998,3.174329],[100.641434,2.099381],[101.658012,2.083697],[102.498271,1.3987],[103.07684,0.561361],[103.838396,0.104542],[103.437645,-0.711946],[104.010789,-1.059212],[104.369991,-1.084843]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Argentina","SOV_A3":"ARG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Argentina","ADM0_A3":"ARG","GEOU_DIF":0,"GEOUNIT":"Argentina","GU_A3":"ARG","SU_DIF":0,"SUBUNIT":"Argentina","SU_A3":"ARG","BRK_DIFF":0,"NAME":"Argentina","NAME_LONG":"Argentina","BRK_A3":"ARG","BRK_NAME":"Argentina","BRK_GROUP":null,"ABBREV":"Arg.","POSTAL":"AR","FORMAL_EN":"Argentine Republic","FORMAL_FR":null,"NAME_CIAWF":"Argentina","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Argentina","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":13,"POP_EST":44938712,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":445445,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"AR","ISO_A2":"AR","ISO_A2_EH":"AR","ISO_A3":"ARG","ISO_A3_EH":"ARG","ISO_N3":"032","ISO_N3_EH":"032","UN_A3":"032","WB_A2":"AR","WB_A3":"ARG","WOE_ID":23424747,"WOE_ID_EH":23424747,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ARG","ADM0_DIFF":null,"ADM0_TLC":"ARG","ADM0_A3_US":"ARG","ADM0_A3_FR":"ARG","ADM0_A3_RU":"ARG","ADM0_A3_ES":"ARG","ADM0_A3_CN":"ARG","ADM0_A3_TW":"ARG","ADM0_A3_IN":"ARG","ADM0_A3_NP":"ARG","ADM0_A3_PK":"ARG","ADM0_A3_DE":"ARG","ADM0_A3_GB":"ARG","ADM0_A3_BR":"ARG","ADM0_A3_IL":"ARG","ADM0_A3_PS":"ARG","ADM0_A3_SA":"ARG","ADM0_A3_EG":"ARG","ADM0_A3_MA":"ARG","ADM0_A3_PT":"ARG","ADM0_A3_AR":"ARG","ADM0_A3_JP":"ARG","ADM0_A3_KO":"ARG","ADM0_A3_VN":"ARG","ADM0_A3_TR":"ARG","ADM0_A3_ID":"ARG","ADM0_A3_PL":"ARG","ADM0_A3_GR":"ARG","ADM0_A3_IT":"ARG","ADM0_A3_NL":"ARG","ADM0_A3_SE":"ARG","ADM0_A3_BD":"ARG","ADM0_A3_UA":"ARG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":-64.173331,"LABEL_Y":-33.501159,"NE_ID":1159320331,"WIKIDATAID":"Q414","NAME_AR":"الأرجنتين","NAME_BN":"আর্জেন্টিনা","NAME_DE":"Argentinien","NAME_EN":"Argentina","NAME_ES":"Argentina","NAME_FA":"آرژانتین","NAME_FR":"Argentine","NAME_EL":"Αργεντινή","NAME_HE":"ארגנטינה","NAME_HI":"अर्जेण्टीना","NAME_HU":"Argentína","NAME_ID":"Argentina","NAME_IT":"Argentina","NAME_JA":"アルゼンチン","NAME_KO":"아르헨티나","NAME_NL":"Argentinië","NAME_PL":"Argentyna","NAME_PT":"Argentina","NAME_RU":"Аргентина","NAME_SV":"Argentina","NAME_TR":"Arjantin","NAME_UK":"Аргентина","NAME_UR":"ارجنٹائن","NAME_VI":"Argentina","NAME_ZH":"阿根廷","NAME_ZHT":"阿根廷","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-73.415436,-55.25,-53.628349,-21.83231],"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.63401,-52.63637],[-68.25,-53.1],[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2],[-66.45,-55.25],[-66.95992,-54.89681],[-67.56244,-54.87001],[-68.63335,-54.8695],[-68.63401,-52.63637]]],[[[-57.625133,-30.216295],[-57.874937,-31.016556],[-58.14244,-32.044504],[-58.132648,-33.040567],[-58.349611,-33.263189],[-58.427074,-33.909454],[-58.495442,-34.43149],[-57.22583,-35.288027],[-57.362359,-35.97739],[-56.737487,-36.413126],[-56.788285,-36.901572],[-57.749157,-38.183871],[-59.231857,-38.72022],[-61.237445,-38.928425],[-62.335957,-38.827707],[-62.125763,-39.424105],[-62.330531,-40.172586],[-62.145994,-40.676897],[-62.745803,-41.028761],[-63.770495,-41.166789],[-64.73209,-40.802677],[-65.118035,-41.064315],[-64.978561,-42.058001],[-64.303408,-42.359016],[-63.755948,-42.043687],[-63.458059,-42.563138],[-64.378804,-42.873558],[-65.181804,-43.495381],[-65.328823,-44.501366],[-65.565269,-45.036786],[-66.509966,-45.039628],[-67.293794,-45.551896],[-67.580546,-46.301773],[-66.597066,-47.033925],[-65.641027,-47.236135],[-65.985088,-48.133289],[-67.166179,-48.697337],[-67.816088,-49.869669],[-68.728745,-50.264218],[-69.138539,-50.73251],[-68.815561,-51.771104],[-68.149995,-52.349983],[-68.571545,-52.299444],[-69.498362,-52.142761],[-71.914804,-52.009022],[-72.329404,-51.425956],[-72.309974,-50.67701],[-72.975747,-50.74145],[-73.328051,-50.378785],[-73.415436,-49.318436],[-72.648247,-48.878618],[-72.331161,-48.244238],[-72.447355,-47.738533],[-71.917258,-46.884838],[-71.552009,-45.560733],[-71.659316,-44.973689],[-71.222779,-44.784243],[-71.329801,-44.407522],[-71.793623,-44.207172],[-71.464056,-43.787611],[-71.915424,-43.408565],[-72.148898,-42.254888],[-71.746804,-42.051386],[-71.915734,-40.832339],[-71.680761,-39.808164],[-71.413517,-38.916022],[-70.814664,-38.552995],[-71.118625,-37.576827],[-71.121881,-36.658124],[-70.364769,-36.005089],[-70.388049,-35.169688],[-69.817309,-34.193571],[-69.814777,-33.273886],[-70.074399,-33.09121],[-70.535069,-31.36501],[-69.919008,-30.336339],[-70.01355,-29.367923],[-69.65613,-28.459141],[-69.001235,-27.521214],[-68.295542,-26.89934],[-68.5948,-26.506909],[-68.386001,-26.185016],[-68.417653,-24.518555],[-67.328443,-24.025303],[-66.985234,-22.986349],[-67.106674,-22.735925],[-66.273339,-21.83231],[-64.964892,-22.075862],[-64.377021,-22.798091],[-63.986838,-21.993644],[-62.846468,-22.034985],[-62.685057,-22.249029],[-60.846565,-23.880713],[-60.028966,-24.032796],[-58.807128,-24.771459],[-57.777217,-25.16234],[-57.63366,-25.603657],[-58.618174,-27.123719],[-57.60976,-27.395899],[-56.486702,-27.548499],[-55.695846,-27.387837],[-54.788795,-26.621786],[-54.625291,-25.739255],[-54.13005,-25.547639],[-53.628349,-26.124865],[-53.648735,-26.923473],[-54.490725,-27.474757],[-55.162286,-27.881915],[-56.2909,-28.852761],[-57.625133,-30.216295]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Chile","SOV_A3":"CHL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Chile","ADM0_A3":"CHL","GEOU_DIF":0,"GEOUNIT":"Chile","GU_A3":"CHL","SU_DIF":0,"SUBUNIT":"Chile","SU_A3":"CHL","BRK_DIFF":0,"NAME":"Chile","NAME_LONG":"Chile","BRK_A3":"CHL","BRK_NAME":"Chile","BRK_GROUP":null,"ABBREV":"Chile","POSTAL":"CL","FORMAL_EN":"Republic of Chile","FORMAL_FR":null,"NAME_CIAWF":"Chile","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Chile","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":5,"MAPCOLOR13":9,"POP_EST":18952038,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":282318,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"CI","ISO_A2":"CL","ISO_A2_EH":"CL","ISO_A3":"CHL","ISO_A3_EH":"CHL","ISO_N3":"152","ISO_N3_EH":"152","UN_A3":"152","WB_A2":"CL","WB_A3":"CHL","WOE_ID":23424782,"WOE_ID_EH":23424782,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CHL","ADM0_DIFF":null,"ADM0_TLC":"CHL","ADM0_A3_US":"CHL","ADM0_A3_FR":"CHL","ADM0_A3_RU":"CHL","ADM0_A3_ES":"CHL","ADM0_A3_CN":"CHL","ADM0_A3_TW":"CHL","ADM0_A3_IN":"CHL","ADM0_A3_NP":"CHL","ADM0_A3_PK":"CHL","ADM0_A3_DE":"CHL","ADM0_A3_GB":"CHL","ADM0_A3_BR":"CHL","ADM0_A3_IL":"CHL","ADM0_A3_PS":"CHL","ADM0_A3_SA":"CHL","ADM0_A3_EG":"CHL","ADM0_A3_MA":"CHL","ADM0_A3_PT":"CHL","ADM0_A3_AR":"CHL","ADM0_A3_JP":"CHL","ADM0_A3_KO":"CHL","ADM0_A3_VN":"CHL","ADM0_A3_TR":"CHL","ADM0_A3_ID":"CHL","ADM0_A3_PL":"CHL","ADM0_A3_GR":"CHL","ADM0_A3_IT":"CHL","ADM0_A3_NL":"CHL","ADM0_A3_SE":"CHL","ADM0_A3_BD":"CHL","ADM0_A3_UA":"CHL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":-72.318871,"LABEL_Y":-38.151771,"NE_ID":1159320493,"WIKIDATAID":"Q298","NAME_AR":"تشيلي","NAME_BN":"চিলি","NAME_DE":"Chile","NAME_EN":"Chile","NAME_ES":"Chile","NAME_FA":"شیلی","NAME_FR":"Chili","NAME_EL":"Χιλή","NAME_HE":"צ'ילה","NAME_HI":"चिली","NAME_HU":"Chile","NAME_ID":"Chili","NAME_IT":"Cile","NAME_JA":"チリ","NAME_KO":"칠레","NAME_NL":"Chili","NAME_PL":"Chile","NAME_PT":"Chile","NAME_RU":"Чили","NAME_SV":"Chile","NAME_TR":"Şili","NAME_UK":"Чилі","NAME_UR":"چلی","NAME_VI":"Chile","NAME_ZH":"智利","NAME_ZHT":"智利","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-75.644395,-55.61183,-66.95992,-17.580012],"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.63401,-52.63637],[-68.63335,-54.8695],[-67.56244,-54.87001],[-66.95992,-54.89681],[-67.29103,-55.30124],[-68.14863,-55.61183],[-68.639991,-55.580018],[-69.2321,-55.49906],[-69.95809,-55.19843],[-71.00568,-55.05383],[-72.2639,-54.49514],[-73.2852,-53.95752],[-74.66253,-52.83749],[-73.8381,-53.04743],[-72.43418,-53.7154],[-71.10773,-54.07433],[-70.59178,-53.61583],[-70.26748,-52.93123],[-69.34565,-52.5183],[-68.63401,-52.63637]]],[[[-69.590424,-17.580012],[-69.100247,-18.260125],[-68.966818,-18.981683],[-68.442225,-19.405068],[-68.757167,-20.372658],[-68.219913,-21.494347],[-67.82818,-22.872919],[-67.106674,-22.735925],[-66.985234,-22.986349],[-67.328443,-24.025303],[-68.417653,-24.518555],[-68.386001,-26.185016],[-68.5948,-26.506909],[-68.295542,-26.89934],[-69.001235,-27.521214],[-69.65613,-28.459141],[-70.01355,-29.367923],[-69.919008,-30.336339],[-70.535069,-31.36501],[-70.074399,-33.09121],[-69.814777,-33.273886],[-69.817309,-34.193571],[-70.388049,-35.169688],[-70.364769,-36.005089],[-71.121881,-36.658124],[-71.118625,-37.576827],[-70.814664,-38.552995],[-71.413517,-38.916022],[-71.680761,-39.808164],[-71.915734,-40.832339],[-71.746804,-42.051386],[-72.148898,-42.254888],[-71.915424,-43.408565],[-71.464056,-43.787611],[-71.793623,-44.207172],[-71.329801,-44.407522],[-71.222779,-44.784243],[-71.659316,-44.973689],[-71.552009,-45.560733],[-71.917258,-46.884838],[-72.447355,-47.738533],[-72.331161,-48.244238],[-72.648247,-48.878618],[-73.415436,-49.318436],[-73.328051,-50.378785],[-72.975747,-50.74145],[-72.309974,-50.67701],[-72.329404,-51.425956],[-71.914804,-52.009022],[-69.498362,-52.142761],[-68.571545,-52.299444],[-69.461284,-52.291951],[-69.94278,-52.537931],[-70.845102,-52.899201],[-71.006332,-53.833252],[-71.429795,-53.856455],[-72.557943,-53.53141],[-73.702757,-52.835069],[-73.702757,-52.83507],[-74.946763,-52.262754],[-75.260026,-51.629355],[-74.976632,-51.043396],[-75.479754,-50.378372],[-75.608015,-48.673773],[-75.18277,-47.711919],[-74.126581,-46.939253],[-75.644395,-46.647643],[-74.692154,-45.763976],[-74.351709,-44.103044],[-73.240356,-44.454961],[-72.717804,-42.383356],[-73.3889,-42.117532],[-73.701336,-43.365776],[-74.331943,-43.224958],[-74.017957,-41.794813],[-73.677099,-39.942213],[-73.217593,-39.258689],[-73.505559,-38.282883],[-73.588061,-37.156285],[-73.166717,-37.12378],[-72.553137,-35.50884],[-71.861732,-33.909093],[-71.43845,-32.418899],[-71.668721,-30.920645],[-71.370083,-30.095682],[-71.489894,-28.861442],[-70.905124,-27.64038],[-70.724954,-25.705924],[-70.403966,-23.628997],[-70.091246,-21.393319],[-70.16442,-19.756468],[-70.372572,-18.347975],[-69.858444,-18.092694],[-69.590424,-17.580012]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Democratic Republic of the Congo","SOV_A3":"COD","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Democratic Republic of the Congo","ADM0_A3":"COD","GEOU_DIF":0,"GEOUNIT":"Democratic Republic of the Congo","GU_A3":"COD","SU_DIF":0,"SUBUNIT":"Democratic Republic of the Congo","SU_A3":"COD","BRK_DIFF":0,"NAME":"Dem. Rep. Congo","NAME_LONG":"Democratic Republic of the Congo","BRK_A3":"COD","BRK_NAME":"Democratic Republic of the Congo","BRK_GROUP":null,"ABBREV":"D.R.C.","POSTAL":"DRC","FORMAL_EN":"Democratic Republic of the Congo","FORMAL_FR":null,"NAME_CIAWF":"Congo, Democratic Republic of the","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Congo, Dem. Rep.","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":7,"POP_EST":86790567,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":50400,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"CG","ISO_A2":"CD","ISO_A2_EH":"CD","ISO_A3":"COD","ISO_A3_EH":"COD","ISO_N3":"180","ISO_N3_EH":"180","UN_A3":"180","WB_A2":"ZR","WB_A3":"ZAR","WOE_ID":23424780,"WOE_ID_EH":23424780,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"COD","ADM0_DIFF":null,"ADM0_TLC":"COD","ADM0_A3_US":"COD","ADM0_A3_FR":"COD","ADM0_A3_RU":"COD","ADM0_A3_ES":"COD","ADM0_A3_CN":"COD","ADM0_A3_TW":"COD","ADM0_A3_IN":"COD","ADM0_A3_NP":"COD","ADM0_A3_PK":"COD","ADM0_A3_DE":"COD","ADM0_A3_GB":"COD","ADM0_A3_BR":"COD","ADM0_A3_IL":"COD","ADM0_A3_PS":"COD","ADM0_A3_SA":"COD","ADM0_A3_EG":"COD","ADM0_A3_MA":"COD","ADM0_A3_PT":"COD","ADM0_A3_AR":"COD","ADM0_A3_JP":"COD","ADM0_A3_KO":"COD","ADM0_A3_VN":"COD","ADM0_A3_TR":"COD","ADM0_A3_ID":"COD","ADM0_A3_PL":"COD","ADM0_A3_GR":"COD","ADM0_A3_IT":"COD","ADM0_A3_NL":"COD","ADM0_A3_SE":"COD","ADM0_A3_BD":"COD","ADM0_A3_UA":"COD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":15,"LONG_LEN":32,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":23.458829,"LABEL_Y":-1.858167,"NE_ID":1159320513,"WIKIDATAID":"Q974","NAME_AR":"جمهورية الكونغو الديمقراطية","NAME_BN":"গণতান্ত্রিক কঙ্গো প্রজাতন্ত্র","NAME_DE":"Demokratische Republik Kongo","NAME_EN":"Democratic Republic of the Congo","NAME_ES":"República Democrática del Congo","NAME_FA":"جمهوری دموکراتیک کنگو","NAME_FR":"République démocratique du Congo","NAME_EL":"Λαϊκή Δημοκρατία του Κονγκό","NAME_HE":"הרפובליקה הדמוקרטית של קונגו","NAME_HI":"कांगो लोकतान्त्रिक गणराज्य","NAME_HU":"Kongói Demokratikus Köztársaság","NAME_ID":"Republik Demokratik Kongo","NAME_IT":"Repubblica Democratica del Congo","NAME_JA":"コンゴ民主共和国","NAME_KO":"콩고 민주 공화국","NAME_NL":"Congo-Kinshasa","NAME_PL":"Demokratyczna Republika Konga","NAME_PT":"República Democrática do Congo","NAME_RU":"Демократическая Республика Конго","NAME_SV":"Kongo-Kinshasa","NAME_TR":"Demokratik Kongo Cumhuriyeti","NAME_UK":"Демократична Республіка Конго","NAME_UR":"جمہوری جمہوریہ کانگو","NAME_VI":"Cộng hòa Dân chủ Congo","NAME_ZH":"刚果民主共和国","NAME_ZHT":"剛果民主共和國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[12.182337,-13.257227,31.174149,5.256088],"geometry":{"type":"Polygon","coordinates":[[[29.339998,-4.499983],[29.519987,-5.419979],[29.419993,-5.939999],[29.620032,-6.520015],[30.199997,-7.079981],[30.740015,-8.340007],[30.74001,-8.340006],[30.346086,-8.238257],[29.002912,-8.407032],[28.734867,-8.526559],[28.449871,-9.164918],[28.673682,-9.605925],[28.49607,-10.789884],[28.372253,-11.793647],[28.642417,-11.971569],[29.341548,-12.360744],[29.616001,-12.178895],[29.699614,-13.257227],[28.934286,-13.248958],[28.523562,-12.698604],[28.155109,-12.272481],[27.388799,-12.132747],[27.16442,-11.608748],[26.553088,-11.92444],[25.75231,-11.784965],[25.418118,-11.330936],[24.78317,-11.238694],[24.314516,-11.262826],[24.257155,-10.951993],[23.912215,-10.926826],[23.456791,-10.867863],[22.837345,-11.017622],[22.402798,-10.993075],[22.155268,-11.084801],[22.208753,-9.894796],[21.875182,-9.523708],[21.801801,-8.908707],[21.949131,-8.305901],[21.746456,-7.920085],[21.728111,-7.290872],[20.514748,-7.299606],[20.601823,-6.939318],[20.091622,-6.94309],[20.037723,-7.116361],[19.417502,-7.155429],[19.166613,-7.738184],[19.016752,-7.988246],[18.464176,-7.847014],[18.134222,-7.987678],[17.47297,-8.068551],[17.089996,-7.545689],[16.860191,-7.222298],[16.57318,-6.622645],[16.326528,-5.87747],[13.375597,-5.864241],[13.024869,-5.984389],[12.735171,-5.965682],[12.322432,-6.100092],[12.182337,-5.789931],[12.436688,-5.684304],[12.468004,-5.248362],[12.631612,-4.991271],[12.995517,-4.781103],[13.25824,-4.882957],[13.600235,-4.500138],[14.144956,-4.510009],[14.209035,-4.793092],[14.582604,-4.970239],[15.170992,-4.343507],[15.75354,-3.855165],[16.00629,-3.535133],[15.972803,-2.712392],[16.407092,-1.740927],[16.865307,-1.225816],[17.523716,-0.74383],[17.638645,-0.424832],[17.663553,-0.058084],[17.82654,0.288923],[17.774192,0.855659],[17.898835,1.741832],[18.094276,2.365722],[18.393792,2.900443],[18.453065,3.504386],[18.542982,4.201785],[18.932312,4.709506],[19.467784,5.031528],[20.290679,4.691678],[20.927591,4.322786],[21.659123,4.224342],[22.405124,4.02916],[22.704124,4.633051],[22.84148,4.710126],[23.297214,4.609693],[24.410531,5.108784],[24.805029,4.897247],[25.128833,4.927245],[25.278798,5.170408],[25.650455,5.256088],[26.402761,5.150875],[27.044065,5.127853],[27.374226,5.233944],[27.979977,4.408413],[28.428994,4.287155],[28.696678,4.455077],[29.159078,4.389267],[29.715995,4.600805],[29.9535,4.173699],[30.833852,3.509172],[30.83386,3.509166],[30.773347,2.339883],[31.174149,2.204465],[30.85267,1.849396],[30.468508,1.583805],[30.086154,1.062313],[29.875779,0.59738],[29.819503,-0.20531],[29.587838,-0.587406],[29.579466,-1.341313],[29.291887,-1.620056],[29.254835,-2.21511],[29.117479,-2.292211],[29.024926,-2.839258],[29.276384,-3.293907],[29.339998,-4.499983]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Somalia","SOV_A3":"SOM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Somalia","ADM0_A3":"SOM","GEOU_DIF":0,"GEOUNIT":"Somalia","GU_A3":"SOM","SU_DIF":0,"SUBUNIT":"Somalia","SU_A3":"SOM","BRK_DIFF":0,"NAME":"Somalia","NAME_LONG":"Somalia","BRK_A3":"SOM","BRK_NAME":"Somalia","BRK_GROUP":null,"ABBREV":"Som.","POSTAL":"SO","FORMAL_EN":"Federal Republic of Somalia","FORMAL_FR":null,"NAME_CIAWF":"Somalia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Somalia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":8,"MAPCOLOR9":6,"MAPCOLOR13":7,"POP_EST":10192317.3,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":4719,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"SO","ISO_A2":"SO","ISO_A2_EH":"SO","ISO_A3":"SOM","ISO_A3_EH":"SOM","ISO_N3":"706","ISO_N3_EH":"706","UN_A3":"706","WB_A2":"SO","WB_A3":"SOM","WOE_ID":-90,"WOE_ID_EH":23424949,"WOE_NOTE":"Includes Somaliland (2347021, 2347020, 2347017 and portion of 2347016)","ADM0_ISO":"SOM","ADM0_DIFF":null,"ADM0_TLC":"SOM","ADM0_A3_US":"SOM","ADM0_A3_FR":"SOM","ADM0_A3_RU":"SOM","ADM0_A3_ES":"SOM","ADM0_A3_CN":"SOM","ADM0_A3_TW":"SOM","ADM0_A3_IN":"SOM","ADM0_A3_NP":"SOM","ADM0_A3_PK":"SOM","ADM0_A3_DE":"SOM","ADM0_A3_GB":"SOM","ADM0_A3_BR":"SOM","ADM0_A3_IL":"SOM","ADM0_A3_PS":"SOM","ADM0_A3_SA":"SOM","ADM0_A3_EG":"SOM","ADM0_A3_MA":"SOM","ADM0_A3_PT":"SOM","ADM0_A3_AR":"SOM","ADM0_A3_JP":"SOM","ADM0_A3_KO":"SOM","ADM0_A3_VN":"SOM","ADM0_A3_TR":"SOM","ADM0_A3_ID":"SOM","ADM0_A3_PL":"SOM","ADM0_A3_GR":"SOM","ADM0_A3_IT":"SOM","ADM0_A3_NL":"SOM","ADM0_A3_SE":"SOM","ADM0_A3_BD":"SOM","ADM0_A3_UA":"SOM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":45.19238,"LABEL_Y":3.568925,"NE_ID":1159321261,"WIKIDATAID":"Q1045","NAME_AR":"الصومال","NAME_BN":"সোমালিয়া","NAME_DE":"Somalia","NAME_EN":"Somalia","NAME_ES":"Somalia","NAME_FA":"سومالی","NAME_FR":"Somalie","NAME_EL":"Σομαλία","NAME_HE":"סומליה","NAME_HI":"सोमालिया","NAME_HU":"Szomália","NAME_ID":"Somalia","NAME_IT":"Somalia","NAME_JA":"ソマリア","NAME_KO":"소말리아","NAME_NL":"Somalië","NAME_PL":"Somalia","NAME_PT":"Somália","NAME_RU":"Сомали","NAME_SV":"Somalia","NAME_TR":"Somali","NAME_UK":"Сомалі","NAME_UR":"صومالیہ","NAME_VI":"Somalia","NAME_ZH":"索马里","NAME_ZHT":"索馬利亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[40.98105,-1.68325,51.13387,12.02464],"geometry":{"type":"Polygon","coordinates":[[[41.58513,-1.68325],[40.993,-0.85829],[40.98105,2.78452],[41.855083,3.918912],[42.12861,4.23413],[42.76967,4.25259],[43.66087,4.95755],[44.9636,5.00162],[47.78942,8.003],[48.486736,8.837626],[48.93813,9.451749],[48.938233,9.9735],[48.938491,10.982327],[48.942005,11.394266],[48.948205,11.410617],[48.948205,11.410617],[49.26776,11.43033],[49.72862,11.5789],[50.25878,11.67957],[50.73202,12.0219],[51.1112,12.02464],[51.13387,11.74815],[51.04153,11.16651],[51.04531,10.6409],[50.83418,10.27972],[50.55239,9.19874],[50.07092,8.08173],[49.4527,6.80466],[48.59455,5.33911],[47.74079,4.2194],[46.56476,2.85529],[45.56399,2.04576],[44.06815,1.05283],[43.13597,0.2922],[42.04157,-0.91916],[41.81095,-1.44647],[41.58513,-1.68325]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Kenya","SOV_A3":"KEN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Kenya","ADM0_A3":"KEN","GEOU_DIF":0,"GEOUNIT":"Kenya","GU_A3":"KEN","SU_DIF":0,"SUBUNIT":"Kenya","SU_A3":"KEN","BRK_DIFF":0,"NAME":"Kenya","NAME_LONG":"Kenya","BRK_A3":"KEN","BRK_NAME":"Kenya","BRK_GROUP":null,"ABBREV":"Ken.","POSTAL":"KE","FORMAL_EN":"Republic of Kenya","FORMAL_FR":null,"NAME_CIAWF":"Kenya","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kenya","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":2,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":52573973,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":95503,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"5. Low income","FIPS_10":"KE","ISO_A2":"KE","ISO_A2_EH":"KE","ISO_A3":"KEN","ISO_A3_EH":"KEN","ISO_N3":"404","ISO_N3_EH":"404","UN_A3":"404","WB_A2":"KE","WB_A3":"KEN","WOE_ID":23424863,"WOE_ID_EH":23424863,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"KEN","ADM0_DIFF":null,"ADM0_TLC":"KEN","ADM0_A3_US":"KEN","ADM0_A3_FR":"KEN","ADM0_A3_RU":"KEN","ADM0_A3_ES":"KEN","ADM0_A3_CN":"KEN","ADM0_A3_TW":"KEN","ADM0_A3_IN":"KEN","ADM0_A3_NP":"KEN","ADM0_A3_PK":"KEN","ADM0_A3_DE":"KEN","ADM0_A3_GB":"KEN","ADM0_A3_BR":"KEN","ADM0_A3_IL":"KEN","ADM0_A3_PS":"KEN","ADM0_A3_SA":"KEN","ADM0_A3_EG":"KEN","ADM0_A3_MA":"KEN","ADM0_A3_PT":"KEN","ADM0_A3_AR":"KEN","ADM0_A3_JP":"KEN","ADM0_A3_KO":"KEN","ADM0_A3_VN":"KEN","ADM0_A3_TR":"KEN","ADM0_A3_ID":"KEN","ADM0_A3_PL":"KEN","ADM0_A3_GR":"KEN","ADM0_A3_IT":"KEN","ADM0_A3_NL":"KEN","ADM0_A3_SE":"KEN","ADM0_A3_BD":"KEN","ADM0_A3_UA":"KEN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":37.907632,"LABEL_Y":0.549043,"NE_ID":1159320971,"WIKIDATAID":"Q114","NAME_AR":"كينيا","NAME_BN":"কেনিয়া","NAME_DE":"Kenia","NAME_EN":"Kenya","NAME_ES":"Kenia","NAME_FA":"کنیا","NAME_FR":"Kenya","NAME_EL":"Κένυα","NAME_HE":"קניה","NAME_HI":"कीनिया","NAME_HU":"Kenya","NAME_ID":"Kenya","NAME_IT":"Kenya","NAME_JA":"ケニア","NAME_KO":"케냐","NAME_NL":"Kenia","NAME_PL":"Kenia","NAME_PT":"Quénia","NAME_RU":"Кения","NAME_SV":"Kenya","NAME_TR":"Kenya","NAME_UK":"Кенія","NAME_UR":"کینیا","NAME_VI":"Kenya","NAME_ZH":"肯尼亚","NAME_ZHT":"肯亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[33.893569,-4.67677,41.855083,5.506],"geometry":{"type":"Polygon","coordinates":[[[39.20222,-4.67677],[37.7669,-3.67712],[37.69869,-3.09699],[34.07262,-1.05982],[33.903711,-0.95],[33.893569,0.109814],[34.18,0.515],[34.6721,1.17694],[35.03599,1.90584],[34.59607,3.05374],[34.47913,3.5556],[34.005,4.249885],[34.620196,4.847123],[35.298007,5.506],[35.817448,5.338232],[35.817448,4.776966],[36.159079,4.447864],[36.855093,4.447864],[38.120915,3.598605],[38.43697,3.58851],[38.67114,3.61607],[38.89251,3.50074],[39.559384,3.42206],[39.85494,3.83879],[40.76848,4.25702],[41.1718,3.91909],[41.855083,3.918912],[40.98105,2.78452],[40.993,-0.85829],[41.58513,-1.68325],[40.88477,-2.08255],[40.63785,-2.49979],[40.26304,-2.57309],[40.12119,-3.27768],[39.80006,-3.68116],[39.60489,-4.34653],[39.20222,-4.67677]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Sudan","SOV_A3":"SDN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Sudan","ADM0_A3":"SDN","GEOU_DIF":0,"GEOUNIT":"Sudan","GU_A3":"SDN","SU_DIF":0,"SUBUNIT":"Sudan","SU_A3":"SDN","BRK_DIFF":0,"NAME":"Sudan","NAME_LONG":"Sudan","BRK_A3":"SDN","BRK_NAME":"Sudan","BRK_GROUP":null,"ABBREV":"Sudan","POSTAL":"SD","FORMAL_EN":"Republic of the Sudan","FORMAL_FR":null,"NAME_CIAWF":"Sudan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Sudan","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":6,"MAPCOLOR9":4,"MAPCOLOR13":1,"POP_EST":42813238,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":30513,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"SU","ISO_A2":"SD","ISO_A2_EH":"SD","ISO_A3":"SDN","ISO_A3_EH":"SDN","ISO_N3":"729","ISO_N3_EH":"729","UN_A3":"729","WB_A2":"SD","WB_A3":"SDN","WOE_ID":-90,"WOE_ID_EH":23424952,"WOE_NOTE":"Almost all FLickr photos are in the north.","ADM0_ISO":"SDZ","ADM0_DIFF":null,"ADM0_TLC":"SDZ","ADM0_A3_US":"SDN","ADM0_A3_FR":"SDN","ADM0_A3_RU":"SDN","ADM0_A3_ES":"SDN","ADM0_A3_CN":"SDN","ADM0_A3_TW":"SDN","ADM0_A3_IN":"SDN","ADM0_A3_NP":"SDN","ADM0_A3_PK":"SDN","ADM0_A3_DE":"SDN","ADM0_A3_GB":"SDN","ADM0_A3_BR":"SDN","ADM0_A3_IL":"SDN","ADM0_A3_PS":"SDN","ADM0_A3_SA":"SDN","ADM0_A3_EG":"SDN","ADM0_A3_MA":"SDN","ADM0_A3_PT":"SDN","ADM0_A3_AR":"SDN","ADM0_A3_JP":"SDN","ADM0_A3_KO":"SDN","ADM0_A3_VN":"SDN","ADM0_A3_TR":"SDN","ADM0_A3_ID":"SDN","ADM0_A3_PL":"SDN","ADM0_A3_GR":"SDN","ADM0_A3_IT":"SDN","ADM0_A3_NL":"SDN","ADM0_A3_SE":"SDN","ADM0_A3_BD":"SDN","ADM0_A3_UA":"SDN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":8,"LABEL_X":29.260657,"LABEL_Y":16.330746,"NE_ID":1159321229,"WIKIDATAID":"Q1049","NAME_AR":"السودان","NAME_BN":"সুদান","NAME_DE":"Sudan","NAME_EN":"Sudan","NAME_ES":"Sudán","NAME_FA":"سودان","NAME_FR":"Soudan","NAME_EL":"Σουδάν","NAME_HE":"סודאן","NAME_HI":"सूडान","NAME_HU":"Szudán","NAME_ID":"Sudan","NAME_IT":"Sudan","NAME_JA":"スーダン","NAME_KO":"수단","NAME_NL":"Soedan","NAME_PL":"Sudan","NAME_PT":"Sudão","NAME_RU":"Судан","NAME_SV":"Sudan","NAME_TR":"Sudan","NAME_UK":"Судан","NAME_UR":"سوڈان","NAME_VI":"Sudan","NAME_ZH":"苏丹","NAME_ZHT":"蘇丹","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[21.93681,8.229188,38.41009,22],"geometry":{"type":"Polygon","coordinates":[[[24.567369,8.229188],[23.805813,8.666319],[23.459013,8.954286],[23.394779,9.265068],[23.55725,9.681218],[23.554304,10.089255],[22.977544,10.714463],[22.864165,11.142395],[22.87622,11.38461],[22.50869,11.67936],[22.49762,12.26024],[22.28801,12.64605],[21.93681,12.58818],[22.03759,12.95546],[22.29658,13.37232],[22.18329,13.78648],[22.51202,14.09318],[22.30351,14.32682],[22.56795,14.94429],[23.02459,15.68072],[23.88689,15.61084],[23.83766,19.58047],[23.85,20],[25,20.00304],[25,22],[29.02,22],[32.9,22],[36.86623,22],[37.18872,21.01885],[36.96941,20.83744],[37.1147,19.80796],[37.48179,18.61409],[37.86276,18.36786],[38.41009,17.998307],[37.904,17.42754],[37.16747,17.26314],[36.85253,16.95655],[36.75389,16.29186],[36.32322,14.82249],[36.42951,14.42211],[36.27022,13.56333],[35.86363,12.57828],[35.26049,12.08286],[34.83163,11.31896],[34.73115,10.91017],[34.25745,10.63009],[33.96162,9.58358],[33.97498,8.68456],[33.963393,9.464285],[33.824963,9.484061],[33.842131,9.981915],[33.721959,10.325262],[33.206938,10.720112],[33.086766,11.441141],[33.206938,12.179338],[32.743419,12.248008],[32.67475,12.024832],[32.073892,11.97333],[32.314235,11.681484],[32.400072,11.080626],[31.850716,10.531271],[31.352862,9.810241],[30.837841,9.707237],[29.996639,10.290927],[29.618957,10.084919],[29.515953,9.793074],[29.000932,9.604232],[28.966597,9.398224],[27.97089,9.398224],[27.833551,9.604232],[27.112521,9.638567],[26.752006,9.466893],[26.477328,9.55273],[25.962307,10.136421],[25.790633,10.411099],[25.069604,10.27376],[24.794926,9.810241],[24.537415,8.917538],[24.194068,8.728696],[23.88698,8.61973],[24.567369,8.229188]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Chad","SOV_A3":"TCD","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Chad","ADM0_A3":"TCD","GEOU_DIF":0,"GEOUNIT":"Chad","GU_A3":"TCD","SU_DIF":0,"SUBUNIT":"Chad","SU_A3":"TCD","BRK_DIFF":0,"NAME":"Chad","NAME_LONG":"Chad","BRK_A3":"TCD","BRK_NAME":"Chad","BRK_GROUP":null,"ABBREV":"Chad","POSTAL":"TD","FORMAL_EN":"Republic of Chad","FORMAL_FR":null,"NAME_CIAWF":"Chad","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Chad","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":1,"MAPCOLOR9":8,"MAPCOLOR13":6,"POP_EST":15946876,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":11314,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"CD","ISO_A2":"TD","ISO_A2_EH":"TD","ISO_A3":"TCD","ISO_A3_EH":"TCD","ISO_N3":"148","ISO_N3_EH":"148","UN_A3":"148","WB_A2":"TD","WB_A3":"TCD","WOE_ID":23424777,"WOE_ID_EH":23424777,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TCD","ADM0_DIFF":null,"ADM0_TLC":"TCD","ADM0_A3_US":"TCD","ADM0_A3_FR":"TCD","ADM0_A3_RU":"TCD","ADM0_A3_ES":"TCD","ADM0_A3_CN":"TCD","ADM0_A3_TW":"TCD","ADM0_A3_IN":"TCD","ADM0_A3_NP":"TCD","ADM0_A3_PK":"TCD","ADM0_A3_DE":"TCD","ADM0_A3_GB":"TCD","ADM0_A3_BR":"TCD","ADM0_A3_IL":"TCD","ADM0_A3_PS":"TCD","ADM0_A3_SA":"TCD","ADM0_A3_EG":"TCD","ADM0_A3_MA":"TCD","ADM0_A3_PT":"TCD","ADM0_A3_AR":"TCD","ADM0_A3_JP":"TCD","ADM0_A3_KO":"TCD","ADM0_A3_VN":"TCD","ADM0_A3_TR":"TCD","ADM0_A3_ID":"TCD","ADM0_A3_PL":"TCD","ADM0_A3_GR":"TCD","ADM0_A3_IT":"TCD","ADM0_A3_NL":"TCD","ADM0_A3_SE":"TCD","ADM0_A3_BD":"TCD","ADM0_A3_UA":"TCD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":18.645041,"LABEL_Y":15.142959,"NE_ID":1159321301,"WIKIDATAID":"Q657","NAME_AR":"تشاد","NAME_BN":"চাদ","NAME_DE":"Tschad","NAME_EN":"Chad","NAME_ES":"Chad","NAME_FA":"چاد","NAME_FR":"Tchad","NAME_EL":"Τσαντ","NAME_HE":"צ'אד","NAME_HI":"चाड","NAME_HU":"Csád","NAME_ID":"Chad","NAME_IT":"Ciad","NAME_JA":"チャド","NAME_KO":"차드","NAME_NL":"Tsjaad","NAME_PL":"Czad","NAME_PT":"Chade","NAME_RU":"Чад","NAME_SV":"Tchad","NAME_TR":"Çad","NAME_UK":"Чад","NAME_UR":"چاڈ","NAME_VI":"Tchad","NAME_ZH":"乍得","NAME_ZHT":"查德","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[13.540394,7.421925,23.88689,23.40972],"geometry":{"type":"Polygon","coordinates":[[[23.83766,19.58047],[23.88689,15.61084],[23.02459,15.68072],[22.56795,14.94429],[22.30351,14.32682],[22.51202,14.09318],[22.18329,13.78648],[22.29658,13.37232],[22.03759,12.95546],[21.93681,12.58818],[22.28801,12.64605],[22.49762,12.26024],[22.50869,11.67936],[22.87622,11.38461],[22.864165,11.142395],[22.231129,10.971889],[21.723822,10.567056],[21.000868,9.475985],[20.059685,9.012706],[19.094008,9.074847],[18.81201,8.982915],[18.911022,8.630895],[18.389555,8.281304],[17.96493,7.890914],[16.705988,7.508328],[16.456185,7.734774],[16.290562,7.754307],[16.106232,7.497088],[15.27946,7.421925],[15.436092,7.692812],[15.120866,8.38215],[14.979996,8.796104],[14.544467,8.965861],[13.954218,9.549495],[14.171466,10.021378],[14.627201,9.920919],[14.909354,9.992129],[15.467873,9.982337],[14.923565,10.891325],[14.960152,11.555574],[14.89336,12.21905],[14.495787,12.859396],[14.595781,13.330427],[13.954477,13.353449],[13.956699,13.996691],[13.540394,14.367134],[13.97217,15.68437],[15.247731,16.627306],[15.300441,17.92795],[15.685741,19.95718],[15.903247,20.387619],[15.487148,20.730415],[15.47106,21.04845],[15.096888,21.308519],[14.8513,22.86295],[15.86085,23.40972],[19.84926,21.49509],[23.83766,19.58047]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Haiti","SOV_A3":"HTI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Haiti","ADM0_A3":"HTI","GEOU_DIF":0,"GEOUNIT":"Haiti","GU_A3":"HTI","SU_DIF":0,"SUBUNIT":"Haiti","SU_A3":"HTI","BRK_DIFF":0,"NAME":"Haiti","NAME_LONG":"Haiti","BRK_A3":"HTI","BRK_NAME":"Haiti","BRK_GROUP":null,"ABBREV":"Haiti","POSTAL":"HT","FORMAL_EN":"Republic of Haiti","FORMAL_FR":null,"NAME_CIAWF":"Haiti","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Haiti","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":7,"MAPCOLOR13":2,"POP_EST":11263077,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":14332,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"HA","ISO_A2":"HT","ISO_A2_EH":"HT","ISO_A3":"HTI","ISO_A3_EH":"HTI","ISO_N3":"332","ISO_N3_EH":"332","UN_A3":"332","WB_A2":"HT","WB_A3":"HTI","WOE_ID":23424839,"WOE_ID_EH":23424839,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"HTI","ADM0_DIFF":null,"ADM0_TLC":"HTI","ADM0_A3_US":"HTI","ADM0_A3_FR":"HTI","ADM0_A3_RU":"HTI","ADM0_A3_ES":"HTI","ADM0_A3_CN":"HTI","ADM0_A3_TW":"HTI","ADM0_A3_IN":"HTI","ADM0_A3_NP":"HTI","ADM0_A3_PK":"HTI","ADM0_A3_DE":"HTI","ADM0_A3_GB":"HTI","ADM0_A3_BR":"HTI","ADM0_A3_IL":"HTI","ADM0_A3_PS":"HTI","ADM0_A3_SA":"HTI","ADM0_A3_EG":"HTI","ADM0_A3_MA":"HTI","ADM0_A3_PT":"HTI","ADM0_A3_AR":"HTI","ADM0_A3_JP":"HTI","ADM0_A3_KO":"HTI","ADM0_A3_VN":"HTI","ADM0_A3_TR":"HTI","ADM0_A3_ID":"HTI","ADM0_A3_PL":"HTI","ADM0_A3_GR":"HTI","ADM0_A3_IT":"HTI","ADM0_A3_NL":"HTI","ADM0_A3_SE":"HTI","ADM0_A3_BD":"HTI","ADM0_A3_UA":"HTI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-72.224051,"LABEL_Y":19.263784,"NE_ID":1159320839,"WIKIDATAID":"Q790","NAME_AR":"هايتي","NAME_BN":"হাইতি","NAME_DE":"Haiti","NAME_EN":"Haiti","NAME_ES":"Haití","NAME_FA":"هائیتی","NAME_FR":"Haïti","NAME_EL":"Αϊτή","NAME_HE":"האיטי","NAME_HI":"हैती","NAME_HU":"Haiti","NAME_ID":"Haiti","NAME_IT":"Haiti","NAME_JA":"ハイチ","NAME_KO":"아이티","NAME_NL":"Haïti","NAME_PL":"Haiti","NAME_PT":"Haiti","NAME_RU":"Республика Гаити","NAME_SV":"Haiti","NAME_TR":"Haiti","NAME_UK":"Гаїті","NAME_UR":"ہیٹی","NAME_VI":"Haiti","NAME_ZH":"海地","NAME_ZHT":"海地","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-74.458034,18.030993,-71.624873,19.915684],"geometry":{"type":"Polygon","coordinates":[[[-71.712361,19.714456],[-71.624873,19.169838],[-71.701303,18.785417],[-71.945112,18.6169],[-71.687738,18.31666],[-71.708305,18.044997],[-72.372476,18.214961],[-72.844411,18.145611],[-73.454555,18.217906],[-73.922433,18.030993],[-74.458034,18.34255],[-74.369925,18.664908],[-73.449542,18.526053],[-72.694937,18.445799],[-72.334882,18.668422],[-72.79165,19.101625],[-72.784105,19.483591],[-73.415022,19.639551],[-73.189791,19.915684],[-72.579673,19.871501],[-71.712361,19.714456]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Dominican Republic","SOV_A3":"DOM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Dominican Republic","ADM0_A3":"DOM","GEOU_DIF":0,"GEOUNIT":"Dominican Republic","GU_A3":"DOM","SU_DIF":0,"SUBUNIT":"Dominican Republic","SU_A3":"DOM","BRK_DIFF":0,"NAME":"Dominican Rep.","NAME_LONG":"Dominican Republic","BRK_A3":"DOM","BRK_NAME":"Dominican Rep.","BRK_GROUP":null,"ABBREV":"Dom. Rep.","POSTAL":"DO","FORMAL_EN":"Dominican Republic","FORMAL_FR":null,"NAME_CIAWF":"Dominican Republic","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Dominican Republic","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":7,"POP_EST":10738958,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":88941,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"DR","ISO_A2":"DO","ISO_A2_EH":"DO","ISO_A3":"DOM","ISO_A3_EH":"DOM","ISO_N3":"214","ISO_N3_EH":"214","UN_A3":"214","WB_A2":"DO","WB_A3":"DOM","WOE_ID":23424800,"WOE_ID_EH":23424800,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"DOM","ADM0_DIFF":null,"ADM0_TLC":"DOM","ADM0_A3_US":"DOM","ADM0_A3_FR":"DOM","ADM0_A3_RU":"DOM","ADM0_A3_ES":"DOM","ADM0_A3_CN":"DOM","ADM0_A3_TW":"DOM","ADM0_A3_IN":"DOM","ADM0_A3_NP":"DOM","ADM0_A3_PK":"DOM","ADM0_A3_DE":"DOM","ADM0_A3_GB":"DOM","ADM0_A3_BR":"DOM","ADM0_A3_IL":"DOM","ADM0_A3_PS":"DOM","ADM0_A3_SA":"DOM","ADM0_A3_EG":"DOM","ADM0_A3_MA":"DOM","ADM0_A3_PT":"DOM","ADM0_A3_AR":"DOM","ADM0_A3_JP":"DOM","ADM0_A3_KO":"DOM","ADM0_A3_VN":"DOM","ADM0_A3_TR":"DOM","ADM0_A3_ID":"DOM","ADM0_A3_PL":"DOM","ADM0_A3_GR":"DOM","ADM0_A3_IT":"DOM","ADM0_A3_NL":"DOM","ADM0_A3_SE":"DOM","ADM0_A3_BD":"DOM","ADM0_A3_UA":"DOM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":14,"LONG_LEN":18,"ABBREV_LEN":9,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5,"LABEL_X":-70.653998,"LABEL_Y":19.104137,"NE_ID":1159320563,"WIKIDATAID":"Q786","NAME_AR":"جمهورية الدومينيكان","NAME_BN":"ডোমিনিকান প্রজাতন্ত্র","NAME_DE":"Dominikanische Republik","NAME_EN":"Dominican Republic","NAME_ES":"República Dominicana","NAME_FA":"جمهوری دومینیکن","NAME_FR":"République dominicaine","NAME_EL":"Δομινικανή Δημοκρατία","NAME_HE":"הרפובליקה הדומיניקנית","NAME_HI":"डोमिनिकन गणराज्य","NAME_HU":"Dominikai Köztársaság","NAME_ID":"Republik Dominika","NAME_IT":"Repubblica Dominicana","NAME_JA":"ドミニカ共和国","NAME_KO":"도미니카 공화국","NAME_NL":"Dominicaanse Republiek","NAME_PL":"Dominikana","NAME_PT":"República Dominicana","NAME_RU":"Доминиканская Республика","NAME_SV":"Dominikanska republiken","NAME_TR":"Dominik Cumhuriyeti","NAME_UK":"Домініканська Республіка","NAME_UR":"جمہوریہ ڈومینیکن","NAME_VI":"Cộng hòa Dominica","NAME_ZH":"多米尼加","NAME_ZHT":"多明尼加","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-71.945112,17.598564,-68.317943,19.884911],"geometry":{"type":"Polygon","coordinates":[[[-71.708305,18.044997],[-71.687738,18.31666],[-71.945112,18.6169],[-71.701303,18.785417],[-71.624873,19.169838],[-71.712361,19.714456],[-71.587304,19.884911],[-70.806706,19.880286],[-70.214365,19.622885],[-69.950815,19.648],[-69.76925,19.293267],[-69.222126,19.313214],[-69.254346,19.015196],[-68.809412,18.979074],[-68.317943,18.612198],[-68.689316,18.205142],[-69.164946,18.422648],[-69.623988,18.380713],[-69.952934,18.428307],[-70.133233,18.245915],[-70.517137,18.184291],[-70.669298,18.426886],[-70.99995,18.283329],[-71.40021,17.598564],[-71.657662,17.757573],[-71.708305,18.044997]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Russia","SOV_A3":"RUS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Russia","ADM0_A3":"RUS","GEOU_DIF":0,"GEOUNIT":"Russia","GU_A3":"RUS","SU_DIF":0,"SUBUNIT":"Russia","SU_A3":"RUS","BRK_DIFF":0,"NAME":"Russia","NAME_LONG":"Russian Federation","BRK_A3":"RUS","BRK_NAME":"Russia","BRK_GROUP":null,"ABBREV":"Rus.","POSTAL":"RUS","FORMAL_EN":"Russian Federation","FORMAL_FR":null,"NAME_CIAWF":"Russia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Russian Federation","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":5,"MAPCOLOR9":7,"MAPCOLOR13":7,"POP_EST":144373535,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":1699876,"GDP_YEAR":2019,"ECONOMY":"3. Emerging region: BRIC","INCOME_GRP":"3. Upper middle income","FIPS_10":"RS","ISO_A2":"RU","ISO_A2_EH":"RU","ISO_A3":"RUS","ISO_A3_EH":"RUS","ISO_N3":"643","ISO_N3_EH":"643","UN_A3":"643","WB_A2":"RU","WB_A3":"RUS","WOE_ID":23424936,"WOE_ID_EH":23424936,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"RUS","ADM0_DIFF":null,"ADM0_TLC":"RUS","ADM0_A3_US":"RUS","ADM0_A3_FR":"RUS","ADM0_A3_RU":"RUS","ADM0_A3_ES":"RUS","ADM0_A3_CN":"RUS","ADM0_A3_TW":"RUS","ADM0_A3_IN":"RUS","ADM0_A3_NP":"RUS","ADM0_A3_PK":"RUS","ADM0_A3_DE":"RUS","ADM0_A3_GB":"RUS","ADM0_A3_BR":"RUS","ADM0_A3_IL":"RUS","ADM0_A3_PS":"RUS","ADM0_A3_SA":"RUS","ADM0_A3_EG":"RUS","ADM0_A3_MA":"RUS","ADM0_A3_PT":"RUS","ADM0_A3_AR":"RUS","ADM0_A3_JP":"RUS","ADM0_A3_KO":"RUS","ADM0_A3_VN":"RUS","ADM0_A3_TR":"RUS","ADM0_A3_ID":"RUS","ADM0_A3_PL":"RUS","ADM0_A3_GR":"RUS","ADM0_A3_IT":"RUS","ADM0_A3_NL":"RUS","ADM0_A3_SE":"RUS","ADM0_A3_BD":"RUS","ADM0_A3_UA":"RUS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":18,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.2,"LABEL_X":44.686469,"LABEL_Y":58.249357,"NE_ID":1159321201,"WIKIDATAID":"Q159","NAME_AR":"روسيا","NAME_BN":"রাশিয়া","NAME_DE":"Russland","NAME_EN":"Russia","NAME_ES":"Rusia","NAME_FA":"روسیه","NAME_FR":"Russie","NAME_EL":"Ρωσία","NAME_HE":"רוסיה","NAME_HI":"रूस","NAME_HU":"Oroszország","NAME_ID":"Rusia","NAME_IT":"Russia","NAME_JA":"ロシア","NAME_KO":"러시아","NAME_NL":"Rusland","NAME_PL":"Rosja","NAME_PT":"Rússia","NAME_RU":"Россия","NAME_SV":"Ryssland","NAME_TR":"Rusya","NAME_UK":"Росія","NAME_UR":"روس","NAME_VI":"Nga","NAME_ZH":"俄罗斯","NAME_ZHT":"俄羅斯","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-180,41.151416,180,81.2504],"geometry":{"type":"MultiPolygon","coordinates":[[[[178.7253,71.0988],[180,71.515714],[180,70.832199],[178.903425,70.78114],[178.7253,71.0988]]],[[[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[48.584353,41.808869],[47.987283,41.405819],[47.815666,41.151416],[47.373315,41.219732],[46.686071,41.827137],[46.404951,41.860675],[45.7764,42.09244],[45.470279,42.502781],[44.537623,42.711993],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.076965,43.553104],[39.955009,43.434998],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.223538,47.10219],[38.255112,47.5464],[38.77057,47.82562],[39.738278,47.898937],[39.89562,48.23241],[39.67465,48.78382],[40.080789,49.30743],[40.06904,49.60105],[38.594988,49.926462],[38.010631,49.915662],[37.39346,50.383953],[36.626168,50.225591],[35.356116,50.577197],[35.37791,50.77394],[35.022183,51.207572],[34.224816,51.255993],[34.141978,51.566413],[34.391731,51.768882],[33.7527,52.335075],[32.715761,52.238465],[32.412058,52.288695],[32.15944,52.06125],[31.785992,52.101678],[31.78597,52.10168],[31.540018,52.742052],[31.305201,53.073996],[31.49764,53.16743],[32.304519,53.132726],[32.693643,53.351421],[32.405599,53.618045],[31.731273,53.794029],[31.791424,53.974639],[31.384472,54.157056],[30.757534,54.811771],[30.971836,55.081548],[30.873909,55.550976],[29.896294,55.789463],[29.371572,55.670091],[29.229513,55.918344],[28.176709,56.16913],[27.855282,56.759326],[27.770016,57.244258],[27.288185,57.474528],[27.716686,57.791899],[27.42015,58.72457],[28.131699,59.300825],[27.98112,59.47537],[27.981127,59.475373],[29.1177,60.02805],[28.070002,60.503519],[28.07,60.50352],[30.211107,61.780028],[31.139991,62.357693],[31.516092,62.867687],[30.035872,63.552814],[30.444685,64.204453],[29.54443,64.948672],[30.21765,65.80598],[29.054589,66.944286],[29.977426,67.698297],[28.445944,68.364613],[28.59193,69.064777],[29.39955,69.15692],[31.101042,69.558101],[31.10108,69.55811],[32.13272,69.90595],[33.77547,69.30142],[36.51396,69.06342],[40.29234,67.9324],[41.05987,67.45713],[41.12595,66.79158],[40.01583,66.26618],[38.38295,65.99953],[33.91871,66.75961],[33.18444,66.63253],[34.81477,65.90015],[34.878574,65.436213],[34.94391,64.41437],[36.23129,64.10945],[37.01273,63.84983],[37.14197,64.33471],[36.539579,64.76446],[37.17604,65.14322],[39.59345,64.52079],[40.4356,64.76446],[39.7626,65.49682],[42.09309,66.47623],[43.01604,66.41858],[43.94975,66.06908],[44.53226,66.75634],[43.69839,67.35245],[44.18795,67.95051],[43.45282,68.57079],[46.25,68.25],[46.82134,67.68997],[45.55517,67.56652],[45.56202,67.01005],[46.34915,66.66767],[47.89416,66.88455],[48.13876,67.52238],[50.22766,67.99867],[53.71743,68.85738],[54.47171,68.80815],[53.48582,68.20131],[54.72628,68.09702],[55.44268,68.43866],[57.31702,68.46628],[58.802,68.88082],[59.94142,68.27844],[61.07784,68.94069],[60.03,69.52],[60.55,69.85],[63.504,69.54739],[64.888115,69.234835],[68.51216,68.09233],[69.18068,68.61563],[68.16444,69.14436],[68.13522,69.35649],[66.93008,69.45461],[67.25976,69.92873],[66.72492,70.70889],[66.69466,71.02897],[68.54006,71.9345],[69.19636,72.84336],[69.94,73.04],[72.58754,72.77629],[72.79603,72.22006],[71.84811,71.40898],[72.47011,71.09019],[72.79188,70.39114],[72.5647,69.02085],[73.66787,68.4079],[73.2387,67.7404],[71.28,66.32],[72.42301,66.17267],[72.82077,66.53267],[73.92099,66.78946],[74.18651,67.28429],[75.052,67.76047],[74.46926,68.32899],[74.93584,68.98918],[73.84236,69.07146],[73.60187,69.62763],[74.3998,70.63175],[73.1011,71.44717],[74.89082,72.12119],[74.65926,72.83227],[75.15801,72.85497],[75.68351,72.30056],[75.28898,71.33556],[76.35911,71.15287],[75.90313,71.87401],[77.57665,72.26717],[79.65202,72.32011],[81.5,71.75],[80.61071,72.58285],[80.51109,73.6482],[82.25,73.85],[84.65526,73.80591],[86.8223,73.93688],[86.00956,74.45967],[87.16682,75.11643],[88.31571,75.14393],[90.26,75.64],[92.90058,75.77333],[93.23421,76.0472],[95.86,76.14],[96.67821,75.91548],[98.92254,76.44689],[100.75967,76.43028],[101.03532,76.86189],[101.99084,77.28754],[104.3516,77.69792],[106.06664,77.37389],[104.705,77.1274],[106.97013,76.97419],[107.24,76.48],[108.1538,76.72335],[111.07726,76.71],[113.33151,76.22224],[114.13417,75.84764],[113.88539,75.32779],[112.77918,75.03186],[110.15125,74.47673],[109.4,74.18],[110.64,74.04],[112.11919,73.78774],[113.01954,73.97693],[113.52958,73.33505],[113.96881,73.59488],[115.56782,73.75285],[118.77633,73.58772],[119.02,73.12],[123.20066,72.97122],[123.25777,73.73503],[125.38,73.56],[126.97644,73.56549],[128.59126,73.03871],[129.05157,72.39872],[128.46,71.98],[129.71599,71.19304],[131.28858,70.78699],[132.2535,71.8363],[133.85766,71.38642],[135.56193,71.65525],[137.49755,71.34763],[138.23409,71.62803],[139.86983,71.48783],[139.14791,72.41619],[140.46817,72.84941],[149.5,72.2],[150.35118,71.60643],[152.9689,70.84222],[157.00688,71.03141],[158.99779,70.86672],[159.83031,70.45324],[159.70866,69.72198],[160.94053,69.43728],[162.27907,69.64204],[164.05248,69.66823],[165.94037,69.47199],[167.83567,69.58269],[169.57763,68.6938],[170.81688,69.01363],[170.0082,69.65276],[170.45345,70.09703],[173.64391,69.81743],[175.72403,69.87725],[178.6,69.4],[180,68.963636],[180,64.979709],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.780005,42.22001],[130.780004,42.220008],[130.78,42.22],[130.779992,42.22001],[130.64,42.395],[130.64,42.395024],[130.633866,42.903015],[131.144688,42.92999],[131.288555,44.11152],[131.02519,44.96796],[131.883454,45.321162],[133.09712,45.14409],[133.769644,46.116927],[134.11235,47.21248],[134.50081,47.57845],[135.026311,48.47823],[133.373596,48.183442],[132.50669,47.78896],[130.98726,47.79013],[130.582293,48.729687],[129.397818,49.4406],[127.6574,49.76027],[127.287456,50.739797],[126.939157,51.353894],[126.564399,51.784255],[125.946349,52.792799],[125.068211,53.161045],[123.57147,53.4588],[122.245748,53.431726],[121.003085,53.251401],[120.177089,52.753886],[120.725789,52.516226],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.288461,50.142883],[117.879244,49.510983],[116.678801,49.888531],[115.485695,49.805177],[114.96211,50.140247],[114.362456,50.248303],[112.89774,49.543565],[111.581231,49.377968],[110.662011,49.130128],[109.402449,49.292961],[108.475167,49.282548],[107.868176,49.793705],[106.888804,50.274296],[105.886591,50.406019],[104.62158,50.27532],[103.676545,50.089966],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.516856],[99.981732,51.634006],[98.861491,52.047366],[97.82574,51.010995],[98.231762,50.422401],[97.25976,49.72605],[95.81402,49.97746],[94.815949,50.013433],[94.147566,50.480537],[93.10421,50.49529],[92.234712,50.802171],[90.713667,50.331812],[88.805567,49.470521],[87.751264,49.297198],[87.35997,49.214981],[86.829357,49.826675],[85.54127,49.692859],[85.11556,50.117303],[84.416377,50.3114],[83.935115,50.889246],[83.383004,51.069183],[81.945986,50.812196],[80.568447,51.388336],[80.03556,50.864751],[77.800916,53.404415],[76.525179,54.177003],[76.8911,54.490524],[74.38482,53.54685],[73.425679,53.48981],[73.508516,54.035617],[72.22415,54.376655],[71.180131,54.133285],[70.865267,55.169734],[69.068167,55.38525],[68.1691,54.970392],[65.66687,54.60125],[65.178534,54.354228],[61.4366,54.00625],[60.978066,53.664993],[61.699986,52.979996],[60.739993,52.719986],[60.927269,52.447548],[59.967534,51.96042],[61.588003,51.272659],[61.337424,50.79907],[59.932807,50.842194],[59.642282,50.545442],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.532878,51.02624],[52.328724,51.718652],[50.766648,51.692762],[48.702382,50.605128],[48.577841,49.87476],[47.54948,50.454698],[46.751596,49.356006],[47.043672,49.152039],[46.466446,48.394152],[47.31524,47.71585],[48.05725,47.74377],[48.694734,47.075628],[48.59325,46.56104],[49.10116,46.39933]]],[[[93.77766,81.0246],[95.940895,81.2504],[97.88385,80.746975],[100.186655,79.780135],[99.93976,78.88094],[97.75794,78.7562],[94.97259,79.044745],[93.31288,79.4265],[92.5454,80.14379],[91.18107,80.34146],[93.77766,81.0246]]],[[[102.837815,79.28129],[105.37243,78.71334],[105.07547,78.30689],[99.43814,77.921],[101.2649,79.23399],[102.08635,79.34641],[102.837815,79.28129]]],[[[138.831075,76.13676],[141.471615,76.09289],[145.086285,75.562625],[144.3,74.82],[140.61381,74.84768],[138.95544,74.61148],[136.97439,75.26167],[137.51176,75.94917],[138.831075,76.13676]]],[[[148.22223,75.345845],[150.73167,75.08406],[149.575925,74.68892],[147.977465,74.778355],[146.11919,75.17298],[146.358485,75.49682],[148.22223,75.345845]]],[[[139.86312,73.36983],[140.81171,73.76506],[142.06207,73.85758],[143.48283,73.47525],[143.60385,73.21244],[142.08763,73.20544],[140.038155,73.31692],[139.86312,73.36983]]],[[[44.846958,80.58981],[46.799139,80.771918],[48.318477,80.78401],[48.522806,80.514569],[49.09719,80.753986],[50.039768,80.918885],[51.522933,80.699726],[51.136187,80.54728],[49.793685,80.415428],[48.894411,80.339567],[48.754937,80.175468],[47.586119,80.010181],[46.502826,80.247247],[47.072455,80.559424],[44.846958,80.58981]]],[[[22.731099,54.327537],[20.892245,54.312525],[19.66064,54.426084],[19.888481,54.86616],[21.268449,55.190482],[22.315724,55.015299],[22.757764,54.856574],[22.651052,54.582741],[22.731099,54.327537]]],[[[53.50829,73.749814],[55.902459,74.627486],[55.631933,75.081412],[57.868644,75.60939],[61.170044,76.251883],[64.498368,76.439055],[66.210977,76.809782],[68.15706,76.939697],[68.852211,76.544811],[68.180573,76.233642],[64.637326,75.737755],[61.583508,75.260885],[58.477082,74.309056],[56.986786,73.333044],[55.419336,72.371268],[55.622838,71.540595],[57.535693,70.720464],[56.944979,70.632743],[53.677375,70.762658],[53.412017,71.206662],[51.601895,71.474759],[51.455754,72.014881],[52.478275,72.229442],[52.444169,72.774731],[54.427614,73.627548],[53.50829,73.749814]]],[[[142.914616,53.704578],[143.260848,52.74076],[143.235268,51.75666],[143.648007,50.7476],[144.654148,48.976391],[143.173928,49.306551],[142.558668,47.861575],[143.533492,46.836728],[143.505277,46.137908],[142.747701,46.740765],[142.09203,45.966755],[141.906925,46.805929],[142.018443,47.780133],[141.904445,48.859189],[142.1358,49.615163],[142.179983,50.952342],[141.594076,51.935435],[141.682546,53.301966],[142.606934,53.762145],[142.209749,54.225476],[142.654786,54.365881],[142.914616,53.704578]]],[[[-174.92825,67.20589],[-175.01425,66.58435],[-174.33983,66.33556],[-174.57182,67.06219],[-171.85731,66.91308],[-169.89958,65.97724],[-170.89107,65.54139],[-172.53025,65.43791],[-172.555,64.46079],[-172.95533,64.25269],[-173.89184,64.2826],[-174.65392,64.63125],[-175.98353,64.92288],[-176.20716,65.35667],[-177.22266,65.52024],[-178.35993,65.39052],[-178.90332,65.74044],[-178.68611,66.11211],[-179.88377,65.87456],[-179.43268,65.40411],[-180,64.979709],[-180,68.963636],[-177.55,68.2],[-174.92825,67.20589]]],[[[-178.69378,70.89302],[-180,70.832199],[-180,71.515714],[-179.871875,71.55762],[-179.02433,71.55553],[-177.577945,71.26948],[-177.663575,71.13277],[-178.69378,70.89302]]],[[[33.435988,45.971917],[33.699462,46.219573],[34.410402,46.005162],[34.732017,45.965666],[34.861792,45.768182],[35.012659,45.737725],[35.020788,45.651219],[35.510009,45.409993],[36.529998,45.46999],[36.334713,45.113216],[35.239999,44.939996],[33.882511,44.361479],[33.326421,44.564877],[33.546924,45.034771],[32.454174,45.327466],[32.630804,45.519186],[33.588162,45.851569],[33.435988,45.971917]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"The Bahamas","SOV_A3":"BHS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"The Bahamas","ADM0_A3":"BHS","GEOU_DIF":0,"GEOUNIT":"The Bahamas","GU_A3":"BHS","SU_DIF":0,"SUBUNIT":"The Bahamas","SU_A3":"BHS","BRK_DIFF":0,"NAME":"Bahamas","NAME_LONG":"Bahamas","BRK_A3":"BHS","BRK_NAME":"Bahamas","BRK_GROUP":null,"ABBREV":"Bhs.","POSTAL":"BS","FORMAL_EN":"Commonwealth of the Bahamas","FORMAL_FR":null,"NAME_CIAWF":"Bahamas, The","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bahamas, The","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":389482,"POP_RANK":10,"POP_YEAR":2019,"GDP_MD":13578,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"BF","ISO_A2":"BS","ISO_A2_EH":"BS","ISO_A3":"BHS","ISO_A3_EH":"BHS","ISO_N3":"044","ISO_N3_EH":"044","UN_A3":"044","WB_A2":"BS","WB_A3":"BHS","WOE_ID":23424758,"WOE_ID_EH":23424758,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BHS","ADM0_DIFF":null,"ADM0_TLC":"BHS","ADM0_A3_US":"BHS","ADM0_A3_FR":"BHS","ADM0_A3_RU":"BHS","ADM0_A3_ES":"BHS","ADM0_A3_CN":"BHS","ADM0_A3_TW":"BHS","ADM0_A3_IN":"BHS","ADM0_A3_NP":"BHS","ADM0_A3_PK":"BHS","ADM0_A3_DE":"BHS","ADM0_A3_GB":"BHS","ADM0_A3_BR":"BHS","ADM0_A3_IL":"BHS","ADM0_A3_PS":"BHS","ADM0_A3_SA":"BHS","ADM0_A3_EG":"BHS","ADM0_A3_MA":"BHS","ADM0_A3_PT":"BHS","ADM0_A3_AR":"BHS","ADM0_A3_JP":"BHS","ADM0_A3_KO":"BHS","ADM0_A3_VN":"BHS","ADM0_A3_TR":"BHS","ADM0_A3_ID":"BHS","ADM0_A3_PL":"BHS","ADM0_A3_GR":"BHS","ADM0_A3_IT":"BHS","ADM0_A3_NL":"BHS","ADM0_A3_SE":"BHS","ADM0_A3_BD":"BHS","ADM0_A3_UA":"BHS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-77.146688,"LABEL_Y":26.401789,"NE_ID":1159320415,"WIKIDATAID":"Q778","NAME_AR":"باهاماس","NAME_BN":"বাহামা দ্বীপপুঞ্জ","NAME_DE":"Bahamas","NAME_EN":"The Bahamas","NAME_ES":"Bahamas","NAME_FA":"باهاما","NAME_FR":"Bahamas","NAME_EL":"Μπαχάμες","NAME_HE":"איי בהאמה","NAME_HI":"बहामास","NAME_HU":"Bahama-szigetek","NAME_ID":"Bahama","NAME_IT":"Bahamas","NAME_JA":"バハマ","NAME_KO":"바하마","NAME_NL":"Bahama's","NAME_PL":"Bahamy","NAME_PT":"Bahamas","NAME_RU":"Багамские Острова","NAME_SV":"Bahamas","NAME_TR":"Bahamalar","NAME_UK":"Багамські Острови","NAME_UR":"بہاماس","NAME_VI":"Bahamas","NAME_ZH":"巴哈马","NAME_ZHT":"巴哈馬","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-78.98,23.71,-77,27.04],"geometry":{"type":"MultiPolygon","coordinates":[[[[-78.98,26.79],[-78.51,26.87],[-77.85,26.84],[-77.82,26.58],[-78.91,26.42],[-78.98,26.79]]],[[[-77.79,27.04],[-77,26.59],[-77.17255,25.87918],[-77.35641,26.00735],[-77.34,26.53],[-77.78802,26.92516],[-77.79,27.04]]],[[[-78.19087,25.2103],[-77.89,25.17],[-77.54,24.34],[-77.53466,23.75975],[-77.78,23.71],[-78.03405,24.28615],[-78.40848,24.57564],[-78.19087,25.2103]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"United Kingdom","SOV_A3":"GB1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Disputed","TLC":"1","ADMIN":"Falkland Islands","ADM0_A3":"FLK","GEOU_DIF":0,"GEOUNIT":"Falkland Islands","GU_A3":"FLK","SU_DIF":0,"SUBUNIT":"Falkland Islands","SU_A3":"FLK","BRK_DIFF":1,"NAME":"Falkland Is.","NAME_LONG":"Falkland Islands / Malvinas","BRK_A3":"B12","BRK_NAME":"Falkland Is.","BRK_GROUP":null,"ABBREV":"Flk. Is.","POSTAL":"FK","FORMAL_EN":"Falkland Islands","FORMAL_FR":null,"NAME_CIAWF":"Falkland Islands (Islas Malvinas)","NOTE_ADM0":"U.K.","NOTE_BRK":"Admin. by U.K.; Claimed by Argentina","NAME_SORT":"Falkland Islands","NAME_ALT":"Islas Malvinas","MAPCOLOR7":6,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":3398,"POP_RANK":4,"POP_YEAR":2016,"GDP_MD":282,"GDP_YEAR":2012,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"FK","ISO_A2":"FK","ISO_A2_EH":"FK","ISO_A3":"FLK","ISO_A3_EH":"FLK","ISO_N3":"238","ISO_N3_EH":"238","UN_A3":"238","WB_A2":"-99","WB_A3":"-99","WOE_ID":23424814,"WOE_ID_EH":23424814,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"B12","ADM0_DIFF":null,"ADM0_TLC":"B12","ADM0_A3_US":"FLK","ADM0_A3_FR":"FLK","ADM0_A3_RU":"FLK","ADM0_A3_ES":"FLK","ADM0_A3_CN":"FLK","ADM0_A3_TW":"FLK","ADM0_A3_IN":"FLK","ADM0_A3_NP":"FLK","ADM0_A3_PK":"FLK","ADM0_A3_DE":"FLK","ADM0_A3_GB":"FLK","ADM0_A3_BR":"FLK","ADM0_A3_IL":"FLK","ADM0_A3_PS":"FLK","ADM0_A3_SA":"FLK","ADM0_A3_EG":"FLK","ADM0_A3_MA":"FLK","ADM0_A3_PT":"FLK","ADM0_A3_AR":"ARG","ADM0_A3_JP":"FLK","ADM0_A3_KO":"FLK","ADM0_A3_VN":"FLK","ADM0_A3_TR":"FLK","ADM0_A3_ID":"FLK","ADM0_A3_PL":"FLK","ADM0_A3_GR":"FLK","ADM0_A3_IT":"FLK","ADM0_A3_NL":"FLK","ADM0_A3_SE":"FLK","ADM0_A3_BD":"FLK","ADM0_A3_UA":"FLK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":12,"LONG_LEN":27,"ABBREV_LEN":8,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9,"LABEL_X":-58.738602,"LABEL_Y":-51.608913,"NE_ID":1159320711,"WIKIDATAID":"Q9648","NAME_AR":"جزر فوكلاند","NAME_BN":"ফকল্যান্ড দ্বীপপুঞ্জ","NAME_DE":"Falklandinseln","NAME_EN":"Falkland Islands","NAME_ES":"Islas Malvinas","NAME_FA":"جزایر فالکلند","NAME_FR":"îles Malouines","NAME_EL":"Νήσοι Φώκλαντ","NAME_HE":"איי פוקלנד","NAME_HI":"फ़ॉकलैंड द्वीपसमूह","NAME_HU":"Falkland-szigetek","NAME_ID":"Kepulauan Falkland","NAME_IT":"Isole Falkland","NAME_JA":"フォークランド諸島","NAME_KO":"포클랜드 제도","NAME_NL":"Falklandeilanden","NAME_PL":"Falklandy","NAME_PT":"Ilhas Malvinas","NAME_RU":"Фолклендские острова","NAME_SV":"Falklandsöarna","NAME_TR":"Falkland Adaları","NAME_UK":"Фолклендські острови","NAME_UR":"جزائر فاکلینڈ","NAME_VI":"Quần đảo Falkland","NAME_ZH":"福克兰群岛","NAME_ZHT":"福克蘭群島","FCLASS_ISO":"Admin-0 dependency","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 dependency","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":"Unrecognized","FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-61.2,-52.3,-57.75,-51.1],"geometry":{"type":"Polygon","coordinates":[[[-61.2,-51.85],[-60,-51.25],[-59.15,-51.5],[-58.55,-51.1],[-57.75,-51.55],[-58.05,-51.9],[-59.4,-52.2],[-59.85,-51.85],[-60.7,-52.3],[-61.2,-51.85]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Norway","SOV_A3":"NOR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":null,"ADMIN":"Norway","ADM0_A3":"NOR","GEOU_DIF":0,"GEOUNIT":"Norway","GU_A3":"NOR","SU_DIF":0,"SUBUNIT":"Norway","SU_A3":"NOR","BRK_DIFF":0,"NAME":"Norway","NAME_LONG":"Norway","BRK_A3":"NOR","BRK_NAME":"Norway","BRK_GROUP":null,"ABBREV":"Nor.","POSTAL":"N","FORMAL_EN":"Kingdom of Norway","FORMAL_FR":null,"NAME_CIAWF":"Norway","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Norway","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":8,"MAPCOLOR13":12,"POP_EST":5347896,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":403336,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"-99","ISO_A2":"-99","ISO_A2_EH":"NO","ISO_A3":"-99","ISO_A3_EH":"NOR","ISO_N3":"-99","ISO_N3_EH":"578","UN_A3":"-99","WB_A2":"-99","WB_A3":"-99","WOE_ID":-90,"WOE_ID_EH":23424910,"WOE_NOTE":"Does not include Svalbard, Jan Mayen, or Bouvet Islands (28289410).","ADM0_ISO":"NOR","ADM0_DIFF":null,"ADM0_TLC":"NOR","ADM0_A3_US":"NOR","ADM0_A3_FR":"NOR","ADM0_A3_RU":"NOR","ADM0_A3_ES":"NOR","ADM0_A3_CN":"NOR","ADM0_A3_TW":"NOR","ADM0_A3_IN":"NOR","ADM0_A3_NP":"NOR","ADM0_A3_PK":"NOR","ADM0_A3_DE":"NOR","ADM0_A3_GB":"NOR","ADM0_A3_BR":"NOR","ADM0_A3_IL":"NOR","ADM0_A3_PS":"NOR","ADM0_A3_SA":"NOR","ADM0_A3_EG":"NOR","ADM0_A3_MA":"NOR","ADM0_A3_PT":"NOR","ADM0_A3_AR":"NOR","ADM0_A3_JP":"NOR","ADM0_A3_KO":"NOR","ADM0_A3_VN":"NOR","ADM0_A3_TR":"NOR","ADM0_A3_ID":"NOR","ADM0_A3_PL":"NOR","ADM0_A3_GR":"NOR","ADM0_A3_IT":"NOR","ADM0_A3_NL":"NOR","ADM0_A3_SE":"NOR","ADM0_A3_BD":"NOR","ADM0_A3_UA":"NOR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7,"LABEL_X":9.679975,"LABEL_Y":61.357092,"NE_ID":1159321109,"WIKIDATAID":"Q20","NAME_AR":"النرويج","NAME_BN":"নরওয়ে","NAME_DE":"Norwegen","NAME_EN":"Norway","NAME_ES":"Noruega","NAME_FA":"نروژ","NAME_FR":"Norvège","NAME_EL":"Νορβηγία","NAME_HE":"נורווגיה","NAME_HI":"नॉर्वे","NAME_HU":"Norvégia","NAME_ID":"Norwegia","NAME_IT":"Norvegia","NAME_JA":"ノルウェー","NAME_KO":"노르웨이","NAME_NL":"Noorwegen","NAME_PL":"Norwegia","NAME_PT":"Noruega","NAME_RU":"Норвегия","NAME_SV":"Norge","NAME_TR":"Norveç","NAME_UK":"Норвегія","NAME_UR":"ناروے","NAME_VI":"Na Uy","NAME_ZH":"挪威","NAME_ZHT":"挪威","FCLASS_ISO":"Unrecognized","TLC_DIFF":null,"FCLASS_TLC":"Unrecognized","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[4.992078,58.078884,31.293418,80.657144],"geometry":{"type":"MultiPolygon","coordinates":[[[[15.14282,79.67431],[15.52255,80.01608],[16.99085,80.05086],[18.25183,79.70175],[21.54383,78.95611],[19.02737,78.5626],[18.47172,77.82669],[17.59441,77.63796],[17.1182,76.80941],[15.91315,76.77045],[13.76259,77.38035],[14.66956,77.73565],[13.1706,78.02493],[11.22231,78.8693],[10.44453,79.65239],[13.17077,80.01046],[13.71852,79.66039],[15.14282,79.67431]]],[[[31.101042,69.558101],[29.39955,69.15692],[28.59193,69.064777],[29.015573,69.766491],[27.732292,70.164193],[26.179622,69.825299],[25.689213,69.092114],[24.735679,68.649557],[23.66205,68.891247],[22.356238,68.841741],[21.244936,69.370443],[20.645593,69.106247],[20.025269,69.065139],[19.87856,68.407194],[17.993868,68.567391],[17.729182,68.010552],[16.768879,68.013937],[16.108712,67.302456],[15.108411,66.193867],[13.55569,64.787028],[13.919905,64.445421],[13.571916,64.049114],[12.579935,64.066219],[11.930569,63.128318],[11.992064,61.800362],[12.631147,61.293572],[12.300366,60.117933],[11.468272,59.432393],[11.027369,58.856149],[10.356557,59.469807],[8.382,58.313288],[7.048748,58.078884],[5.665835,58.588155],[5.308234,59.663232],[4.992078,61.970998],[5.9129,62.614473],[8.553411,63.454008],[10.527709,64.486038],[12.358347,65.879726],[14.761146,67.810642],[16.435927,68.563205],[19.184028,69.817444],[21.378416,70.255169],[23.023742,70.202072],[24.546543,71.030497],[26.37005,70.986262],[28.165547,71.185474],[31.293418,70.453788],[30.005435,70.186259],[31.101042,69.558101]]],[[[27.407506,80.056406],[25.924651,79.517834],[23.024466,79.400012],[20.075188,79.566823],[19.897266,79.842362],[18.462264,79.85988],[17.368015,80.318896],[20.455992,80.598156],[21.907945,80.357679],[22.919253,80.657144],[25.447625,80.40734],[27.407506,80.056406]]],[[[24.72412,77.85385],[22.49032,77.44493],[20.72601,77.67704],[21.41611,77.93504],[20.8119,78.25463],[22.88426,78.45494],[23.28134,78.07954],[24.72412,77.85385]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Denmark","SOV_A3":"DN1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"Greenland","ADM0_A3":"GRL","GEOU_DIF":0,"GEOUNIT":"Greenland","GU_A3":"GRL","SU_DIF":0,"SUBUNIT":"Greenland","SU_A3":"GRL","BRK_DIFF":0,"NAME":"Greenland","NAME_LONG":"Greenland","BRK_A3":"GRL","BRK_NAME":"Greenland","BRK_GROUP":null,"ABBREV":"Grlnd.","POSTAL":"GL","FORMAL_EN":"Greenland","FORMAL_FR":null,"NAME_CIAWF":"Greenland","NOTE_ADM0":"Den.","NOTE_BRK":null,"NAME_SORT":"Greenland","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":12,"POP_EST":56225,"POP_RANK":8,"POP_YEAR":2019,"GDP_MD":3051,"GDP_YEAR":2018,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"GL","ISO_A2":"GL","ISO_A2_EH":"GL","ISO_A3":"GRL","ISO_A3_EH":"GRL","ISO_N3":"304","ISO_N3_EH":"304","UN_A3":"304","WB_A2":"GL","WB_A3":"GRL","WOE_ID":23424828,"WOE_ID_EH":23424828,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GRL","ADM0_DIFF":null,"ADM0_TLC":"GRL","ADM0_A3_US":"GRL","ADM0_A3_FR":"GRL","ADM0_A3_RU":"GRL","ADM0_A3_ES":"GRL","ADM0_A3_CN":"GRL","ADM0_A3_TW":"GRL","ADM0_A3_IN":"GRL","ADM0_A3_NP":"GRL","ADM0_A3_PK":"GRL","ADM0_A3_DE":"GRL","ADM0_A3_GB":"GRL","ADM0_A3_BR":"GRL","ADM0_A3_IL":"GRL","ADM0_A3_PS":"GRL","ADM0_A3_SA":"GRL","ADM0_A3_EG":"GRL","ADM0_A3_MA":"GRL","ADM0_A3_PT":"GRL","ADM0_A3_AR":"GRL","ADM0_A3_JP":"GRL","ADM0_A3_KO":"GRL","ADM0_A3_VN":"GRL","ADM0_A3_TR":"GRL","ADM0_A3_ID":"GRL","ADM0_A3_PL":"GRL","ADM0_A3_GR":"GRL","ADM0_A3_IT":"GRL","ADM0_A3_NL":"GRL","ADM0_A3_SE":"GRL","ADM0_A3_BD":"GRL","ADM0_A3_UA":"GRL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Northern America","REGION_WB":"Europe & Central Asia","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":-39.335251,"LABEL_Y":74.319387,"NE_ID":1159320551,"WIKIDATAID":"Q223","NAME_AR":"جرينلاند","NAME_BN":"গ্রিনল্যান্ড","NAME_DE":"Grönland","NAME_EN":"Greenland","NAME_ES":"Groenlandia","NAME_FA":"گرینلند","NAME_FR":"Groenland","NAME_EL":"Γροιλανδία","NAME_HE":"גרינלנד","NAME_HI":"ग्रीनलैण्ड","NAME_HU":"Grönland","NAME_ID":"Greenland","NAME_IT":"Groenlandia","NAME_JA":"グリーンランド","NAME_KO":"그린란드","NAME_NL":"Groenland","NAME_PL":"Grenlandia","NAME_PT":"Groenlândia","NAME_RU":"Гренландия","NAME_SV":"Grönland","NAME_TR":"Grönland","NAME_UK":"Гренландія","NAME_UR":"گرین لینڈ","NAME_VI":"Greenland","NAME_ZH":"格陵兰","NAME_ZHT":"格陵蘭","FCLASS_ISO":"Admin-0 dependency","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 dependency","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-73.297,60.03676,-12.20855,83.64513],"geometry":{"type":"Polygon","coordinates":[[[-46.76379,82.62796],[-43.40644,83.22516],[-39.89753,83.18018],[-38.62214,83.54905],[-35.08787,83.64513],[-27.10046,83.51966],[-20.84539,82.72669],[-22.69182,82.34165],[-26.51753,82.29765],[-31.9,82.2],[-31.39646,82.02154],[-27.85666,82.13178],[-24.84448,81.78697],[-22.90328,82.09317],[-22.07175,81.73449],[-23.16961,81.15271],[-20.62363,81.52462],[-15.76818,81.91245],[-12.77018,81.71885],[-12.20855,81.29154],[-16.28533,80.58004],[-16.85,80.35],[-20.04624,80.17708],[-17.73035,80.12912],[-18.9,79.4],[-19.70499,78.75128],[-19.67353,77.63859],[-18.47285,76.98565],[-20.03503,76.94434],[-21.67944,76.62795],[-19.83407,76.09808],[-19.59896,75.24838],[-20.66818,75.15585],[-19.37281,74.29561],[-21.59422,74.22382],[-20.43454,73.81713],[-20.76234,73.46436],[-22.17221,73.30955],[-23.56593,73.30663],[-22.31311,72.62928],[-22.29954,72.18409],[-24.27834,72.59788],[-24.79296,72.3302],[-23.44296,72.08016],[-22.13281,71.46898],[-21.75356,70.66369],[-23.53603,70.471],[-24.30702,70.85649],[-25.54341,71.43094],[-25.20135,70.75226],[-26.36276,70.22646],[-23.72742,70.18401],[-22.34902,70.12946],[-25.02927,69.2588],[-27.74737,68.47046],[-30.67371,68.12503],[-31.77665,68.12078],[-32.81105,67.73547],[-34.20196,66.67974],[-36.35284,65.9789],[-37.04378,65.93768],[-38.37505,65.69213],[-39.81222,65.45848],[-40.66899,64.83997],[-40.68281,64.13902],[-41.1887,63.48246],[-42.81938,62.68233],[-42.41666,61.90093],[-42.86619,61.07404],[-43.3784,60.09772],[-44.7875,60.03676],[-46.26364,60.85328],[-48.26294,60.85843],[-49.23308,61.40681],[-49.90039,62.38336],[-51.63325,63.62691],[-52.14014,64.27842],[-52.27659,65.1767],[-53.66166,66.09957],[-53.30161,66.8365],[-53.96911,67.18899],[-52.9804,68.35759],[-51.47536,68.72958],[-51.08041,69.14781],[-50.87122,69.9291],[-52.013585,69.574925],[-52.55792,69.42616],[-53.45629,69.283625],[-54.68336,69.61003],[-54.75001,70.28932],[-54.35884,70.821315],[-53.431315,70.835755],[-51.39014,70.56978],[-53.10937,71.20485],[-54.00422,71.54719],[-55,71.406537],[-55.83468,71.65444],[-54.71819,72.58625],[-55.32634,72.95861],[-56.12003,73.64977],[-57.32363,74.71026],[-58.59679,75.09861],[-58.58516,75.51727],[-61.26861,76.10238],[-63.39165,76.1752],[-66.06427,76.13486],[-68.50438,76.06141],[-69.66485,76.37975],[-71.40257,77.00857],[-68.77671,77.32312],[-66.76397,77.37595],[-71.04293,77.63595],[-73.297,78.04419],[-73.15938,78.43271],[-69.37345,78.91388],[-65.7107,79.39436],[-65.3239,79.75814],[-68.02298,80.11721],[-67.15129,80.51582],[-63.68925,81.21396],[-62.23444,81.3211],[-62.65116,81.77042],[-60.28249,82.03363],[-57.20744,82.19074],[-54.13442,82.19962],[-53.04328,81.88833],[-50.39061,82.43883],[-48.00386,82.06481],[-46.59984,81.985945],[-44.523,81.6607],[-46.9007,82.19979],[-46.76379,82.62796]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":3,"LABELRANK":6,"SOVEREIGNT":"France","SOV_A3":"FR1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Dependency","TLC":"1","ADMIN":"French Southern and Antarctic Lands","ADM0_A3":"ATF","GEOU_DIF":0,"GEOUNIT":"French Southern and Antarctic Lands","GU_A3":"ATF","SU_DIF":0,"SUBUNIT":"French Southern and Antarctic Lands","SU_A3":"ATF","BRK_DIFF":0,"NAME":"Fr. S. Antarctic Lands","NAME_LONG":"French Southern and Antarctic Lands","BRK_A3":"ATF","BRK_NAME":"Fr. S. and Antarctic Lands","BRK_GROUP":null,"ABBREV":"Fr. S.A.L.","POSTAL":"TF","FORMAL_EN":"Territory of the French Southern and Antarctic Lands","FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":"Fr.","NOTE_BRK":null,"NAME_SORT":"French Southern and Antarctic Lands","NAME_ALT":null,"MAPCOLOR7":7,"MAPCOLOR8":5,"MAPCOLOR9":9,"MAPCOLOR13":11,"POP_EST":140,"POP_RANK":1,"POP_YEAR":2017,"GDP_MD":16,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"FS","ISO_A2":"TF","ISO_A2_EH":"TF","ISO_A3":"ATF","ISO_A3_EH":"ATF","ISO_N3":"260","ISO_N3_EH":"260","UN_A3":"260","WB_A2":"-99","WB_A3":"-99","WOE_ID":28289406,"WOE_ID_EH":28289406,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ATF","ADM0_DIFF":null,"ADM0_TLC":"ATF","ADM0_A3_US":"ATF","ADM0_A3_FR":"ATF","ADM0_A3_RU":"ATF","ADM0_A3_ES":"ATF","ADM0_A3_CN":"ATF","ADM0_A3_TW":"ATF","ADM0_A3_IN":"ATF","ADM0_A3_NP":"ATF","ADM0_A3_PK":"ATF","ADM0_A3_DE":"ATF","ADM0_A3_GB":"ATF","ADM0_A3_BR":"ATF","ADM0_A3_IL":"ATF","ADM0_A3_PS":"ATF","ADM0_A3_SA":"ATF","ADM0_A3_EG":"ATF","ADM0_A3_MA":"ATF","ADM0_A3_PT":"ATF","ADM0_A3_AR":"ATF","ADM0_A3_JP":"ATF","ADM0_A3_KO":"ATF","ADM0_A3_VN":"ATF","ADM0_A3_TR":"ATF","ADM0_A3_ID":"ATF","ADM0_A3_PL":"ATF","ADM0_A3_GR":"ATF","ADM0_A3_IT":"ATF","ADM0_A3_NL":"ATF","ADM0_A3_SE":"ATF","ADM0_A3_BD":"ATF","ADM0_A3_UA":"ATF","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Seven seas (open ocean)","REGION_UN":"Africa","SUBREGION":"Seven seas (open ocean)","REGION_WB":"Sub-Saharan Africa","NAME_LEN":22,"LONG_LEN":35,"ABBREV_LEN":10,"TINY":2,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":69.122136,"LABEL_Y":-49.303721,"NE_ID":1159320631,"WIKIDATAID":"Q129003","NAME_AR":"أراض فرنسية جنوبية وأنتارتيكية","NAME_BN":"ফ্র. এস. অ্যান্ড অ্যান্টার্কটিক ল্যান্ড","NAME_DE":"Französische Süd- und Antarktisgebiete","NAME_EN":"French Southern and Antarctic Lands","NAME_ES":"Tierras Australes y Antárticas Francesas","NAME_FA":"سرزمینهای جنوبی و جنوبگانی فرانسه","NAME_FR":"Terres australes et antarctiques françaises","NAME_EL":"Γαλλικά Νότια και Ανταρκτικά Εδάφη","NAME_HE":"הארצות הדרומיות והאנטארקטיות של צרפת","NAME_HI":"दक्षिण फ्रांसीसी और अंटार्कटिक लैंड","NAME_HU":"Francia déli és antarktiszi területek","NAME_ID":"Daratan Selatan dan Antarktika Perancis","NAME_IT":"Terre australi e antartiche francesi","NAME_JA":"フランス領南方・南極地域","NAME_KO":"프랑스령 남방 및 남극","NAME_NL":"Franse Zuidelijke Gebieden","NAME_PL":"Francuskie Terytoria Południowe i Antarktyczne","NAME_PT":"Terras Austrais e Antárticas Francesas","NAME_RU":"Французские Южные и Антарктические территории","NAME_SV":"Franska sydterritorierna","NAME_TR":"Fransız Güney ve Antarktika Toprakları","NAME_UK":"Французькі Південні і Антарктичні території","NAME_UR":"سرزمین جنوبی فرانسیسیہ و انٹارکٹیکا","NAME_VI":"Vùng đất phía Nam và châu Nam Cực thuộc Pháp","NAME_ZH":"法属南部和南极领地","NAME_ZHT":"法屬南部和南極領地","FCLASS_ISO":"Admin-0 dependency","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 dependency","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[68.72,-49.775,70.56,-48.625],"geometry":{"type":"Polygon","coordinates":[[[68.935,-48.625],[69.58,-48.94],[70.525,-49.065],[70.56,-49.255],[70.28,-49.71],[68.745,-49.775],[68.72,-49.2425],[68.8675,-48.83],[68.935,-48.625]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"East Timor","SOV_A3":"TLS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"East Timor","ADM0_A3":"TLS","GEOU_DIF":0,"GEOUNIT":"East Timor","GU_A3":"TLS","SU_DIF":0,"SUBUNIT":"East Timor","SU_A3":"TLS","BRK_DIFF":0,"NAME":"Timor-Leste","NAME_LONG":"Timor-Leste","BRK_A3":"TLS","BRK_NAME":"Timor-Leste","BRK_GROUP":null,"ABBREV":"T.L.","POSTAL":"TL","FORMAL_EN":"Democratic Republic of Timor-Leste","FORMAL_FR":null,"NAME_CIAWF":"Timor-Leste","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Timor-Leste","NAME_ALT":"East Timor","MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":4,"MAPCOLOR13":3,"POP_EST":1293119,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":2017,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"TT","ISO_A2":"TL","ISO_A2_EH":"TL","ISO_A3":"TLS","ISO_A3_EH":"TLS","ISO_N3":"626","ISO_N3_EH":"626","UN_A3":"626","WB_A2":"TP","WB_A3":"TMP","WOE_ID":23424968,"WOE_ID_EH":23424968,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TLS","ADM0_DIFF":null,"ADM0_TLC":"TLS","ADM0_A3_US":"TLS","ADM0_A3_FR":"TLS","ADM0_A3_RU":"TLS","ADM0_A3_ES":"TLS","ADM0_A3_CN":"TLS","ADM0_A3_TW":"TLS","ADM0_A3_IN":"TLS","ADM0_A3_NP":"TLS","ADM0_A3_PK":"TLS","ADM0_A3_DE":"TLS","ADM0_A3_GB":"TLS","ADM0_A3_BR":"TLS","ADM0_A3_IL":"TLS","ADM0_A3_PS":"TLS","ADM0_A3_SA":"TLS","ADM0_A3_EG":"TLS","ADM0_A3_MA":"TLS","ADM0_A3_PT":"TLS","ADM0_A3_AR":"TLS","ADM0_A3_JP":"TLS","ADM0_A3_KO":"TLS","ADM0_A3_VN":"TLS","ADM0_A3_TR":"TLS","ADM0_A3_ID":"TLS","ADM0_A3_PL":"TLS","ADM0_A3_GR":"TLS","ADM0_A3_IT":"TLS","ADM0_A3_NL":"TLS","ADM0_A3_SE":"TLS","ADM0_A3_BD":"TLS","ADM0_A3_UA":"TLS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":125.854679,"LABEL_Y":-8.803705,"NE_ID":1159321313,"WIKIDATAID":"Q574","NAME_AR":"تيمور الشرقية","NAME_BN":"পূর্ব তিমুর","NAME_DE":"Osttimor","NAME_EN":"East Timor","NAME_ES":"Timor Oriental","NAME_FA":"تیمور شرقی","NAME_FR":"Timor oriental","NAME_EL":"Ανατολικό Τιμόρ","NAME_HE":"מזרח טימור","NAME_HI":"पूर्वी तिमोर","NAME_HU":"Kelet-Timor","NAME_ID":"Timor Leste","NAME_IT":"Timor Est","NAME_JA":"東ティモール","NAME_KO":"동티모르","NAME_NL":"Oost-Timor","NAME_PL":"Timor Wschodni","NAME_PT":"Timor-Leste","NAME_RU":"Восточный Тимор","NAME_SV":"Östtimor","NAME_TR":"Doğu Timor","NAME_UK":"Східний Тимор","NAME_UR":"مشرقی تیمور","NAME_VI":"Đông Timor","NAME_ZH":"东帝汶","NAME_ZHT":"東帝汶","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[124.968682,-9.393173,127.335928,-8.273345],"geometry":{"type":"Polygon","coordinates":[[[124.968682,-8.89279],[125.086246,-8.656887],[125.947072,-8.432095],[126.644704,-8.398247],[126.957243,-8.273345],[127.335928,-8.397317],[126.967992,-8.668256],[125.925885,-9.106007],[125.08852,-9.393173],[125.07002,-9.089987],[124.968682,-8.89279]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"South Africa","SOV_A3":"ZAF","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"South Africa","ADM0_A3":"ZAF","GEOU_DIF":0,"GEOUNIT":"South Africa","GU_A3":"ZAF","SU_DIF":0,"SUBUNIT":"South Africa","SU_A3":"ZAF","BRK_DIFF":0,"NAME":"South Africa","NAME_LONG":"South Africa","BRK_A3":"ZAF","BRK_NAME":"South Africa","BRK_GROUP":null,"ABBREV":"S.Af.","POSTAL":"ZA","FORMAL_EN":"Republic of South Africa","FORMAL_FR":null,"NAME_CIAWF":"South Africa","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"South Africa","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":2,"POP_EST":58558270,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":351431,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"SF","ISO_A2":"ZA","ISO_A2_EH":"ZA","ISO_A3":"ZAF","ISO_A3_EH":"ZAF","ISO_N3":"710","ISO_N3_EH":"710","UN_A3":"710","WB_A2":"ZA","WB_A3":"ZAF","WOE_ID":23424942,"WOE_ID_EH":23424942,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ZAF","ADM0_DIFF":null,"ADM0_TLC":"ZAF","ADM0_A3_US":"ZAF","ADM0_A3_FR":"ZAF","ADM0_A3_RU":"ZAF","ADM0_A3_ES":"ZAF","ADM0_A3_CN":"ZAF","ADM0_A3_TW":"ZAF","ADM0_A3_IN":"ZAF","ADM0_A3_NP":"ZAF","ADM0_A3_PK":"ZAF","ADM0_A3_DE":"ZAF","ADM0_A3_GB":"ZAF","ADM0_A3_BR":"ZAF","ADM0_A3_IL":"ZAF","ADM0_A3_PS":"ZAF","ADM0_A3_SA":"ZAF","ADM0_A3_EG":"ZAF","ADM0_A3_MA":"ZAF","ADM0_A3_PT":"ZAF","ADM0_A3_AR":"ZAF","ADM0_A3_JP":"ZAF","ADM0_A3_KO":"ZAF","ADM0_A3_VN":"ZAF","ADM0_A3_TR":"ZAF","ADM0_A3_ID":"ZAF","ADM0_A3_PL":"ZAF","ADM0_A3_GR":"ZAF","ADM0_A3_IT":"ZAF","ADM0_A3_NL":"ZAF","ADM0_A3_SE":"ZAF","ADM0_A3_BD":"ZAF","ADM0_A3_UA":"ZAF","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":23.665734,"LABEL_Y":-29.708776,"NE_ID":1159321431,"WIKIDATAID":"Q258","NAME_AR":"جنوب أفريقيا","NAME_BN":"দক্ষিণ আফ্রিকা","NAME_DE":"Südafrika","NAME_EN":"South Africa","NAME_ES":"Sudáfrica","NAME_FA":"آفریقای جنوبی","NAME_FR":"Afrique du Sud","NAME_EL":"Νότια Αφρική","NAME_HE":"דרום אפריקה","NAME_HI":"दक्षिण अफ़्रीका","NAME_HU":"Dél-afrikai Köztársaság","NAME_ID":"Afrika Selatan","NAME_IT":"Sudafrica","NAME_JA":"南アフリカ共和国","NAME_KO":"남아프리카 공화국","NAME_NL":"Zuid-Afrika","NAME_PL":"Południowa Afryka","NAME_PT":"África do Sul","NAME_RU":"ЮАР","NAME_SV":"Sydafrika","NAME_TR":"Güney Afrika Cumhuriyeti","NAME_UK":"Південно-Африканська Республіка","NAME_UR":"جنوبی افریقا","NAME_VI":"Cộng hòa Nam Phi","NAME_ZH":"南非","NAME_ZHT":"南非","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[16.344977,-34.819166,32.83012,-22.091313],"geometry":{"type":"Polygon","coordinates":[[[16.344977,-28.576705],[16.824017,-28.082162],[17.218929,-28.355943],[17.387497,-28.783514],[17.836152,-28.856378],[18.464899,-29.045462],[19.002127,-28.972443],[19.894734,-28.461105],[19.895768,-24.76779],[20.165726,-24.917962],[20.758609,-25.868136],[20.66647,-26.477453],[20.889609,-26.828543],[21.605896,-26.726534],[22.105969,-26.280256],[22.579532,-25.979448],[22.824271,-25.500459],[23.312097,-25.26869],[23.73357,-25.390129],[24.211267,-25.670216],[25.025171,-25.71967],[25.664666,-25.486816],[25.765849,-25.174845],[25.941652,-24.696373],[26.485753,-24.616327],[26.786407,-24.240691],[27.11941,-23.574323],[28.017236,-22.827754],[29.432188,-22.091313],[29.839037,-22.102216],[30.322883,-22.271612],[30.659865,-22.151567],[31.191409,-22.25151],[31.670398,-23.658969],[31.930589,-24.369417],[31.752408,-25.484284],[31.837778,-25.843332],[31.333158,-25.660191],[31.04408,-25.731452],[30.949667,-26.022649],[30.676609,-26.398078],[30.685962,-26.743845],[31.282773,-27.285879],[31.86806,-27.177927],[32.071665,-26.73382],[32.83012,-26.742192],[32.580265,-27.470158],[32.462133,-28.301011],[32.203389,-28.752405],[31.521001,-29.257387],[31.325561,-29.401978],[30.901763,-29.909957],[30.622813,-30.423776],[30.055716,-31.140269],[28.925553,-32.172041],[28.219756,-32.771953],[27.464608,-33.226964],[26.419452,-33.61495],[25.909664,-33.66704],[25.780628,-33.944646],[25.172862,-33.796851],[24.677853,-33.987176],[23.594043,-33.794474],[22.988189,-33.916431],[22.574157,-33.864083],[21.542799,-34.258839],[20.689053,-34.417175],[20.071261,-34.795137],[19.616405,-34.819166],[19.193278,-34.462599],[18.855315,-34.444306],[18.424643,-33.997873],[18.377411,-34.136521],[18.244499,-33.867752],[18.25008,-33.281431],[17.92519,-32.611291],[18.24791,-32.429131],[18.221762,-31.661633],[17.566918,-30.725721],[17.064416,-29.878641],[17.062918,-29.875954],[16.344977,-28.576705]],[[28.978263,-28.955597],[28.5417,-28.647502],[28.074338,-28.851469],[27.532511,-29.242711],[26.999262,-29.875954],[27.749397,-30.645106],[28.107205,-30.545732],[28.291069,-30.226217],[28.8484,-30.070051],[29.018415,-29.743766],[29.325166,-29.257387],[28.978263,-28.955597]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Lesotho","SOV_A3":"LSO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Lesotho","ADM0_A3":"LSO","GEOU_DIF":0,"GEOUNIT":"Lesotho","GU_A3":"LSO","SU_DIF":0,"SUBUNIT":"Lesotho","SU_A3":"LSO","BRK_DIFF":0,"NAME":"Lesotho","NAME_LONG":"Lesotho","BRK_A3":"LSO","BRK_NAME":"Lesotho","BRK_GROUP":null,"ABBREV":"Les.","POSTAL":"LS","FORMAL_EN":"Kingdom of Lesotho","FORMAL_FR":null,"NAME_CIAWF":"Lesotho","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Lesotho","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":8,"POP_EST":2125268,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":2376,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"LT","ISO_A2":"LS","ISO_A2_EH":"LS","ISO_A3":"LSO","ISO_A3_EH":"LSO","ISO_N3":"426","ISO_N3_EH":"426","UN_A3":"426","WB_A2":"LS","WB_A3":"LSO","WOE_ID":23424880,"WOE_ID_EH":23424880,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LSO","ADM0_DIFF":null,"ADM0_TLC":"LSO","ADM0_A3_US":"LSO","ADM0_A3_FR":"LSO","ADM0_A3_RU":"LSO","ADM0_A3_ES":"LSO","ADM0_A3_CN":"LSO","ADM0_A3_TW":"LSO","ADM0_A3_IN":"LSO","ADM0_A3_NP":"LSO","ADM0_A3_PK":"LSO","ADM0_A3_DE":"LSO","ADM0_A3_GB":"LSO","ADM0_A3_BR":"LSO","ADM0_A3_IL":"LSO","ADM0_A3_PS":"LSO","ADM0_A3_SA":"LSO","ADM0_A3_EG":"LSO","ADM0_A3_MA":"LSO","ADM0_A3_PT":"LSO","ADM0_A3_AR":"LSO","ADM0_A3_JP":"LSO","ADM0_A3_KO":"LSO","ADM0_A3_VN":"LSO","ADM0_A3_TR":"LSO","ADM0_A3_ID":"LSO","ADM0_A3_PL":"LSO","ADM0_A3_GR":"LSO","ADM0_A3_IT":"LSO","ADM0_A3_NL":"LSO","ADM0_A3_SE":"LSO","ADM0_A3_BD":"LSO","ADM0_A3_UA":"LSO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":28.246639,"LABEL_Y":-29.480158,"NE_ID":1159321027,"WIKIDATAID":"Q1013","NAME_AR":"ليسوتو","NAME_BN":"লেসোথো","NAME_DE":"Lesotho","NAME_EN":"Lesotho","NAME_ES":"Lesoto","NAME_FA":"لسوتو","NAME_FR":"Lesotho","NAME_EL":"Λεσότο","NAME_HE":"לסוטו","NAME_HI":"लेसोथो","NAME_HU":"Lesotho","NAME_ID":"Lesotho","NAME_IT":"Lesotho","NAME_JA":"レソト","NAME_KO":"레소토","NAME_NL":"Lesotho","NAME_PL":"Lesotho","NAME_PT":"Lesoto","NAME_RU":"Лесото","NAME_SV":"Lesotho","NAME_TR":"Lesotho","NAME_UK":"Лесото","NAME_UR":"لیسوتھو","NAME_VI":"Lesotho","NAME_ZH":"莱索托","NAME_ZHT":"賴索托","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[26.999262,-30.645106,29.325166,-28.647502],"geometry":{"type":"Polygon","coordinates":[[[28.978263,-28.955597],[29.325166,-29.257387],[29.018415,-29.743766],[28.8484,-30.070051],[28.291069,-30.226217],[28.107205,-30.545732],[27.749397,-30.645106],[26.999262,-29.875954],[27.532511,-29.242711],[28.074338,-28.851469],[28.5417,-28.647502],[28.978263,-28.955597]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Mexico","SOV_A3":"MEX","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Mexico","ADM0_A3":"MEX","GEOU_DIF":0,"GEOUNIT":"Mexico","GU_A3":"MEX","SU_DIF":0,"SUBUNIT":"Mexico","SU_A3":"MEX","BRK_DIFF":0,"NAME":"Mexico","NAME_LONG":"Mexico","BRK_A3":"MEX","BRK_NAME":"Mexico","BRK_GROUP":null,"ABBREV":"Mex.","POSTAL":"MX","FORMAL_EN":"United Mexican States","FORMAL_FR":null,"NAME_CIAWF":"Mexico","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mexico","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":1,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":127575529,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":1268870,"GDP_YEAR":2019,"ECONOMY":"4. Emerging region: MIKT","INCOME_GRP":"3. Upper middle income","FIPS_10":"MX","ISO_A2":"MX","ISO_A2_EH":"MX","ISO_A3":"MEX","ISO_A3_EH":"MEX","ISO_N3":"484","ISO_N3_EH":"484","UN_A3":"484","WB_A2":"MX","WB_A3":"MEX","WOE_ID":23424900,"WOE_ID_EH":23424900,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MEX","ADM0_DIFF":null,"ADM0_TLC":"MEX","ADM0_A3_US":"MEX","ADM0_A3_FR":"MEX","ADM0_A3_RU":"MEX","ADM0_A3_ES":"MEX","ADM0_A3_CN":"MEX","ADM0_A3_TW":"MEX","ADM0_A3_IN":"MEX","ADM0_A3_NP":"MEX","ADM0_A3_PK":"MEX","ADM0_A3_DE":"MEX","ADM0_A3_GB":"MEX","ADM0_A3_BR":"MEX","ADM0_A3_IL":"MEX","ADM0_A3_PS":"MEX","ADM0_A3_SA":"MEX","ADM0_A3_EG":"MEX","ADM0_A3_MA":"MEX","ADM0_A3_PT":"MEX","ADM0_A3_AR":"MEX","ADM0_A3_JP":"MEX","ADM0_A3_KO":"MEX","ADM0_A3_VN":"MEX","ADM0_A3_TR":"MEX","ADM0_A3_ID":"MEX","ADM0_A3_PL":"MEX","ADM0_A3_GR":"MEX","ADM0_A3_IT":"MEX","ADM0_A3_NL":"MEX","ADM0_A3_SE":"MEX","ADM0_A3_BD":"MEX","ADM0_A3_UA":"MEX","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":6.7,"LABEL_X":-102.289448,"LABEL_Y":23.919988,"NE_ID":1159321055,"WIKIDATAID":"Q96","NAME_AR":"المكسيك","NAME_BN":"মেক্সিকো","NAME_DE":"Mexiko","NAME_EN":"Mexico","NAME_ES":"México","NAME_FA":"مکزیک","NAME_FR":"Mexique","NAME_EL":"Μεξικό","NAME_HE":"מקסיקו","NAME_HI":"मेक्सिको","NAME_HU":"Mexikó","NAME_ID":"Meksiko","NAME_IT":"Messico","NAME_JA":"メキシコ","NAME_KO":"멕시코","NAME_NL":"Mexico","NAME_PL":"Meksyk","NAME_PT":"México","NAME_RU":"Мексика","NAME_SV":"Mexiko","NAME_TR":"Meksika","NAME_UK":"Мексика","NAME_UR":"میکسیکو","NAME_VI":"México","NAME_ZH":"墨西哥","NAME_ZHT":"墨西哥","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-117.12776,14.538829,-86.811982,32.72083],"geometry":{"type":"Polygon","coordinates":[[[-117.12776,32.53534],[-115.99135,32.61239],[-114.72139,32.72083],[-114.815,32.52528],[-113.30498,32.03914],[-111.02361,31.33472],[-109.035,31.34194],[-108.24194,31.34222],[-108.24,31.754854],[-106.50759,31.75452],[-106.1429,31.39995],[-105.63159,31.08383],[-105.03737,30.64402],[-104.70575,30.12173],[-104.45697,29.57196],[-103.94,29.27],[-103.11,28.97],[-102.48,29.76],[-101.6624,29.7793],[-100.9576,29.38071],[-100.45584,28.69612],[-100.11,28.11],[-99.52,27.54],[-99.3,26.84],[-99.02,26.37],[-98.24,26.06],[-97.53,25.84],[-97.140008,25.869997],[-97.528072,24.992144],[-97.702946,24.272343],[-97.776042,22.93258],[-97.872367,22.444212],[-97.699044,21.898689],[-97.38896,21.411019],[-97.189333,20.635433],[-96.525576,19.890931],[-96.292127,19.320371],[-95.900885,18.828024],[-94.839063,18.562717],[-94.42573,18.144371],[-93.548651,18.423837],[-92.786114,18.524839],[-92.037348,18.704569],[-91.407903,18.876083],[-90.77187,19.28412],[-90.53359,19.867418],[-90.451476,20.707522],[-90.278618,20.999855],[-89.601321,21.261726],[-88.543866,21.493675],[-87.658417,21.458846],[-87.05189,21.543543],[-86.811982,21.331515],[-86.845908,20.849865],[-87.383291,20.255405],[-87.621054,19.646553],[-87.43675,19.472403],[-87.58656,19.04013],[-87.837191,18.259816],[-88.090664,18.516648],[-88.300031,18.499982],[-88.490123,18.486831],[-88.848344,17.883198],[-89.029857,18.001511],[-89.150909,17.955468],[-89.14308,17.808319],[-90.067934,17.819326],[-91.00152,17.817595],[-91.002269,17.254658],[-91.453921,17.252177],[-91.08167,16.918477],[-90.711822,16.687483],[-90.600847,16.470778],[-90.438867,16.41011],[-90.464473,16.069562],[-91.74796,16.066565],[-92.229249,15.251447],[-92.087216,15.064585],[-92.20323,14.830103],[-92.22775,14.538829],[-93.359464,15.61543],[-93.875169,15.940164],[-94.691656,16.200975],[-95.250227,16.128318],[-96.053382,15.752088],[-96.557434,15.653515],[-97.263592,15.917065],[-98.01303,16.107312],[-98.947676,16.566043],[-99.697397,16.706164],[-100.829499,17.171071],[-101.666089,17.649026],[-101.918528,17.91609],[-102.478132,17.975751],[-103.50099,18.292295],[-103.917527,18.748572],[-104.99201,19.316134],[-105.493038,19.946767],[-105.731396,20.434102],[-105.397773,20.531719],[-105.500661,20.816895],[-105.270752,21.076285],[-105.265817,21.422104],[-105.603161,21.871146],[-105.693414,22.26908],[-106.028716,22.773752],[-106.90998,23.767774],[-107.915449,24.548915],[-108.401905,25.172314],[-109.260199,25.580609],[-109.444089,25.824884],[-109.291644,26.442934],[-109.801458,26.676176],[-110.391732,27.162115],[-110.641019,27.859876],[-111.178919,27.941241],[-111.759607,28.467953],[-112.228235,28.954409],[-112.271824,29.266844],[-112.809594,30.021114],[-113.163811,30.786881],[-113.148669,31.170966],[-113.871881,31.567608],[-114.205737,31.524045],[-114.776451,31.799532],[-114.9367,31.393485],[-114.771232,30.913617],[-114.673899,30.162681],[-114.330974,29.750432],[-113.588875,29.061611],[-113.424053,28.826174],[-113.271969,28.754783],[-113.140039,28.411289],[-112.962298,28.42519],[-112.761587,27.780217],[-112.457911,27.525814],[-112.244952,27.171727],[-111.616489,26.662817],[-111.284675,25.73259],[-110.987819,25.294606],[-110.710007,24.826004],[-110.655049,24.298595],[-110.172856,24.265548],[-109.771847,23.811183],[-109.409104,23.364672],[-109.433392,23.185588],[-109.854219,22.818272],[-110.031392,22.823078],[-110.295071,23.430973],[-110.949501,24.000964],[-111.670568,24.484423],[-112.182036,24.738413],[-112.148989,25.470125],[-112.300711,26.012004],[-112.777297,26.32196],[-113.464671,26.768186],[-113.59673,26.63946],[-113.848937,26.900064],[-114.465747,27.14209],[-115.055142,27.722727],[-114.982253,27.7982],[-114.570366,27.741485],[-114.199329,28.115003],[-114.162018,28.566112],[-114.931842,29.279479],[-115.518654,29.556362],[-115.887365,30.180794],[-116.25835,30.836464],[-116.721526,31.635744],[-117.12776,32.53534]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Uruguay","SOV_A3":"URY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Uruguay","ADM0_A3":"URY","GEOU_DIF":0,"GEOUNIT":"Uruguay","GU_A3":"URY","SU_DIF":0,"SUBUNIT":"Uruguay","SU_A3":"URY","BRK_DIFF":0,"NAME":"Uruguay","NAME_LONG":"Uruguay","BRK_A3":"URY","BRK_NAME":"Uruguay","BRK_GROUP":null,"ABBREV":"Ury.","POSTAL":"UY","FORMAL_EN":"Oriental Republic of Uruguay","FORMAL_FR":null,"NAME_CIAWF":"Uruguay","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Uruguay","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":10,"POP_EST":3461734,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":56045,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"UY","ISO_A2":"UY","ISO_A2_EH":"UY","ISO_A3":"URY","ISO_A3_EH":"URY","ISO_N3":"858","ISO_N3_EH":"858","UN_A3":"858","WB_A2":"UY","WB_A3":"URY","WOE_ID":23424979,"WOE_ID_EH":23424979,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"URY","ADM0_DIFF":null,"ADM0_TLC":"URY","ADM0_A3_US":"URY","ADM0_A3_FR":"URY","ADM0_A3_RU":"URY","ADM0_A3_ES":"URY","ADM0_A3_CN":"URY","ADM0_A3_TW":"URY","ADM0_A3_IN":"URY","ADM0_A3_NP":"URY","ADM0_A3_PK":"URY","ADM0_A3_DE":"URY","ADM0_A3_GB":"URY","ADM0_A3_BR":"URY","ADM0_A3_IL":"URY","ADM0_A3_PS":"URY","ADM0_A3_SA":"URY","ADM0_A3_EG":"URY","ADM0_A3_MA":"URY","ADM0_A3_PT":"URY","ADM0_A3_AR":"URY","ADM0_A3_JP":"URY","ADM0_A3_KO":"URY","ADM0_A3_VN":"URY","ADM0_A3_TR":"URY","ADM0_A3_ID":"URY","ADM0_A3_PL":"URY","ADM0_A3_GR":"URY","ADM0_A3_IT":"URY","ADM0_A3_NL":"URY","ADM0_A3_SE":"URY","ADM0_A3_BD":"URY","ADM0_A3_UA":"URY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-55.966942,"LABEL_Y":-32.961127,"NE_ID":1159321353,"WIKIDATAID":"Q77","NAME_AR":"الأوروغواي","NAME_BN":"উরুগুয়ে","NAME_DE":"Uruguay","NAME_EN":"Uruguay","NAME_ES":"Uruguay","NAME_FA":"اروگوئه","NAME_FR":"Uruguay","NAME_EL":"Ουρουγουάη","NAME_HE":"אורוגוואי","NAME_HI":"उरुग्वे","NAME_HU":"Uruguay","NAME_ID":"Uruguay","NAME_IT":"Uruguay","NAME_JA":"ウルグアイ","NAME_KO":"우루과이","NAME_NL":"Uruguay","NAME_PL":"Urugwaj","NAME_PT":"Uruguai","NAME_RU":"Уругвай","NAME_SV":"Uruguay","NAME_TR":"Uruguay","NAME_UK":"Уругвай","NAME_UR":"یوراگوئے","NAME_VI":"Uruguay","NAME_ZH":"乌拉圭","NAME_ZHT":"烏拉圭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-58.427074,-34.952647,-53.209589,-30.109686],"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.976026,-30.109686],[-55.973245,-30.883076],[-55.60151,-30.853879],[-54.572452,-31.494511],[-53.787952,-32.047243],[-53.209589,-32.727666],[-53.650544,-33.202004],[-53.373662,-33.768378],[-53.806426,-34.396815],[-54.935866,-34.952647],[-55.67409,-34.752659],[-56.215297,-34.859836],[-57.139685,-34.430456],[-57.817861,-34.462547],[-58.427074,-33.909454],[-58.349611,-33.263189],[-58.132648,-33.040567],[-58.14244,-32.044504],[-57.874937,-31.016556],[-57.625133,-30.216295]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Brazil","SOV_A3":"BRA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Brazil","ADM0_A3":"BRA","GEOU_DIF":0,"GEOUNIT":"Brazil","GU_A3":"BRA","SU_DIF":0,"SUBUNIT":"Brazil","SU_A3":"BRA","BRK_DIFF":0,"NAME":"Brazil","NAME_LONG":"Brazil","BRK_A3":"BRA","BRK_NAME":"Brazil","BRK_GROUP":null,"ABBREV":"Brazil","POSTAL":"BR","FORMAL_EN":"Federative Republic of Brazil","FORMAL_FR":null,"NAME_CIAWF":"Brazil","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Brazil","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":7,"POP_EST":211049527,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":1839758,"GDP_YEAR":2019,"ECONOMY":"3. Emerging region: BRIC","INCOME_GRP":"3. Upper middle income","FIPS_10":"BR","ISO_A2":"BR","ISO_A2_EH":"BR","ISO_A3":"BRA","ISO_A3_EH":"BRA","ISO_N3":"076","ISO_N3_EH":"076","UN_A3":"076","WB_A2":"BR","WB_A3":"BRA","WOE_ID":23424768,"WOE_ID_EH":23424768,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BRA","ADM0_DIFF":null,"ADM0_TLC":"BRA","ADM0_A3_US":"BRA","ADM0_A3_FR":"BRA","ADM0_A3_RU":"BRA","ADM0_A3_ES":"BRA","ADM0_A3_CN":"BRA","ADM0_A3_TW":"BRA","ADM0_A3_IN":"BRA","ADM0_A3_NP":"BRA","ADM0_A3_PK":"BRA","ADM0_A3_DE":"BRA","ADM0_A3_GB":"BRA","ADM0_A3_BR":"BRA","ADM0_A3_IL":"BRA","ADM0_A3_PS":"BRA","ADM0_A3_SA":"BRA","ADM0_A3_EG":"BRA","ADM0_A3_MA":"BRA","ADM0_A3_PT":"BRA","ADM0_A3_AR":"BRA","ADM0_A3_JP":"BRA","ADM0_A3_KO":"BRA","ADM0_A3_VN":"BRA","ADM0_A3_TR":"BRA","ADM0_A3_ID":"BRA","ADM0_A3_PL":"BRA","ADM0_A3_GR":"BRA","ADM0_A3_IT":"BRA","ADM0_A3_NL":"BRA","ADM0_A3_SE":"BRA","ADM0_A3_BD":"BRA","ADM0_A3_UA":"BRA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7,"LABEL_X":-49.55945,"LABEL_Y":-12.098687,"NE_ID":1159320441,"WIKIDATAID":"Q155","NAME_AR":"البرازيل","NAME_BN":"ব্রাজিল","NAME_DE":"Brasilien","NAME_EN":"Brazil","NAME_ES":"Brasil","NAME_FA":"برزیل","NAME_FR":"Brésil","NAME_EL":"Βραζιλία","NAME_HE":"ברזיל","NAME_HI":"ब्राज़ील","NAME_HU":"Brazília","NAME_ID":"Brasil","NAME_IT":"Brasile","NAME_JA":"ブラジル","NAME_KO":"브라질","NAME_NL":"Brazilië","NAME_PL":"Brazylia","NAME_PT":"Brasil","NAME_RU":"Бразилия","NAME_SV":"Brasilien","NAME_TR":"Brezilya","NAME_UK":"Бразилія","NAME_UR":"برازیل","NAME_VI":"Brasil","NAME_ZH":"巴西","NAME_ZHT":"巴西","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-73.987235,-33.768378,-34.729993,5.244486],"geometry":{"type":"Polygon","coordinates":[[[-53.373662,-33.768378],[-53.650544,-33.202004],[-53.209589,-32.727666],[-53.787952,-32.047243],[-54.572452,-31.494511],[-55.60151,-30.853879],[-55.973245,-30.883076],[-56.976026,-30.109686],[-57.625133,-30.216295],[-56.2909,-28.852761],[-55.162286,-27.881915],[-54.490725,-27.474757],[-53.648735,-26.923473],[-53.628349,-26.124865],[-54.13005,-25.547639],[-54.625291,-25.739255],[-54.428946,-25.162185],[-54.293476,-24.5708],[-54.29296,-24.021014],[-54.652834,-23.839578],[-55.027902,-24.001274],[-55.400747,-23.956935],[-55.517639,-23.571998],[-55.610683,-22.655619],[-55.797958,-22.35693],[-56.473317,-22.0863],[-56.88151,-22.282154],[-57.937156,-22.090176],[-57.870674,-20.732688],[-58.166392,-20.176701],[-57.853802,-19.969995],[-57.949997,-19.400004],[-57.676009,-18.96184],[-57.498371,-18.174188],[-57.734558,-17.552468],[-58.280804,-17.27171],[-58.388058,-16.877109],[-58.24122,-16.299573],[-60.15839,-16.258284],[-60.542966,-15.09391],[-60.251149,-15.077219],[-60.264326,-14.645979],[-60.459198,-14.354007],[-60.503304,-13.775955],[-61.084121,-13.479384],[-61.713204,-13.489202],[-62.127081,-13.198781],[-62.80306,-13.000653],[-63.196499,-12.627033],[-64.316353,-12.461978],[-65.402281,-11.56627],[-65.321899,-10.895872],[-65.444837,-10.511451],[-65.338435,-9.761988],[-66.646908,-9.931331],[-67.173801,-10.306812],[-68.048192,-10.712059],[-68.271254,-11.014521],[-68.786158,-11.03638],[-69.529678,-10.951734],[-70.093752,-11.123972],[-70.548686,-11.009147],[-70.481894,-9.490118],[-71.302412,-10.079436],[-72.184891,-10.053598],[-72.563033,-9.520194],[-73.226713,-9.462213],[-73.015383,-9.032833],[-73.571059,-8.424447],[-73.987235,-7.52383],[-73.723401,-7.340999],[-73.724487,-6.918595],[-73.120027,-6.629931],[-73.219711,-6.089189],[-72.964507,-5.741251],[-72.891928,-5.274561],[-71.748406,-4.593983],[-70.928843,-4.401591],[-70.794769,-4.251265],[-69.893635,-4.298187],[-69.444102,-1.556287],[-69.420486,-1.122619],[-69.577065,-0.549992],[-70.020656,-0.185156],[-70.015566,0.541414],[-69.452396,0.706159],[-69.252434,0.602651],[-69.218638,0.985677],[-69.804597,1.089081],[-69.816973,1.714805],[-67.868565,1.692455],[-67.53781,2.037163],[-67.259998,1.719999],[-67.065048,1.130112],[-66.876326,1.253361],[-66.325765,0.724452],[-65.548267,0.789254],[-65.354713,1.095282],[-64.611012,1.328731],[-64.199306,1.492855],[-64.083085,1.916369],[-63.368788,2.2009],[-63.422867,2.411068],[-64.269999,2.497006],[-64.408828,3.126786],[-64.368494,3.79721],[-64.816064,4.056445],[-64.628659,4.148481],[-63.888343,4.02053],[-63.093198,3.770571],[-62.804533,4.006965],[-62.08543,4.162124],[-60.966893,4.536468],[-60.601179,4.918098],[-60.733574,5.200277],[-60.213683,5.244486],[-59.980959,5.014061],[-60.111002,4.574967],[-59.767406,4.423503],[-59.53804,3.958803],[-59.815413,3.606499],[-59.974525,2.755233],[-59.718546,2.24963],[-59.646044,1.786894],[-59.030862,1.317698],[-58.540013,1.268088],[-58.429477,1.463942],[-58.11345,1.507195],[-57.660971,1.682585],[-57.335823,1.948538],[-56.782704,1.863711],[-56.539386,1.899523],[-55.995698,1.817667],[-55.9056,2.021996],[-56.073342,2.220795],[-55.973322,2.510364],[-55.569755,2.421506],[-55.097587,2.523748],[-54.524754,2.311849],[-54.088063,2.105557],[-53.778521,2.376703],[-53.554839,2.334897],[-53.418465,2.053389],[-52.939657,2.124858],[-52.556425,2.504705],[-52.249338,3.241094],[-51.657797,4.156232],[-51.317146,4.203491],[-51.069771,3.650398],[-50.508875,1.901564],[-49.974076,1.736483],[-49.947101,1.04619],[-50.699251,0.222984],[-50.388211,-0.078445],[-48.620567,-0.235489],[-48.584497,-1.237805],[-47.824956,-0.581618],[-46.566584,-0.941028],[-44.905703,-1.55174],[-44.417619,-2.13775],[-44.581589,-2.691308],[-43.418791,-2.38311],[-41.472657,-2.912018],[-39.978665,-2.873054],[-38.500383,-3.700652],[-37.223252,-4.820946],[-36.452937,-5.109404],[-35.597796,-5.149504],[-35.235389,-5.464937],[-34.89603,-6.738193],[-34.729993,-7.343221],[-35.128212,-8.996401],[-35.636967,-9.649282],[-37.046519,-11.040721],[-37.683612,-12.171195],[-38.423877,-13.038119],[-38.673887,-13.057652],[-38.953276,-13.79337],[-38.882298,-15.667054],[-39.161092,-17.208407],[-39.267339,-17.867746],[-39.583521,-18.262296],[-39.760823,-19.599113],[-40.774741,-20.904512],[-40.944756,-21.937317],[-41.754164,-22.370676],[-41.988284,-22.97007],[-43.074704,-22.967693],[-44.647812,-23.351959],[-45.352136,-23.796842],[-46.472093,-24.088969],[-47.648972,-24.885199],[-48.495458,-25.877025],[-48.641005,-26.623698],[-48.474736,-27.175912],[-48.66152,-28.186135],[-48.888457,-28.674115],[-49.587329,-29.224469],[-50.696874,-30.984465],[-51.576226,-31.777698],[-52.256081,-32.24537],[-52.7121,-33.196578],[-53.373662,-33.768378]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Bolivia","SOV_A3":"BOL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Bolivia","ADM0_A3":"BOL","GEOU_DIF":0,"GEOUNIT":"Bolivia","GU_A3":"BOL","SU_DIF":0,"SUBUNIT":"Bolivia","SU_A3":"BOL","BRK_DIFF":0,"NAME":"Bolivia","NAME_LONG":"Bolivia","BRK_A3":"BOL","BRK_NAME":"Bolivia","BRK_GROUP":null,"ABBREV":"Bolivia","POSTAL":"BO","FORMAL_EN":"Plurinational State of Bolivia","FORMAL_FR":null,"NAME_CIAWF":"Bolivia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bolivia","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":3,"POP_EST":11513100,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":40895,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","FIPS_10":"BL","ISO_A2":"BO","ISO_A2_EH":"BO","ISO_A3":"BOL","ISO_A3_EH":"BOL","ISO_N3":"068","ISO_N3_EH":"068","UN_A3":"068","WB_A2":"BO","WB_A3":"BOL","WOE_ID":23424762,"WOE_ID_EH":23424762,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BOL","ADM0_DIFF":null,"ADM0_TLC":"BOL","ADM0_A3_US":"BOL","ADM0_A3_FR":"BOL","ADM0_A3_RU":"BOL","ADM0_A3_ES":"BOL","ADM0_A3_CN":"BOL","ADM0_A3_TW":"BOL","ADM0_A3_IN":"BOL","ADM0_A3_NP":"BOL","ADM0_A3_PK":"BOL","ADM0_A3_DE":"BOL","ADM0_A3_GB":"BOL","ADM0_A3_BR":"BOL","ADM0_A3_IL":"BOL","ADM0_A3_PS":"BOL","ADM0_A3_SA":"BOL","ADM0_A3_EG":"BOL","ADM0_A3_MA":"BOL","ADM0_A3_PT":"BOL","ADM0_A3_AR":"BOL","ADM0_A3_JP":"BOL","ADM0_A3_KO":"BOL","ADM0_A3_VN":"BOL","ADM0_A3_TR":"BOL","ADM0_A3_ID":"BOL","ADM0_A3_PL":"BOL","ADM0_A3_GR":"BOL","ADM0_A3_IT":"BOL","ADM0_A3_NL":"BOL","ADM0_A3_SE":"BOL","ADM0_A3_BD":"BOL","ADM0_A3_UA":"BOL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7.5,"LABEL_X":-64.593433,"LABEL_Y":-16.666015,"NE_ID":1159320439,"WIKIDATAID":"Q750","NAME_AR":"بوليفيا","NAME_BN":"বলিভিয়া","NAME_DE":"Bolivien","NAME_EN":"Bolivia","NAME_ES":"Bolivia","NAME_FA":"بولیوی","NAME_FR":"Bolivie","NAME_EL":"Βολιβία","NAME_HE":"בוליביה","NAME_HI":"बोलिविया","NAME_HU":"Bolívia","NAME_ID":"Bolivia","NAME_IT":"Bolivia","NAME_JA":"ボリビア","NAME_KO":"볼리비아","NAME_NL":"Bolivia","NAME_PL":"Boliwia","NAME_PT":"Bolívia","NAME_RU":"Боливия","NAME_SV":"Bolivia","NAME_TR":"Bolivya","NAME_UK":"Болівія","NAME_UR":"بولیویا","NAME_VI":"Bolivia","NAME_ZH":"玻利维亚","NAME_ZHT":"玻利維亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-69.590424,-22.872919,-57.498371,-9.761988],"geometry":{"type":"Polygon","coordinates":[[[-69.529678,-10.951734],[-68.786158,-11.03638],[-68.271254,-11.014521],[-68.048192,-10.712059],[-67.173801,-10.306812],[-66.646908,-9.931331],[-65.338435,-9.761988],[-65.444837,-10.511451],[-65.321899,-10.895872],[-65.402281,-11.56627],[-64.316353,-12.461978],[-63.196499,-12.627033],[-62.80306,-13.000653],[-62.127081,-13.198781],[-61.713204,-13.489202],[-61.084121,-13.479384],[-60.503304,-13.775955],[-60.459198,-14.354007],[-60.264326,-14.645979],[-60.251149,-15.077219],[-60.542966,-15.09391],[-60.15839,-16.258284],[-58.24122,-16.299573],[-58.388058,-16.877109],[-58.280804,-17.27171],[-57.734558,-17.552468],[-57.498371,-18.174188],[-57.676009,-18.96184],[-57.949997,-19.400004],[-57.853802,-19.969995],[-58.166392,-20.176701],[-58.183471,-19.868399],[-59.115042,-19.356906],[-60.043565,-19.342747],[-61.786326,-19.633737],[-62.265961,-20.513735],[-62.291179,-21.051635],[-62.685057,-22.249029],[-62.846468,-22.034985],[-63.986838,-21.993644],[-64.377021,-22.798091],[-64.964892,-22.075862],[-66.273339,-21.83231],[-67.106674,-22.735925],[-67.82818,-22.872919],[-68.219913,-21.494347],[-68.757167,-20.372658],[-68.442225,-19.405068],[-68.966818,-18.981683],[-69.100247,-18.260125],[-69.590424,-17.580012],[-68.959635,-16.500698],[-69.389764,-15.660129],[-69.160347,-15.323974],[-69.339535,-14.953195],[-68.948887,-14.453639],[-68.929224,-13.602684],[-68.88008,-12.899729],[-68.66508,-12.5613],[-69.529678,-10.951734]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Peru","SOV_A3":"PER","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Peru","ADM0_A3":"PER","GEOU_DIF":0,"GEOUNIT":"Peru","GU_A3":"PER","SU_DIF":0,"SUBUNIT":"Peru","SU_A3":"PER","BRK_DIFF":0,"NAME":"Peru","NAME_LONG":"Peru","BRK_A3":"PER","BRK_NAME":"Peru","BRK_GROUP":null,"ABBREV":"Peru","POSTAL":"PE","FORMAL_EN":"Republic of Peru","FORMAL_FR":null,"NAME_CIAWF":"Peru","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Peru","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":11,"POP_EST":32510453,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":226848,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"PE","ISO_A2":"PE","ISO_A2_EH":"PE","ISO_A3":"PER","ISO_A3_EH":"PER","ISO_N3":"604","ISO_N3_EH":"604","UN_A3":"604","WB_A2":"PE","WB_A3":"PER","WOE_ID":23424919,"WOE_ID_EH":23424919,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PER","ADM0_DIFF":null,"ADM0_TLC":"PER","ADM0_A3_US":"PER","ADM0_A3_FR":"PER","ADM0_A3_RU":"PER","ADM0_A3_ES":"PER","ADM0_A3_CN":"PER","ADM0_A3_TW":"PER","ADM0_A3_IN":"PER","ADM0_A3_NP":"PER","ADM0_A3_PK":"PER","ADM0_A3_DE":"PER","ADM0_A3_GB":"PER","ADM0_A3_BR":"PER","ADM0_A3_IL":"PER","ADM0_A3_PS":"PER","ADM0_A3_SA":"PER","ADM0_A3_EG":"PER","ADM0_A3_MA":"PER","ADM0_A3_PT":"PER","ADM0_A3_AR":"PER","ADM0_A3_JP":"PER","ADM0_A3_KO":"PER","ADM0_A3_VN":"PER","ADM0_A3_TR":"PER","ADM0_A3_ID":"PER","ADM0_A3_PL":"PER","ADM0_A3_GR":"PER","ADM0_A3_IT":"PER","ADM0_A3_NL":"PER","ADM0_A3_SE":"PER","ADM0_A3_BD":"PER","ADM0_A3_UA":"PER","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":-72.90016,"LABEL_Y":-12.976679,"NE_ID":1159321163,"WIKIDATAID":"Q419","NAME_AR":"بيرو","NAME_BN":"পেরু","NAME_DE":"Peru","NAME_EN":"Peru","NAME_ES":"Perú","NAME_FA":"پرو","NAME_FR":"Pérou","NAME_EL":"Περού","NAME_HE":"פרו","NAME_HI":"पेरू","NAME_HU":"Peru","NAME_ID":"Peru","NAME_IT":"Perù","NAME_JA":"ペルー","NAME_KO":"페루","NAME_NL":"Peru","NAME_PL":"Peru","NAME_PT":"Peru","NAME_RU":"Перу","NAME_SV":"Peru","NAME_TR":"Peru","NAME_UK":"Перу","NAME_UR":"پیرو","NAME_VI":"Peru","NAME_ZH":"秘鲁","NAME_ZHT":"秘魯","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-81.410943,-18.347975,-68.66508,-0.057205],"geometry":{"type":"Polygon","coordinates":[[[-69.893635,-4.298187],[-70.794769,-4.251265],[-70.928843,-4.401591],[-71.748406,-4.593983],[-72.891928,-5.274561],[-72.964507,-5.741251],[-73.219711,-6.089189],[-73.120027,-6.629931],[-73.724487,-6.918595],[-73.723401,-7.340999],[-73.987235,-7.52383],[-73.571059,-8.424447],[-73.015383,-9.032833],[-73.226713,-9.462213],[-72.563033,-9.520194],[-72.184891,-10.053598],[-71.302412,-10.079436],[-70.481894,-9.490118],[-70.548686,-11.009147],[-70.093752,-11.123972],[-69.529678,-10.951734],[-68.66508,-12.5613],[-68.88008,-12.899729],[-68.929224,-13.602684],[-68.948887,-14.453639],[-69.339535,-14.953195],[-69.160347,-15.323974],[-69.389764,-15.660129],[-68.959635,-16.500698],[-69.590424,-17.580012],[-69.858444,-18.092694],[-70.372572,-18.347975],[-71.37525,-17.773799],[-71.462041,-17.363488],[-73.44453,-16.359363],[-75.237883,-15.265683],[-76.009205,-14.649286],[-76.423469,-13.823187],[-76.259242,-13.535039],[-77.106192,-12.222716],[-78.092153,-10.377712],[-79.036953,-8.386568],[-79.44592,-7.930833],[-79.760578,-7.194341],[-80.537482,-6.541668],[-81.249996,-6.136834],[-80.926347,-5.690557],[-81.410943,-4.736765],[-81.09967,-4.036394],[-80.302561,-3.404856],[-80.184015,-3.821162],[-80.469295,-4.059287],[-80.442242,-4.425724],[-80.028908,-4.346091],[-79.624979,-4.454198],[-79.205289,-4.959129],[-78.639897,-4.547784],[-78.450684,-3.873097],[-77.837905,-3.003021],[-76.635394,-2.608678],[-75.544996,-1.56161],[-75.233723,-0.911417],[-75.373223,-0.152032],[-75.106625,-0.057205],[-74.441601,-0.53082],[-74.122395,-1.002833],[-73.659504,-1.260491],[-73.070392,-2.308954],[-72.325787,-2.434218],[-71.774761,-2.16979],[-71.413646,-2.342802],[-70.813476,-2.256865],[-70.047709,-2.725156],[-70.692682,-3.742872],[-70.394044,-3.766591],[-69.893635,-4.298187]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Colombia","SOV_A3":"COL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Colombia","ADM0_A3":"COL","GEOU_DIF":0,"GEOUNIT":"Colombia","GU_A3":"COL","SU_DIF":0,"SUBUNIT":"Colombia","SU_A3":"COL","BRK_DIFF":0,"NAME":"Colombia","NAME_LONG":"Colombia","BRK_A3":"COL","BRK_NAME":"Colombia","BRK_GROUP":null,"ABBREV":"Col.","POSTAL":"CO","FORMAL_EN":"Republic of Colombia","FORMAL_FR":null,"NAME_CIAWF":"Colombia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Colombia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":1,"POP_EST":50339443,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":323615,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"CO","ISO_A2":"CO","ISO_A2_EH":"CO","ISO_A3":"COL","ISO_A3_EH":"COL","ISO_N3":"170","ISO_N3_EH":"170","UN_A3":"170","WB_A2":"CO","WB_A3":"COL","WOE_ID":23424787,"WOE_ID_EH":23424787,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"COL","ADM0_DIFF":null,"ADM0_TLC":"COL","ADM0_A3_US":"COL","ADM0_A3_FR":"COL","ADM0_A3_RU":"COL","ADM0_A3_ES":"COL","ADM0_A3_CN":"COL","ADM0_A3_TW":"COL","ADM0_A3_IN":"COL","ADM0_A3_NP":"COL","ADM0_A3_PK":"COL","ADM0_A3_DE":"COL","ADM0_A3_GB":"COL","ADM0_A3_BR":"COL","ADM0_A3_IL":"COL","ADM0_A3_PS":"COL","ADM0_A3_SA":"COL","ADM0_A3_EG":"COL","ADM0_A3_MA":"COL","ADM0_A3_PT":"COL","ADM0_A3_AR":"COL","ADM0_A3_JP":"COL","ADM0_A3_KO":"COL","ADM0_A3_VN":"COL","ADM0_A3_TR":"COL","ADM0_A3_ID":"COL","ADM0_A3_PL":"COL","ADM0_A3_GR":"COL","ADM0_A3_IT":"COL","ADM0_A3_NL":"COL","ADM0_A3_SE":"COL","ADM0_A3_BD":"COL","ADM0_A3_UA":"COL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7,"LABEL_X":-73.174347,"LABEL_Y":3.373111,"NE_ID":1159320517,"WIKIDATAID":"Q739","NAME_AR":"كولومبيا","NAME_BN":"কলম্বিয়া","NAME_DE":"Kolumbien","NAME_EN":"Colombia","NAME_ES":"Colombia","NAME_FA":"کلمبیا","NAME_FR":"Colombie","NAME_EL":"Κολομβία","NAME_HE":"קולומביה","NAME_HI":"कोलम्बिया","NAME_HU":"Kolumbia","NAME_ID":"Kolombia","NAME_IT":"Colombia","NAME_JA":"コロンビア","NAME_KO":"콜롬비아","NAME_NL":"Colombia","NAME_PL":"Kolumbia","NAME_PT":"Colômbia","NAME_RU":"Колумбия","NAME_SV":"Colombia","NAME_TR":"Kolombiya","NAME_UK":"Колумбія","NAME_UR":"کولمبیا","NAME_VI":"Colombia","NAME_ZH":"哥伦比亚","NAME_ZHT":"哥倫比亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-78.990935,-4.298187,-66.876326,12.437303],"geometry":{"type":"Polygon","coordinates":[[[-66.876326,1.253361],[-67.065048,1.130112],[-67.259998,1.719999],[-67.53781,2.037163],[-67.868565,1.692455],[-69.816973,1.714805],[-69.804597,1.089081],[-69.218638,0.985677],[-69.252434,0.602651],[-69.452396,0.706159],[-70.015566,0.541414],[-70.020656,-0.185156],[-69.577065,-0.549992],[-69.420486,-1.122619],[-69.444102,-1.556287],[-69.893635,-4.298187],[-70.394044,-3.766591],[-70.692682,-3.742872],[-70.047709,-2.725156],[-70.813476,-2.256865],[-71.413646,-2.342802],[-71.774761,-2.16979],[-72.325787,-2.434218],[-73.070392,-2.308954],[-73.659504,-1.260491],[-74.122395,-1.002833],[-74.441601,-0.53082],[-75.106625,-0.057205],[-75.373223,-0.152032],[-75.801466,0.084801],[-76.292314,0.416047],[-76.57638,0.256936],[-77.424984,0.395687],[-77.668613,0.825893],[-77.855061,0.809925],[-78.855259,1.380924],[-78.990935,1.69137],[-78.617831,1.766404],[-78.662118,2.267355],[-78.42761,2.629556],[-77.931543,2.696606],[-77.510431,3.325017],[-77.12769,3.849636],[-77.496272,4.087606],[-77.307601,4.667984],[-77.533221,5.582812],[-77.318815,5.845354],[-77.476661,6.691116],[-77.881571,7.223771],[-77.753414,7.70984],[-77.431108,7.638061],[-77.242566,7.935278],[-77.474723,8.524286],[-77.353361,8.670505],[-76.836674,8.638749],[-76.086384,9.336821],[-75.6746,9.443248],[-75.664704,9.774003],[-75.480426,10.61899],[-74.906895,11.083045],[-74.276753,11.102036],[-74.197223,11.310473],[-73.414764,11.227015],[-72.627835,11.731972],[-72.238195,11.95555],[-71.75409,12.437303],[-71.399822,12.376041],[-71.137461,12.112982],[-71.331584,11.776284],[-71.973922,11.608672],[-72.227575,11.108702],[-72.614658,10.821975],[-72.905286,10.450344],[-73.027604,9.73677],[-73.304952,9.152],[-72.78873,9.085027],[-72.660495,8.625288],[-72.439862,8.405275],[-72.360901,8.002638],[-72.479679,7.632506],[-72.444487,7.423785],[-72.198352,7.340431],[-71.960176,6.991615],[-70.674234,7.087785],[-70.093313,6.960376],[-69.38948,6.099861],[-68.985319,6.206805],[-68.265052,6.153268],[-67.695087,6.267318],[-67.34144,6.095468],[-67.521532,5.55687],[-67.744697,5.221129],[-67.823012,4.503937],[-67.621836,3.839482],[-67.337564,3.542342],[-67.303173,3.318454],[-67.809938,2.820655],[-67.447092,2.600281],[-67.181294,2.250638],[-66.876326,1.253361]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Panama","SOV_A3":"PAN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Panama","ADM0_A3":"PAN","GEOU_DIF":0,"GEOUNIT":"Panama","GU_A3":"PAN","SU_DIF":0,"SUBUNIT":"Panama","SU_A3":"PAN","BRK_DIFF":0,"NAME":"Panama","NAME_LONG":"Panama","BRK_A3":"PAN","BRK_NAME":"Panama","BRK_GROUP":null,"ABBREV":"Pan.","POSTAL":"PA","FORMAL_EN":"Republic of Panama","FORMAL_FR":null,"NAME_CIAWF":"Panama","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Panama","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":4246439,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":66800,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"PM","ISO_A2":"PA","ISO_A2_EH":"PA","ISO_A3":"PAN","ISO_A3_EH":"PAN","ISO_N3":"591","ISO_N3_EH":"591","UN_A3":"591","WB_A2":"PA","WB_A3":"PAN","WOE_ID":23424924,"WOE_ID_EH":23424924,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PAN","ADM0_DIFF":null,"ADM0_TLC":"PAN","ADM0_A3_US":"PAN","ADM0_A3_FR":"PAN","ADM0_A3_RU":"PAN","ADM0_A3_ES":"PAN","ADM0_A3_CN":"PAN","ADM0_A3_TW":"PAN","ADM0_A3_IN":"PAN","ADM0_A3_NP":"PAN","ADM0_A3_PK":"PAN","ADM0_A3_DE":"PAN","ADM0_A3_GB":"PAN","ADM0_A3_BR":"PAN","ADM0_A3_IL":"PAN","ADM0_A3_PS":"PAN","ADM0_A3_SA":"PAN","ADM0_A3_EG":"PAN","ADM0_A3_MA":"PAN","ADM0_A3_PT":"PAN","ADM0_A3_AR":"PAN","ADM0_A3_JP":"PAN","ADM0_A3_KO":"PAN","ADM0_A3_VN":"PAN","ADM0_A3_TR":"PAN","ADM0_A3_ID":"PAN","ADM0_A3_PL":"PAN","ADM0_A3_GR":"PAN","ADM0_A3_IT":"PAN","ADM0_A3_NL":"PAN","ADM0_A3_SE":"PAN","ADM0_A3_BD":"PAN","ADM0_A3_UA":"PAN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-80.352106,"LABEL_Y":8.72198,"NE_ID":1159321161,"WIKIDATAID":"Q804","NAME_AR":"بنما","NAME_BN":"পানামা","NAME_DE":"Panama","NAME_EN":"Panama","NAME_ES":"Panamá","NAME_FA":"پاناما","NAME_FR":"Panama","NAME_EL":"Παναμάς","NAME_HE":"פנמה","NAME_HI":"पनामा","NAME_HU":"Panama","NAME_ID":"Panama","NAME_IT":"Panama","NAME_JA":"パナマ","NAME_KO":"파나마","NAME_NL":"Panama","NAME_PL":"Panama","NAME_PT":"Panamá","NAME_RU":"Панама","NAME_SV":"Panama","NAME_TR":"Panama","NAME_UK":"Панама","NAME_UR":"پاناما","NAME_VI":"Panama","NAME_ZH":"巴拿马","NAME_ZHT":"巴拿馬","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-82.965783,7.220541,-77.242566,9.61161],"geometry":{"type":"Polygon","coordinates":[[[-77.353361,8.670505],[-77.474723,8.524286],[-77.242566,7.935278],[-77.431108,7.638061],[-77.753414,7.70984],[-77.881571,7.223771],[-78.214936,7.512255],[-78.429161,8.052041],[-78.182096,8.319182],[-78.435465,8.387705],[-78.622121,8.718124],[-79.120307,8.996092],[-79.557877,8.932375],[-79.760578,8.584515],[-80.164481,8.333316],[-80.382659,8.298409],[-80.480689,8.090308],[-80.00369,7.547524],[-80.276671,7.419754],[-80.421158,7.271572],[-80.886401,7.220541],[-81.059543,7.817921],[-81.189716,7.647906],[-81.519515,7.70661],[-81.721311,8.108963],[-82.131441,8.175393],[-82.390934,8.292362],[-82.820081,8.290864],[-82.850958,8.073823],[-82.965783,8.225028],[-82.913176,8.423517],[-82.829771,8.626295],[-82.868657,8.807266],[-82.719183,8.925709],[-82.927155,9.07433],[-82.932891,9.476812],[-82.546196,9.566135],[-82.187123,9.207449],[-82.207586,8.995575],[-81.808567,8.950617],[-81.714154,9.031955],[-81.439287,8.786234],[-80.947302,8.858504],[-80.521901,9.111072],[-79.9146,9.312765],[-79.573303,9.61161],[-79.021192,9.552931],[-79.05845,9.454565],[-78.500888,9.420459],[-78.055928,9.24773],[-77.729514,8.946844],[-77.353361,8.670505]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Costa Rica","SOV_A3":"CRI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Costa Rica","ADM0_A3":"CRI","GEOU_DIF":0,"GEOUNIT":"Costa Rica","GU_A3":"CRI","SU_DIF":0,"SUBUNIT":"Costa Rica","SU_A3":"CRI","BRK_DIFF":0,"NAME":"Costa Rica","NAME_LONG":"Costa Rica","BRK_A3":"CRI","BRK_NAME":"Costa Rica","BRK_GROUP":null,"ABBREV":"C.R.","POSTAL":"CR","FORMAL_EN":"Republic of Costa Rica","FORMAL_FR":null,"NAME_CIAWF":"Costa Rica","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Costa Rica","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":4,"MAPCOLOR13":2,"POP_EST":5047561,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":61801,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"CS","ISO_A2":"CR","ISO_A2_EH":"CR","ISO_A3":"CRI","ISO_A3_EH":"CRI","ISO_N3":"188","ISO_N3_EH":"188","UN_A3":"188","WB_A2":"CR","WB_A3":"CRI","WOE_ID":23424791,"WOE_ID_EH":23424791,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CRI","ADM0_DIFF":null,"ADM0_TLC":"CRI","ADM0_A3_US":"CRI","ADM0_A3_FR":"CRI","ADM0_A3_RU":"CRI","ADM0_A3_ES":"CRI","ADM0_A3_CN":"CRI","ADM0_A3_TW":"CRI","ADM0_A3_IN":"CRI","ADM0_A3_NP":"CRI","ADM0_A3_PK":"CRI","ADM0_A3_DE":"CRI","ADM0_A3_GB":"CRI","ADM0_A3_BR":"CRI","ADM0_A3_IL":"CRI","ADM0_A3_PS":"CRI","ADM0_A3_SA":"CRI","ADM0_A3_EG":"CRI","ADM0_A3_MA":"CRI","ADM0_A3_PT":"CRI","ADM0_A3_AR":"CRI","ADM0_A3_JP":"CRI","ADM0_A3_KO":"CRI","ADM0_A3_VN":"CRI","ADM0_A3_TR":"CRI","ADM0_A3_ID":"CRI","ADM0_A3_PL":"CRI","ADM0_A3_GR":"CRI","ADM0_A3_IT":"CRI","ADM0_A3_NL":"CRI","ADM0_A3_SE":"CRI","ADM0_A3_BD":"CRI","ADM0_A3_UA":"CRI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":8,"LABEL_X":-84.077922,"LABEL_Y":10.0651,"NE_ID":1159320525,"WIKIDATAID":"Q800","NAME_AR":"كوستاريكا","NAME_BN":"কোস্টা রিকা","NAME_DE":"Costa Rica","NAME_EN":"Costa Rica","NAME_ES":"Costa Rica","NAME_FA":"کاستاریکا","NAME_FR":"Costa Rica","NAME_EL":"Κόστα Ρίκα","NAME_HE":"קוסטה ריקה","NAME_HI":"कोस्टा रीका","NAME_HU":"Costa Rica","NAME_ID":"Kosta Rika","NAME_IT":"Costa Rica","NAME_JA":"コスタリカ","NAME_KO":"코스타리카","NAME_NL":"Costa Rica","NAME_PL":"Kostaryka","NAME_PT":"Costa Rica","NAME_RU":"Коста-Рика","NAME_SV":"Costa Rica","NAME_TR":"Kosta Rika","NAME_UK":"Коста-Рика","NAME_UR":"کوسٹاریکا","NAME_VI":"Costa Rica","NAME_ZH":"哥斯达黎加","NAME_ZHT":"哥斯大黎加","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-85.941725,8.225028,-82.546196,11.217119],"geometry":{"type":"Polygon","coordinates":[[[-82.546196,9.566135],[-82.932891,9.476812],[-82.927155,9.07433],[-82.719183,8.925709],[-82.868657,8.807266],[-82.829771,8.626295],[-82.913176,8.423517],[-82.965783,8.225028],[-83.508437,8.446927],[-83.711474,8.656836],[-83.596313,8.830443],[-83.632642,9.051386],[-83.909886,9.290803],[-84.303402,9.487354],[-84.647644,9.615537],[-84.713351,9.908052],[-84.97566,10.086723],[-84.911375,9.795992],[-85.110923,9.55704],[-85.339488,9.834542],[-85.660787,9.933347],[-85.797445,10.134886],[-85.791709,10.439337],[-85.659314,10.754331],[-85.941725,10.895278],[-85.71254,11.088445],[-85.561852,11.217119],[-84.903003,10.952303],[-84.673069,11.082657],[-84.355931,10.999226],[-84.190179,10.79345],[-83.895054,10.726839],[-83.655612,10.938764],[-83.40232,10.395438],[-83.015677,9.992982],[-82.546196,9.566135]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Nicaragua","SOV_A3":"NIC","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Nicaragua","ADM0_A3":"NIC","GEOU_DIF":0,"GEOUNIT":"Nicaragua","GU_A3":"NIC","SU_DIF":0,"SUBUNIT":"Nicaragua","SU_A3":"NIC","BRK_DIFF":0,"NAME":"Nicaragua","NAME_LONG":"Nicaragua","BRK_A3":"NIC","BRK_NAME":"Nicaragua","BRK_GROUP":null,"ABBREV":"Nic.","POSTAL":"NI","FORMAL_EN":"Republic of Nicaragua","FORMAL_FR":null,"NAME_CIAWF":"Nicaragua","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Nicaragua","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":9,"POP_EST":6545502,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":12520,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"NU","ISO_A2":"NI","ISO_A2_EH":"NI","ISO_A3":"NIC","ISO_A3_EH":"NIC","ISO_N3":"558","ISO_N3_EH":"558","UN_A3":"558","WB_A2":"NI","WB_A3":"NIC","WOE_ID":23424915,"WOE_ID_EH":23424915,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"NIC","ADM0_DIFF":null,"ADM0_TLC":"NIC","ADM0_A3_US":"NIC","ADM0_A3_FR":"NIC","ADM0_A3_RU":"NIC","ADM0_A3_ES":"NIC","ADM0_A3_CN":"NIC","ADM0_A3_TW":"NIC","ADM0_A3_IN":"NIC","ADM0_A3_NP":"NIC","ADM0_A3_PK":"NIC","ADM0_A3_DE":"NIC","ADM0_A3_GB":"NIC","ADM0_A3_BR":"NIC","ADM0_A3_IL":"NIC","ADM0_A3_PS":"NIC","ADM0_A3_SA":"NIC","ADM0_A3_EG":"NIC","ADM0_A3_MA":"NIC","ADM0_A3_PT":"NIC","ADM0_A3_AR":"NIC","ADM0_A3_JP":"NIC","ADM0_A3_KO":"NIC","ADM0_A3_VN":"NIC","ADM0_A3_TR":"NIC","ADM0_A3_ID":"NIC","ADM0_A3_PL":"NIC","ADM0_A3_GR":"NIC","ADM0_A3_IT":"NIC","ADM0_A3_NL":"NIC","ADM0_A3_SE":"NIC","ADM0_A3_BD":"NIC","ADM0_A3_UA":"NIC","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-85.069347,"LABEL_Y":12.670697,"NE_ID":1159321091,"WIKIDATAID":"Q811","NAME_AR":"نيكاراغوا","NAME_BN":"নিকারাগুয়া","NAME_DE":"Nicaragua","NAME_EN":"Nicaragua","NAME_ES":"Nicaragua","NAME_FA":"نیکاراگوئه","NAME_FR":"Nicaragua","NAME_EL":"Νικαράγουα","NAME_HE":"ניקרגואה","NAME_HI":"निकारागुआ","NAME_HU":"Nicaragua","NAME_ID":"Nikaragua","NAME_IT":"Nicaragua","NAME_JA":"ニカラグア","NAME_KO":"니카라과","NAME_NL":"Nicaragua","NAME_PL":"Nikaragua","NAME_PT":"Nicarágua","NAME_RU":"Никарагуа","NAME_SV":"Nicaragua","NAME_TR":"Nikaragua","NAME_UK":"Нікарагуа","NAME_UR":"نکاراگوا","NAME_VI":"Nicaragua","NAME_ZH":"尼加拉瓜","NAME_ZHT":"尼加拉瓜","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-87.668493,10.726839,-83.147219,15.016267],"geometry":{"type":"Polygon","coordinates":[[[-83.655612,10.938764],[-83.895054,10.726839],[-84.190179,10.79345],[-84.355931,10.999226],[-84.673069,11.082657],[-84.903003,10.952303],[-85.561852,11.217119],[-85.71254,11.088445],[-86.058488,11.403439],[-86.52585,11.806877],[-86.745992,12.143962],[-87.167516,12.458258],[-87.668493,12.90991],[-87.557467,13.064552],[-87.392386,12.914018],[-87.316654,12.984686],[-87.005769,13.025794],[-86.880557,13.254204],[-86.733822,13.263093],[-86.755087,13.754845],[-86.520708,13.778487],[-86.312142,13.771356],[-86.096264,14.038187],[-85.801295,13.836055],[-85.698665,13.960078],[-85.514413,14.079012],[-85.165365,14.35437],[-85.148751,14.560197],[-85.052787,14.551541],[-84.924501,14.790493],[-84.820037,14.819587],[-84.649582,14.666805],[-84.449336,14.621614],[-84.228342,14.748764],[-83.975721,14.749436],[-83.628585,14.880074],[-83.489989,15.016267],[-83.147219,14.995829],[-83.233234,14.899866],[-83.284162,14.676624],[-83.182126,14.310703],[-83.4125,13.970078],[-83.519832,13.567699],[-83.552207,13.127054],[-83.498515,12.869292],[-83.473323,12.419087],[-83.626104,12.32085],[-83.719613,11.893124],[-83.650858,11.629032],[-83.85547,11.373311],[-83.808936,11.103044],[-83.655612,10.938764]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Honduras","SOV_A3":"HND","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Honduras","ADM0_A3":"HND","GEOU_DIF":0,"GEOUNIT":"Honduras","GU_A3":"HND","SU_DIF":0,"SUBUNIT":"Honduras","SU_A3":"HND","BRK_DIFF":0,"NAME":"Honduras","NAME_LONG":"Honduras","BRK_A3":"HND","BRK_NAME":"Honduras","BRK_GROUP":null,"ABBREV":"Hond.","POSTAL":"HN","FORMAL_EN":"Republic of Honduras","FORMAL_FR":null,"NAME_CIAWF":"Honduras","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Honduras","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":9746117,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":25095,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"HO","ISO_A2":"HN","ISO_A2_EH":"HN","ISO_A3":"HND","ISO_A3_EH":"HND","ISO_N3":"340","ISO_N3_EH":"340","UN_A3":"340","WB_A2":"HN","WB_A3":"HND","WOE_ID":23424841,"WOE_ID_EH":23424841,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"HND","ADM0_DIFF":null,"ADM0_TLC":"HND","ADM0_A3_US":"HND","ADM0_A3_FR":"HND","ADM0_A3_RU":"HND","ADM0_A3_ES":"HND","ADM0_A3_CN":"HND","ADM0_A3_TW":"HND","ADM0_A3_IN":"HND","ADM0_A3_NP":"HND","ADM0_A3_PK":"HND","ADM0_A3_DE":"HND","ADM0_A3_GB":"HND","ADM0_A3_BR":"HND","ADM0_A3_IL":"HND","ADM0_A3_PS":"HND","ADM0_A3_SA":"HND","ADM0_A3_EG":"HND","ADM0_A3_MA":"HND","ADM0_A3_PT":"HND","ADM0_A3_AR":"HND","ADM0_A3_JP":"HND","ADM0_A3_KO":"HND","ADM0_A3_VN":"HND","ADM0_A3_TR":"HND","ADM0_A3_ID":"HND","ADM0_A3_PL":"HND","ADM0_A3_GR":"HND","ADM0_A3_IT":"HND","ADM0_A3_NL":"HND","ADM0_A3_SE":"HND","ADM0_A3_BD":"HND","ADM0_A3_UA":"HND","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5,"LABEL_X":-86.887604,"LABEL_Y":14.794801,"NE_ID":1159320827,"WIKIDATAID":"Q783","NAME_AR":"هندوراس","NAME_BN":"হন্ডুরাস","NAME_DE":"Honduras","NAME_EN":"Honduras","NAME_ES":"Honduras","NAME_FA":"هندوراس","NAME_FR":"Honduras","NAME_EL":"Ονδούρα","NAME_HE":"הונדורס","NAME_HI":"हौण्डुरस","NAME_HU":"Honduras","NAME_ID":"Honduras","NAME_IT":"Honduras","NAME_JA":"ホンジュラス","NAME_KO":"온두라스","NAME_NL":"Honduras","NAME_PL":"Honduras","NAME_PT":"Honduras","NAME_RU":"Гондурас","NAME_SV":"Honduras","NAME_TR":"Honduras","NAME_UK":"Гондурас","NAME_UR":"ہونڈوراس","NAME_VI":"Honduras","NAME_ZH":"洪都拉斯","NAME_ZHT":"宏都拉斯","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-89.353326,12.984686,-83.147219,16.005406],"geometry":{"type":"Polygon","coordinates":[[[-83.147219,14.995829],[-83.489989,15.016267],[-83.628585,14.880074],[-83.975721,14.749436],[-84.228342,14.748764],[-84.449336,14.621614],[-84.649582,14.666805],[-84.820037,14.819587],[-84.924501,14.790493],[-85.052787,14.551541],[-85.148751,14.560197],[-85.165365,14.35437],[-85.514413,14.079012],[-85.698665,13.960078],[-85.801295,13.836055],[-86.096264,14.038187],[-86.312142,13.771356],[-86.520708,13.778487],[-86.755087,13.754845],[-86.733822,13.263093],[-86.880557,13.254204],[-87.005769,13.025794],[-87.316654,12.984686],[-87.489409,13.297535],[-87.793111,13.38448],[-87.723503,13.78505],[-87.859515,13.893312],[-88.065343,13.964626],[-88.503998,13.845486],[-88.541231,13.980155],[-88.843073,14.140507],[-89.058512,14.340029],[-89.353326,14.424133],[-89.145535,14.678019],[-89.22522,14.874286],[-89.154811,15.066419],[-88.68068,15.346247],[-88.225023,15.727722],[-88.121153,15.688655],[-87.901813,15.864458],[-87.61568,15.878799],[-87.522921,15.797279],[-87.367762,15.84694],[-86.903191,15.756713],[-86.440946,15.782835],[-86.119234,15.893449],[-86.001954,16.005406],[-85.683317,15.953652],[-85.444004,15.885749],[-85.182444,15.909158],[-84.983722,15.995923],[-84.52698,15.857224],[-84.368256,15.835158],[-84.063055,15.648244],[-83.773977,15.424072],[-83.410381,15.270903],[-83.147219,14.995829]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"El Salvador","SOV_A3":"SLV","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"El Salvador","ADM0_A3":"SLV","GEOU_DIF":0,"GEOUNIT":"El Salvador","GU_A3":"SLV","SU_DIF":0,"SUBUNIT":"El Salvador","SU_A3":"SLV","BRK_DIFF":0,"NAME":"El Salvador","NAME_LONG":"El Salvador","BRK_A3":"SLV","BRK_NAME":"El Salvador","BRK_GROUP":null,"ABBREV":"El. S.","POSTAL":"SV","FORMAL_EN":"Republic of El Salvador","FORMAL_FR":null,"NAME_CIAWF":"El Salvador","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"El Salvador","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":6,"MAPCOLOR13":8,"POP_EST":6453553,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":27022,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"ES","ISO_A2":"SV","ISO_A2_EH":"SV","ISO_A3":"SLV","ISO_A3_EH":"SLV","ISO_N3":"222","ISO_N3_EH":"222","UN_A3":"222","WB_A2":"SV","WB_A3":"SLV","WOE_ID":23424807,"WOE_ID_EH":23424807,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SLV","ADM0_DIFF":null,"ADM0_TLC":"SLV","ADM0_A3_US":"SLV","ADM0_A3_FR":"SLV","ADM0_A3_RU":"SLV","ADM0_A3_ES":"SLV","ADM0_A3_CN":"SLV","ADM0_A3_TW":"SLV","ADM0_A3_IN":"SLV","ADM0_A3_NP":"SLV","ADM0_A3_PK":"SLV","ADM0_A3_DE":"SLV","ADM0_A3_GB":"SLV","ADM0_A3_BR":"SLV","ADM0_A3_IL":"SLV","ADM0_A3_PS":"SLV","ADM0_A3_SA":"SLV","ADM0_A3_EG":"SLV","ADM0_A3_MA":"SLV","ADM0_A3_PT":"SLV","ADM0_A3_AR":"SLV","ADM0_A3_JP":"SLV","ADM0_A3_KO":"SLV","ADM0_A3_VN":"SLV","ADM0_A3_TR":"SLV","ADM0_A3_ID":"SLV","ADM0_A3_PL":"SLV","ADM0_A3_GR":"SLV","ADM0_A3_IT":"SLV","ADM0_A3_NL":"SLV","ADM0_A3_SE":"SLV","ADM0_A3_BD":"SLV","ADM0_A3_UA":"SLV","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":-88.890124,"LABEL_Y":13.685371,"NE_ID":1159321253,"WIKIDATAID":"Q792","NAME_AR":"السلفادور","NAME_BN":"এল সালভাদোর","NAME_DE":"El Salvador","NAME_EN":"El Salvador","NAME_ES":"El Salvador","NAME_FA":"السالوادور","NAME_FR":"Salvador","NAME_EL":"Ελ Σαλβαδόρ","NAME_HE":"אל סלוודור","NAME_HI":"अल साल्वाडोर","NAME_HU":"Salvador","NAME_ID":"El Salvador","NAME_IT":"El Salvador","NAME_JA":"エルサルバドル","NAME_KO":"엘살바도르","NAME_NL":"El Salvador","NAME_PL":"Salwador","NAME_PT":"El Salvador","NAME_RU":"Сальвадор","NAME_SV":"El Salvador","NAME_TR":"El Salvador","NAME_UK":"Сальвадор","NAME_UR":"ایل سیلواڈور","NAME_VI":"El Salvador","NAME_ZH":"萨尔瓦多","NAME_ZHT":"薩爾瓦多","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-90.095555,13.149017,-87.723503,14.424133],"geometry":{"type":"Polygon","coordinates":[[[-89.353326,14.424133],[-89.058512,14.340029],[-88.843073,14.140507],[-88.541231,13.980155],[-88.503998,13.845486],[-88.065343,13.964626],[-87.859515,13.893312],[-87.723503,13.78505],[-87.793111,13.38448],[-87.904112,13.149017],[-88.483302,13.163951],[-88.843228,13.259734],[-89.256743,13.458533],[-89.812394,13.520622],[-90.095555,13.735338],[-90.064678,13.88197],[-89.721934,14.134228],[-89.534219,14.244816],[-89.587343,14.362586],[-89.353326,14.424133]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Guatemala","SOV_A3":"GTM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Guatemala","ADM0_A3":"GTM","GEOU_DIF":0,"GEOUNIT":"Guatemala","GU_A3":"GTM","SU_DIF":0,"SUBUNIT":"Guatemala","SU_A3":"GTM","BRK_DIFF":0,"NAME":"Guatemala","NAME_LONG":"Guatemala","BRK_A3":"GTM","BRK_NAME":"Guatemala","BRK_GROUP":null,"ABBREV":"Guat.","POSTAL":"GT","FORMAL_EN":"Republic of Guatemala","FORMAL_FR":null,"NAME_CIAWF":"Guatemala","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Guatemala","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":6,"POP_EST":16604026,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":76710,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"GT","ISO_A2":"GT","ISO_A2_EH":"GT","ISO_A3":"GTM","ISO_A3_EH":"GTM","ISO_N3":"320","ISO_N3_EH":"320","UN_A3":"320","WB_A2":"GT","WB_A3":"GTM","WOE_ID":23424834,"WOE_ID_EH":23424834,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GTM","ADM0_DIFF":null,"ADM0_TLC":"GTM","ADM0_A3_US":"GTM","ADM0_A3_FR":"GTM","ADM0_A3_RU":"GTM","ADM0_A3_ES":"GTM","ADM0_A3_CN":"GTM","ADM0_A3_TW":"GTM","ADM0_A3_IN":"GTM","ADM0_A3_NP":"GTM","ADM0_A3_PK":"GTM","ADM0_A3_DE":"GTM","ADM0_A3_GB":"GTM","ADM0_A3_BR":"GTM","ADM0_A3_IL":"GTM","ADM0_A3_PS":"GTM","ADM0_A3_SA":"GTM","ADM0_A3_EG":"GTM","ADM0_A3_MA":"GTM","ADM0_A3_PT":"GTM","ADM0_A3_AR":"GTM","ADM0_A3_JP":"GTM","ADM0_A3_KO":"GTM","ADM0_A3_VN":"GTM","ADM0_A3_TR":"GTM","ADM0_A3_ID":"GTM","ADM0_A3_PL":"GTM","ADM0_A3_GR":"GTM","ADM0_A3_IT":"GTM","ADM0_A3_NL":"GTM","ADM0_A3_SE":"GTM","ADM0_A3_BD":"GTM","ADM0_A3_UA":"GTM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":5,"TINY":4,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-90.497134,"LABEL_Y":14.982133,"NE_ID":1159320815,"WIKIDATAID":"Q774","NAME_AR":"غواتيمالا","NAME_BN":"গুয়াতেমালা","NAME_DE":"Guatemala","NAME_EN":"Guatemala","NAME_ES":"Guatemala","NAME_FA":"گواتمالا","NAME_FR":"Guatemala","NAME_EL":"Γουατεμάλα","NAME_HE":"גואטמלה","NAME_HI":"ग्वाटेमाला","NAME_HU":"Guatemala","NAME_ID":"Guatemala","NAME_IT":"Guatemala","NAME_JA":"グアテマラ","NAME_KO":"과테말라","NAME_NL":"Guatemala","NAME_PL":"Gwatemala","NAME_PT":"Guatemala","NAME_RU":"Гватемала","NAME_SV":"Guatemala","NAME_TR":"Guatemala","NAME_UK":"Гватемала","NAME_UR":"گواتیمالا","NAME_VI":"Guatemala","NAME_ZH":"危地马拉","NAME_ZHT":"瓜地馬拉","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-92.229249,13.735338,-88.225023,17.819326],"geometry":{"type":"Polygon","coordinates":[[[-92.22775,14.538829],[-92.20323,14.830103],[-92.087216,15.064585],[-92.229249,15.251447],[-91.74796,16.066565],[-90.464473,16.069562],[-90.438867,16.41011],[-90.600847,16.470778],[-90.711822,16.687483],[-91.08167,16.918477],[-91.453921,17.252177],[-91.002269,17.254658],[-91.00152,17.817595],[-90.067934,17.819326],[-89.14308,17.808319],[-89.150806,17.015577],[-89.229122,15.886938],[-88.930613,15.887273],[-88.604586,15.70638],[-88.518364,15.855389],[-88.225023,15.727722],[-88.68068,15.346247],[-89.154811,15.066419],[-89.22522,14.874286],[-89.145535,14.678019],[-89.353326,14.424133],[-89.587343,14.362586],[-89.534219,14.244816],[-89.721934,14.134228],[-90.064678,13.88197],[-90.095555,13.735338],[-90.608624,13.909771],[-91.23241,13.927832],[-91.689747,14.126218],[-92.22775,14.538829]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Belize","SOV_A3":"BLZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Belize","ADM0_A3":"BLZ","GEOU_DIF":0,"GEOUNIT":"Belize","GU_A3":"BLZ","SU_DIF":0,"SUBUNIT":"Belize","SU_A3":"BLZ","BRK_DIFF":0,"NAME":"Belize","NAME_LONG":"Belize","BRK_A3":"BLZ","BRK_NAME":"Belize","BRK_GROUP":null,"ABBREV":"Belize","POSTAL":"BZ","FORMAL_EN":"Belize","FORMAL_FR":null,"NAME_CIAWF":"Belize","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Belize","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":5,"MAPCOLOR13":7,"POP_EST":390353,"POP_RANK":10,"POP_YEAR":2019,"GDP_MD":1879,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"BH","ISO_A2":"BZ","ISO_A2_EH":"BZ","ISO_A3":"BLZ","ISO_A3_EH":"BLZ","ISO_N3":"084","ISO_N3_EH":"084","UN_A3":"084","WB_A2":"BZ","WB_A3":"BLZ","WOE_ID":23424760,"WOE_ID_EH":23424760,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BLZ","ADM0_DIFF":null,"ADM0_TLC":"BLZ","ADM0_A3_US":"BLZ","ADM0_A3_FR":"BLZ","ADM0_A3_RU":"BLZ","ADM0_A3_ES":"BLZ","ADM0_A3_CN":"BLZ","ADM0_A3_TW":"BLZ","ADM0_A3_IN":"BLZ","ADM0_A3_NP":"BLZ","ADM0_A3_PK":"BLZ","ADM0_A3_DE":"BLZ","ADM0_A3_GB":"BLZ","ADM0_A3_BR":"BLZ","ADM0_A3_IL":"BLZ","ADM0_A3_PS":"BLZ","ADM0_A3_SA":"BLZ","ADM0_A3_EG":"BLZ","ADM0_A3_MA":"BLZ","ADM0_A3_PT":"BLZ","ADM0_A3_AR":"BLZ","ADM0_A3_JP":"BLZ","ADM0_A3_KO":"BLZ","ADM0_A3_VN":"BLZ","ADM0_A3_TR":"BLZ","ADM0_A3_ID":"BLZ","ADM0_A3_PL":"BLZ","ADM0_A3_GR":"BLZ","ADM0_A3_IT":"BLZ","ADM0_A3_NL":"BLZ","ADM0_A3_SE":"BLZ","ADM0_A3_BD":"BLZ","ADM0_A3_UA":"BLZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":-88.712962,"LABEL_Y":17.202068,"NE_ID":1159320431,"WIKIDATAID":"Q242","NAME_AR":"بليز","NAME_BN":"বেলিজ","NAME_DE":"Belize","NAME_EN":"Belize","NAME_ES":"Belice","NAME_FA":"بلیز","NAME_FR":"Belize","NAME_EL":"Μπελίζ","NAME_HE":"בליז","NAME_HI":"बेलीज़","NAME_HU":"Belize","NAME_ID":"Belize","NAME_IT":"Belize","NAME_JA":"ベリーズ","NAME_KO":"벨리즈","NAME_NL":"Belize","NAME_PL":"Belize","NAME_PT":"Belize","NAME_RU":"Белиз","NAME_SV":"Belize","NAME_TR":"Belize","NAME_UK":"Беліз","NAME_UR":"بیلیز","NAME_VI":"Belize","NAME_ZH":"伯利兹","NAME_ZHT":"貝里斯","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-89.229122,15.886938,-88.106813,18.499982],"geometry":{"type":"Polygon","coordinates":[[[-89.14308,17.808319],[-89.150909,17.955468],[-89.029857,18.001511],[-88.848344,17.883198],[-88.490123,18.486831],[-88.300031,18.499982],[-88.296336,18.353273],[-88.106813,18.348674],[-88.123479,18.076675],[-88.285355,17.644143],[-88.197867,17.489475],[-88.302641,17.131694],[-88.239518,17.036066],[-88.355428,16.530774],[-88.551825,16.265467],[-88.732434,16.233635],[-88.930613,15.887273],[-89.229122,15.886938],[-89.150806,17.015577],[-89.14308,17.808319]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Venezuela","SOV_A3":"VEN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Venezuela","ADM0_A3":"VEN","GEOU_DIF":0,"GEOUNIT":"Venezuela","GU_A3":"VEN","SU_DIF":0,"SUBUNIT":"Venezuela","SU_A3":"VEN","BRK_DIFF":0,"NAME":"Venezuela","NAME_LONG":"Venezuela","BRK_A3":"VEN","BRK_NAME":"Venezuela","BRK_GROUP":null,"ABBREV":"Ven.","POSTAL":"VE","FORMAL_EN":"Bolivarian Republic of Venezuela","FORMAL_FR":"República Bolivariana de Venezuela","NAME_CIAWF":"Venezuela","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Venezuela, RB","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":3,"MAPCOLOR9":1,"MAPCOLOR13":4,"POP_EST":28515829,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":482359,"GDP_YEAR":2014,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"VE","ISO_A2":"VE","ISO_A2_EH":"VE","ISO_A3":"VEN","ISO_A3_EH":"VEN","ISO_N3":"862","ISO_N3_EH":"862","UN_A3":"862","WB_A2":"VE","WB_A3":"VEN","WOE_ID":23424982,"WOE_ID_EH":23424982,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"VEN","ADM0_DIFF":null,"ADM0_TLC":"VEN","ADM0_A3_US":"VEN","ADM0_A3_FR":"VEN","ADM0_A3_RU":"VEN","ADM0_A3_ES":"VEN","ADM0_A3_CN":"VEN","ADM0_A3_TW":"VEN","ADM0_A3_IN":"VEN","ADM0_A3_NP":"VEN","ADM0_A3_PK":"VEN","ADM0_A3_DE":"VEN","ADM0_A3_GB":"VEN","ADM0_A3_BR":"VEN","ADM0_A3_IL":"VEN","ADM0_A3_PS":"VEN","ADM0_A3_SA":"VEN","ADM0_A3_EG":"VEN","ADM0_A3_MA":"VEN","ADM0_A3_PT":"VEN","ADM0_A3_AR":"VEN","ADM0_A3_JP":"VEN","ADM0_A3_KO":"VEN","ADM0_A3_VN":"VEN","ADM0_A3_TR":"VEN","ADM0_A3_ID":"VEN","ADM0_A3_PL":"VEN","ADM0_A3_GR":"VEN","ADM0_A3_IT":"VEN","ADM0_A3_NL":"VEN","ADM0_A3_SE":"VEN","ADM0_A3_BD":"VEN","ADM0_A3_UA":"VEN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":7.5,"LABEL_X":-64.599381,"LABEL_Y":7.182476,"NE_ID":1159321411,"WIKIDATAID":"Q717","NAME_AR":"فنزويلا","NAME_BN":"ভেনেজুয়েলা","NAME_DE":"Venezuela","NAME_EN":"Venezuela","NAME_ES":"Venezuela","NAME_FA":"ونزوئلا","NAME_FR":"Venezuela","NAME_EL":"Βενεζουέλα","NAME_HE":"ונצואלה","NAME_HI":"वेनेज़ुएला","NAME_HU":"Venezuela","NAME_ID":"Venezuela","NAME_IT":"Venezuela","NAME_JA":"ベネズエラ","NAME_KO":"베네수엘라","NAME_NL":"Venezuela","NAME_PL":"Wenezuela","NAME_PT":"Venezuela","NAME_RU":"Венесуэла","NAME_SV":"Venezuela","NAME_TR":"Venezuela","NAME_UK":"Венесуела","NAME_UR":"وینیزویلا","NAME_VI":"Venezuela","NAME_ZH":"委内瑞拉","NAME_ZHT":"委內瑞拉","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-73.304952,0.724452,-59.758285,12.162307],"geometry":{"type":"Polygon","coordinates":[[[-60.733574,5.200277],[-60.601179,4.918098],[-60.966893,4.536468],[-62.08543,4.162124],[-62.804533,4.006965],[-63.093198,3.770571],[-63.888343,4.02053],[-64.628659,4.148481],[-64.816064,4.056445],[-64.368494,3.79721],[-64.408828,3.126786],[-64.269999,2.497006],[-63.422867,2.411068],[-63.368788,2.2009],[-64.083085,1.916369],[-64.199306,1.492855],[-64.611012,1.328731],[-65.354713,1.095282],[-65.548267,0.789254],[-66.325765,0.724452],[-66.876326,1.253361],[-67.181294,2.250638],[-67.447092,2.600281],[-67.809938,2.820655],[-67.303173,3.318454],[-67.337564,3.542342],[-67.621836,3.839482],[-67.823012,4.503937],[-67.744697,5.221129],[-67.521532,5.55687],[-67.34144,6.095468],[-67.695087,6.267318],[-68.265052,6.153268],[-68.985319,6.206805],[-69.38948,6.099861],[-70.093313,6.960376],[-70.674234,7.087785],[-71.960176,6.991615],[-72.198352,7.340431],[-72.444487,7.423785],[-72.479679,7.632506],[-72.360901,8.002638],[-72.439862,8.405275],[-72.660495,8.625288],[-72.78873,9.085027],[-73.304952,9.152],[-73.027604,9.73677],[-72.905286,10.450344],[-72.614658,10.821975],[-72.227575,11.108702],[-71.973922,11.608672],[-71.331584,11.776284],[-71.360006,11.539994],[-71.94705,11.423282],[-71.620868,10.96946],[-71.633064,10.446494],[-72.074174,9.865651],[-71.695644,9.072263],[-71.264559,9.137195],[-71.039999,9.859993],[-71.350084,10.211935],[-71.400623,10.968969],[-70.155299,11.375482],[-70.293843,11.846822],[-69.943245,12.162307],[-69.5843,11.459611],[-68.882999,11.443385],[-68.233271,10.885744],[-68.194127,10.554653],[-67.296249,10.545868],[-66.227864,10.648627],[-65.655238,10.200799],[-64.890452,10.077215],[-64.329479,10.389599],[-64.318007,10.641418],[-63.079322,10.701724],[-61.880946,10.715625],[-62.730119,10.420269],[-62.388512,9.948204],[-61.588767,9.873067],[-60.830597,9.38134],[-60.671252,8.580174],[-60.150096,8.602757],[-59.758285,8.367035],[-60.550588,7.779603],[-60.637973,7.415],[-60.295668,7.043911],[-60.543999,6.856584],[-61.159336,6.696077],[-61.139415,6.234297],[-61.410303,5.959068],[-60.733574,5.200277]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Guyana","SOV_A3":"GUY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Guyana","ADM0_A3":"GUY","GEOU_DIF":0,"GEOUNIT":"Guyana","GU_A3":"GUY","SU_DIF":0,"SUBUNIT":"Guyana","SU_A3":"GUY","BRK_DIFF":0,"NAME":"Guyana","NAME_LONG":"Guyana","BRK_A3":"GUY","BRK_NAME":"Guyana","BRK_GROUP":null,"ABBREV":"Guy.","POSTAL":"GY","FORMAL_EN":"Co-operative Republic of Guyana","FORMAL_FR":null,"NAME_CIAWF":"Guyana","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Guyana","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":8,"POP_EST":782766,"POP_RANK":11,"POP_YEAR":2019,"GDP_MD":5173,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"GY","ISO_A2":"GY","ISO_A2_EH":"GY","ISO_A3":"GUY","ISO_A3_EH":"GUY","ISO_N3":"328","ISO_N3_EH":"328","UN_A3":"328","WB_A2":"GY","WB_A3":"GUY","WOE_ID":23424836,"WOE_ID_EH":23424836,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GUY","ADM0_DIFF":null,"ADM0_TLC":"GUY","ADM0_A3_US":"GUY","ADM0_A3_FR":"GUY","ADM0_A3_RU":"GUY","ADM0_A3_ES":"GUY","ADM0_A3_CN":"GUY","ADM0_A3_TW":"GUY","ADM0_A3_IN":"GUY","ADM0_A3_NP":"GUY","ADM0_A3_PK":"GUY","ADM0_A3_DE":"GUY","ADM0_A3_GB":"GUY","ADM0_A3_BR":"GUY","ADM0_A3_IL":"GUY","ADM0_A3_PS":"GUY","ADM0_A3_SA":"GUY","ADM0_A3_EG":"GUY","ADM0_A3_MA":"GUY","ADM0_A3_PT":"GUY","ADM0_A3_AR":"GUY","ADM0_A3_JP":"GUY","ADM0_A3_KO":"GUY","ADM0_A3_VN":"GUY","ADM0_A3_TR":"GUY","ADM0_A3_ID":"GUY","ADM0_A3_PL":"GUY","ADM0_A3_GR":"GUY","ADM0_A3_IT":"GUY","ADM0_A3_NL":"GUY","ADM0_A3_SE":"GUY","ADM0_A3_BD":"GUY","ADM0_A3_UA":"GUY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-58.942643,"LABEL_Y":5.124317,"NE_ID":1159320817,"WIKIDATAID":"Q734","NAME_AR":"غيانا","NAME_BN":"গায়ানা","NAME_DE":"Guyana","NAME_EN":"Guyana","NAME_ES":"Guyana","NAME_FA":"گویان","NAME_FR":"Guyana","NAME_EL":"Γουιάνα","NAME_HE":"גיאנה","NAME_HI":"गयाना","NAME_HU":"Guyana","NAME_ID":"Guyana","NAME_IT":"Guyana","NAME_JA":"ガイアナ","NAME_KO":"가이아나","NAME_NL":"Guyana","NAME_PL":"Gujana","NAME_PT":"Guiana","NAME_RU":"Гайана","NAME_SV":"Guyana","NAME_TR":"Guyana","NAME_UK":"Гаяна","NAME_UR":"گیانا","NAME_VI":"Guyana","NAME_ZH":"圭亚那","NAME_ZHT":"圭亞那","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-61.410303,1.268088,-56.539386,8.367035],"geometry":{"type":"Polygon","coordinates":[[[-56.539386,1.899523],[-56.782704,1.863711],[-57.335823,1.948538],[-57.660971,1.682585],[-58.11345,1.507195],[-58.429477,1.463942],[-58.540013,1.268088],[-59.030862,1.317698],[-59.646044,1.786894],[-59.718546,2.24963],[-59.974525,2.755233],[-59.815413,3.606499],[-59.53804,3.958803],[-59.767406,4.423503],[-60.111002,4.574967],[-59.980959,5.014061],[-60.213683,5.244486],[-60.733574,5.200277],[-61.410303,5.959068],[-61.139415,6.234297],[-61.159336,6.696077],[-60.543999,6.856584],[-60.295668,7.043911],[-60.637973,7.415],[-60.550588,7.779603],[-59.758285,8.367035],[-59.101684,7.999202],[-58.482962,7.347691],[-58.454876,6.832787],[-58.078103,6.809094],[-57.542219,6.321268],[-57.147436,5.97315],[-57.307246,5.073567],[-57.914289,4.812626],[-57.86021,4.576801],[-58.044694,4.060864],[-57.601569,3.334655],[-57.281433,3.333492],[-57.150098,2.768927],[-56.539386,1.899523]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Suriname","SOV_A3":"SUR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Suriname","ADM0_A3":"SUR","GEOU_DIF":0,"GEOUNIT":"Suriname","GU_A3":"SUR","SU_DIF":0,"SUBUNIT":"Suriname","SU_A3":"SUR","BRK_DIFF":0,"NAME":"Suriname","NAME_LONG":"Suriname","BRK_A3":"SUR","BRK_NAME":"Suriname","BRK_GROUP":null,"ABBREV":"Sur.","POSTAL":"SR","FORMAL_EN":"Republic of Suriname","FORMAL_FR":null,"NAME_CIAWF":"Suriname","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Suriname","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":7,"MAPCOLOR13":6,"POP_EST":581363,"POP_RANK":11,"POP_YEAR":2019,"GDP_MD":3697,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"NS","ISO_A2":"SR","ISO_A2_EH":"SR","ISO_A3":"SUR","ISO_A3_EH":"SUR","ISO_N3":"740","ISO_N3_EH":"740","UN_A3":"740","WB_A2":"SR","WB_A3":"SUR","WOE_ID":23424913,"WOE_ID_EH":23424913,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SUR","ADM0_DIFF":null,"ADM0_TLC":"SUR","ADM0_A3_US":"SUR","ADM0_A3_FR":"SUR","ADM0_A3_RU":"SUR","ADM0_A3_ES":"SUR","ADM0_A3_CN":"SUR","ADM0_A3_TW":"SUR","ADM0_A3_IN":"SUR","ADM0_A3_NP":"SUR","ADM0_A3_PK":"SUR","ADM0_A3_DE":"SUR","ADM0_A3_GB":"SUR","ADM0_A3_BR":"SUR","ADM0_A3_IL":"SUR","ADM0_A3_PS":"SUR","ADM0_A3_SA":"SUR","ADM0_A3_EG":"SUR","ADM0_A3_MA":"SUR","ADM0_A3_PT":"SUR","ADM0_A3_AR":"SUR","ADM0_A3_JP":"SUR","ADM0_A3_KO":"SUR","ADM0_A3_VN":"SUR","ADM0_A3_TR":"SUR","ADM0_A3_ID":"SUR","ADM0_A3_PL":"SUR","ADM0_A3_GR":"SUR","ADM0_A3_IT":"SUR","ADM0_A3_NL":"SUR","ADM0_A3_SE":"SUR","ADM0_A3_BD":"SUR","ADM0_A3_UA":"SUR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-55.91094,"LABEL_Y":4.143987,"NE_ID":1159321281,"WIKIDATAID":"Q730","NAME_AR":"سورينام","NAME_BN":"সুরিনাম","NAME_DE":"Suriname","NAME_EN":"Suriname","NAME_ES":"Surinam","NAME_FA":"سورینام","NAME_FR":"Suriname","NAME_EL":"Σουρινάμ","NAME_HE":"סורינאם","NAME_HI":"सूरीनाम","NAME_HU":"Suriname","NAME_ID":"Suriname","NAME_IT":"Suriname","NAME_JA":"スリナム","NAME_KO":"수리남","NAME_NL":"Suriname","NAME_PL":"Surinam","NAME_PT":"Suriname","NAME_RU":"Суринам","NAME_SV":"Surinam","NAME_TR":"Surinam","NAME_UK":"Суринам","NAME_UR":"سرینام","NAME_VI":"Suriname","NAME_ZH":"苏里南","NAME_ZHT":"蘇利南","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-58.044694,1.817667,-53.958045,6.025291],"geometry":{"type":"Polygon","coordinates":[[[-54.524754,2.311849],[-55.097587,2.523748],[-55.569755,2.421506],[-55.973322,2.510364],[-56.073342,2.220795],[-55.9056,2.021996],[-55.995698,1.817667],[-56.539386,1.899523],[-57.150098,2.768927],[-57.281433,3.333492],[-57.601569,3.334655],[-58.044694,4.060864],[-57.86021,4.576801],[-57.914289,4.812626],[-57.307246,5.073567],[-57.147436,5.97315],[-55.949318,5.772878],[-55.84178,5.953125],[-55.03325,6.025291],[-53.958045,5.756548],[-54.478633,4.896756],[-54.399542,4.212611],[-54.006931,3.620038],[-54.181726,3.18978],[-54.269705,2.732392],[-54.524754,2.311849]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"France","SOV_A3":"FR1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"France","ADM0_A3":"FRA","GEOU_DIF":0,"GEOUNIT":"France","GU_A3":"FRA","SU_DIF":0,"SUBUNIT":"France","SU_A3":"FRA","BRK_DIFF":0,"NAME":"France","NAME_LONG":"France","BRK_A3":"FRA","BRK_NAME":"France","BRK_GROUP":null,"ABBREV":"Fr.","POSTAL":"F","FORMAL_EN":"French Republic","FORMAL_FR":null,"NAME_CIAWF":"France","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"France","NAME_ALT":null,"MAPCOLOR7":7,"MAPCOLOR8":5,"MAPCOLOR9":9,"MAPCOLOR13":11,"POP_EST":67059887,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":2715518,"GDP_YEAR":2019,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","FIPS_10":"FR","ISO_A2":"-99","ISO_A2_EH":"FR","ISO_A3":"-99","ISO_A3_EH":"FRA","ISO_N3":"-99","ISO_N3_EH":"250","UN_A3":"250","WB_A2":"FR","WB_A3":"FRA","WOE_ID":-90,"WOE_ID_EH":23424819,"WOE_NOTE":"Includes only Metropolitan France (including Corsica)","ADM0_ISO":"FRA","ADM0_DIFF":null,"ADM0_TLC":"FRA","ADM0_A3_US":"FRA","ADM0_A3_FR":"FRA","ADM0_A3_RU":"FRA","ADM0_A3_ES":"FRA","ADM0_A3_CN":"FRA","ADM0_A3_TW":"FRA","ADM0_A3_IN":"FRA","ADM0_A3_NP":"FRA","ADM0_A3_PK":"FRA","ADM0_A3_DE":"FRA","ADM0_A3_GB":"FRA","ADM0_A3_BR":"FRA","ADM0_A3_IL":"FRA","ADM0_A3_PS":"FRA","ADM0_A3_SA":"FRA","ADM0_A3_EG":"FRA","ADM0_A3_MA":"FRA","ADM0_A3_PT":"FRA","ADM0_A3_AR":"FRA","ADM0_A3_JP":"FRA","ADM0_A3_KO":"FRA","ADM0_A3_VN":"FRA","ADM0_A3_TR":"FRA","ADM0_A3_ID":"FRA","ADM0_A3_PL":"FRA","ADM0_A3_GR":"FRA","ADM0_A3_IT":"FRA","ADM0_A3_NL":"FRA","ADM0_A3_SE":"FRA","ADM0_A3_BD":"FRA","ADM0_A3_UA":"FRA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":3,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":2.552275,"LABEL_Y":46.696113,"NE_ID":1159320637,"WIKIDATAID":"Q142","NAME_AR":"فرنسا","NAME_BN":"ফ্রান্স","NAME_DE":"Frankreich","NAME_EN":"France","NAME_ES":"Francia","NAME_FA":"فرانسه","NAME_FR":"France","NAME_EL":"Γαλλία","NAME_HE":"צרפת","NAME_HI":"फ़्रान्स","NAME_HU":"Franciaország","NAME_ID":"Prancis","NAME_IT":"Francia","NAME_JA":"フランス","NAME_KO":"프랑스","NAME_NL":"Frankrijk","NAME_PL":"Francja","NAME_PT":"França","NAME_RU":"Франция","NAME_SV":"Frankrike","NAME_TR":"Fransa","NAME_UK":"Франція","NAME_UR":"فرانس","NAME_VI":"Pháp","NAME_ZH":"法国","NAME_ZHT":"法國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-54.524754,2.053389,9.560016,51.148506],"geometry":{"type":"MultiPolygon","coordinates":[[[[-51.657797,4.156232],[-52.249338,3.241094],[-52.556425,2.504705],[-52.939657,2.124858],[-53.418465,2.053389],[-53.554839,2.334897],[-53.778521,2.376703],[-54.088063,2.105557],[-54.524754,2.311849],[-54.269705,2.732392],[-54.181726,3.18978],[-54.006931,3.620038],[-54.399542,4.212611],[-54.478633,4.896756],[-53.958045,5.756548],[-53.618453,5.646529],[-52.882141,5.409851],[-51.823343,4.565768],[-51.657797,4.156232]]],[[[6.18632,49.463803],[6.65823,49.201958],[8.099279,49.017784],[7.593676,48.333019],[7.466759,47.620582],[7.192202,47.449766],[6.736571,47.541801],[6.768714,47.287708],[6.037389,46.725779],[6.022609,46.27299],[6.5001,46.429673],[6.843593,45.991147],[6.802355,45.70858],[7.096652,45.333099],[6.749955,45.028518],[7.007562,44.254767],[7.549596,44.127901],[7.435185,43.693845],[6.529245,43.128892],[4.556963,43.399651],[3.100411,43.075201],[2.985999,42.473015],[1.826793,42.343385],[0.701591,42.795734],[0.338047,42.579546],[-1.502771,43.034014],[-1.901351,43.422802],[-1.384225,44.02261],[-1.193798,46.014918],[-2.225724,47.064363],[-2.963276,47.570327],[-4.491555,47.954954],[-4.59235,48.68416],[-3.295814,48.901692],[-1.616511,48.644421],[-1.933494,49.776342],[-0.989469,49.347376],[1.338761,50.127173],[1.639001,50.946606],[2.513573,51.148506],[2.658422,50.796848],[3.123252,50.780363],[3.588184,50.378992],[4.286023,49.907497],[4.799222,49.985373],[5.674052,49.529484],[5.897759,49.442667],[6.18632,49.463803]]],[[[8.746009,42.628122],[9.390001,43.009985],[9.560016,42.152492],[9.229752,41.380007],[8.775723,41.583612],[8.544213,42.256517],[8.746009,42.628122]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Ecuador","SOV_A3":"ECU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Ecuador","ADM0_A3":"ECU","GEOU_DIF":0,"GEOUNIT":"Ecuador","GU_A3":"ECU","SU_DIF":0,"SUBUNIT":"Ecuador","SU_A3":"ECU","BRK_DIFF":0,"NAME":"Ecuador","NAME_LONG":"Ecuador","BRK_A3":"ECU","BRK_NAME":"Ecuador","BRK_GROUP":null,"ABBREV":"Ecu.","POSTAL":"EC","FORMAL_EN":"Republic of Ecuador","FORMAL_FR":null,"NAME_CIAWF":"Ecuador","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ecuador","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":12,"POP_EST":17373662,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":107435,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"EC","ISO_A2":"EC","ISO_A2_EH":"EC","ISO_A3":"ECU","ISO_A3_EH":"ECU","ISO_N3":"218","ISO_N3_EH":"218","UN_A3":"218","WB_A2":"EC","WB_A3":"ECU","WOE_ID":23424801,"WOE_ID_EH":23424801,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ECU","ADM0_DIFF":null,"ADM0_TLC":"ECU","ADM0_A3_US":"ECU","ADM0_A3_FR":"ECU","ADM0_A3_RU":"ECU","ADM0_A3_ES":"ECU","ADM0_A3_CN":"ECU","ADM0_A3_TW":"ECU","ADM0_A3_IN":"ECU","ADM0_A3_NP":"ECU","ADM0_A3_PK":"ECU","ADM0_A3_DE":"ECU","ADM0_A3_GB":"ECU","ADM0_A3_BR":"ECU","ADM0_A3_IL":"ECU","ADM0_A3_PS":"ECU","ADM0_A3_SA":"ECU","ADM0_A3_EG":"ECU","ADM0_A3_MA":"ECU","ADM0_A3_PT":"ECU","ADM0_A3_AR":"ECU","ADM0_A3_JP":"ECU","ADM0_A3_KO":"ECU","ADM0_A3_VN":"ECU","ADM0_A3_TR":"ECU","ADM0_A3_ID":"ECU","ADM0_A3_PL":"ECU","ADM0_A3_GR":"ECU","ADM0_A3_IT":"ECU","ADM0_A3_NL":"ECU","ADM0_A3_SE":"ECU","ADM0_A3_BD":"ECU","ADM0_A3_UA":"ECU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-78.188375,"LABEL_Y":-1.259076,"NE_ID":1159320567,"WIKIDATAID":"Q736","NAME_AR":"الإكوادور","NAME_BN":"ইকুয়েডর","NAME_DE":"Ecuador","NAME_EN":"Ecuador","NAME_ES":"Ecuador","NAME_FA":"اکوادور","NAME_FR":"Équateur","NAME_EL":"Εκουαδόρ","NAME_HE":"אקוודור","NAME_HI":"ईक्वाडोर","NAME_HU":"Ecuador","NAME_ID":"Ekuador","NAME_IT":"Ecuador","NAME_JA":"エクアドル","NAME_KO":"에콰도르","NAME_NL":"Ecuador","NAME_PL":"Ekwador","NAME_PT":"Equador","NAME_RU":"Эквадор","NAME_SV":"Ecuador","NAME_TR":"Ekvador","NAME_UK":"Еквадор","NAME_UR":"ایکواڈور","NAME_VI":"Ecuador","NAME_ZH":"厄瓜多尔","NAME_ZHT":"厄瓜多爾","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-80.967765,-4.959129,-75.233723,1.380924],"geometry":{"type":"Polygon","coordinates":[[[-75.373223,-0.152032],[-75.233723,-0.911417],[-75.544996,-1.56161],[-76.635394,-2.608678],[-77.837905,-3.003021],[-78.450684,-3.873097],[-78.639897,-4.547784],[-79.205289,-4.959129],[-79.624979,-4.454198],[-80.028908,-4.346091],[-80.442242,-4.425724],[-80.469295,-4.059287],[-80.184015,-3.821162],[-80.302561,-3.404856],[-79.770293,-2.657512],[-79.986559,-2.220794],[-80.368784,-2.685159],[-80.967765,-2.246943],[-80.764806,-1.965048],[-80.933659,-1.057455],[-80.58337,-0.906663],[-80.399325,-0.283703],[-80.020898,0.36034],[-80.09061,0.768429],[-79.542762,0.982938],[-78.855259,1.380924],[-77.855061,0.809925],[-77.668613,0.825893],[-77.424984,0.395687],[-76.57638,0.256936],[-76.292314,0.416047],[-75.801466,0.084801],[-75.373223,-0.152032]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"United States of America","SOV_A3":"US1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Dependency","TLC":"1","ADMIN":"Puerto Rico","ADM0_A3":"PRI","GEOU_DIF":0,"GEOUNIT":"Puerto Rico","GU_A3":"PRI","SU_DIF":0,"SUBUNIT":"Puerto Rico","SU_A3":"PRI","BRK_DIFF":0,"NAME":"Puerto Rico","NAME_LONG":"Puerto Rico","BRK_A3":"PRI","BRK_NAME":"Puerto Rico","BRK_GROUP":null,"ABBREV":"P.R.","POSTAL":"PR","FORMAL_EN":"Commonwealth of Puerto Rico","FORMAL_FR":null,"NAME_CIAWF":"Puerto Rico","NOTE_ADM0":"U.S.A.","NOTE_BRK":null,"NAME_SORT":"Puerto Rico","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":1,"MAPCOLOR13":1,"POP_EST":3193694,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":104988,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"RQ","ISO_A2":"PR","ISO_A2_EH":"PR","ISO_A3":"PRI","ISO_A3_EH":"PRI","ISO_N3":"630","ISO_N3_EH":"630","UN_A3":"630","WB_A2":"PR","WB_A3":"PRI","WOE_ID":23424935,"WOE_ID_EH":23424935,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PRI","ADM0_DIFF":null,"ADM0_TLC":"PRI","ADM0_A3_US":"PRI","ADM0_A3_FR":"PRI","ADM0_A3_RU":"PRI","ADM0_A3_ES":"PRI","ADM0_A3_CN":"PRI","ADM0_A3_TW":"PRI","ADM0_A3_IN":"PRI","ADM0_A3_NP":"PRI","ADM0_A3_PK":"PRI","ADM0_A3_DE":"PRI","ADM0_A3_GB":"PRI","ADM0_A3_BR":"PRI","ADM0_A3_IL":"PRI","ADM0_A3_PS":"PRI","ADM0_A3_SA":"PRI","ADM0_A3_EG":"PRI","ADM0_A3_MA":"PRI","ADM0_A3_PT":"PRI","ADM0_A3_AR":"PRI","ADM0_A3_JP":"PRI","ADM0_A3_KO":"PRI","ADM0_A3_VN":"PRI","ADM0_A3_TR":"PRI","ADM0_A3_ID":"PRI","ADM0_A3_PL":"PRI","ADM0_A3_GR":"PRI","ADM0_A3_IT":"PRI","ADM0_A3_NL":"PRI","ADM0_A3_SE":"PRI","ADM0_A3_BD":"PRI","ADM0_A3_UA":"PRI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-66.481065,"LABEL_Y":18.234668,"NE_ID":1159321363,"WIKIDATAID":"Q1183","NAME_AR":"بورتوريكو","NAME_BN":"পুয়ের্তো রিকো","NAME_DE":"Puerto Rico","NAME_EN":"Puerto Rico","NAME_ES":"Puerto Rico","NAME_FA":"پورتوریکو","NAME_FR":"Porto Rico","NAME_EL":"Πουέρτο Ρίκο","NAME_HE":"פוארטו ריקו","NAME_HI":"पोर्टो रीको","NAME_HU":"Puerto Rico","NAME_ID":"Puerto Riko","NAME_IT":"Porto Rico","NAME_JA":"プエルトリコ","NAME_KO":"푸에르토리코","NAME_NL":"Puerto Rico","NAME_PL":"Portoryko","NAME_PT":"Porto Rico","NAME_RU":"Пуэрто-Рико","NAME_SV":"Puerto Rico","NAME_TR":"Porto Riko","NAME_UK":"Пуерто-Рико","NAME_UR":"پورٹو ریکو","NAME_VI":"Puerto Rico","NAME_ZH":"波多黎各","NAME_ZHT":"波多黎各","FCLASS_ISO":"Admin-0 dependency","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 dependency","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-67.242428,17.946553,-65.591004,18.520601],"geometry":{"type":"Polygon","coordinates":[[[-66.282434,18.514762],[-65.771303,18.426679],[-65.591004,18.228035],[-65.847164,17.975906],[-66.599934,17.981823],[-67.184162,17.946553],[-67.242428,18.37446],[-67.100679,18.520601],[-66.282434,18.514762]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Jamaica","SOV_A3":"JAM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Jamaica","ADM0_A3":"JAM","GEOU_DIF":0,"GEOUNIT":"Jamaica","GU_A3":"JAM","SU_DIF":0,"SUBUNIT":"Jamaica","SU_A3":"JAM","BRK_DIFF":0,"NAME":"Jamaica","NAME_LONG":"Jamaica","BRK_A3":"JAM","BRK_NAME":"Jamaica","BRK_GROUP":null,"ABBREV":"Jam.","POSTAL":"J","FORMAL_EN":"Jamaica","FORMAL_FR":null,"NAME_CIAWF":"Jamaica","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Jamaica","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":4,"MAPCOLOR13":10,"POP_EST":2948279,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":16458,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"JM","ISO_A2":"JM","ISO_A2_EH":"JM","ISO_A3":"JAM","ISO_A3_EH":"JAM","ISO_N3":"388","ISO_N3_EH":"388","UN_A3":"388","WB_A2":"JM","WB_A3":"JAM","WOE_ID":23424858,"WOE_ID_EH":23424858,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"JAM","ADM0_DIFF":null,"ADM0_TLC":"JAM","ADM0_A3_US":"JAM","ADM0_A3_FR":"JAM","ADM0_A3_RU":"JAM","ADM0_A3_ES":"JAM","ADM0_A3_CN":"JAM","ADM0_A3_TW":"JAM","ADM0_A3_IN":"JAM","ADM0_A3_NP":"JAM","ADM0_A3_PK":"JAM","ADM0_A3_DE":"JAM","ADM0_A3_GB":"JAM","ADM0_A3_BR":"JAM","ADM0_A3_IL":"JAM","ADM0_A3_PS":"JAM","ADM0_A3_SA":"JAM","ADM0_A3_EG":"JAM","ADM0_A3_MA":"JAM","ADM0_A3_PT":"JAM","ADM0_A3_AR":"JAM","ADM0_A3_JP":"JAM","ADM0_A3_KO":"JAM","ADM0_A3_VN":"JAM","ADM0_A3_TR":"JAM","ADM0_A3_ID":"JAM","ADM0_A3_PL":"JAM","ADM0_A3_GR":"JAM","ADM0_A3_IT":"JAM","ADM0_A3_NL":"JAM","ADM0_A3_SE":"JAM","ADM0_A3_BD":"JAM","ADM0_A3_UA":"JAM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-77.318767,"LABEL_Y":18.137124,"NE_ID":1159320931,"WIKIDATAID":"Q766","NAME_AR":"جامايكا","NAME_BN":"জ্যামাইকা","NAME_DE":"Jamaika","NAME_EN":"Jamaica","NAME_ES":"Jamaica","NAME_FA":"جامائیکا","NAME_FR":"Jamaïque","NAME_EL":"Τζαμάικα","NAME_HE":"ג'מייקה","NAME_HI":"जमैका","NAME_HU":"Jamaica","NAME_ID":"Jamaika","NAME_IT":"Giamaica","NAME_JA":"ジャマイカ","NAME_KO":"자메이카","NAME_NL":"Jamaica","NAME_PL":"Jamajka","NAME_PT":"Jamaica","NAME_RU":"Ямайка","NAME_SV":"Jamaica","NAME_TR":"Jamaika","NAME_UK":"Ямайка","NAME_UR":"جمیکا","NAME_VI":"Jamaica","NAME_ZH":"牙买加","NAME_ZHT":"牙買加","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-78.337719,17.701116,-76.199659,18.524218],"geometry":{"type":"Polygon","coordinates":[[[-77.569601,18.490525],[-76.896619,18.400867],[-76.365359,18.160701],[-76.199659,17.886867],[-76.902561,17.868238],[-77.206341,17.701116],[-77.766023,17.861597],[-78.337719,18.225968],[-78.217727,18.454533],[-77.797365,18.524218],[-77.569601,18.490525]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Cuba","SOV_A3":"CU1","ADM0_DIF":1,"LEVEL":1,"TYPE":"Sovereignty","TLC":"1","ADMIN":"Cuba","ADM0_A3":"CUB","GEOU_DIF":0,"GEOUNIT":"Cuba","GU_A3":"CUB","SU_DIF":0,"SUBUNIT":"Cuba","SU_A3":"CUB","BRK_DIFF":0,"NAME":"Cuba","NAME_LONG":"Cuba","BRK_A3":"CUB","BRK_NAME":"Cuba","BRK_GROUP":null,"ABBREV":"Cuba","POSTAL":"CU","FORMAL_EN":"Republic of Cuba","FORMAL_FR":null,"NAME_CIAWF":"Cuba","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Cuba","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":4,"POP_EST":11333483,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":100023,"GDP_YEAR":2018,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"CU","ISO_A2":"CU","ISO_A2_EH":"CU","ISO_A3":"CUB","ISO_A3_EH":"CUB","ISO_N3":"192","ISO_N3_EH":"192","UN_A3":"192","WB_A2":"CU","WB_A3":"CUB","WOE_ID":23424793,"WOE_ID_EH":23424793,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CUB","ADM0_DIFF":null,"ADM0_TLC":"CUB","ADM0_A3_US":"CUB","ADM0_A3_FR":"CUB","ADM0_A3_RU":"CUB","ADM0_A3_ES":"CUB","ADM0_A3_CN":"CUB","ADM0_A3_TW":"CUB","ADM0_A3_IN":"CUB","ADM0_A3_NP":"CUB","ADM0_A3_PK":"CUB","ADM0_A3_DE":"CUB","ADM0_A3_GB":"CUB","ADM0_A3_BR":"CUB","ADM0_A3_IL":"CUB","ADM0_A3_PS":"CUB","ADM0_A3_SA":"CUB","ADM0_A3_EG":"CUB","ADM0_A3_MA":"CUB","ADM0_A3_PT":"CUB","ADM0_A3_AR":"CUB","ADM0_A3_JP":"CUB","ADM0_A3_KO":"CUB","ADM0_A3_VN":"CUB","ADM0_A3_TR":"CUB","ADM0_A3_ID":"CUB","ADM0_A3_PL":"CUB","ADM0_A3_GR":"CUB","ADM0_A3_IT":"CUB","ADM0_A3_NL":"CUB","ADM0_A3_SE":"CUB","ADM0_A3_BD":"CUB","ADM0_A3_UA":"CUB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":8,"LABEL_X":-77.975855,"LABEL_Y":21.334024,"NE_ID":1159320527,"WIKIDATAID":"Q241","NAME_AR":"كوبا","NAME_BN":"কিউবা","NAME_DE":"Kuba","NAME_EN":"Cuba","NAME_ES":"Cuba","NAME_FA":"کوبا","NAME_FR":"Cuba","NAME_EL":"Κούβα","NAME_HE":"קובה","NAME_HI":"क्यूबा","NAME_HU":"Kuba","NAME_ID":"Kuba","NAME_IT":"Cuba","NAME_JA":"キューバ","NAME_KO":"쿠바","NAME_NL":"Cuba","NAME_PL":"Kuba","NAME_PT":"Cuba","NAME_RU":"Куба","NAME_SV":"Kuba","NAME_TR":"Küba","NAME_UK":"Куба","NAME_UR":"کیوبا","NAME_VI":"Cuba","NAME_ZH":"古巴","NAME_ZHT":"古巴","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-84.974911,19.855481,-74.178025,23.188611],"geometry":{"type":"Polygon","coordinates":[[[-82.268151,23.188611],[-81.404457,23.117271],[-80.618769,23.10598],[-79.679524,22.765303],[-79.281486,22.399202],[-78.347434,22.512166],[-77.993296,22.277194],[-77.146422,21.657851],[-76.523825,21.20682],[-76.19462,21.220565],[-75.598222,21.016624],[-75.67106,20.735091],[-74.933896,20.693905],[-74.178025,20.284628],[-74.296648,20.050379],[-74.961595,19.923435],[-75.63468,19.873774],[-76.323656,19.952891],[-77.755481,19.855481],[-77.085108,20.413354],[-77.492655,20.673105],[-78.137292,20.739949],[-78.482827,21.028613],[-78.719867,21.598114],[-79.285,21.559175],[-80.217475,21.827324],[-80.517535,22.037079],[-81.820943,22.192057],[-82.169992,22.387109],[-81.795002,22.636965],[-82.775898,22.68815],[-83.494459,22.168518],[-83.9088,22.154565],[-84.052151,21.910575],[-84.54703,21.801228],[-84.974911,21.896028],[-84.447062,22.20495],[-84.230357,22.565755],[-83.77824,22.788118],[-83.267548,22.983042],[-82.510436,23.078747],[-82.268151,23.188611]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Zimbabwe","SOV_A3":"ZWE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Zimbabwe","ADM0_A3":"ZWE","GEOU_DIF":0,"GEOUNIT":"Zimbabwe","GU_A3":"ZWE","SU_DIF":0,"SUBUNIT":"Zimbabwe","SU_A3":"ZWE","BRK_DIFF":0,"NAME":"Zimbabwe","NAME_LONG":"Zimbabwe","BRK_A3":"ZWE","BRK_NAME":"Zimbabwe","BRK_GROUP":null,"ABBREV":"Zimb.","POSTAL":"ZW","FORMAL_EN":"Republic of Zimbabwe","FORMAL_FR":null,"NAME_CIAWF":"Zimbabwe","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Zimbabwe","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":9,"POP_EST":14645468,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":21440,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"5. Low income","FIPS_10":"ZI","ISO_A2":"ZW","ISO_A2_EH":"ZW","ISO_A3":"ZWE","ISO_A3_EH":"ZWE","ISO_N3":"716","ISO_N3_EH":"716","UN_A3":"716","WB_A2":"ZW","WB_A3":"ZWE","WOE_ID":23425004,"WOE_ID_EH":23425004,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ZWE","ADM0_DIFF":null,"ADM0_TLC":"ZWE","ADM0_A3_US":"ZWE","ADM0_A3_FR":"ZWE","ADM0_A3_RU":"ZWE","ADM0_A3_ES":"ZWE","ADM0_A3_CN":"ZWE","ADM0_A3_TW":"ZWE","ADM0_A3_IN":"ZWE","ADM0_A3_NP":"ZWE","ADM0_A3_PK":"ZWE","ADM0_A3_DE":"ZWE","ADM0_A3_GB":"ZWE","ADM0_A3_BR":"ZWE","ADM0_A3_IL":"ZWE","ADM0_A3_PS":"ZWE","ADM0_A3_SA":"ZWE","ADM0_A3_EG":"ZWE","ADM0_A3_MA":"ZWE","ADM0_A3_PT":"ZWE","ADM0_A3_AR":"ZWE","ADM0_A3_JP":"ZWE","ADM0_A3_KO":"ZWE","ADM0_A3_VN":"ZWE","ADM0_A3_TR":"ZWE","ADM0_A3_ID":"ZWE","ADM0_A3_PL":"ZWE","ADM0_A3_GR":"ZWE","ADM0_A3_IT":"ZWE","ADM0_A3_NL":"ZWE","ADM0_A3_SE":"ZWE","ADM0_A3_BD":"ZWE","ADM0_A3_UA":"ZWE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":8,"LABEL_X":29.925444,"LABEL_Y":-18.91164,"NE_ID":1159321441,"WIKIDATAID":"Q954","NAME_AR":"زيمبابوي","NAME_BN":"জিম্বাবুয়ে","NAME_DE":"Simbabwe","NAME_EN":"Zimbabwe","NAME_ES":"Zimbabue","NAME_FA":"زیمبابوه","NAME_FR":"Zimbabwe","NAME_EL":"Ζιμπάμπουε","NAME_HE":"זימבבואה","NAME_HI":"ज़िम्बाब्वे","NAME_HU":"Zimbabwe","NAME_ID":"Zimbabwe","NAME_IT":"Zimbabwe","NAME_JA":"ジンバブエ","NAME_KO":"짐바브웨","NAME_NL":"Zimbabwe","NAME_PL":"Zimbabwe","NAME_PT":"Zimbábue","NAME_RU":"Зимбабве","NAME_SV":"Zimbabwe","NAME_TR":"Zimbabve","NAME_UK":"Зімбабве","NAME_UR":"زمبابوے","NAME_VI":"Zimbabwe","NAME_ZH":"津巴布韦","NAME_ZHT":"辛巴威","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[25.264226,-22.271612,32.849861,-15.507787],"geometry":{"type":"Polygon","coordinates":[[[31.191409,-22.25151],[30.659865,-22.151567],[30.322883,-22.271612],[29.839037,-22.102216],[29.432188,-22.091313],[28.794656,-21.639454],[28.02137,-21.485975],[27.727228,-20.851802],[27.724747,-20.499059],[27.296505,-20.39152],[26.164791,-19.293086],[25.850391,-18.714413],[25.649163,-18.536026],[25.264226,-17.73654],[26.381935,-17.846042],[26.706773,-17.961229],[27.044427,-17.938026],[27.598243,-17.290831],[28.467906,-16.4684],[28.825869,-16.389749],[28.947463,-16.043051],[29.516834,-15.644678],[30.274256,-15.507787],[30.338955,-15.880839],[31.173064,-15.860944],[31.636498,-16.07199],[31.852041,-16.319417],[32.328239,-16.392074],[32.847639,-16.713398],[32.849861,-17.979057],[32.654886,-18.67209],[32.611994,-19.419383],[32.772708,-19.715592],[32.659743,-20.30429],[32.508693,-20.395292],[32.244988,-21.116489],[31.191409,-22.25151]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Botswana","SOV_A3":"BWA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Botswana","ADM0_A3":"BWA","GEOU_DIF":0,"GEOUNIT":"Botswana","GU_A3":"BWA","SU_DIF":0,"SUBUNIT":"Botswana","SU_A3":"BWA","BRK_DIFF":0,"NAME":"Botswana","NAME_LONG":"Botswana","BRK_A3":"BWA","BRK_NAME":"Botswana","BRK_GROUP":null,"ABBREV":"Bwa.","POSTAL":"BW","FORMAL_EN":"Republic of Botswana","FORMAL_FR":null,"NAME_CIAWF":"Botswana","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Botswana","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":5,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":2303697,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":18340,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"BC","ISO_A2":"BW","ISO_A2_EH":"BW","ISO_A3":"BWA","ISO_A3_EH":"BWA","ISO_N3":"072","ISO_N3_EH":"072","UN_A3":"072","WB_A2":"BW","WB_A3":"BWA","WOE_ID":23424755,"WOE_ID_EH":23424755,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BWA","ADM0_DIFF":null,"ADM0_TLC":"BWA","ADM0_A3_US":"BWA","ADM0_A3_FR":"BWA","ADM0_A3_RU":"BWA","ADM0_A3_ES":"BWA","ADM0_A3_CN":"BWA","ADM0_A3_TW":"BWA","ADM0_A3_IN":"BWA","ADM0_A3_NP":"BWA","ADM0_A3_PK":"BWA","ADM0_A3_DE":"BWA","ADM0_A3_GB":"BWA","ADM0_A3_BR":"BWA","ADM0_A3_IL":"BWA","ADM0_A3_PS":"BWA","ADM0_A3_SA":"BWA","ADM0_A3_EG":"BWA","ADM0_A3_MA":"BWA","ADM0_A3_PT":"BWA","ADM0_A3_AR":"BWA","ADM0_A3_JP":"BWA","ADM0_A3_KO":"BWA","ADM0_A3_VN":"BWA","ADM0_A3_TR":"BWA","ADM0_A3_ID":"BWA","ADM0_A3_PL":"BWA","ADM0_A3_GR":"BWA","ADM0_A3_IT":"BWA","ADM0_A3_NL":"BWA","ADM0_A3_SE":"BWA","ADM0_A3_BD":"BWA","ADM0_A3_UA":"BWA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":24.179216,"LABEL_Y":-22.102634,"NE_ID":1159320461,"WIKIDATAID":"Q963","NAME_AR":"بوتسوانا","NAME_BN":"বতসোয়ানা","NAME_DE":"Botswana","NAME_EN":"Botswana","NAME_ES":"Botsuana","NAME_FA":"بوتسوانا","NAME_FR":"Botswana","NAME_EL":"Μποτσουάνα","NAME_HE":"בוטסואנה","NAME_HI":"बोत्सवाना","NAME_HU":"Botswana","NAME_ID":"Botswana","NAME_IT":"Botswana","NAME_JA":"ボツワナ","NAME_KO":"보츠와나","NAME_NL":"Botswana","NAME_PL":"Botswana","NAME_PT":"Botsuana","NAME_RU":"Ботсвана","NAME_SV":"Botswana","NAME_TR":"Botsvana","NAME_UK":"Ботсвана","NAME_UR":"بوٹسوانا","NAME_VI":"Botswana","NAME_ZH":"博茨瓦纳","NAME_ZHT":"波札那","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[19.895458,-26.828543,29.432188,-17.661816],"geometry":{"type":"Polygon","coordinates":[[[29.432188,-22.091313],[28.017236,-22.827754],[27.11941,-23.574323],[26.786407,-24.240691],[26.485753,-24.616327],[25.941652,-24.696373],[25.765849,-25.174845],[25.664666,-25.486816],[25.025171,-25.71967],[24.211267,-25.670216],[23.73357,-25.390129],[23.312097,-25.26869],[22.824271,-25.500459],[22.579532,-25.979448],[22.105969,-26.280256],[21.605896,-26.726534],[20.889609,-26.828543],[20.66647,-26.477453],[20.758609,-25.868136],[20.165726,-24.917962],[19.895768,-24.76779],[19.895458,-21.849157],[20.881134,-21.814327],[20.910641,-18.252219],[21.65504,-18.219146],[23.196858,-17.869038],[23.579006,-18.281261],[24.217365,-17.889347],[24.520705,-17.887125],[25.084443,-17.661816],[25.264226,-17.73654],[25.649163,-18.536026],[25.850391,-18.714413],[26.164791,-19.293086],[27.296505,-20.39152],[27.724747,-20.499059],[27.727228,-20.851802],[28.02137,-21.485975],[28.794656,-21.639454],[29.432188,-22.091313]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Namibia","SOV_A3":"NAM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Namibia","ADM0_A3":"NAM","GEOU_DIF":0,"GEOUNIT":"Namibia","GU_A3":"NAM","SU_DIF":0,"SUBUNIT":"Namibia","SU_A3":"NAM","BRK_DIFF":0,"NAME":"Namibia","NAME_LONG":"Namibia","BRK_A3":"NAM","BRK_NAME":"Namibia","BRK_GROUP":null,"ABBREV":"Nam.","POSTAL":"NA","FORMAL_EN":"Republic of Namibia","FORMAL_FR":null,"NAME_CIAWF":"Namibia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Namibia","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":1,"MAPCOLOR13":7,"POP_EST":2494530,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":12366,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"WA","ISO_A2":"NA","ISO_A2_EH":"NA","ISO_A3":"NAM","ISO_A3_EH":"NAM","ISO_N3":"516","ISO_N3_EH":"516","UN_A3":"516","WB_A2":"NA","WB_A3":"NAM","WOE_ID":23424987,"WOE_ID_EH":23424987,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"NAM","ADM0_DIFF":null,"ADM0_TLC":"NAM","ADM0_A3_US":"NAM","ADM0_A3_FR":"NAM","ADM0_A3_RU":"NAM","ADM0_A3_ES":"NAM","ADM0_A3_CN":"NAM","ADM0_A3_TW":"NAM","ADM0_A3_IN":"NAM","ADM0_A3_NP":"NAM","ADM0_A3_PK":"NAM","ADM0_A3_DE":"NAM","ADM0_A3_GB":"NAM","ADM0_A3_BR":"NAM","ADM0_A3_IL":"NAM","ADM0_A3_PS":"NAM","ADM0_A3_SA":"NAM","ADM0_A3_EG":"NAM","ADM0_A3_MA":"NAM","ADM0_A3_PT":"NAM","ADM0_A3_AR":"NAM","ADM0_A3_JP":"NAM","ADM0_A3_KO":"NAM","ADM0_A3_VN":"NAM","ADM0_A3_TR":"NAM","ADM0_A3_ID":"NAM","ADM0_A3_PL":"NAM","ADM0_A3_GR":"NAM","ADM0_A3_IT":"NAM","ADM0_A3_NL":"NAM","ADM0_A3_SE":"NAM","ADM0_A3_BD":"NAM","ADM0_A3_UA":"NAM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7.5,"LABEL_X":17.108166,"LABEL_Y":-20.575298,"NE_ID":1159321085,"WIKIDATAID":"Q1030","NAME_AR":"ناميبيا","NAME_BN":"নামিবিয়া","NAME_DE":"Namibia","NAME_EN":"Namibia","NAME_ES":"Namibia","NAME_FA":"نامیبیا","NAME_FR":"Namibie","NAME_EL":"Ναμίμπια","NAME_HE":"נמיביה","NAME_HI":"नामीबिया","NAME_HU":"Namíbia","NAME_ID":"Namibia","NAME_IT":"Namibia","NAME_JA":"ナミビア","NAME_KO":"나미비아","NAME_NL":"Namibië","NAME_PL":"Namibia","NAME_PT":"Namíbia","NAME_RU":"Намибия","NAME_SV":"Namibia","NAME_TR":"Namibya","NAME_UK":"Намібія","NAME_UR":"نمیبیا","NAME_VI":"Namibia","NAME_ZH":"纳米比亚","NAME_ZHT":"納米比亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[11.734199,-29.045462,25.084443,-16.941343],"geometry":{"type":"Polygon","coordinates":[[[19.895768,-24.76779],[19.894734,-28.461105],[19.002127,-28.972443],[18.464899,-29.045462],[17.836152,-28.856378],[17.387497,-28.783514],[17.218929,-28.355943],[16.824017,-28.082162],[16.344977,-28.576705],[15.601818,-27.821247],[15.210472,-27.090956],[14.989711,-26.117372],[14.743214,-25.39292],[14.408144,-23.853014],[14.385717,-22.656653],[14.257714,-22.111208],[13.868642,-21.699037],[13.352498,-20.872834],[12.826845,-19.673166],[12.608564,-19.045349],[11.794919,-18.069129],[11.734199,-17.301889],[12.215461,-17.111668],[12.814081,-16.941343],[13.462362,-16.971212],[14.058501,-17.423381],[14.209707,-17.353101],[18.263309,-17.309951],[18.956187,-17.789095],[21.377176,-17.930636],[23.215048,-17.523116],[24.033862,-17.295843],[24.682349,-17.353411],[25.07695,-17.578823],[25.084443,-17.661816],[24.520705,-17.887125],[24.217365,-17.889347],[23.579006,-18.281261],[23.196858,-17.869038],[21.65504,-18.219146],[20.910641,-18.252219],[20.881134,-21.814327],[19.895458,-21.849157],[19.895768,-24.76779]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Senegal","SOV_A3":"SEN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Senegal","ADM0_A3":"SEN","GEOU_DIF":0,"GEOUNIT":"Senegal","GU_A3":"SEN","SU_DIF":0,"SUBUNIT":"Senegal","SU_A3":"SEN","BRK_DIFF":0,"NAME":"Senegal","NAME_LONG":"Senegal","BRK_A3":"SEN","BRK_NAME":"Senegal","BRK_GROUP":null,"ABBREV":"Sen.","POSTAL":"SN","FORMAL_EN":"Republic of Senegal","FORMAL_FR":null,"NAME_CIAWF":"Senegal","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Senegal","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":5,"POP_EST":16296364,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":23578,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"SG","ISO_A2":"SN","ISO_A2_EH":"SN","ISO_A3":"SEN","ISO_A3_EH":"SEN","ISO_N3":"686","ISO_N3_EH":"686","UN_A3":"686","WB_A2":"SN","WB_A3":"SEN","WOE_ID":23424943,"WOE_ID_EH":23424943,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SEN","ADM0_DIFF":null,"ADM0_TLC":"SEN","ADM0_A3_US":"SEN","ADM0_A3_FR":"SEN","ADM0_A3_RU":"SEN","ADM0_A3_ES":"SEN","ADM0_A3_CN":"SEN","ADM0_A3_TW":"SEN","ADM0_A3_IN":"SEN","ADM0_A3_NP":"SEN","ADM0_A3_PK":"SEN","ADM0_A3_DE":"SEN","ADM0_A3_GB":"SEN","ADM0_A3_BR":"SEN","ADM0_A3_IL":"SEN","ADM0_A3_PS":"SEN","ADM0_A3_SA":"SEN","ADM0_A3_EG":"SEN","ADM0_A3_MA":"SEN","ADM0_A3_PT":"SEN","ADM0_A3_AR":"SEN","ADM0_A3_JP":"SEN","ADM0_A3_KO":"SEN","ADM0_A3_VN":"SEN","ADM0_A3_TR":"SEN","ADM0_A3_ID":"SEN","ADM0_A3_PL":"SEN","ADM0_A3_GR":"SEN","ADM0_A3_IT":"SEN","ADM0_A3_NL":"SEN","ADM0_A3_SE":"SEN","ADM0_A3_BD":"SEN","ADM0_A3_UA":"SEN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":8,"LABEL_X":-14.778586,"LABEL_Y":15.138125,"NE_ID":1159321243,"WIKIDATAID":"Q1041","NAME_AR":"السنغال","NAME_BN":"সেনেগাল","NAME_DE":"Senegal","NAME_EN":"Senegal","NAME_ES":"Senegal","NAME_FA":"سنگال","NAME_FR":"Sénégal","NAME_EL":"Σενεγάλη","NAME_HE":"סנגל","NAME_HI":"सेनेगल","NAME_HU":"Szenegál","NAME_ID":"Senegal","NAME_IT":"Senegal","NAME_JA":"セネガル","NAME_KO":"세네갈","NAME_NL":"Senegal","NAME_PL":"Senegal","NAME_PT":"Senegal","NAME_RU":"Сенегал","NAME_SV":"Senegal","NAME_TR":"Senegal","NAME_UK":"Сенегал","NAME_UR":"سینیگال","NAME_VI":"Sénégal","NAME_ZH":"塞内加尔","NAME_ZHT":"塞內加爾","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-17.625043,12.33209,-11.467899,16.598264],"geometry":{"type":"Polygon","coordinates":[[[-16.713729,13.594959],[-17.126107,14.373516],[-17.625043,14.729541],[-17.185173,14.919477],[-16.700706,15.621527],[-16.463098,16.135036],[-16.12069,16.455663],[-15.623666,16.369337],[-15.135737,16.587282],[-14.577348,16.598264],[-14.099521,16.304302],[-13.435738,16.039383],[-12.830658,15.303692],[-12.17075,14.616834],[-12.124887,13.994727],[-11.927716,13.422075],[-11.553398,13.141214],[-11.467899,12.754519],[-11.513943,12.442988],[-11.658301,12.386583],[-12.203565,12.465648],[-12.278599,12.35444],[-12.499051,12.33209],[-13.217818,12.575874],[-13.700476,12.586183],[-15.548477,12.62817],[-15.816574,12.515567],[-16.147717,12.547762],[-16.677452,12.384852],[-16.841525,13.151394],[-15.931296,13.130284],[-15.691001,13.270353],[-15.511813,13.27857],[-15.141163,13.509512],[-14.712197,13.298207],[-14.277702,13.280585],[-13.844963,13.505042],[-14.046992,13.794068],[-14.376714,13.62568],[-14.687031,13.630357],[-15.081735,13.876492],[-15.39877,13.860369],[-15.624596,13.623587],[-16.713729,13.594959]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Mali","SOV_A3":"MLI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Mali","ADM0_A3":"MLI","GEOU_DIF":0,"GEOUNIT":"Mali","GU_A3":"MLI","SU_DIF":0,"SUBUNIT":"Mali","SU_A3":"MLI","BRK_DIFF":0,"NAME":"Mali","NAME_LONG":"Mali","BRK_A3":"MLI","BRK_NAME":"Mali","BRK_GROUP":null,"ABBREV":"Mali","POSTAL":"ML","FORMAL_EN":"Republic of Mali","FORMAL_FR":null,"NAME_CIAWF":"Mali","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mali","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":7,"POP_EST":19658031,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":17279,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"ML","ISO_A2":"ML","ISO_A2_EH":"ML","ISO_A3":"MLI","ISO_A3_EH":"MLI","ISO_N3":"466","ISO_N3_EH":"466","UN_A3":"466","WB_A2":"ML","WB_A3":"MLI","WOE_ID":23424891,"WOE_ID_EH":23424891,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MLI","ADM0_DIFF":null,"ADM0_TLC":"MLI","ADM0_A3_US":"MLI","ADM0_A3_FR":"MLI","ADM0_A3_RU":"MLI","ADM0_A3_ES":"MLI","ADM0_A3_CN":"MLI","ADM0_A3_TW":"MLI","ADM0_A3_IN":"MLI","ADM0_A3_NP":"MLI","ADM0_A3_PK":"MLI","ADM0_A3_DE":"MLI","ADM0_A3_GB":"MLI","ADM0_A3_BR":"MLI","ADM0_A3_IL":"MLI","ADM0_A3_PS":"MLI","ADM0_A3_SA":"MLI","ADM0_A3_EG":"MLI","ADM0_A3_MA":"MLI","ADM0_A3_PT":"MLI","ADM0_A3_AR":"MLI","ADM0_A3_JP":"MLI","ADM0_A3_KO":"MLI","ADM0_A3_VN":"MLI","ADM0_A3_TR":"MLI","ADM0_A3_ID":"MLI","ADM0_A3_PL":"MLI","ADM0_A3_GR":"MLI","ADM0_A3_IT":"MLI","ADM0_A3_NL":"MLI","ADM0_A3_SE":"MLI","ADM0_A3_BD":"MLI","ADM0_A3_UA":"MLI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7,"LABEL_X":-2.038455,"LABEL_Y":18.692713,"NE_ID":1159321063,"WIKIDATAID":"Q912","NAME_AR":"مالي","NAME_BN":"মালি","NAME_DE":"Mali","NAME_EN":"Mali","NAME_ES":"Malí","NAME_FA":"مالی","NAME_FR":"Mali","NAME_EL":"Μάλι","NAME_HE":"מאלי","NAME_HI":"माली","NAME_HU":"Mali","NAME_ID":"Mali","NAME_IT":"Mali","NAME_JA":"マリ共和国","NAME_KO":"말리","NAME_NL":"Mali","NAME_PL":"Mali","NAME_PT":"Mali","NAME_RU":"Мали","NAME_SV":"Mali","NAME_TR":"Mali","NAME_UK":"Малі","NAME_UR":"مالی","NAME_VI":"Mali","NAME_ZH":"马里","NAME_ZHT":"馬利共和國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-12.17075,10.096361,4.27021,24.974574],"geometry":{"type":"Polygon","coordinates":[[[-11.513943,12.442988],[-11.467899,12.754519],[-11.553398,13.141214],[-11.927716,13.422075],[-12.124887,13.994727],[-12.17075,14.616834],[-11.834208,14.799097],[-11.666078,15.388208],[-11.349095,15.411256],[-10.650791,15.132746],[-10.086846,15.330486],[-9.700255,15.264107],[-9.550238,15.486497],[-5.537744,15.50169],[-5.315277,16.201854],[-5.488523,16.325102],[-5.971129,20.640833],[-6.453787,24.956591],[-4.923337,24.974574],[-1.550055,22.792666],[1.823228,20.610809],[2.060991,20.142233],[2.683588,19.85623],[3.146661,19.693579],[3.158133,19.057364],[4.267419,19.155265],[4.27021,16.852227],[3.723422,16.184284],[3.638259,15.56812],[2.749993,15.409525],[1.385528,15.323561],[1.015783,14.968182],[0.374892,14.928908],[-0.266257,14.924309],[-0.515854,15.116158],[-1.066363,14.973815],[-2.001035,14.559008],[-2.191825,14.246418],[-2.967694,13.79815],[-3.103707,13.541267],[-3.522803,13.337662],[-4.006391,13.472485],[-4.280405,13.228444],[-4.427166,12.542646],[-5.220942,11.713859],[-5.197843,11.375146],[-5.470565,10.95127],[-5.404342,10.370737],[-5.816926,10.222555],[-6.050452,10.096361],[-6.205223,10.524061],[-6.493965,10.411303],[-6.666461,10.430811],[-6.850507,10.138994],[-7.622759,10.147236],[-7.89959,10.297382],[-8.029944,10.206535],[-8.335377,10.494812],[-8.282357,10.792597],[-8.407311,10.909257],[-8.620321,10.810891],[-8.581305,11.136246],[-8.376305,11.393646],[-8.786099,11.812561],[-8.905265,12.088358],[-9.127474,12.30806],[-9.327616,12.334286],[-9.567912,12.194243],[-9.890993,12.060479],[-10.165214,11.844084],[-10.593224,11.923975],[-10.87083,12.177887],[-11.036556,12.211245],[-11.297574,12.077971],[-11.456169,12.076834],[-11.513943,12.442988]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Mauritania","SOV_A3":"MRT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Mauritania","ADM0_A3":"MRT","GEOU_DIF":0,"GEOUNIT":"Mauritania","GU_A3":"MRT","SU_DIF":0,"SUBUNIT":"Mauritania","SU_A3":"MRT","BRK_DIFF":0,"NAME":"Mauritania","NAME_LONG":"Mauritania","BRK_A3":"MRT","BRK_NAME":"Mauritania","BRK_GROUP":null,"ABBREV":"Mrt.","POSTAL":"MR","FORMAL_EN":"Islamic Republic of Mauritania","FORMAL_FR":null,"NAME_CIAWF":"Mauritania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mauritania","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":1,"POP_EST":4525696,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":7600,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"MR","ISO_A2":"MR","ISO_A2_EH":"MR","ISO_A3":"MRT","ISO_A3_EH":"MRT","ISO_N3":"478","ISO_N3_EH":"478","UN_A3":"478","WB_A2":"MR","WB_A3":"MRT","WOE_ID":23424896,"WOE_ID_EH":23424896,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MRT","ADM0_DIFF":null,"ADM0_TLC":"MRT","ADM0_A3_US":"MRT","ADM0_A3_FR":"MRT","ADM0_A3_RU":"MRT","ADM0_A3_ES":"MRT","ADM0_A3_CN":"MRT","ADM0_A3_TW":"MRT","ADM0_A3_IN":"MRT","ADM0_A3_NP":"MRT","ADM0_A3_PK":"MRT","ADM0_A3_DE":"MRT","ADM0_A3_GB":"MRT","ADM0_A3_BR":"MRT","ADM0_A3_IL":"MRT","ADM0_A3_PS":"MRT","ADM0_A3_SA":"MRT","ADM0_A3_EG":"MRT","ADM0_A3_MA":"MRT","ADM0_A3_PT":"MRT","ADM0_A3_AR":"MRT","ADM0_A3_JP":"MRT","ADM0_A3_KO":"MRT","ADM0_A3_VN":"MRT","ADM0_A3_TR":"MRT","ADM0_A3_ID":"MRT","ADM0_A3_PL":"MRT","ADM0_A3_GR":"MRT","ADM0_A3_IT":"MRT","ADM0_A3_NL":"MRT","ADM0_A3_SE":"MRT","ADM0_A3_BD":"MRT","ADM0_A3_UA":"MRT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-9.740299,"LABEL_Y":19.587062,"NE_ID":1159321075,"WIKIDATAID":"Q1025","NAME_AR":"موريتانيا","NAME_BN":"মৌরিতানিয়া","NAME_DE":"Mauretanien","NAME_EN":"Mauritania","NAME_ES":"Mauritania","NAME_FA":"موریتانی","NAME_FR":"Mauritanie","NAME_EL":"Μαυριτανία","NAME_HE":"מאוריטניה","NAME_HI":"मॉरीतानिया","NAME_HU":"Mauritánia","NAME_ID":"Mauritania","NAME_IT":"Mauritania","NAME_JA":"モーリタニア","NAME_KO":"모리타니","NAME_NL":"Mauritanië","NAME_PL":"Mauretania","NAME_PT":"Mauritânia","NAME_RU":"Мавритания","NAME_SV":"Mauretanien","NAME_TR":"Moritanya","NAME_UK":"Мавританія","NAME_UR":"موریتانیہ","NAME_VI":"Mauritanie","NAME_ZH":"毛里塔尼亚","NAME_ZHT":"茅利塔尼亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-17.063423,14.616834,-4.923337,27.395744],"geometry":{"type":"Polygon","coordinates":[[[-17.063423,20.999752],[-16.845194,21.333323],[-12.929102,21.327071],[-13.118754,22.77122],[-12.874222,23.284832],[-11.937224,23.374594],[-11.969419,25.933353],[-8.687294,25.881056],[-8.6844,27.395744],[-4.923337,24.974574],[-6.453787,24.956591],[-5.971129,20.640833],[-5.488523,16.325102],[-5.315277,16.201854],[-5.537744,15.50169],[-9.550238,15.486497],[-9.700255,15.264107],[-10.086846,15.330486],[-10.650791,15.132746],[-11.349095,15.411256],[-11.666078,15.388208],[-11.834208,14.799097],[-12.17075,14.616834],[-12.830658,15.303692],[-13.435738,16.039383],[-14.099521,16.304302],[-14.577348,16.598264],[-15.135737,16.587282],[-15.623666,16.369337],[-16.12069,16.455663],[-16.463098,16.135036],[-16.549708,16.673892],[-16.270552,17.166963],[-16.146347,18.108482],[-16.256883,19.096716],[-16.377651,19.593817],[-16.277838,20.092521],[-16.536324,20.567866],[-17.063423,20.999752]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Benin","SOV_A3":"BEN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Benin","ADM0_A3":"BEN","GEOU_DIF":0,"GEOUNIT":"Benin","GU_A3":"BEN","SU_DIF":0,"SUBUNIT":"Benin","SU_A3":"BEN","BRK_DIFF":0,"NAME":"Benin","NAME_LONG":"Benin","BRK_A3":"BEN","BRK_NAME":"Benin","BRK_GROUP":null,"ABBREV":"Benin","POSTAL":"BJ","FORMAL_EN":"Republic of Benin","FORMAL_FR":null,"NAME_CIAWF":"Benin","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Benin","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":12,"POP_EST":11801151,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":14390,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"BN","ISO_A2":"BJ","ISO_A2_EH":"BJ","ISO_A3":"BEN","ISO_A3_EH":"BEN","ISO_N3":"204","ISO_N3_EH":"204","UN_A3":"204","WB_A2":"BJ","WB_A3":"BEN","WOE_ID":23424764,"WOE_ID_EH":23424764,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BEN","ADM0_DIFF":null,"ADM0_TLC":"BEN","ADM0_A3_US":"BEN","ADM0_A3_FR":"BEN","ADM0_A3_RU":"BEN","ADM0_A3_ES":"BEN","ADM0_A3_CN":"BEN","ADM0_A3_TW":"BEN","ADM0_A3_IN":"BEN","ADM0_A3_NP":"BEN","ADM0_A3_PK":"BEN","ADM0_A3_DE":"BEN","ADM0_A3_GB":"BEN","ADM0_A3_BR":"BEN","ADM0_A3_IL":"BEN","ADM0_A3_PS":"BEN","ADM0_A3_SA":"BEN","ADM0_A3_EG":"BEN","ADM0_A3_MA":"BEN","ADM0_A3_PT":"BEN","ADM0_A3_AR":"BEN","ADM0_A3_JP":"BEN","ADM0_A3_KO":"BEN","ADM0_A3_VN":"BEN","ADM0_A3_TR":"BEN","ADM0_A3_ID":"BEN","ADM0_A3_PL":"BEN","ADM0_A3_GR":"BEN","ADM0_A3_IT":"BEN","ADM0_A3_NL":"BEN","ADM0_A3_SE":"BEN","ADM0_A3_BD":"BEN","ADM0_A3_UA":"BEN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":2.352018,"LABEL_Y":10.324775,"NE_ID":1159320399,"WIKIDATAID":"Q962","NAME_AR":"بنين","NAME_BN":"বেনিন","NAME_DE":"Benin","NAME_EN":"Benin","NAME_ES":"Benín","NAME_FA":"بنین","NAME_FR":"Bénin","NAME_EL":"Μπενίν","NAME_HE":"בנין","NAME_HI":"बेनिन","NAME_HU":"Benin","NAME_ID":"Benin","NAME_IT":"Benin","NAME_JA":"ベナン","NAME_KO":"베냉","NAME_NL":"Benin","NAME_PL":"Benin","NAME_PT":"Benim","NAME_RU":"Бенин","NAME_SV":"Benin","NAME_TR":"Benin","NAME_UK":"Бенін","NAME_UR":"بینن","NAME_VI":"Bénin","NAME_ZH":"贝宁","NAME_ZHT":"貝南","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[0.772336,6.142158,3.797112,12.235636],"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[1.865241,6.142158],[1.618951,6.832038],[1.664478,9.12859],[1.463043,9.334624],[1.425061,9.825395],[1.077795,10.175607],[0.772336,10.470808],[0.899563,10.997339],[1.24347,11.110511],[1.447178,11.547719],[1.935986,11.64115],[2.154474,11.94015],[2.490164,12.233052],[2.848643,12.235636],[3.61118,11.660167],[3.572216,11.327939],[3.797112,10.734746],[3.60007,10.332186],[3.705438,10.06321],[3.220352,9.444153],[2.912308,9.137608],[2.723793,8.506845],[2.749063,7.870734],[2.691702,6.258817]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Niger","SOV_A3":"NER","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Niger","ADM0_A3":"NER","GEOU_DIF":0,"GEOUNIT":"Niger","GU_A3":"NER","SU_DIF":0,"SUBUNIT":"Niger","SU_A3":"NER","BRK_DIFF":0,"NAME":"Niger","NAME_LONG":"Niger","BRK_A3":"NER","BRK_NAME":"Niger","BRK_GROUP":null,"ABBREV":"Niger","POSTAL":"NE","FORMAL_EN":"Republic of Niger","FORMAL_FR":null,"NAME_CIAWF":"Niger","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Niger","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":13,"POP_EST":23310715,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":12911,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"NG","ISO_A2":"NE","ISO_A2_EH":"NE","ISO_A3":"NER","ISO_A3_EH":"NER","ISO_N3":"562","ISO_N3_EH":"562","UN_A3":"562","WB_A2":"NE","WB_A3":"NER","WOE_ID":23424906,"WOE_ID_EH":23424906,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"NER","ADM0_DIFF":null,"ADM0_TLC":"NER","ADM0_A3_US":"NER","ADM0_A3_FR":"NER","ADM0_A3_RU":"NER","ADM0_A3_ES":"NER","ADM0_A3_CN":"NER","ADM0_A3_TW":"NER","ADM0_A3_IN":"NER","ADM0_A3_NP":"NER","ADM0_A3_PK":"NER","ADM0_A3_DE":"NER","ADM0_A3_GB":"NER","ADM0_A3_BR":"NER","ADM0_A3_IL":"NER","ADM0_A3_PS":"NER","ADM0_A3_SA":"NER","ADM0_A3_EG":"NER","ADM0_A3_MA":"NER","ADM0_A3_PT":"NER","ADM0_A3_AR":"NER","ADM0_A3_JP":"NER","ADM0_A3_KO":"NER","ADM0_A3_VN":"NER","ADM0_A3_TR":"NER","ADM0_A3_ID":"NER","ADM0_A3_PL":"NER","ADM0_A3_GR":"NER","ADM0_A3_IT":"NER","ADM0_A3_NL":"NER","ADM0_A3_SE":"NER","ADM0_A3_BD":"NER","ADM0_A3_UA":"NER","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":9.504356,"LABEL_Y":17.446195,"NE_ID":1159321087,"WIKIDATAID":"Q1032","NAME_AR":"النيجر","NAME_BN":"নাইজার","NAME_DE":"Niger","NAME_EN":"Niger","NAME_ES":"Níger","NAME_FA":"نیجر","NAME_FR":"Niger","NAME_EL":"Νίγηρας","NAME_HE":"ניז'ר","NAME_HI":"नाइजर","NAME_HU":"Niger","NAME_ID":"Niger","NAME_IT":"Niger","NAME_JA":"ニジェール","NAME_KO":"니제르","NAME_NL":"Niger","NAME_PL":"Niger","NAME_PT":"Níger","NAME_RU":"Нигер","NAME_SV":"Niger","NAME_TR":"Nijer","NAME_UK":"Нігер","NAME_UR":"نائجر","NAME_VI":"Niger","NAME_ZH":"尼日尔","NAME_ZHT":"尼日","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[0.295646,11.660167,15.903247,23.471668],"geometry":{"type":"Polygon","coordinates":[[[14.8513,22.86295],[15.096888,21.308519],[15.47106,21.04845],[15.487148,20.730415],[15.903247,20.387619],[15.685741,19.95718],[15.300441,17.92795],[15.247731,16.627306],[13.97217,15.68437],[13.540394,14.367134],[13.956699,13.996691],[13.954477,13.353449],[14.595781,13.330427],[14.495787,12.859396],[14.213531,12.802035],[14.181336,12.483657],[13.995353,12.461565],[13.318702,13.556356],[13.083987,13.596147],[12.302071,13.037189],[11.527803,13.32898],[10.989593,13.387323],[10.701032,13.246918],[10.114814,13.277252],[9.524928,12.851102],[9.014933,12.826659],[7.804671,13.343527],[7.330747,13.098038],[6.820442,13.115091],[6.445426,13.492768],[5.443058,13.865924],[4.368344,13.747482],[4.107946,13.531216],[3.967283,12.956109],[3.680634,12.552903],[3.61118,11.660167],[2.848643,12.235636],[2.490164,12.233052],[2.154474,11.94015],[2.177108,12.625018],[1.024103,12.851826],[0.993046,13.33575],[0.429928,13.988733],[0.295646,14.444235],[0.374892,14.928908],[1.015783,14.968182],[1.385528,15.323561],[2.749993,15.409525],[3.638259,15.56812],[3.723422,16.184284],[4.27021,16.852227],[4.267419,19.155265],[5.677566,19.601207],[8.572893,21.565661],[11.999506,23.471668],[13.581425,23.040506],[14.143871,22.491289],[14.8513,22.86295]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Nigeria","SOV_A3":"NGA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Nigeria","ADM0_A3":"NGA","GEOU_DIF":0,"GEOUNIT":"Nigeria","GU_A3":"NGA","SU_DIF":0,"SUBUNIT":"Nigeria","SU_A3":"NGA","BRK_DIFF":0,"NAME":"Nigeria","NAME_LONG":"Nigeria","BRK_A3":"NGA","BRK_NAME":"Nigeria","BRK_GROUP":null,"ABBREV":"Nigeria","POSTAL":"NG","FORMAL_EN":"Federal Republic of Nigeria","FORMAL_FR":null,"NAME_CIAWF":"Nigeria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Nigeria","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":2,"POP_EST":200963599,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":448120,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","FIPS_10":"NI","ISO_A2":"NG","ISO_A2_EH":"NG","ISO_A3":"NGA","ISO_A3_EH":"NGA","ISO_N3":"566","ISO_N3_EH":"566","UN_A3":"566","WB_A2":"NG","WB_A3":"NGA","WOE_ID":23424908,"WOE_ID_EH":23424908,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"NGA","ADM0_DIFF":null,"ADM0_TLC":"NGA","ADM0_A3_US":"NGA","ADM0_A3_FR":"NGA","ADM0_A3_RU":"NGA","ADM0_A3_ES":"NGA","ADM0_A3_CN":"NGA","ADM0_A3_TW":"NGA","ADM0_A3_IN":"NGA","ADM0_A3_NP":"NGA","ADM0_A3_PK":"NGA","ADM0_A3_DE":"NGA","ADM0_A3_GB":"NGA","ADM0_A3_BR":"NGA","ADM0_A3_IL":"NGA","ADM0_A3_PS":"NGA","ADM0_A3_SA":"NGA","ADM0_A3_EG":"NGA","ADM0_A3_MA":"NGA","ADM0_A3_PT":"NGA","ADM0_A3_AR":"NGA","ADM0_A3_JP":"NGA","ADM0_A3_KO":"NGA","ADM0_A3_VN":"NGA","ADM0_A3_TR":"NGA","ADM0_A3_ID":"NGA","ADM0_A3_PL":"NGA","ADM0_A3_GR":"NGA","ADM0_A3_IT":"NGA","ADM0_A3_NL":"NGA","ADM0_A3_SE":"NGA","ADM0_A3_BD":"NGA","ADM0_A3_UA":"NGA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":7.50322,"LABEL_Y":9.439799,"NE_ID":1159321089,"WIKIDATAID":"Q1033","NAME_AR":"نيجيريا","NAME_BN":"নাইজেরিয়া","NAME_DE":"Nigeria","NAME_EN":"Nigeria","NAME_ES":"Nigeria","NAME_FA":"نیجریه","NAME_FR":"Nigeria","NAME_EL":"Νιγηρία","NAME_HE":"ניגריה","NAME_HI":"नाईजीरिया","NAME_HU":"Nigéria","NAME_ID":"Nigeria","NAME_IT":"Nigeria","NAME_JA":"ナイジェリア","NAME_KO":"나이지리아","NAME_NL":"Nigeria","NAME_PL":"Nigeria","NAME_PT":"Nigéria","NAME_RU":"Нигерия","NAME_SV":"Nigeria","NAME_TR":"Nijerya","NAME_UK":"Нігерія","NAME_UR":"نائجیریا","NAME_VI":"Nigeria","NAME_ZH":"尼日利亚","NAME_ZHT":"奈及利亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[2.691702,4.240594,14.577178,13.865924],"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[2.749063,7.870734],[2.723793,8.506845],[2.912308,9.137608],[3.220352,9.444153],[3.705438,10.06321],[3.60007,10.332186],[3.797112,10.734746],[3.572216,11.327939],[3.61118,11.660167],[3.680634,12.552903],[3.967283,12.956109],[4.107946,13.531216],[4.368344,13.747482],[5.443058,13.865924],[6.445426,13.492768],[6.820442,13.115091],[7.330747,13.098038],[7.804671,13.343527],[9.014933,12.826659],[9.524928,12.851102],[10.114814,13.277252],[10.701032,13.246918],[10.989593,13.387323],[11.527803,13.32898],[12.302071,13.037189],[13.083987,13.596147],[13.318702,13.556356],[13.995353,12.461565],[14.181336,12.483657],[14.577178,12.085361],[14.468192,11.904752],[14.415379,11.572369],[13.57295,10.798566],[13.308676,10.160362],[13.1676,9.640626],[12.955468,9.417772],[12.753672,8.717763],[12.218872,8.305824],[12.063946,7.799808],[11.839309,7.397042],[11.745774,6.981383],[11.058788,6.644427],[10.497375,7.055358],[10.118277,7.03877],[9.522706,6.453482],[9.233163,6.444491],[8.757533,5.479666],[8.500288,4.771983],[7.462108,4.412108],[7.082596,4.464689],[6.698072,4.240594],[5.898173,4.262453],[5.362805,4.887971],[5.033574,5.611802],[4.325607,6.270651],[3.57418,6.2583],[2.691702,6.258817]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Cameroon","SOV_A3":"CMR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Cameroon","ADM0_A3":"CMR","GEOU_DIF":0,"GEOUNIT":"Cameroon","GU_A3":"CMR","SU_DIF":0,"SUBUNIT":"Cameroon","SU_A3":"CMR","BRK_DIFF":0,"NAME":"Cameroon","NAME_LONG":"Cameroon","BRK_A3":"CMR","BRK_NAME":"Cameroon","BRK_GROUP":null,"ABBREV":"Cam.","POSTAL":"CM","FORMAL_EN":"Republic of Cameroon","FORMAL_FR":null,"NAME_CIAWF":"Cameroon","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Cameroon","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":3,"POP_EST":25876380,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":39007,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"CM","ISO_A2":"CM","ISO_A2_EH":"CM","ISO_A3":"CMR","ISO_A3_EH":"CMR","ISO_N3":"120","ISO_N3_EH":"120","UN_A3":"120","WB_A2":"CM","WB_A3":"CMR","WOE_ID":23424785,"WOE_ID_EH":23424785,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CMR","ADM0_DIFF":null,"ADM0_TLC":"CMR","ADM0_A3_US":"CMR","ADM0_A3_FR":"CMR","ADM0_A3_RU":"CMR","ADM0_A3_ES":"CMR","ADM0_A3_CN":"CMR","ADM0_A3_TW":"CMR","ADM0_A3_IN":"CMR","ADM0_A3_NP":"CMR","ADM0_A3_PK":"CMR","ADM0_A3_DE":"CMR","ADM0_A3_GB":"CMR","ADM0_A3_BR":"CMR","ADM0_A3_IL":"CMR","ADM0_A3_PS":"CMR","ADM0_A3_SA":"CMR","ADM0_A3_EG":"CMR","ADM0_A3_MA":"CMR","ADM0_A3_PT":"CMR","ADM0_A3_AR":"CMR","ADM0_A3_JP":"CMR","ADM0_A3_KO":"CMR","ADM0_A3_VN":"CMR","ADM0_A3_TR":"CMR","ADM0_A3_ID":"CMR","ADM0_A3_PL":"CMR","ADM0_A3_GR":"CMR","ADM0_A3_IT":"CMR","ADM0_A3_NL":"CMR","ADM0_A3_SE":"CMR","ADM0_A3_BD":"CMR","ADM0_A3_UA":"CMR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":12.473488,"LABEL_Y":4.585041,"NE_ID":1159320509,"WIKIDATAID":"Q1009","NAME_AR":"الكاميرون","NAME_BN":"ক্যামেরুন","NAME_DE":"Kamerun","NAME_EN":"Cameroon","NAME_ES":"Camerún","NAME_FA":"کامرون","NAME_FR":"Cameroun","NAME_EL":"Καμερούν","NAME_HE":"קמרון","NAME_HI":"कैमरुन","NAME_HU":"Kamerun","NAME_ID":"Kamerun","NAME_IT":"Camerun","NAME_JA":"カメルーン","NAME_KO":"카메룬","NAME_NL":"Kameroen","NAME_PL":"Kamerun","NAME_PT":"Camarões","NAME_RU":"Камерун","NAME_SV":"Kamerun","NAME_TR":"Kamerun","NAME_UK":"Камерун","NAME_UR":"کیمرون","NAME_VI":"Cameroon","NAME_ZH":"喀麦隆","NAME_ZHT":"喀麥隆","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[8.488816,1.727673,16.012852,12.859396],"geometry":{"type":"Polygon","coordinates":[[[14.495787,12.859396],[14.89336,12.21905],[14.960152,11.555574],[14.923565,10.891325],[15.467873,9.982337],[14.909354,9.992129],[14.627201,9.920919],[14.171466,10.021378],[13.954218,9.549495],[14.544467,8.965861],[14.979996,8.796104],[15.120866,8.38215],[15.436092,7.692812],[15.27946,7.421925],[14.776545,6.408498],[14.53656,6.226959],[14.459407,5.451761],[14.558936,5.030598],[14.478372,4.732605],[14.950953,4.210389],[15.03622,3.851367],[15.405396,3.335301],[15.862732,3.013537],[15.907381,2.557389],[16.012852,2.26764],[15.940919,1.727673],[15.146342,1.964015],[14.337813,2.227875],[13.075822,2.267097],[12.951334,2.321616],[12.35938,2.192812],[11.751665,2.326758],[11.276449,2.261051],[9.649158,2.283866],[9.795196,3.073404],[9.404367,3.734527],[8.948116,3.904129],[8.744924,4.352215],[8.488816,4.495617],[8.500288,4.771983],[8.757533,5.479666],[9.233163,6.444491],[9.522706,6.453482],[10.118277,7.03877],[10.497375,7.055358],[11.058788,6.644427],[11.745774,6.981383],[11.839309,7.397042],[12.063946,7.799808],[12.218872,8.305824],[12.753672,8.717763],[12.955468,9.417772],[13.1676,9.640626],[13.308676,10.160362],[13.57295,10.798566],[14.415379,11.572369],[14.468192,11.904752],[14.577178,12.085361],[14.181336,12.483657],[14.213531,12.802035],[14.495787,12.859396]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Togo","SOV_A3":"TGO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Togo","ADM0_A3":"TGO","GEOU_DIF":0,"GEOUNIT":"Togo","GU_A3":"TGO","SU_DIF":0,"SUBUNIT":"Togo","SU_A3":"TGO","BRK_DIFF":0,"NAME":"Togo","NAME_LONG":"Togo","BRK_A3":"TGO","BRK_NAME":"Togo","BRK_GROUP":null,"ABBREV":"Togo","POSTAL":"TG","FORMAL_EN":"Togolese Republic","FORMAL_FR":"République Togolaise","NAME_CIAWF":"Togo","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Togo","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":5,"POP_EST":8082366,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":5490,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"TO","ISO_A2":"TG","ISO_A2_EH":"TG","ISO_A3":"TGO","ISO_A3_EH":"TGO","ISO_N3":"768","ISO_N3_EH":"768","UN_A3":"768","WB_A2":"TG","WB_A3":"TGO","WOE_ID":23424965,"WOE_ID_EH":23424965,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TGO","ADM0_DIFF":null,"ADM0_TLC":"TGO","ADM0_A3_US":"TGO","ADM0_A3_FR":"TGO","ADM0_A3_RU":"TGO","ADM0_A3_ES":"TGO","ADM0_A3_CN":"TGO","ADM0_A3_TW":"TGO","ADM0_A3_IN":"TGO","ADM0_A3_NP":"TGO","ADM0_A3_PK":"TGO","ADM0_A3_DE":"TGO","ADM0_A3_GB":"TGO","ADM0_A3_BR":"TGO","ADM0_A3_IL":"TGO","ADM0_A3_PS":"TGO","ADM0_A3_SA":"TGO","ADM0_A3_EG":"TGO","ADM0_A3_MA":"TGO","ADM0_A3_PT":"TGO","ADM0_A3_AR":"TGO","ADM0_A3_JP":"TGO","ADM0_A3_KO":"TGO","ADM0_A3_VN":"TGO","ADM0_A3_TR":"TGO","ADM0_A3_ID":"TGO","ADM0_A3_PL":"TGO","ADM0_A3_GR":"TGO","ADM0_A3_IT":"TGO","ADM0_A3_NL":"TGO","ADM0_A3_SE":"TGO","ADM0_A3_BD":"TGO","ADM0_A3_UA":"TGO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":1.058113,"LABEL_Y":8.80722,"NE_ID":1159321303,"WIKIDATAID":"Q945","NAME_AR":"توغو","NAME_BN":"টোগো","NAME_DE":"Togo","NAME_EN":"Togo","NAME_ES":"Togo","NAME_FA":"توگو","NAME_FR":"Togo","NAME_EL":"Τόγκο","NAME_HE":"טוגו","NAME_HI":"टोगो","NAME_HU":"Togo","NAME_ID":"Togo","NAME_IT":"Togo","NAME_JA":"トーゴ","NAME_KO":"토고","NAME_NL":"Togo","NAME_PL":"Togo","NAME_PT":"Togo","NAME_RU":"Того","NAME_SV":"Togo","NAME_TR":"Togo","NAME_UK":"Того","NAME_UR":"ٹوگو","NAME_VI":"Togo","NAME_ZH":"多哥","NAME_ZHT":"多哥","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-0.049785,5.928837,1.865241,11.018682],"geometry":{"type":"Polygon","coordinates":[[[0.899563,10.997339],[0.772336,10.470808],[1.077795,10.175607],[1.425061,9.825395],[1.463043,9.334624],[1.664478,9.12859],[1.618951,6.832038],[1.865241,6.142158],[1.060122,5.928837],[0.836931,6.279979],[0.570384,6.914359],[0.490957,7.411744],[0.712029,8.312465],[0.461192,8.677223],[0.365901,9.465004],[0.36758,10.191213],[-0.049785,10.706918],[0.023803,11.018682],[0.899563,10.997339]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Ghana","SOV_A3":"GHA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Ghana","ADM0_A3":"GHA","GEOU_DIF":0,"GEOUNIT":"Ghana","GU_A3":"GHA","SU_DIF":0,"SUBUNIT":"Ghana","SU_A3":"GHA","BRK_DIFF":0,"NAME":"Ghana","NAME_LONG":"Ghana","BRK_A3":"GHA","BRK_NAME":"Ghana","BRK_GROUP":null,"ABBREV":"Ghana","POSTAL":"GH","FORMAL_EN":"Republic of Ghana","FORMAL_FR":null,"NAME_CIAWF":"Ghana","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ghana","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":1,"MAPCOLOR13":4,"POP_EST":30417856,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":66983,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"GH","ISO_A2":"GH","ISO_A2_EH":"GH","ISO_A3":"GHA","ISO_A3_EH":"GHA","ISO_N3":"288","ISO_N3_EH":"288","UN_A3":"288","WB_A2":"GH","WB_A3":"GHA","WOE_ID":23424824,"WOE_ID_EH":23424824,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GHA","ADM0_DIFF":null,"ADM0_TLC":"GHA","ADM0_A3_US":"GHA","ADM0_A3_FR":"GHA","ADM0_A3_RU":"GHA","ADM0_A3_ES":"GHA","ADM0_A3_CN":"GHA","ADM0_A3_TW":"GHA","ADM0_A3_IN":"GHA","ADM0_A3_NP":"GHA","ADM0_A3_PK":"GHA","ADM0_A3_DE":"GHA","ADM0_A3_GB":"GHA","ADM0_A3_BR":"GHA","ADM0_A3_IL":"GHA","ADM0_A3_PS":"GHA","ADM0_A3_SA":"GHA","ADM0_A3_EG":"GHA","ADM0_A3_MA":"GHA","ADM0_A3_PT":"GHA","ADM0_A3_AR":"GHA","ADM0_A3_JP":"GHA","ADM0_A3_KO":"GHA","ADM0_A3_VN":"GHA","ADM0_A3_TR":"GHA","ADM0_A3_ID":"GHA","ADM0_A3_PL":"GHA","ADM0_A3_GR":"GHA","ADM0_A3_IT":"GHA","ADM0_A3_NL":"GHA","ADM0_A3_SE":"GHA","ADM0_A3_BD":"GHA","ADM0_A3_UA":"GHA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":8,"LABEL_X":-1.036941,"LABEL_Y":7.717639,"NE_ID":1159320793,"WIKIDATAID":"Q117","NAME_AR":"غانا","NAME_BN":"ঘানা","NAME_DE":"Ghana","NAME_EN":"Ghana","NAME_ES":"Ghana","NAME_FA":"غنا","NAME_FR":"Ghana","NAME_EL":"Γκάνα","NAME_HE":"גאנה","NAME_HI":"घाना","NAME_HU":"Ghána","NAME_ID":"Ghana","NAME_IT":"Ghana","NAME_JA":"ガーナ","NAME_KO":"가나","NAME_NL":"Ghana","NAME_PL":"Ghana","NAME_PT":"Gana","NAME_RU":"Гана","NAME_SV":"Ghana","NAME_TR":"Gana","NAME_UK":"Гана","NAME_UR":"گھانا","NAME_VI":"Ghana","NAME_ZH":"加纳","NAME_ZHT":"迦納","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-3.24437,4.710462,1.060122,11.098341],"geometry":{"type":"Polygon","coordinates":[[[0.023803,11.018682],[-0.049785,10.706918],[0.36758,10.191213],[0.365901,9.465004],[0.461192,8.677223],[0.712029,8.312465],[0.490957,7.411744],[0.570384,6.914359],[0.836931,6.279979],[1.060122,5.928837],[-0.507638,5.343473],[-1.063625,5.000548],[-1.964707,4.710462],[-2.856125,4.994476],[-2.810701,5.389051],[-3.24437,6.250472],[-2.983585,7.379705],[-2.56219,8.219628],[-2.827496,9.642461],[-2.963896,10.395335],[-2.940409,10.96269],[-1.203358,11.009819],[-0.761576,10.93693],[-0.438702,11.098341],[0.023803,11.018682]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Ivory Coast","SOV_A3":"CIV","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Ivory Coast","ADM0_A3":"CIV","GEOU_DIF":0,"GEOUNIT":"Ivory Coast","GU_A3":"CIV","SU_DIF":0,"SUBUNIT":"Ivory Coast","SU_A3":"CIV","BRK_DIFF":0,"NAME":"Côte d'Ivoire","NAME_LONG":"Côte d'Ivoire","BRK_A3":"CIV","BRK_NAME":"Côte d'Ivoire","BRK_GROUP":null,"ABBREV":"I.C.","POSTAL":"CI","FORMAL_EN":"Republic of Ivory Coast","FORMAL_FR":"Republic of Cote D'Ivoire","NAME_CIAWF":"Cote D'ivoire","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Côte d'Ivoire","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":6,"MAPCOLOR9":3,"MAPCOLOR13":3,"POP_EST":25716544,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":58539,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"IV","ISO_A2":"CI","ISO_A2_EH":"CI","ISO_A3":"CIV","ISO_A3_EH":"CIV","ISO_N3":"384","ISO_N3_EH":"384","UN_A3":"384","WB_A2":"CI","WB_A3":"CIV","WOE_ID":23424854,"WOE_ID_EH":23424854,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CIV","ADM0_DIFF":null,"ADM0_TLC":"CIV","ADM0_A3_US":"CIV","ADM0_A3_FR":"CIV","ADM0_A3_RU":"CIV","ADM0_A3_ES":"CIV","ADM0_A3_CN":"CIV","ADM0_A3_TW":"CIV","ADM0_A3_IN":"CIV","ADM0_A3_NP":"CIV","ADM0_A3_PK":"CIV","ADM0_A3_DE":"CIV","ADM0_A3_GB":"CIV","ADM0_A3_BR":"CIV","ADM0_A3_IL":"CIV","ADM0_A3_PS":"CIV","ADM0_A3_SA":"CIV","ADM0_A3_EG":"CIV","ADM0_A3_MA":"CIV","ADM0_A3_PT":"CIV","ADM0_A3_AR":"CIV","ADM0_A3_JP":"CIV","ADM0_A3_KO":"CIV","ADM0_A3_VN":"CIV","ADM0_A3_TR":"CIV","ADM0_A3_ID":"CIV","ADM0_A3_PL":"CIV","ADM0_A3_GR":"CIV","ADM0_A3_IT":"CIV","ADM0_A3_NL":"CIV","ADM0_A3_SE":"CIV","ADM0_A3_BD":"CIV","ADM0_A3_UA":"CIV","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":13,"LONG_LEN":13,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":8,"LABEL_X":-5.568618,"LABEL_Y":7.49139,"NE_ID":1159320507,"WIKIDATAID":"Q1008","NAME_AR":"ساحل العاج","NAME_BN":"কোত দিভোয়ার","NAME_DE":"Elfenbeinküste","NAME_EN":"Ivory Coast","NAME_ES":"Costa de Marfil","NAME_FA":"ساحل عاج","NAME_FR":"Côte d'Ivoire","NAME_EL":"Ακτή Ελεφαντοστού","NAME_HE":"חוף השנהב","NAME_HI":"कोत दिव्वार","NAME_HU":"Elefántcsontpart","NAME_ID":"Pantai Gading","NAME_IT":"Costa d'Avorio","NAME_JA":"コートジボワール","NAME_KO":"코트디부아르","NAME_NL":"Ivoorkust","NAME_PL":"Wybrzeże Kości Słoniowej","NAME_PT":"Costa do Marfim","NAME_RU":"Кот-д’Ивуар","NAME_SV":"Elfenbenskusten","NAME_TR":"Fildişi Sahili","NAME_UK":"Кот-д'Івуар","NAME_UR":"کوت داوواغ","NAME_VI":"Bờ Biển Ngà","NAME_ZH":"科特迪瓦","NAME_ZHT":"象牙海岸","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-8.60288,4.338288,-2.56219,10.524061],"geometry":{"type":"Polygon","coordinates":[[[-8.029944,10.206535],[-7.89959,10.297382],[-7.622759,10.147236],[-6.850507,10.138994],[-6.666461,10.430811],[-6.493965,10.411303],[-6.205223,10.524061],[-6.050452,10.096361],[-5.816926,10.222555],[-5.404342,10.370737],[-4.954653,10.152714],[-4.779884,9.821985],[-4.330247,9.610835],[-3.980449,9.862344],[-3.511899,9.900326],[-2.827496,9.642461],[-2.56219,8.219628],[-2.983585,7.379705],[-3.24437,6.250472],[-2.810701,5.389051],[-2.856125,4.994476],[-3.311084,4.984296],[-4.00882,5.179813],[-4.649917,5.168264],[-5.834496,4.993701],[-6.528769,4.705088],[-7.518941,4.338288],[-7.712159,4.364566],[-7.635368,5.188159],[-7.539715,5.313345],[-7.570153,5.707352],[-7.993693,6.12619],[-8.311348,6.193033],[-8.60288,6.467564],[-8.385452,6.911801],[-8.485446,7.395208],[-8.439298,7.686043],[-8.280703,7.68718],[-8.221792,8.123329],[-8.299049,8.316444],[-8.203499,8.455453],[-7.8321,8.575704],[-8.079114,9.376224],[-8.309616,9.789532],[-8.229337,10.12902],[-8.029944,10.206535]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Guinea","SOV_A3":"GIN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Guinea","ADM0_A3":"GIN","GEOU_DIF":0,"GEOUNIT":"Guinea","GU_A3":"GIN","SU_DIF":0,"SUBUNIT":"Guinea","SU_A3":"GIN","BRK_DIFF":0,"NAME":"Guinea","NAME_LONG":"Guinea","BRK_A3":"GIN","BRK_NAME":"Guinea","BRK_GROUP":null,"ABBREV":"Gin.","POSTAL":"GN","FORMAL_EN":"Republic of Guinea","FORMAL_FR":null,"NAME_CIAWF":"Guinea","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Guinea","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":7,"MAPCOLOR13":2,"POP_EST":12771246,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":12296,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"GV","ISO_A2":"GN","ISO_A2_EH":"GN","ISO_A3":"GIN","ISO_A3_EH":"GIN","ISO_N3":"324","ISO_N3_EH":"324","UN_A3":"324","WB_A2":"GN","WB_A3":"GIN","WOE_ID":23424835,"WOE_ID_EH":23424835,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GIN","ADM0_DIFF":null,"ADM0_TLC":"GIN","ADM0_A3_US":"GIN","ADM0_A3_FR":"GIN","ADM0_A3_RU":"GIN","ADM0_A3_ES":"GIN","ADM0_A3_CN":"GIN","ADM0_A3_TW":"GIN","ADM0_A3_IN":"GIN","ADM0_A3_NP":"GIN","ADM0_A3_PK":"GIN","ADM0_A3_DE":"GIN","ADM0_A3_GB":"GIN","ADM0_A3_BR":"GIN","ADM0_A3_IL":"GIN","ADM0_A3_PS":"GIN","ADM0_A3_SA":"GIN","ADM0_A3_EG":"GIN","ADM0_A3_MA":"GIN","ADM0_A3_PT":"GIN","ADM0_A3_AR":"GIN","ADM0_A3_JP":"GIN","ADM0_A3_KO":"GIN","ADM0_A3_VN":"GIN","ADM0_A3_TR":"GIN","ADM0_A3_ID":"GIN","ADM0_A3_PL":"GIN","ADM0_A3_GR":"GIN","ADM0_A3_IT":"GIN","ADM0_A3_NL":"GIN","ADM0_A3_SE":"GIN","ADM0_A3_BD":"GIN","ADM0_A3_UA":"GIN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-10.016402,"LABEL_Y":10.618516,"NE_ID":1159320795,"WIKIDATAID":"Q1006","NAME_AR":"غينيا","NAME_BN":"গিনি","NAME_DE":"Guinea","NAME_EN":"Guinea","NAME_ES":"Guinea","NAME_FA":"گینه","NAME_FR":"Guinée","NAME_EL":"Γουινέα","NAME_HE":"גינאה","NAME_HI":"गिनी","NAME_HU":"Guinea","NAME_ID":"Guinea","NAME_IT":"Guinea","NAME_JA":"ギニア","NAME_KO":"기니","NAME_NL":"Guinee","NAME_PL":"Gwinea","NAME_PT":"Guiné","NAME_RU":"Гвинея","NAME_SV":"Guinea","NAME_TR":"Gine","NAME_UK":"Гвінея","NAME_UR":"جمہوریہ گنی","NAME_VI":"Guinée","NAME_ZH":"几内亚","NAME_ZHT":"幾內亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-15.130311,7.309037,-7.8321,12.586183],"geometry":{"type":"Polygon","coordinates":[[[-13.700476,12.586183],[-13.217818,12.575874],[-12.499051,12.33209],[-12.278599,12.35444],[-12.203565,12.465648],[-11.658301,12.386583],[-11.513943,12.442988],[-11.456169,12.076834],[-11.297574,12.077971],[-11.036556,12.211245],[-10.87083,12.177887],[-10.593224,11.923975],[-10.165214,11.844084],[-9.890993,12.060479],[-9.567912,12.194243],[-9.327616,12.334286],[-9.127474,12.30806],[-8.905265,12.088358],[-8.786099,11.812561],[-8.376305,11.393646],[-8.581305,11.136246],[-8.620321,10.810891],[-8.407311,10.909257],[-8.282357,10.792597],[-8.335377,10.494812],[-8.029944,10.206535],[-8.229337,10.12902],[-8.309616,9.789532],[-8.079114,9.376224],[-7.8321,8.575704],[-8.203499,8.455453],[-8.299049,8.316444],[-8.221792,8.123329],[-8.280703,7.68718],[-8.439298,7.686043],[-8.722124,7.711674],[-8.926065,7.309037],[-9.208786,7.313921],[-9.403348,7.526905],[-9.33728,7.928534],[-9.755342,8.541055],[-10.016567,8.428504],[-10.230094,8.406206],[-10.505477,8.348896],[-10.494315,8.715541],[-10.65477,8.977178],[-10.622395,9.26791],[-10.839152,9.688246],[-11.117481,10.045873],[-11.917277,10.046984],[-12.150338,9.858572],[-12.425929,9.835834],[-12.596719,9.620188],[-12.711958,9.342712],[-13.24655,8.903049],[-13.685154,9.494744],[-14.074045,9.886167],[-14.330076,10.01572],[-14.579699,10.214467],[-14.693232,10.656301],[-14.839554,10.876572],[-15.130311,11.040412],[-14.685687,11.527824],[-14.382192,11.509272],[-14.121406,11.677117],[-13.9008,11.678719],[-13.743161,11.811269],[-13.828272,12.142644],[-13.718744,12.247186],[-13.700476,12.586183]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Guinea-Bissau","SOV_A3":"GNB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Guinea-Bissau","ADM0_A3":"GNB","GEOU_DIF":0,"GEOUNIT":"Guinea-Bissau","GU_A3":"GNB","SU_DIF":0,"SUBUNIT":"Guinea-Bissau","SU_A3":"GNB","BRK_DIFF":0,"NAME":"Guinea-Bissau","NAME_LONG":"Guinea-Bissau","BRK_A3":"GNB","BRK_NAME":"Guinea-Bissau","BRK_GROUP":null,"ABBREV":"GnB.","POSTAL":"GW","FORMAL_EN":"Republic of Guinea-Bissau","FORMAL_FR":null,"NAME_CIAWF":"Guinea-Bissau","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Guinea-Bissau","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":4,"POP_EST":1920922,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":1339,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"PU","ISO_A2":"GW","ISO_A2_EH":"GW","ISO_A3":"GNB","ISO_A3_EH":"GNB","ISO_N3":"624","ISO_N3_EH":"624","UN_A3":"624","WB_A2":"GW","WB_A3":"GNB","WOE_ID":23424929,"WOE_ID_EH":23424929,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GNB","ADM0_DIFF":null,"ADM0_TLC":"GNB","ADM0_A3_US":"GNB","ADM0_A3_FR":"GNB","ADM0_A3_RU":"GNB","ADM0_A3_ES":"GNB","ADM0_A3_CN":"GNB","ADM0_A3_TW":"GNB","ADM0_A3_IN":"GNB","ADM0_A3_NP":"GNB","ADM0_A3_PK":"GNB","ADM0_A3_DE":"GNB","ADM0_A3_GB":"GNB","ADM0_A3_BR":"GNB","ADM0_A3_IL":"GNB","ADM0_A3_PS":"GNB","ADM0_A3_SA":"GNB","ADM0_A3_EG":"GNB","ADM0_A3_MA":"GNB","ADM0_A3_PT":"GNB","ADM0_A3_AR":"GNB","ADM0_A3_JP":"GNB","ADM0_A3_KO":"GNB","ADM0_A3_VN":"GNB","ADM0_A3_TR":"GNB","ADM0_A3_ID":"GNB","ADM0_A3_PL":"GNB","ADM0_A3_GR":"GNB","ADM0_A3_IT":"GNB","ADM0_A3_NL":"GNB","ADM0_A3_SE":"GNB","ADM0_A3_BD":"GNB","ADM0_A3_UA":"GNB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":13,"LONG_LEN":13,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":-14.52413,"LABEL_Y":12.163712,"NE_ID":1159320799,"WIKIDATAID":"Q1007","NAME_AR":"غينيا بيساو","NAME_BN":"গিনি-বিসাউ","NAME_DE":"Guinea-Bissau","NAME_EN":"Guinea-Bissau","NAME_ES":"Guinea-Bisáu","NAME_FA":"گینه بیسائو","NAME_FR":"Guinée-Bissau","NAME_EL":"Γουινέα-Μπισσάου","NAME_HE":"גינאה ביסאו","NAME_HI":"गिनी-बिसाऊ","NAME_HU":"Bissau-Guinea","NAME_ID":"Guinea-Bissau","NAME_IT":"Guinea-Bissau","NAME_JA":"ギニアビサウ","NAME_KO":"기니비사우","NAME_NL":"Guinee-Bissau","NAME_PL":"Gwinea Bissau","NAME_PT":"Guiné-Bissau","NAME_RU":"Гвинея-Бисау","NAME_SV":"Guinea-Bissau","NAME_TR":"Gine-Bissau","NAME_UK":"Гвінея-Бісау","NAME_UR":"گنی بساؤ","NAME_VI":"Guiné-Bissau","NAME_ZH":"几内亚比绍","NAME_ZHT":"幾內亞比索","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-16.677452,11.040412,-13.700476,12.62817],"geometry":{"type":"Polygon","coordinates":[[[-16.677452,12.384852],[-16.147717,12.547762],[-15.816574,12.515567],[-15.548477,12.62817],[-13.700476,12.586183],[-13.718744,12.247186],[-13.828272,12.142644],[-13.743161,11.811269],[-13.9008,11.678719],[-14.121406,11.677117],[-14.382192,11.509272],[-14.685687,11.527824],[-15.130311,11.040412],[-15.66418,11.458474],[-16.085214,11.524594],[-16.314787,11.806515],[-16.308947,11.958702],[-16.613838,12.170911],[-16.677452,12.384852]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Liberia","SOV_A3":"LBR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Liberia","ADM0_A3":"LBR","GEOU_DIF":0,"GEOUNIT":"Liberia","GU_A3":"LBR","SU_DIF":0,"SUBUNIT":"Liberia","SU_A3":"LBR","BRK_DIFF":0,"NAME":"Liberia","NAME_LONG":"Liberia","BRK_A3":"LBR","BRK_NAME":"Liberia","BRK_GROUP":null,"ABBREV":"Liberia","POSTAL":"LR","FORMAL_EN":"Republic of Liberia","FORMAL_FR":null,"NAME_CIAWF":"Liberia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Liberia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":9,"POP_EST":4937374,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":3070,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"LI","ISO_A2":"LR","ISO_A2_EH":"LR","ISO_A3":"LBR","ISO_A3_EH":"LBR","ISO_N3":"430","ISO_N3_EH":"430","UN_A3":"430","WB_A2":"LR","WB_A3":"LBR","WOE_ID":23424876,"WOE_ID_EH":23424876,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LBR","ADM0_DIFF":null,"ADM0_TLC":"LBR","ADM0_A3_US":"LBR","ADM0_A3_FR":"LBR","ADM0_A3_RU":"LBR","ADM0_A3_ES":"LBR","ADM0_A3_CN":"LBR","ADM0_A3_TW":"LBR","ADM0_A3_IN":"LBR","ADM0_A3_NP":"LBR","ADM0_A3_PK":"LBR","ADM0_A3_DE":"LBR","ADM0_A3_GB":"LBR","ADM0_A3_BR":"LBR","ADM0_A3_IL":"LBR","ADM0_A3_PS":"LBR","ADM0_A3_SA":"LBR","ADM0_A3_EG":"LBR","ADM0_A3_MA":"LBR","ADM0_A3_PT":"LBR","ADM0_A3_AR":"LBR","ADM0_A3_JP":"LBR","ADM0_A3_KO":"LBR","ADM0_A3_VN":"LBR","ADM0_A3_TR":"LBR","ADM0_A3_ID":"LBR","ADM0_A3_PL":"LBR","ADM0_A3_GR":"LBR","ADM0_A3_IT":"LBR","ADM0_A3_NL":"LBR","ADM0_A3_SE":"LBR","ADM0_A3_BD":"LBR","ADM0_A3_UA":"LBR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-9.460379,"LABEL_Y":6.447177,"NE_ID":1159321015,"WIKIDATAID":"Q1014","NAME_AR":"ليبيريا","NAME_BN":"লাইবেরিয়া","NAME_DE":"Liberia","NAME_EN":"Liberia","NAME_ES":"Liberia","NAME_FA":"لیبریا","NAME_FR":"Liberia","NAME_EL":"Λιβερία","NAME_HE":"ליבריה","NAME_HI":"लाइबेरिया","NAME_HU":"Libéria","NAME_ID":"Liberia","NAME_IT":"Liberia","NAME_JA":"リベリア","NAME_KO":"라이베리아","NAME_NL":"Liberia","NAME_PL":"Liberia","NAME_PT":"Libéria","NAME_RU":"Либерия","NAME_SV":"Liberia","NAME_TR":"Liberya","NAME_UK":"Ліберія","NAME_UR":"لائبیریا","NAME_VI":"Liberia","NAME_ZH":"利比里亚","NAME_ZHT":"賴比瑞亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-11.438779,4.355755,-7.539715,8.541055],"geometry":{"type":"Polygon","coordinates":[[[-8.439298,7.686043],[-8.485446,7.395208],[-8.385452,6.911801],[-8.60288,6.467564],[-8.311348,6.193033],[-7.993693,6.12619],[-7.570153,5.707352],[-7.539715,5.313345],[-7.635368,5.188159],[-7.712159,4.364566],[-7.974107,4.355755],[-9.004794,4.832419],[-9.91342,5.593561],[-10.765384,6.140711],[-11.438779,6.785917],[-11.199802,7.105846],[-11.146704,7.396706],[-10.695595,7.939464],[-10.230094,8.406206],[-10.016567,8.428504],[-9.755342,8.541055],[-9.33728,7.928534],[-9.403348,7.526905],[-9.208786,7.313921],[-8.926065,7.309037],[-8.722124,7.711674],[-8.439298,7.686043]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Sierra Leone","SOV_A3":"SLE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Sierra Leone","ADM0_A3":"SLE","GEOU_DIF":0,"GEOUNIT":"Sierra Leone","GU_A3":"SLE","SU_DIF":0,"SUBUNIT":"Sierra Leone","SU_A3":"SLE","BRK_DIFF":0,"NAME":"Sierra Leone","NAME_LONG":"Sierra Leone","BRK_A3":"SLE","BRK_NAME":"Sierra Leone","BRK_GROUP":null,"ABBREV":"S.L.","POSTAL":"SL","FORMAL_EN":"Republic of Sierra Leone","FORMAL_FR":null,"NAME_CIAWF":"Sierra Leone","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Sierra Leone","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":7,"POP_EST":7813215,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":4121,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"SL","ISO_A2":"SL","ISO_A2_EH":"SL","ISO_A3":"SLE","ISO_A3_EH":"SLE","ISO_N3":"694","ISO_N3_EH":"694","UN_A3":"694","WB_A2":"SL","WB_A3":"SLE","WOE_ID":23424946,"WOE_ID_EH":23424946,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SLE","ADM0_DIFF":null,"ADM0_TLC":"SLE","ADM0_A3_US":"SLE","ADM0_A3_FR":"SLE","ADM0_A3_RU":"SLE","ADM0_A3_ES":"SLE","ADM0_A3_CN":"SLE","ADM0_A3_TW":"SLE","ADM0_A3_IN":"SLE","ADM0_A3_NP":"SLE","ADM0_A3_PK":"SLE","ADM0_A3_DE":"SLE","ADM0_A3_GB":"SLE","ADM0_A3_BR":"SLE","ADM0_A3_IL":"SLE","ADM0_A3_PS":"SLE","ADM0_A3_SA":"SLE","ADM0_A3_EG":"SLE","ADM0_A3_MA":"SLE","ADM0_A3_PT":"SLE","ADM0_A3_AR":"SLE","ADM0_A3_JP":"SLE","ADM0_A3_KO":"SLE","ADM0_A3_VN":"SLE","ADM0_A3_TR":"SLE","ADM0_A3_ID":"SLE","ADM0_A3_PL":"SLE","ADM0_A3_GR":"SLE","ADM0_A3_IT":"SLE","ADM0_A3_NL":"SLE","ADM0_A3_SE":"SLE","ADM0_A3_BD":"SLE","ADM0_A3_UA":"SLE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":-11.763677,"LABEL_Y":8.617449,"NE_ID":1159321251,"WIKIDATAID":"Q1044","NAME_AR":"سيراليون","NAME_BN":"সিয়েরা লিওন","NAME_DE":"Sierra Leone","NAME_EN":"Sierra Leone","NAME_ES":"Sierra Leona","NAME_FA":"سیرالئون","NAME_FR":"Sierra Leone","NAME_EL":"Σιέρα Λεόνε","NAME_HE":"סיירה לאון","NAME_HI":"सिएरा लियोन","NAME_HU":"Sierra Leone","NAME_ID":"Sierra Leone","NAME_IT":"Sierra Leone","NAME_JA":"シエラレオネ","NAME_KO":"시에라리온","NAME_NL":"Sierra Leone","NAME_PL":"Sierra Leone","NAME_PT":"Serra Leoa","NAME_RU":"Сьерра-Леоне","NAME_SV":"Sierra Leone","NAME_TR":"Sierra Leone","NAME_UK":"Сьєрра-Леоне","NAME_UR":"سیرالیون","NAME_VI":"Sierra Leone","NAME_ZH":"塞拉利昂","NAME_ZHT":"獅子山","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-13.24655,6.785917,-10.230094,10.046984],"geometry":{"type":"Polygon","coordinates":[[[-13.24655,8.903049],[-12.711958,9.342712],[-12.596719,9.620188],[-12.425929,9.835834],[-12.150338,9.858572],[-11.917277,10.046984],[-11.117481,10.045873],[-10.839152,9.688246],[-10.622395,9.26791],[-10.65477,8.977178],[-10.494315,8.715541],[-10.505477,8.348896],[-10.230094,8.406206],[-10.695595,7.939464],[-11.146704,7.396706],[-11.199802,7.105846],[-11.438779,6.785917],[-11.708195,6.860098],[-12.428099,7.262942],[-12.949049,7.798646],[-13.124025,8.163946],[-13.24655,8.903049]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Burkina Faso","SOV_A3":"BFA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Burkina Faso","ADM0_A3":"BFA","GEOU_DIF":0,"GEOUNIT":"Burkina Faso","GU_A3":"BFA","SU_DIF":0,"SUBUNIT":"Burkina Faso","SU_A3":"BFA","BRK_DIFF":0,"NAME":"Burkina Faso","NAME_LONG":"Burkina Faso","BRK_A3":"BFA","BRK_NAME":"Burkina Faso","BRK_GROUP":null,"ABBREV":"B.F.","POSTAL":"BF","FORMAL_EN":"Burkina Faso","FORMAL_FR":null,"NAME_CIAWF":"Burkina Faso","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Burkina Faso","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":5,"MAPCOLOR13":11,"POP_EST":20321378,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":15990,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"UV","ISO_A2":"BF","ISO_A2_EH":"BF","ISO_A3":"BFA","ISO_A3_EH":"BFA","ISO_N3":"854","ISO_N3_EH":"854","UN_A3":"854","WB_A2":"BF","WB_A3":"BFA","WOE_ID":23424978,"WOE_ID_EH":23424978,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BFA","ADM0_DIFF":null,"ADM0_TLC":"BFA","ADM0_A3_US":"BFA","ADM0_A3_FR":"BFA","ADM0_A3_RU":"BFA","ADM0_A3_ES":"BFA","ADM0_A3_CN":"BFA","ADM0_A3_TW":"BFA","ADM0_A3_IN":"BFA","ADM0_A3_NP":"BFA","ADM0_A3_PK":"BFA","ADM0_A3_DE":"BFA","ADM0_A3_GB":"BFA","ADM0_A3_BR":"BFA","ADM0_A3_IL":"BFA","ADM0_A3_PS":"BFA","ADM0_A3_SA":"BFA","ADM0_A3_EG":"BFA","ADM0_A3_MA":"BFA","ADM0_A3_PT":"BFA","ADM0_A3_AR":"BFA","ADM0_A3_JP":"BFA","ADM0_A3_KO":"BFA","ADM0_A3_VN":"BFA","ADM0_A3_TR":"BFA","ADM0_A3_ID":"BFA","ADM0_A3_PL":"BFA","ADM0_A3_GR":"BFA","ADM0_A3_IT":"BFA","ADM0_A3_NL":"BFA","ADM0_A3_SE":"BFA","ADM0_A3_BD":"BFA","ADM0_A3_UA":"BFA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-1.36388,"LABEL_Y":12.673048,"NE_ID":1159320405,"WIKIDATAID":"Q965","NAME_AR":"بوركينا فاسو","NAME_BN":"বুর্কিনা ফাসো","NAME_DE":"Burkina Faso","NAME_EN":"Burkina Faso","NAME_ES":"Burkina Faso","NAME_FA":"بورکینافاسو","NAME_FR":"Burkina Faso","NAME_EL":"Μπουρκίνα Φάσο","NAME_HE":"בורקינה פאסו","NAME_HI":"बुर्किना फासो","NAME_HU":"Burkina Faso","NAME_ID":"Burkina Faso","NAME_IT":"Burkina Faso","NAME_JA":"ブルキナファソ","NAME_KO":"부르키나파소","NAME_NL":"Burkina Faso","NAME_PL":"Burkina Faso","NAME_PT":"Burkina Faso","NAME_RU":"Буркина-Фасо","NAME_SV":"Burkina Faso","NAME_TR":"Burkina Faso","NAME_UK":"Буркіна-Фасо","NAME_UR":"برکینا فاسو","NAME_VI":"Burkina Faso","NAME_ZH":"布基纳法索","NAME_ZHT":"布基納法索","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-5.470565,9.610835,2.177108,15.116158],"geometry":{"type":"Polygon","coordinates":[[[-5.404342,10.370737],[-5.470565,10.95127],[-5.197843,11.375146],[-5.220942,11.713859],[-4.427166,12.542646],[-4.280405,13.228444],[-4.006391,13.472485],[-3.522803,13.337662],[-3.103707,13.541267],[-2.967694,13.79815],[-2.191825,14.246418],[-2.001035,14.559008],[-1.066363,14.973815],[-0.515854,15.116158],[-0.266257,14.924309],[0.374892,14.928908],[0.295646,14.444235],[0.429928,13.988733],[0.993046,13.33575],[1.024103,12.851826],[2.177108,12.625018],[2.154474,11.94015],[1.935986,11.64115],[1.447178,11.547719],[1.24347,11.110511],[0.899563,10.997339],[0.023803,11.018682],[-0.438702,11.098341],[-0.761576,10.93693],[-1.203358,11.009819],[-2.940409,10.96269],[-2.963896,10.395335],[-2.827496,9.642461],[-3.511899,9.900326],[-3.980449,9.862344],[-4.330247,9.610835],[-4.779884,9.821985],[-4.954653,10.152714],[-5.404342,10.370737]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Central African Republic","SOV_A3":"CAF","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Central African Republic","ADM0_A3":"CAF","GEOU_DIF":0,"GEOUNIT":"Central African Republic","GU_A3":"CAF","SU_DIF":0,"SUBUNIT":"Central African Republic","SU_A3":"CAF","BRK_DIFF":0,"NAME":"Central African Rep.","NAME_LONG":"Central African Republic","BRK_A3":"CAF","BRK_NAME":"Central African Rep.","BRK_GROUP":null,"ABBREV":"C.A.R.","POSTAL":"CF","FORMAL_EN":"Central African Republic","FORMAL_FR":null,"NAME_CIAWF":"Central African Republic","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Central African Republic","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":9,"POP_EST":4745185,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":2220,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"CT","ISO_A2":"CF","ISO_A2_EH":"CF","ISO_A3":"CAF","ISO_A3_EH":"CAF","ISO_N3":"140","ISO_N3_EH":"140","UN_A3":"140","WB_A2":"CF","WB_A3":"CAF","WOE_ID":23424792,"WOE_ID_EH":23424792,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CAF","ADM0_DIFF":null,"ADM0_TLC":"CAF","ADM0_A3_US":"CAF","ADM0_A3_FR":"CAF","ADM0_A3_RU":"CAF","ADM0_A3_ES":"CAF","ADM0_A3_CN":"CAF","ADM0_A3_TW":"CAF","ADM0_A3_IN":"CAF","ADM0_A3_NP":"CAF","ADM0_A3_PK":"CAF","ADM0_A3_DE":"CAF","ADM0_A3_GB":"CAF","ADM0_A3_BR":"CAF","ADM0_A3_IL":"CAF","ADM0_A3_PS":"CAF","ADM0_A3_SA":"CAF","ADM0_A3_EG":"CAF","ADM0_A3_MA":"CAF","ADM0_A3_PT":"CAF","ADM0_A3_AR":"CAF","ADM0_A3_JP":"CAF","ADM0_A3_KO":"CAF","ADM0_A3_VN":"CAF","ADM0_A3_TR":"CAF","ADM0_A3_ID":"CAF","ADM0_A3_PL":"CAF","ADM0_A3_GR":"CAF","ADM0_A3_IT":"CAF","ADM0_A3_NL":"CAF","ADM0_A3_SE":"CAF","ADM0_A3_BD":"CAF","ADM0_A3_UA":"CAF","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":20,"LONG_LEN":24,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":20.906897,"LABEL_Y":6.989681,"NE_ID":1159320463,"WIKIDATAID":"Q929","NAME_AR":"جمهورية أفريقيا الوسطى","NAME_BN":"মধ্য আফ্রিকান প্রজাতন্ত্র","NAME_DE":"Zentralafrikanische Republik","NAME_EN":"Central African Republic","NAME_ES":"República Centroafricana","NAME_FA":"جمهوری آفریقای مرکزی","NAME_FR":"République centrafricaine","NAME_EL":"Κεντροαφρικανική Δημοκρατία","NAME_HE":"הרפובליקה המרכז-אפריקאית","NAME_HI":"मध्य अफ़्रीकी गणराज्य","NAME_HU":"Közép-afrikai Köztársaság","NAME_ID":"Republik Afrika Tengah","NAME_IT":"Repubblica Centrafricana","NAME_JA":"中央アフリカ共和国","NAME_KO":"중앙아프리카 공화국","NAME_NL":"Centraal-Afrikaanse Republiek","NAME_PL":"Republika Środkowoafrykańska","NAME_PT":"República Centro-Africana","NAME_RU":"Центральноафриканская Республика","NAME_SV":"Centralafrikanska republiken","NAME_TR":"Orta Afrika Cumhuriyeti","NAME_UK":"Центральноафриканська Республіка","NAME_UR":"وسطی افریقی جمہوریہ","NAME_VI":"Cộng hòa Trung Phi","NAME_ZH":"中非共和国","NAME_ZHT":"中非共和國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[14.459407,2.26764,27.374226,11.142395],"geometry":{"type":"Polygon","coordinates":[[[27.374226,5.233944],[27.044065,5.127853],[26.402761,5.150875],[25.650455,5.256088],[25.278798,5.170408],[25.128833,4.927245],[24.805029,4.897247],[24.410531,5.108784],[23.297214,4.609693],[22.84148,4.710126],[22.704124,4.633051],[22.405124,4.02916],[21.659123,4.224342],[20.927591,4.322786],[20.290679,4.691678],[19.467784,5.031528],[18.932312,4.709506],[18.542982,4.201785],[18.453065,3.504386],[17.8099,3.560196],[17.133042,3.728197],[16.537058,3.198255],[16.012852,2.26764],[15.907381,2.557389],[15.862732,3.013537],[15.405396,3.335301],[15.03622,3.851367],[14.950953,4.210389],[14.478372,4.732605],[14.558936,5.030598],[14.459407,5.451761],[14.53656,6.226959],[14.776545,6.408498],[15.27946,7.421925],[16.106232,7.497088],[16.290562,7.754307],[16.456185,7.734774],[16.705988,7.508328],[17.96493,7.890914],[18.389555,8.281304],[18.911022,8.630895],[18.81201,8.982915],[19.094008,9.074847],[20.059685,9.012706],[21.000868,9.475985],[21.723822,10.567056],[22.231129,10.971889],[22.864165,11.142395],[22.977544,10.714463],[23.554304,10.089255],[23.55725,9.681218],[23.394779,9.265068],[23.459013,8.954286],[23.805813,8.666319],[24.567369,8.229188],[25.114932,7.825104],[25.124131,7.500085],[25.796648,6.979316],[26.213418,6.546603],[26.465909,5.946717],[27.213409,5.550953],[27.374226,5.233944]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Republic of the Congo","SOV_A3":"COG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Republic of the Congo","ADM0_A3":"COG","GEOU_DIF":0,"GEOUNIT":"Republic of the Congo","GU_A3":"COG","SU_DIF":0,"SUBUNIT":"Republic of the Congo","SU_A3":"COG","BRK_DIFF":0,"NAME":"Congo","NAME_LONG":"Republic of the Congo","BRK_A3":"COG","BRK_NAME":"Republic of the Congo","BRK_GROUP":null,"ABBREV":"Rep. Congo","POSTAL":"CG","FORMAL_EN":"Republic of the Congo","FORMAL_FR":null,"NAME_CIAWF":"Congo, Republic of the","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Congo, Rep.","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":10,"POP_EST":5380508,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":12267,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"CF","ISO_A2":"CG","ISO_A2_EH":"CG","ISO_A3":"COG","ISO_A3_EH":"COG","ISO_N3":"178","ISO_N3_EH":"178","UN_A3":"178","WB_A2":"CG","WB_A3":"COG","WOE_ID":23424779,"WOE_ID_EH":23424779,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"COG","ADM0_DIFF":null,"ADM0_TLC":"COG","ADM0_A3_US":"COG","ADM0_A3_FR":"COG","ADM0_A3_RU":"COG","ADM0_A3_ES":"COG","ADM0_A3_CN":"COG","ADM0_A3_TW":"COG","ADM0_A3_IN":"COG","ADM0_A3_NP":"COG","ADM0_A3_PK":"COG","ADM0_A3_DE":"COG","ADM0_A3_GB":"COG","ADM0_A3_BR":"COG","ADM0_A3_IL":"COG","ADM0_A3_PS":"COG","ADM0_A3_SA":"COG","ADM0_A3_EG":"COG","ADM0_A3_MA":"COG","ADM0_A3_PT":"COG","ADM0_A3_AR":"COG","ADM0_A3_JP":"COG","ADM0_A3_KO":"COG","ADM0_A3_VN":"COG","ADM0_A3_TR":"COG","ADM0_A3_ID":"COG","ADM0_A3_PL":"COG","ADM0_A3_GR":"COG","ADM0_A3_IT":"COG","ADM0_A3_NL":"COG","ADM0_A3_SE":"COG","ADM0_A3_BD":"COG","ADM0_A3_UA":"COG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":21,"ABBREV_LEN":10,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":15.9005,"LABEL_Y":0.142331,"NE_ID":1159320515,"WIKIDATAID":"Q971","NAME_AR":"جمهورية الكونغو","NAME_BN":"কঙ্গো প্রজাতন্ত্র","NAME_DE":"Republik Kongo","NAME_EN":"Republic of the Congo","NAME_ES":"República del Congo","NAME_FA":"جمهوری کنگو","NAME_FR":"République du Congo","NAME_EL":"Δημοκρατία του Κονγκό","NAME_HE":"הרפובליקה של קונגו","NAME_HI":"कांगो गणराज्य","NAME_HU":"Kongói Köztársaság","NAME_ID":"Republik Kongo","NAME_IT":"Repubblica del Congo","NAME_JA":"コンゴ共和国","NAME_KO":"콩고 공화국","NAME_NL":"Congo-Brazzaville","NAME_PL":"Kongo","NAME_PT":"República do Congo","NAME_RU":"Республика Конго","NAME_SV":"Kongo-Brazzaville","NAME_TR":"Kongo Cumhuriyeti","NAME_UK":"Республіка Конго","NAME_UR":"جمہوریہ کانگو","NAME_VI":"Cộng hòa Congo","NAME_ZH":"刚果共和国","NAME_ZHT":"剛果共和國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[11.093773,-5.037987,18.453065,3.728197],"geometry":{"type":"Polygon","coordinates":[[[18.453065,3.504386],[18.393792,2.900443],[18.094276,2.365722],[17.898835,1.741832],[17.774192,0.855659],[17.82654,0.288923],[17.663553,-0.058084],[17.638645,-0.424832],[17.523716,-0.74383],[16.865307,-1.225816],[16.407092,-1.740927],[15.972803,-2.712392],[16.00629,-3.535133],[15.75354,-3.855165],[15.170992,-4.343507],[14.582604,-4.970239],[14.209035,-4.793092],[14.144956,-4.510009],[13.600235,-4.500138],[13.25824,-4.882957],[12.995517,-4.781103],[12.62076,-4.438023],[12.318608,-4.60623],[11.914963,-5.037987],[11.093773,-3.978827],[11.855122,-3.426871],[11.478039,-2.765619],[11.820964,-2.514161],[12.495703,-2.391688],[12.575284,-1.948511],[13.109619,-2.42874],[13.992407,-2.470805],[14.29921,-1.998276],[14.425456,-1.333407],[14.316418,-0.552627],[13.843321,0.038758],[14.276266,1.19693],[14.026669,1.395677],[13.282631,1.314184],[13.003114,1.830896],[13.075822,2.267097],[14.337813,2.227875],[15.146342,1.964015],[15.940919,1.727673],[16.012852,2.26764],[16.537058,3.198255],[17.133042,3.728197],[17.8099,3.560196],[18.453065,3.504386]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Gabon","SOV_A3":"GAB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Gabon","ADM0_A3":"GAB","GEOU_DIF":0,"GEOUNIT":"Gabon","GU_A3":"GAB","SU_DIF":0,"SUBUNIT":"Gabon","SU_A3":"GAB","BRK_DIFF":0,"NAME":"Gabon","NAME_LONG":"Gabon","BRK_A3":"GAB","BRK_NAME":"Gabon","BRK_GROUP":null,"ABBREV":"Gabon","POSTAL":"GA","FORMAL_EN":"Gabonese Republic","FORMAL_FR":null,"NAME_CIAWF":"Gabon","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Gabon","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":5,"POP_EST":2172579,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":16874,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"GB","ISO_A2":"GA","ISO_A2_EH":"GA","ISO_A3":"GAB","ISO_A3_EH":"GAB","ISO_N3":"266","ISO_N3_EH":"266","UN_A3":"266","WB_A2":"GA","WB_A3":"GAB","WOE_ID":23424822,"WOE_ID_EH":23424822,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GAB","ADM0_DIFF":null,"ADM0_TLC":"GAB","ADM0_A3_US":"GAB","ADM0_A3_FR":"GAB","ADM0_A3_RU":"GAB","ADM0_A3_ES":"GAB","ADM0_A3_CN":"GAB","ADM0_A3_TW":"GAB","ADM0_A3_IN":"GAB","ADM0_A3_NP":"GAB","ADM0_A3_PK":"GAB","ADM0_A3_DE":"GAB","ADM0_A3_GB":"GAB","ADM0_A3_BR":"GAB","ADM0_A3_IL":"GAB","ADM0_A3_PS":"GAB","ADM0_A3_SA":"GAB","ADM0_A3_EG":"GAB","ADM0_A3_MA":"GAB","ADM0_A3_PT":"GAB","ADM0_A3_AR":"GAB","ADM0_A3_JP":"GAB","ADM0_A3_KO":"GAB","ADM0_A3_VN":"GAB","ADM0_A3_TR":"GAB","ADM0_A3_ID":"GAB","ADM0_A3_PL":"GAB","ADM0_A3_GR":"GAB","ADM0_A3_IT":"GAB","ADM0_A3_NL":"GAB","ADM0_A3_SE":"GAB","ADM0_A3_BD":"GAB","ADM0_A3_UA":"GAB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":3,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":11.835939,"LABEL_Y":-0.437739,"NE_ID":1159320693,"WIKIDATAID":"Q1000","NAME_AR":"الغابون","NAME_BN":"গ্যাবন","NAME_DE":"Gabun","NAME_EN":"Gabon","NAME_ES":"Gabón","NAME_FA":"گابن","NAME_FR":"Gabon","NAME_EL":"Γκαμπόν","NAME_HE":"גבון","NAME_HI":"गबॉन","NAME_HU":"Gabon","NAME_ID":"Gabon","NAME_IT":"Gabon","NAME_JA":"ガボン","NAME_KO":"가봉","NAME_NL":"Gabon","NAME_PL":"Gabon","NAME_PT":"Gabão","NAME_RU":"Габон","NAME_SV":"Gabon","NAME_TR":"Gabon","NAME_UK":"Габон","NAME_UR":"گیبون","NAME_VI":"Gabon","NAME_ZH":"加蓬","NAME_ZHT":"加彭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[8.797996,-3.978827,14.425456,2.326758],"geometry":{"type":"Polygon","coordinates":[[[11.276449,2.261051],[11.751665,2.326758],[12.35938,2.192812],[12.951334,2.321616],[13.075822,2.267097],[13.003114,1.830896],[13.282631,1.314184],[14.026669,1.395677],[14.276266,1.19693],[13.843321,0.038758],[14.316418,-0.552627],[14.425456,-1.333407],[14.29921,-1.998276],[13.992407,-2.470805],[13.109619,-2.42874],[12.575284,-1.948511],[12.495703,-2.391688],[11.820964,-2.514161],[11.478039,-2.765619],[11.855122,-3.426871],[11.093773,-3.978827],[10.066135,-2.969483],[9.405245,-2.144313],[8.797996,-1.111301],[8.830087,-0.779074],[9.04842,-0.459351],[9.291351,0.268666],[9.492889,1.01012],[9.830284,1.067894],[11.285079,1.057662],[11.276449,2.261051]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Equatorial Guinea","SOV_A3":"GNQ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Equatorial Guinea","ADM0_A3":"GNQ","GEOU_DIF":0,"GEOUNIT":"Equatorial Guinea","GU_A3":"GNQ","SU_DIF":0,"SUBUNIT":"Equatorial Guinea","SU_A3":"GNQ","BRK_DIFF":0,"NAME":"Eq. Guinea","NAME_LONG":"Equatorial Guinea","BRK_A3":"GNQ","BRK_NAME":"Eq. Guinea","BRK_GROUP":null,"ABBREV":"Eq. G.","POSTAL":"GQ","FORMAL_EN":"Republic of Equatorial Guinea","FORMAL_FR":null,"NAME_CIAWF":"Equatorial Guinea","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Equatorial Guinea","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":8,"POP_EST":1355986,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":11026,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"EK","ISO_A2":"GQ","ISO_A2_EH":"GQ","ISO_A3":"GNQ","ISO_A3_EH":"GNQ","ISO_N3":"226","ISO_N3_EH":"226","UN_A3":"226","WB_A2":"GQ","WB_A3":"GNQ","WOE_ID":23424804,"WOE_ID_EH":23424804,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GNQ","ADM0_DIFF":null,"ADM0_TLC":"GNQ","ADM0_A3_US":"GNQ","ADM0_A3_FR":"GNQ","ADM0_A3_RU":"GNQ","ADM0_A3_ES":"GNQ","ADM0_A3_CN":"GNQ","ADM0_A3_TW":"GNQ","ADM0_A3_IN":"GNQ","ADM0_A3_NP":"GNQ","ADM0_A3_PK":"GNQ","ADM0_A3_DE":"GNQ","ADM0_A3_GB":"GNQ","ADM0_A3_BR":"GNQ","ADM0_A3_IL":"GNQ","ADM0_A3_PS":"GNQ","ADM0_A3_SA":"GNQ","ADM0_A3_EG":"GNQ","ADM0_A3_MA":"GNQ","ADM0_A3_PT":"GNQ","ADM0_A3_AR":"GNQ","ADM0_A3_JP":"GNQ","ADM0_A3_KO":"GNQ","ADM0_A3_VN":"GNQ","ADM0_A3_TR":"GNQ","ADM0_A3_ID":"GNQ","ADM0_A3_PL":"GNQ","ADM0_A3_GR":"GNQ","ADM0_A3_IT":"GNQ","ADM0_A3_NL":"GNQ","ADM0_A3_SE":"GNQ","ADM0_A3_BD":"GNQ","ADM0_A3_UA":"GNQ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":17,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":8.9902,"LABEL_Y":2.333,"NE_ID":1159320801,"WIKIDATAID":"Q983","NAME_AR":"غينيا الاستوائية","NAME_BN":"বিষুবীয় গিনি","NAME_DE":"Äquatorialguinea","NAME_EN":"Equatorial Guinea","NAME_ES":"Guinea Ecuatorial","NAME_FA":"گینه استوایی","NAME_FR":"Guinée équatoriale","NAME_EL":"Ισημερινή Γουινέα","NAME_HE":"גינאה המשוונית","NAME_HI":"भूमध्यरेखीय गिनी","NAME_HU":"Egyenlítői-Guinea","NAME_ID":"Guinea Khatulistiwa","NAME_IT":"Guinea Equatoriale","NAME_JA":"赤道ギニア","NAME_KO":"적도 기니","NAME_NL":"Equatoriaal-Guinea","NAME_PL":"Gwinea Równikowa","NAME_PT":"Guiné Equatorial","NAME_RU":"Экваториальная Гвинея","NAME_SV":"Ekvatorialguinea","NAME_TR":"Ekvator Ginesi","NAME_UK":"Екваторіальна Гвінея","NAME_UR":"استوائی گنی","NAME_VI":"Guinea Xích Đạo","NAME_ZH":"赤道几内亚","NAME_ZHT":"赤道幾內亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[9.305613,1.01012,11.285079,2.283866],"geometry":{"type":"Polygon","coordinates":[[[9.649158,2.283866],[11.276449,2.261051],[11.285079,1.057662],[9.830284,1.067894],[9.492889,1.01012],[9.305613,1.160911],[9.649158,2.283866]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Zambia","SOV_A3":"ZMB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Zambia","ADM0_A3":"ZMB","GEOU_DIF":0,"GEOUNIT":"Zambia","GU_A3":"ZMB","SU_DIF":0,"SUBUNIT":"Zambia","SU_A3":"ZMB","BRK_DIFF":0,"NAME":"Zambia","NAME_LONG":"Zambia","BRK_A3":"ZMB","BRK_NAME":"Zambia","BRK_GROUP":null,"ABBREV":"Zambia","POSTAL":"ZM","FORMAL_EN":"Republic of Zambia","FORMAL_FR":null,"NAME_CIAWF":"Zambia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Zambia","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":8,"MAPCOLOR9":5,"MAPCOLOR13":13,"POP_EST":17861030,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":23309,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"ZA","ISO_A2":"ZM","ISO_A2_EH":"ZM","ISO_A3":"ZMB","ISO_A3_EH":"ZMB","ISO_N3":"894","ISO_N3_EH":"894","UN_A3":"894","WB_A2":"ZM","WB_A3":"ZMB","WOE_ID":23425003,"WOE_ID_EH":23425003,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ZMB","ADM0_DIFF":null,"ADM0_TLC":"ZMB","ADM0_A3_US":"ZMB","ADM0_A3_FR":"ZMB","ADM0_A3_RU":"ZMB","ADM0_A3_ES":"ZMB","ADM0_A3_CN":"ZMB","ADM0_A3_TW":"ZMB","ADM0_A3_IN":"ZMB","ADM0_A3_NP":"ZMB","ADM0_A3_PK":"ZMB","ADM0_A3_DE":"ZMB","ADM0_A3_GB":"ZMB","ADM0_A3_BR":"ZMB","ADM0_A3_IL":"ZMB","ADM0_A3_PS":"ZMB","ADM0_A3_SA":"ZMB","ADM0_A3_EG":"ZMB","ADM0_A3_MA":"ZMB","ADM0_A3_PT":"ZMB","ADM0_A3_AR":"ZMB","ADM0_A3_JP":"ZMB","ADM0_A3_KO":"ZMB","ADM0_A3_VN":"ZMB","ADM0_A3_TR":"ZMB","ADM0_A3_ID":"ZMB","ADM0_A3_PL":"ZMB","ADM0_A3_GR":"ZMB","ADM0_A3_IT":"ZMB","ADM0_A3_NL":"ZMB","ADM0_A3_SE":"ZMB","ADM0_A3_BD":"ZMB","ADM0_A3_UA":"ZMB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":26.395298,"LABEL_Y":-14.660804,"NE_ID":1159321439,"WIKIDATAID":"Q953","NAME_AR":"زامبيا","NAME_BN":"জাম্বিয়া","NAME_DE":"Sambia","NAME_EN":"Zambia","NAME_ES":"Zambia","NAME_FA":"زامبیا","NAME_FR":"Zambie","NAME_EL":"Ζάμπια","NAME_HE":"זמביה","NAME_HI":"ज़ाम्बिया","NAME_HU":"Zambia","NAME_ID":"Zambia","NAME_IT":"Zambia","NAME_JA":"ザンビア","NAME_KO":"잠비아","NAME_NL":"Zambia","NAME_PL":"Zambia","NAME_PT":"Zâmbia","NAME_RU":"Замбия","NAME_SV":"Zambia","NAME_TR":"Zambiya","NAME_UK":"Замбія","NAME_UR":"زیمبیا","NAME_VI":"Zambia","NAME_ZH":"赞比亚","NAME_ZHT":"尚比亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[21.887843,-17.961229,33.485688,-8.238257],"geometry":{"type":"Polygon","coordinates":[[[30.74001,-8.340006],[31.157751,-8.594579],[31.556348,-8.762049],[32.191865,-8.930359],[32.759375,-9.230599],[33.231388,-9.676722],[33.485688,-10.525559],[33.31531,-10.79655],[33.114289,-11.607198],[33.306422,-12.435778],[32.991764,-12.783871],[32.688165,-13.712858],[33.214025,-13.97186],[30.179481,-14.796099],[30.274256,-15.507787],[29.516834,-15.644678],[28.947463,-16.043051],[28.825869,-16.389749],[28.467906,-16.4684],[27.598243,-17.290831],[27.044427,-17.938026],[26.706773,-17.961229],[26.381935,-17.846042],[25.264226,-17.73654],[25.084443,-17.661816],[25.07695,-17.578823],[24.682349,-17.353411],[24.033862,-17.295843],[23.215048,-17.523116],[22.562478,-16.898451],[21.887843,-16.08031],[21.933886,-12.898437],[24.016137,-12.911046],[23.930922,-12.565848],[24.079905,-12.191297],[23.904154,-11.722282],[24.017894,-11.237298],[23.912215,-10.926826],[24.257155,-10.951993],[24.314516,-11.262826],[24.78317,-11.238694],[25.418118,-11.330936],[25.75231,-11.784965],[26.553088,-11.92444],[27.16442,-11.608748],[27.388799,-12.132747],[28.155109,-12.272481],[28.523562,-12.698604],[28.934286,-13.248958],[29.699614,-13.257227],[29.616001,-12.178895],[29.341548,-12.360744],[28.642417,-11.971569],[28.372253,-11.793647],[28.49607,-10.789884],[28.673682,-9.605925],[28.449871,-9.164918],[28.734867,-8.526559],[29.002912,-8.407032],[30.346086,-8.238257],[30.74001,-8.340006]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Malawi","SOV_A3":"MWI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Malawi","ADM0_A3":"MWI","GEOU_DIF":0,"GEOUNIT":"Malawi","GU_A3":"MWI","SU_DIF":0,"SUBUNIT":"Malawi","SU_A3":"MWI","BRK_DIFF":0,"NAME":"Malawi","NAME_LONG":"Malawi","BRK_A3":"MWI","BRK_NAME":"Malawi","BRK_GROUP":null,"ABBREV":"Mal.","POSTAL":"MW","FORMAL_EN":"Republic of Malawi","FORMAL_FR":null,"NAME_CIAWF":"Malawi","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Malawi","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":5,"POP_EST":18628747,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":7666,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"MI","ISO_A2":"MW","ISO_A2_EH":"MW","ISO_A3":"MWI","ISO_A3_EH":"MWI","ISO_N3":"454","ISO_N3_EH":"454","UN_A3":"454","WB_A2":"MW","WB_A3":"MWI","WOE_ID":23424889,"WOE_ID_EH":23424889,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MWI","ADM0_DIFF":null,"ADM0_TLC":"MWI","ADM0_A3_US":"MWI","ADM0_A3_FR":"MWI","ADM0_A3_RU":"MWI","ADM0_A3_ES":"MWI","ADM0_A3_CN":"MWI","ADM0_A3_TW":"MWI","ADM0_A3_IN":"MWI","ADM0_A3_NP":"MWI","ADM0_A3_PK":"MWI","ADM0_A3_DE":"MWI","ADM0_A3_GB":"MWI","ADM0_A3_BR":"MWI","ADM0_A3_IL":"MWI","ADM0_A3_PS":"MWI","ADM0_A3_SA":"MWI","ADM0_A3_EG":"MWI","ADM0_A3_MA":"MWI","ADM0_A3_PT":"MWI","ADM0_A3_AR":"MWI","ADM0_A3_JP":"MWI","ADM0_A3_KO":"MWI","ADM0_A3_VN":"MWI","ADM0_A3_TR":"MWI","ADM0_A3_ID":"MWI","ADM0_A3_PL":"MWI","ADM0_A3_GR":"MWI","ADM0_A3_IT":"MWI","ADM0_A3_NL":"MWI","ADM0_A3_SE":"MWI","ADM0_A3_BD":"MWI","ADM0_A3_UA":"MWI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":33.608082,"LABEL_Y":-13.386737,"NE_ID":1159321081,"WIKIDATAID":"Q1020","NAME_AR":"مالاوي","NAME_BN":"মালাউই","NAME_DE":"Malawi","NAME_EN":"Malawi","NAME_ES":"Malaui","NAME_FA":"مالاوی","NAME_FR":"Malawi","NAME_EL":"Μαλάουι","NAME_HE":"מלאווי","NAME_HI":"मलावी","NAME_HU":"Malawi","NAME_ID":"Malawi","NAME_IT":"Malawi","NAME_JA":"マラウイ","NAME_KO":"말라위","NAME_NL":"Malawi","NAME_PL":"Malawi","NAME_PT":"Malawi","NAME_RU":"Малави","NAME_SV":"Malawi","NAME_TR":"Malavi","NAME_UK":"Малаві","NAME_UR":"ملاوی","NAME_VI":"Malawi","NAME_ZH":"马拉维","NAME_ZHT":"馬拉威","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[32.688165,-16.8013,35.771905,-9.230599],"geometry":{"type":"Polygon","coordinates":[[[32.759375,-9.230599],[33.73972,-9.41715],[33.940838,-9.693674],[34.28,-10.16],[34.559989,-11.52002],[34.280006,-12.280025],[34.559989,-13.579998],[34.907151,-13.565425],[35.267956,-13.887834],[35.686845,-14.611046],[35.771905,-15.896859],[35.339063,-16.10744],[35.03381,-16.8013],[34.381292,-16.18356],[34.307291,-15.478641],[34.517666,-15.013709],[34.459633,-14.61301],[34.064825,-14.35995],[33.7897,-14.451831],[33.214025,-13.97186],[32.688165,-13.712858],[32.991764,-12.783871],[33.306422,-12.435778],[33.114289,-11.607198],[33.31531,-10.79655],[33.485688,-10.525559],[33.231388,-9.676722],[32.759375,-9.230599]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Mozambique","SOV_A3":"MOZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Mozambique","ADM0_A3":"MOZ","GEOU_DIF":0,"GEOUNIT":"Mozambique","GU_A3":"MOZ","SU_DIF":0,"SUBUNIT":"Mozambique","SU_A3":"MOZ","BRK_DIFF":0,"NAME":"Mozambique","NAME_LONG":"Mozambique","BRK_A3":"MOZ","BRK_NAME":"Mozambique","BRK_GROUP":null,"ABBREV":"Moz.","POSTAL":"MZ","FORMAL_EN":"Republic of Mozambique","FORMAL_FR":null,"NAME_CIAWF":"Mozambique","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mozambique","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":2,"MAPCOLOR9":1,"MAPCOLOR13":4,"POP_EST":30366036,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":15291,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"MZ","ISO_A2":"MZ","ISO_A2_EH":"MZ","ISO_A3":"MOZ","ISO_A3_EH":"MOZ","ISO_N3":"508","ISO_N3_EH":"508","UN_A3":"508","WB_A2":"MZ","WB_A3":"MOZ","WOE_ID":23424902,"WOE_ID_EH":23424902,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MOZ","ADM0_DIFF":null,"ADM0_TLC":"MOZ","ADM0_A3_US":"MOZ","ADM0_A3_FR":"MOZ","ADM0_A3_RU":"MOZ","ADM0_A3_ES":"MOZ","ADM0_A3_CN":"MOZ","ADM0_A3_TW":"MOZ","ADM0_A3_IN":"MOZ","ADM0_A3_NP":"MOZ","ADM0_A3_PK":"MOZ","ADM0_A3_DE":"MOZ","ADM0_A3_GB":"MOZ","ADM0_A3_BR":"MOZ","ADM0_A3_IL":"MOZ","ADM0_A3_PS":"MOZ","ADM0_A3_SA":"MOZ","ADM0_A3_EG":"MOZ","ADM0_A3_MA":"MOZ","ADM0_A3_PT":"MOZ","ADM0_A3_AR":"MOZ","ADM0_A3_JP":"MOZ","ADM0_A3_KO":"MOZ","ADM0_A3_VN":"MOZ","ADM0_A3_TR":"MOZ","ADM0_A3_ID":"MOZ","ADM0_A3_PL":"MOZ","ADM0_A3_GR":"MOZ","ADM0_A3_IT":"MOZ","ADM0_A3_NL":"MOZ","ADM0_A3_SE":"MOZ","ADM0_A3_BD":"MOZ","ADM0_A3_UA":"MOZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":37.83789,"LABEL_Y":-13.94323,"NE_ID":1159321073,"WIKIDATAID":"Q1029","NAME_AR":"موزمبيق","NAME_BN":"মোজাম্বিক","NAME_DE":"Mosambik","NAME_EN":"Mozambique","NAME_ES":"Mozambique","NAME_FA":"موزامبیک","NAME_FR":"Mozambique","NAME_EL":"Μοζαμβίκη","NAME_HE":"מוזמביק","NAME_HI":"मोज़ाम्बीक","NAME_HU":"Mozambik","NAME_ID":"Mozambik","NAME_IT":"Mozambico","NAME_JA":"モザンビーク","NAME_KO":"모잠비크","NAME_NL":"Mozambique","NAME_PL":"Mozambik","NAME_PT":"Moçambique","NAME_RU":"Мозамбик","NAME_SV":"Moçambique","NAME_TR":"Mozambik","NAME_UK":"Мозамбік","NAME_UR":"موزمبیق","NAME_VI":"Mozambique","NAME_ZH":"莫桑比克","NAME_ZHT":"莫三比克","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[30.179481,-26.742192,40.775475,-10.317096],"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[35.312398,-11.439146],[36.514082,-11.720938],[36.775151,-11.594537],[37.47129,-11.56876],[37.82764,-11.26879],[38.427557,-11.285202],[39.521,-10.89688],[40.31659,-10.3171],[40.316586,-10.317098],[40.316589,-10.317096],[40.478387,-10.765441],[40.437253,-11.761711],[40.560811,-12.639177],[40.59962,-14.201975],[40.775475,-14.691764],[40.477251,-15.406294],[40.089264,-16.100774],[39.452559,-16.720891],[38.538351,-17.101023],[37.411133,-17.586368],[36.281279,-18.659688],[35.896497,-18.84226],[35.1984,-19.552811],[34.786383,-19.784012],[34.701893,-20.497043],[35.176127,-21.254361],[35.373428,-21.840837],[35.385848,-22.14],[35.562546,-22.09],[35.533935,-23.070788],[35.371774,-23.535359],[35.60747,-23.706563],[35.458746,-24.12261],[35.040735,-24.478351],[34.215824,-24.816314],[33.01321,-25.357573],[32.574632,-25.727318],[32.660363,-26.148584],[32.915955,-26.215867],[32.83012,-26.742192],[32.071665,-26.73382],[31.985779,-26.29178],[31.837778,-25.843332],[31.752408,-25.484284],[31.930589,-24.369417],[31.670398,-23.658969],[31.191409,-22.25151],[32.244988,-21.116489],[32.508693,-20.395292],[32.659743,-20.30429],[32.772708,-19.715592],[32.611994,-19.419383],[32.654886,-18.67209],[32.849861,-17.979057],[32.847639,-16.713398],[32.328239,-16.392074],[31.852041,-16.319417],[31.636498,-16.07199],[31.173064,-15.860944],[30.338955,-15.880839],[30.274256,-15.507787],[30.179481,-14.796099],[33.214025,-13.97186],[33.7897,-14.451831],[34.064825,-14.35995],[34.459633,-14.61301],[34.517666,-15.013709],[34.307291,-15.478641],[34.381292,-16.18356],[35.03381,-16.8013],[35.339063,-16.10744],[35.771905,-15.896859],[35.686845,-14.611046],[35.267956,-13.887834],[34.907151,-13.565425],[34.559989,-13.579998],[34.280006,-12.280025],[34.559989,-11.52002]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"eSwatini","SOV_A3":"SWZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"eSwatini","ADM0_A3":"SWZ","GEOU_DIF":0,"GEOUNIT":"eSwatini","GU_A3":"SWZ","SU_DIF":0,"SUBUNIT":"eSwatini","SU_A3":"SWZ","BRK_DIFF":0,"NAME":"eSwatini","NAME_LONG":"Kingdom of eSwatini","BRK_A3":"SWZ","BRK_NAME":"eSwatini","BRK_GROUP":null,"ABBREV":"eSw.","POSTAL":"ES","FORMAL_EN":"Kingdom of eSwatini","FORMAL_FR":null,"NAME_CIAWF":"eSwatini","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"eSwatini","NAME_ALT":"Swaziland","MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":1148130,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":4471,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"WZ","ISO_A2":"SZ","ISO_A2_EH":"SZ","ISO_A3":"SWZ","ISO_A3_EH":"SWZ","ISO_N3":"748","ISO_N3_EH":"748","UN_A3":"748","WB_A2":"SZ","WB_A3":"SWZ","WOE_ID":23424993,"WOE_ID_EH":23424993,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SWZ","ADM0_DIFF":null,"ADM0_TLC":"SWZ","ADM0_A3_US":"SWZ","ADM0_A3_FR":"SWZ","ADM0_A3_RU":"SWZ","ADM0_A3_ES":"SWZ","ADM0_A3_CN":"SWZ","ADM0_A3_TW":"SWZ","ADM0_A3_IN":"SWZ","ADM0_A3_NP":"SWZ","ADM0_A3_PK":"SWZ","ADM0_A3_DE":"SWZ","ADM0_A3_GB":"SWZ","ADM0_A3_BR":"SWZ","ADM0_A3_IL":"SWZ","ADM0_A3_PS":"SWZ","ADM0_A3_SA":"SWZ","ADM0_A3_EG":"SWZ","ADM0_A3_MA":"SWZ","ADM0_A3_PT":"SWZ","ADM0_A3_AR":"SWZ","ADM0_A3_JP":"SWZ","ADM0_A3_KO":"SWZ","ADM0_A3_VN":"SWZ","ADM0_A3_TR":"SWZ","ADM0_A3_ID":"SWZ","ADM0_A3_PL":"SWZ","ADM0_A3_GR":"SWZ","ADM0_A3_IT":"SWZ","ADM0_A3_NL":"SWZ","ADM0_A3_SE":"SWZ","ADM0_A3_BD":"SWZ","ADM0_A3_UA":"SWZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":19,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":31.467264,"LABEL_Y":-26.533676,"NE_ID":1159321289,"WIKIDATAID":"Q1050","NAME_AR":"إسواتيني","NAME_BN":"ইসোয়াতিনি","NAME_DE":"Eswatini","NAME_EN":"Eswatini","NAME_ES":"Suazilandia","NAME_FA":"اسواتینی","NAME_FR":"Eswatini","NAME_EL":"Εσουατίνι","NAME_HE":"אסוואטיני","NAME_HI":"एस्वातीनी","NAME_HU":"Szváziföld","NAME_ID":"Eswatini","NAME_IT":"eSwatini","NAME_JA":"エスワティニ","NAME_KO":"에스와티니","NAME_NL":"Swaziland","NAME_PL":"Eswatini","NAME_PT":"Essuatíni","NAME_RU":"Эсватини","NAME_SV":"Swaziland","NAME_TR":"Esvatini","NAME_UK":"Есватіні","NAME_UR":"اسواتینی","NAME_VI":"Eswatini","NAME_ZH":"斯威士兰","NAME_ZHT":"史瓦帝尼","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[30.676609,-27.285879,32.071665,-25.660191],"geometry":{"type":"Polygon","coordinates":[[[32.071665,-26.73382],[31.86806,-27.177927],[31.282773,-27.285879],[30.685962,-26.743845],[30.676609,-26.398078],[30.949667,-26.022649],[31.04408,-25.731452],[31.333158,-25.660191],[31.837778,-25.843332],[31.985779,-26.29178],[32.071665,-26.73382]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Angola","SOV_A3":"AGO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Angola","ADM0_A3":"AGO","GEOU_DIF":0,"GEOUNIT":"Angola","GU_A3":"AGO","SU_DIF":0,"SUBUNIT":"Angola","SU_A3":"AGO","BRK_DIFF":0,"NAME":"Angola","NAME_LONG":"Angola","BRK_A3":"AGO","BRK_NAME":"Angola","BRK_GROUP":null,"ABBREV":"Ang.","POSTAL":"AO","FORMAL_EN":"People's Republic of Angola","FORMAL_FR":null,"NAME_CIAWF":"Angola","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Angola","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":6,"MAPCOLOR13":1,"POP_EST":31825295,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":88815,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"3. Upper middle income","FIPS_10":"AO","ISO_A2":"AO","ISO_A2_EH":"AO","ISO_A3":"AGO","ISO_A3_EH":"AGO","ISO_N3":"024","ISO_N3_EH":"024","UN_A3":"024","WB_A2":"AO","WB_A3":"AGO","WOE_ID":23424745,"WOE_ID_EH":23424745,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"AGO","ADM0_DIFF":null,"ADM0_TLC":"AGO","ADM0_A3_US":"AGO","ADM0_A3_FR":"AGO","ADM0_A3_RU":"AGO","ADM0_A3_ES":"AGO","ADM0_A3_CN":"AGO","ADM0_A3_TW":"AGO","ADM0_A3_IN":"AGO","ADM0_A3_NP":"AGO","ADM0_A3_PK":"AGO","ADM0_A3_DE":"AGO","ADM0_A3_GB":"AGO","ADM0_A3_BR":"AGO","ADM0_A3_IL":"AGO","ADM0_A3_PS":"AGO","ADM0_A3_SA":"AGO","ADM0_A3_EG":"AGO","ADM0_A3_MA":"AGO","ADM0_A3_PT":"AGO","ADM0_A3_AR":"AGO","ADM0_A3_JP":"AGO","ADM0_A3_KO":"AGO","ADM0_A3_VN":"AGO","ADM0_A3_TR":"AGO","ADM0_A3_ID":"AGO","ADM0_A3_PL":"AGO","ADM0_A3_GR":"AGO","ADM0_A3_IT":"AGO","ADM0_A3_NL":"AGO","ADM0_A3_SE":"AGO","ADM0_A3_BD":"AGO","ADM0_A3_UA":"AGO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7,"LABEL_X":17.984249,"LABEL_Y":-12.182762,"NE_ID":1159320323,"WIKIDATAID":"Q916","NAME_AR":"أنغولا","NAME_BN":"অ্যাঙ্গোলা","NAME_DE":"Angola","NAME_EN":"Angola","NAME_ES":"Angola","NAME_FA":"آنگولا","NAME_FR":"Angola","NAME_EL":"Ανγκόλα","NAME_HE":"אנגולה","NAME_HI":"अंगोला","NAME_HU":"Angola","NAME_ID":"Angola","NAME_IT":"Angola","NAME_JA":"アンゴラ","NAME_KO":"앙골라","NAME_NL":"Angola","NAME_PL":"Angola","NAME_PT":"Angola","NAME_RU":"Ангола","NAME_SV":"Angola","NAME_TR":"Angola","NAME_UK":"Ангола","NAME_UR":"انگولا","NAME_VI":"Angola","NAME_ZH":"安哥拉","NAME_ZHT":"安哥拉","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[11.640096,-17.930636,24.079905,-4.438023],"geometry":{"type":"MultiPolygon","coordinates":[[[[12.995517,-4.781103],[12.631612,-4.991271],[12.468004,-5.248362],[12.436688,-5.684304],[12.182337,-5.789931],[11.914963,-5.037987],[12.318608,-4.60623],[12.62076,-4.438023],[12.995517,-4.781103]]],[[[12.322432,-6.100092],[12.735171,-5.965682],[13.024869,-5.984389],[13.375597,-5.864241],[16.326528,-5.87747],[16.57318,-6.622645],[16.860191,-7.222298],[17.089996,-7.545689],[17.47297,-8.068551],[18.134222,-7.987678],[18.464176,-7.847014],[19.016752,-7.988246],[19.166613,-7.738184],[19.417502,-7.155429],[20.037723,-7.116361],[20.091622,-6.94309],[20.601823,-6.939318],[20.514748,-7.299606],[21.728111,-7.290872],[21.746456,-7.920085],[21.949131,-8.305901],[21.801801,-8.908707],[21.875182,-9.523708],[22.208753,-9.894796],[22.155268,-11.084801],[22.402798,-10.993075],[22.837345,-11.017622],[23.456791,-10.867863],[23.912215,-10.926826],[24.017894,-11.237298],[23.904154,-11.722282],[24.079905,-12.191297],[23.930922,-12.565848],[24.016137,-12.911046],[21.933886,-12.898437],[21.887843,-16.08031],[22.562478,-16.898451],[23.215048,-17.523116],[21.377176,-17.930636],[18.956187,-17.789095],[18.263309,-17.309951],[14.209707,-17.353101],[14.058501,-17.423381],[13.462362,-16.971212],[12.814081,-16.941343],[12.215461,-17.111668],[11.734199,-17.301889],[11.640096,-16.673142],[11.778537,-15.793816],[12.123581,-14.878316],[12.175619,-14.449144],[12.500095,-13.5477],[12.738479,-13.137906],[13.312914,-12.48363],[13.633721,-12.038645],[13.738728,-11.297863],[13.686379,-10.731076],[13.387328,-10.373578],[13.120988,-9.766897],[12.87537,-9.166934],[12.929061,-8.959091],[13.236433,-8.562629],[12.93304,-7.596539],[12.728298,-6.927122],[12.227347,-6.294448],[12.322432,-6.100092]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Burundi","SOV_A3":"BDI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Burundi","ADM0_A3":"BDI","GEOU_DIF":0,"GEOUNIT":"Burundi","GU_A3":"BDI","SU_DIF":0,"SUBUNIT":"Burundi","SU_A3":"BDI","BRK_DIFF":0,"NAME":"Burundi","NAME_LONG":"Burundi","BRK_A3":"BDI","BRK_NAME":"Burundi","BRK_GROUP":null,"ABBREV":"Bur.","POSTAL":"BI","FORMAL_EN":"Republic of Burundi","FORMAL_FR":null,"NAME_CIAWF":"Burundi","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Burundi","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":8,"POP_EST":11530580,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":3012,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"BY","ISO_A2":"BI","ISO_A2_EH":"BI","ISO_A3":"BDI","ISO_A3_EH":"BDI","ISO_N3":"108","ISO_N3_EH":"108","UN_A3":"108","WB_A2":"BI","WB_A3":"BDI","WOE_ID":23424774,"WOE_ID_EH":23424774,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BDI","ADM0_DIFF":null,"ADM0_TLC":"BDI","ADM0_A3_US":"BDI","ADM0_A3_FR":"BDI","ADM0_A3_RU":"BDI","ADM0_A3_ES":"BDI","ADM0_A3_CN":"BDI","ADM0_A3_TW":"BDI","ADM0_A3_IN":"BDI","ADM0_A3_NP":"BDI","ADM0_A3_PK":"BDI","ADM0_A3_DE":"BDI","ADM0_A3_GB":"BDI","ADM0_A3_BR":"BDI","ADM0_A3_IL":"BDI","ADM0_A3_PS":"BDI","ADM0_A3_SA":"BDI","ADM0_A3_EG":"BDI","ADM0_A3_MA":"BDI","ADM0_A3_PT":"BDI","ADM0_A3_AR":"BDI","ADM0_A3_JP":"BDI","ADM0_A3_KO":"BDI","ADM0_A3_VN":"BDI","ADM0_A3_TR":"BDI","ADM0_A3_ID":"BDI","ADM0_A3_PL":"BDI","ADM0_A3_GR":"BDI","ADM0_A3_IT":"BDI","ADM0_A3_NL":"BDI","ADM0_A3_SE":"BDI","ADM0_A3_BD":"BDI","ADM0_A3_UA":"BDI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":29.917086,"LABEL_Y":-3.332836,"NE_ID":1159320387,"WIKIDATAID":"Q967","NAME_AR":"بوروندي","NAME_BN":"বুরুন্ডি","NAME_DE":"Burundi","NAME_EN":"Burundi","NAME_ES":"Burundi","NAME_FA":"بوروندی","NAME_FR":"Burundi","NAME_EL":"Μπουρούντι","NAME_HE":"בורונדי","NAME_HI":"बुरुण्डी","NAME_HU":"Burundi","NAME_ID":"Burundi","NAME_IT":"Burundi","NAME_JA":"ブルンジ","NAME_KO":"부룬디","NAME_NL":"Burundi","NAME_PL":"Burundi","NAME_PT":"Burundi","NAME_RU":"Бурунди","NAME_SV":"Burundi","NAME_TR":"Burundi","NAME_UK":"Бурунді","NAME_UR":"برونڈی","NAME_VI":"Burundi","NAME_ZH":"布隆迪","NAME_ZHT":"蒲隆地","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[29.024926,-4.499983,30.75224,-2.348487],"geometry":{"type":"Polygon","coordinates":[[[30.469674,-2.413855],[30.52766,-2.80762],[30.74301,-3.03431],[30.75224,-3.35931],[30.50554,-3.56858],[30.11632,-4.09012],[29.753512,-4.452389],[29.339998,-4.499983],[29.276384,-3.293907],[29.024926,-2.839258],[29.632176,-2.917858],[29.938359,-2.348487],[30.469674,-2.413855]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Israel","SOV_A3":"IS1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Disputed","TLC":"1","ADMIN":"Israel","ADM0_A3":"ISR","GEOU_DIF":0,"GEOUNIT":"Israel","GU_A3":"ISR","SU_DIF":0,"SUBUNIT":"Israel","SU_A3":"ISR","BRK_DIFF":1,"NAME":"Israel","NAME_LONG":"Israel","BRK_A3":"ISR","BRK_NAME":"Israel","BRK_GROUP":null,"ABBREV":"Isr.","POSTAL":"IS","FORMAL_EN":"State of Israel","FORMAL_FR":null,"NAME_CIAWF":"Israel","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Israel","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":9,"POP_EST":9053300,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":394652,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"-99","ISO_A2":"IL","ISO_A2_EH":"IL","ISO_A3":"ISR","ISO_A3_EH":"ISR","ISO_N3":"376","ISO_N3_EH":"376","UN_A3":"376","WB_A2":"IL","WB_A3":"ISR","WOE_ID":23424852,"WOE_ID_EH":23424852,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ISR","ADM0_DIFF":null,"ADM0_TLC":"ISR","ADM0_A3_US":"ISR","ADM0_A3_FR":"ISR","ADM0_A3_RU":"ISR","ADM0_A3_ES":"ISR","ADM0_A3_CN":"ISR","ADM0_A3_TW":"ISR","ADM0_A3_IN":"ISR","ADM0_A3_NP":"ISR","ADM0_A3_PK":"PSX","ADM0_A3_DE":"ISR","ADM0_A3_GB":"ISR","ADM0_A3_BR":"ISR","ADM0_A3_IL":"ISR","ADM0_A3_PS":"ISR","ADM0_A3_SA":"PSX","ADM0_A3_EG":"ISR","ADM0_A3_MA":"ISR","ADM0_A3_PT":"ISR","ADM0_A3_AR":"ISR","ADM0_A3_JP":"ISR","ADM0_A3_KO":"ISR","ADM0_A3_VN":"ISR","ADM0_A3_TR":"ISR","ADM0_A3_ID":"ISR","ADM0_A3_PL":"ISR","ADM0_A3_GR":"ISR","ADM0_A3_IT":"ISR","ADM0_A3_NL":"ISR","ADM0_A3_SE":"ISR","ADM0_A3_BD":"PSX","ADM0_A3_UA":"ISR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":34.847915,"LABEL_Y":30.911148,"NE_ID":1159320895,"WIKIDATAID":"Q801","NAME_AR":"إسرائيل","NAME_BN":"ইসরায়েল","NAME_DE":"Israel","NAME_EN":"Israel","NAME_ES":"Israel","NAME_FA":"اسرائیل","NAME_FR":"Israël","NAME_EL":"Ισραήλ","NAME_HE":"ישראל","NAME_HI":"इज़राइल","NAME_HU":"Izrael","NAME_ID":"Israel","NAME_IT":"Israele","NAME_JA":"イスラエル","NAME_KO":"이스라엘","NAME_NL":"Israël","NAME_PL":"Izrael","NAME_PT":"Israel","NAME_RU":"Израиль","NAME_SV":"Israel","NAME_TR":"İsrail","NAME_UK":"Ізраїль","NAME_UR":"اسرائیل","NAME_VI":"Israel","NAME_ZH":"以色列","NAME_ZHT":"以色列","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":"Unrecognized","FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":"Unrecognized","FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":"Unrecognized","FCLASS_UA":null},"bbox":[34.265433,29.501326,35.836397,33.277426],"geometry":{"type":"Polygon","coordinates":[[[35.719918,32.709192],[35.545665,32.393992],[35.18393,32.532511],[34.974641,31.866582],[35.225892,31.754341],[34.970507,31.616778],[34.927408,31.353435],[35.397561,31.489086],[35.420918,31.100066],[34.922603,29.501326],[34.823243,29.761081],[34.26544,31.21936],[34.265435,31.219357],[34.265433,31.219361],[34.556372,31.548824],[34.488107,31.605539],[34.752587,32.072926],[34.955417,32.827376],[35.098457,33.080539],[35.126053,33.0909],[35.460709,33.08904],[35.552797,33.264275],[35.821101,33.277426],[35.836397,32.868123],[35.700798,32.716014],[35.719918,32.709192]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Lebanon","SOV_A3":"LBN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Lebanon","ADM0_A3":"LBN","GEOU_DIF":0,"GEOUNIT":"Lebanon","GU_A3":"LBN","SU_DIF":0,"SUBUNIT":"Lebanon","SU_A3":"LBN","BRK_DIFF":0,"NAME":"Lebanon","NAME_LONG":"Lebanon","BRK_A3":"LBN","BRK_NAME":"Lebanon","BRK_GROUP":null,"ABBREV":"Leb.","POSTAL":"LB","FORMAL_EN":"Lebanese Republic","FORMAL_FR":null,"NAME_CIAWF":"Lebanon","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Lebanon","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":12,"POP_EST":6855713,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":51991,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"LE","ISO_A2":"LB","ISO_A2_EH":"LB","ISO_A3":"LBN","ISO_A3_EH":"LBN","ISO_N3":"422","ISO_N3_EH":"422","UN_A3":"422","WB_A2":"LB","WB_A3":"LBN","WOE_ID":23424873,"WOE_ID_EH":23424873,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LBN","ADM0_DIFF":null,"ADM0_TLC":"LBN","ADM0_A3_US":"LBN","ADM0_A3_FR":"LBN","ADM0_A3_RU":"LBN","ADM0_A3_ES":"LBN","ADM0_A3_CN":"LBN","ADM0_A3_TW":"LBN","ADM0_A3_IN":"LBN","ADM0_A3_NP":"LBN","ADM0_A3_PK":"LBN","ADM0_A3_DE":"LBN","ADM0_A3_GB":"LBN","ADM0_A3_BR":"LBN","ADM0_A3_IL":"LBN","ADM0_A3_PS":"LBN","ADM0_A3_SA":"LBN","ADM0_A3_EG":"LBN","ADM0_A3_MA":"LBN","ADM0_A3_PT":"LBN","ADM0_A3_AR":"LBN","ADM0_A3_JP":"LBN","ADM0_A3_KO":"LBN","ADM0_A3_VN":"LBN","ADM0_A3_TR":"LBN","ADM0_A3_ID":"LBN","ADM0_A3_PL":"LBN","ADM0_A3_GR":"LBN","ADM0_A3_IT":"LBN","ADM0_A3_NL":"LBN","ADM0_A3_SE":"LBN","ADM0_A3_BD":"LBN","ADM0_A3_UA":"LBN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":4,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":35.992892,"LABEL_Y":34.133368,"NE_ID":1159321013,"WIKIDATAID":"Q822","NAME_AR":"لبنان","NAME_BN":"লেবানন","NAME_DE":"Libanon","NAME_EN":"Lebanon","NAME_ES":"Líbano","NAME_FA":"لبنان","NAME_FR":"Liban","NAME_EL":"Λίβανος","NAME_HE":"לבנון","NAME_HI":"लेबनान","NAME_HU":"Libanon","NAME_ID":"Lebanon","NAME_IT":"Libano","NAME_JA":"レバノン","NAME_KO":"레바논","NAME_NL":"Libanon","NAME_PL":"Liban","NAME_PT":"Líbano","NAME_RU":"Ливан","NAME_SV":"Libanon","NAME_TR":"Lübnan","NAME_UK":"Ліван","NAME_UR":"لبنان","NAME_VI":"Liban","NAME_ZH":"黎巴嫩","NAME_ZHT":"黎巴嫩","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[35.126053,33.08904,36.61175,34.644914],"geometry":{"type":"Polygon","coordinates":[[[35.821101,33.277426],[35.552797,33.264275],[35.460709,33.08904],[35.126053,33.0909],[35.482207,33.90545],[35.979592,34.610058],[35.998403,34.644914],[36.448194,34.593935],[36.61175,34.201789],[36.06646,33.824912],[35.821101,33.277426]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Madagascar","SOV_A3":"MDG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Madagascar","ADM0_A3":"MDG","GEOU_DIF":0,"GEOUNIT":"Madagascar","GU_A3":"MDG","SU_DIF":0,"SUBUNIT":"Madagascar","SU_A3":"MDG","BRK_DIFF":0,"NAME":"Madagascar","NAME_LONG":"Madagascar","BRK_A3":"MDG","BRK_NAME":"Madagascar","BRK_GROUP":null,"ABBREV":"Mad.","POSTAL":"MG","FORMAL_EN":"Republic of Madagascar","FORMAL_FR":null,"NAME_CIAWF":"Madagascar","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Madagascar","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":3,"POP_EST":26969307,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":14114,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"MA","ISO_A2":"MG","ISO_A2_EH":"MG","ISO_A3":"MDG","ISO_A3_EH":"MDG","ISO_N3":"450","ISO_N3_EH":"450","UN_A3":"450","WB_A2":"MG","WB_A3":"MDG","WOE_ID":23424883,"WOE_ID_EH":23424883,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MDG","ADM0_DIFF":null,"ADM0_TLC":"MDG","ADM0_A3_US":"MDG","ADM0_A3_FR":"MDG","ADM0_A3_RU":"MDG","ADM0_A3_ES":"MDG","ADM0_A3_CN":"MDG","ADM0_A3_TW":"MDG","ADM0_A3_IN":"MDG","ADM0_A3_NP":"MDG","ADM0_A3_PK":"MDG","ADM0_A3_DE":"MDG","ADM0_A3_GB":"MDG","ADM0_A3_BR":"MDG","ADM0_A3_IL":"MDG","ADM0_A3_PS":"MDG","ADM0_A3_SA":"MDG","ADM0_A3_EG":"MDG","ADM0_A3_MA":"MDG","ADM0_A3_PT":"MDG","ADM0_A3_AR":"MDG","ADM0_A3_JP":"MDG","ADM0_A3_KO":"MDG","ADM0_A3_VN":"MDG","ADM0_A3_TR":"MDG","ADM0_A3_ID":"MDG","ADM0_A3_PL":"MDG","ADM0_A3_GR":"MDG","ADM0_A3_IT":"MDG","ADM0_A3_NL":"MDG","ADM0_A3_SE":"MDG","ADM0_A3_BD":"MDG","ADM0_A3_UA":"MDG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":7,"LABEL_X":46.704241,"LABEL_Y":-18.628288,"NE_ID":1159321051,"WIKIDATAID":"Q1019","NAME_AR":"مدغشقر","NAME_BN":"মাদাগাস্কার","NAME_DE":"Madagaskar","NAME_EN":"Madagascar","NAME_ES":"Madagascar","NAME_FA":"ماداگاسکار","NAME_FR":"Madagascar","NAME_EL":"Μαδαγασκάρη","NAME_HE":"מדגסקר","NAME_HI":"मेडागास्कर","NAME_HU":"Madagaszkár","NAME_ID":"Madagaskar","NAME_IT":"Madagascar","NAME_JA":"マダガスカル","NAME_KO":"마다가스카르","NAME_NL":"Madagaskar","NAME_PL":"Madagaskar","NAME_PT":"Madagáscar","NAME_RU":"Мадагаскар","NAME_SV":"Madagaskar","NAME_TR":"Madagaskar","NAME_UK":"Мадагаскар","NAME_UR":"مڈغاسکر","NAME_VI":"Madagascar","NAME_ZH":"马达加斯加","NAME_ZHT":"馬達加斯加","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[43.254187,-25.601434,50.476537,-12.040557],"geometry":{"type":"Polygon","coordinates":[[[49.543519,-12.469833],[49.808981,-12.895285],[50.056511,-13.555761],[50.217431,-14.758789],[50.476537,-15.226512],[50.377111,-15.706069],[50.200275,-16.000263],[49.860606,-15.414253],[49.672607,-15.710204],[49.863344,-16.451037],[49.774564,-16.875042],[49.498612,-17.106036],[49.435619,-17.953064],[49.041792,-19.118781],[48.548541,-20.496888],[47.930749,-22.391501],[47.547723,-23.781959],[47.095761,-24.94163],[46.282478,-25.178463],[45.409508,-25.601434],[44.833574,-25.346101],[44.03972,-24.988345],[43.763768,-24.460677],[43.697778,-23.574116],[43.345654,-22.776904],[43.254187,-22.057413],[43.433298,-21.336475],[43.893683,-21.163307],[43.89637,-20.830459],[44.374325,-20.072366],[44.464397,-19.435454],[44.232422,-18.961995],[44.042976,-18.331387],[43.963084,-17.409945],[44.312469,-16.850496],[44.446517,-16.216219],[44.944937,-16.179374],[45.502732,-15.974373],[45.872994,-15.793454],[46.312243,-15.780018],[46.882183,-15.210182],[47.70513,-14.594303],[48.005215,-14.091233],[47.869047,-13.663869],[48.293828,-13.784068],[48.84506,-13.089175],[48.863509,-12.487868],[49.194651,-12.040557],[49.543519,-12.469833]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Israel","SOV_A3":"IS1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Indeterminate","TLC":"1","ADMIN":"Palestine","ADM0_A3":"PSX","GEOU_DIF":0,"GEOUNIT":"Palestine","GU_A3":"PSX","SU_DIF":0,"SUBUNIT":"Palestine","SU_A3":"PSX","BRK_DIFF":0,"NAME":"Palestine","NAME_LONG":"Palestine","BRK_A3":"PSX","BRK_NAME":"Palestine","BRK_GROUP":null,"ABBREV":"Pal.","POSTAL":"PAL","FORMAL_EN":"West Bank and Gaza","FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":null,"NOTE_BRK":"Partial self-admin.","NAME_SORT":"Palestine (West Bank and Gaza)","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":8,"POP_EST":4685306,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":16276,"GDP_YEAR":2018,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"-99","ISO_A2":"PS","ISO_A2_EH":"PS","ISO_A3":"PSE","ISO_A3_EH":"PSE","ISO_N3":"275","ISO_N3_EH":"275","UN_A3":"275","WB_A2":"GZ","WB_A3":"WBG","WOE_ID":28289408,"WOE_ID_EH":28289408,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PSX","ADM0_DIFF":null,"ADM0_TLC":"PSX","ADM0_A3_US":"PSX","ADM0_A3_FR":"PSX","ADM0_A3_RU":"PSX","ADM0_A3_ES":"PSX","ADM0_A3_CN":"PSX","ADM0_A3_TW":"PSX","ADM0_A3_IN":"PSX","ADM0_A3_NP":"PSX","ADM0_A3_PK":"PSX","ADM0_A3_DE":"PSX","ADM0_A3_GB":"PSX","ADM0_A3_BR":"PSX","ADM0_A3_IL":"PSX","ADM0_A3_PS":"PSX","ADM0_A3_SA":"PSX","ADM0_A3_EG":"PSX","ADM0_A3_MA":"PSX","ADM0_A3_PT":"PSX","ADM0_A3_AR":"PSX","ADM0_A3_JP":"PSX","ADM0_A3_KO":"PSX","ADM0_A3_VN":"PSX","ADM0_A3_TR":"PSX","ADM0_A3_ID":"PSX","ADM0_A3_PL":"PSX","ADM0_A3_GR":"PSX","ADM0_A3_IT":"PSX","ADM0_A3_NL":"PSX","ADM0_A3_SE":"PSX","ADM0_A3_BD":"PSX","ADM0_A3_UA":"PSX","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":7,"MIN_LABEL":4.5,"MAX_LABEL":9.5,"LABEL_X":35.291341,"LABEL_Y":32.047431,"NE_ID":1159320899,"WIKIDATAID":"Q23792","NAME_AR":"فلسطين","NAME_BN":"ফিলিস্তিন অঞ্চল","NAME_DE":"Palästina","NAME_EN":"Palestine","NAME_ES":"Palestina","NAME_FA":"فلسطین","NAME_FR":"Palestine","NAME_EL":"Παλαιστίνη","NAME_HE":"ארץ ישראל","NAME_HI":"फ़िलिस्तीनी राज्यक्षेत्र","NAME_HU":"Palesztina","NAME_ID":"Palestina","NAME_IT":"Palestina","NAME_JA":"パレスチナ","NAME_KO":"팔레스타인","NAME_NL":"Palestina","NAME_PL":"Palestyna","NAME_PT":"Palestina","NAME_RU":"Палестина","NAME_SV":"Palestina","NAME_TR":"Filistin","NAME_UK":"Палестина","NAME_UR":"فلسطین","NAME_VI":"Palestine","NAME_ZH":"巴勒斯坦","NAME_ZHT":"巴勒斯坦地區","FCLASS_ISO":"Admin-0 dependency","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 dependency","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":"Admin-0 country","FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":"Admin-0 country","FCLASS_SA":"Admin-0 country","FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":"Admin-0 country","FCLASS_UA":null},"bbox":[34.927408,31.353435,35.545665,32.532511],"geometry":{"type":"Polygon","coordinates":[[[35.397561,31.489086],[34.927408,31.353435],[34.970507,31.616778],[35.225892,31.754341],[34.974641,31.866582],[35.18393,32.532511],[35.545665,32.393992],[35.545252,31.782505],[35.397561,31.489086]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Gambia","SOV_A3":"GMB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Gambia","ADM0_A3":"GMB","GEOU_DIF":0,"GEOUNIT":"Gambia","GU_A3":"GMB","SU_DIF":0,"SUBUNIT":"Gambia","SU_A3":"GMB","BRK_DIFF":0,"NAME":"Gambia","NAME_LONG":"The Gambia","BRK_A3":"GMB","BRK_NAME":"Gambia","BRK_GROUP":null,"ABBREV":"Gambia","POSTAL":"GM","FORMAL_EN":"Republic of the Gambia","FORMAL_FR":null,"NAME_CIAWF":"Gambia, The","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Gambia, The","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":8,"POP_EST":2347706,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":1826,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"GA","ISO_A2":"GM","ISO_A2_EH":"GM","ISO_A3":"GMB","ISO_A3_EH":"GMB","ISO_N3":"270","ISO_N3_EH":"270","UN_A3":"270","WB_A2":"GM","WB_A3":"GMB","WOE_ID":23424821,"WOE_ID_EH":23424821,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GMB","ADM0_DIFF":null,"ADM0_TLC":"GMB","ADM0_A3_US":"GMB","ADM0_A3_FR":"GMB","ADM0_A3_RU":"GMB","ADM0_A3_ES":"GMB","ADM0_A3_CN":"GMB","ADM0_A3_TW":"GMB","ADM0_A3_IN":"GMB","ADM0_A3_NP":"GMB","ADM0_A3_PK":"GMB","ADM0_A3_DE":"GMB","ADM0_A3_GB":"GMB","ADM0_A3_BR":"GMB","ADM0_A3_IL":"GMB","ADM0_A3_PS":"GMB","ADM0_A3_SA":"GMB","ADM0_A3_EG":"GMB","ADM0_A3_MA":"GMB","ADM0_A3_PT":"GMB","ADM0_A3_AR":"GMB","ADM0_A3_JP":"GMB","ADM0_A3_KO":"GMB","ADM0_A3_VN":"GMB","ADM0_A3_TR":"GMB","ADM0_A3_ID":"GMB","ADM0_A3_PL":"GMB","ADM0_A3_GR":"GMB","ADM0_A3_IT":"GMB","ADM0_A3_NL":"GMB","ADM0_A3_SE":"GMB","ADM0_A3_BD":"GMB","ADM0_A3_UA":"GMB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":10,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":-14.998318,"LABEL_Y":13.641721,"NE_ID":1159320797,"WIKIDATAID":"Q1005","NAME_AR":"غامبيا","NAME_BN":"গাম্বিয়া","NAME_DE":"Gambia","NAME_EN":"The Gambia","NAME_ES":"Gambia","NAME_FA":"گامبیا","NAME_FR":"Gambie","NAME_EL":"Γκάμπια","NAME_HE":"גמביה","NAME_HI":"गाम्बिया","NAME_HU":"Gambia","NAME_ID":"Gambia","NAME_IT":"Gambia","NAME_JA":"ガンビア","NAME_KO":"감비아","NAME_NL":"Gambia","NAME_PL":"Gambia","NAME_PT":"Gâmbia","NAME_RU":"Гамбия","NAME_SV":"Gambia","NAME_TR":"Gambiya","NAME_UK":"Гамбія","NAME_UR":"گیمبیا","NAME_VI":"Gambia","NAME_ZH":"冈比亚","NAME_ZHT":"甘比亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-16.841525,13.130284,-13.844963,13.876492],"geometry":{"type":"Polygon","coordinates":[[[-16.713729,13.594959],[-15.624596,13.623587],[-15.39877,13.860369],[-15.081735,13.876492],[-14.687031,13.630357],[-14.376714,13.62568],[-14.046992,13.794068],[-13.844963,13.505042],[-14.277702,13.280585],[-14.712197,13.298207],[-15.141163,13.509512],[-15.511813,13.27857],[-15.691001,13.270353],[-15.931296,13.130284],[-16.841525,13.151394],[-16.713729,13.594959]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Tunisia","SOV_A3":"TUN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Tunisia","ADM0_A3":"TUN","GEOU_DIF":0,"GEOUNIT":"Tunisia","GU_A3":"TUN","SU_DIF":0,"SUBUNIT":"Tunisia","SU_A3":"TUN","BRK_DIFF":0,"NAME":"Tunisia","NAME_LONG":"Tunisia","BRK_A3":"TUN","BRK_NAME":"Tunisia","BRK_GROUP":null,"ABBREV":"Tun.","POSTAL":"TN","FORMAL_EN":"Republic of Tunisia","FORMAL_FR":null,"NAME_CIAWF":"Tunisia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Tunisia","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":2,"POP_EST":11694719,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":38796,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"TS","ISO_A2":"TN","ISO_A2_EH":"TN","ISO_A3":"TUN","ISO_A3_EH":"TUN","ISO_N3":"788","ISO_N3_EH":"788","UN_A3":"788","WB_A2":"TN","WB_A3":"TUN","WOE_ID":23424967,"WOE_ID_EH":23424967,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TUN","ADM0_DIFF":null,"ADM0_TLC":"TUN","ADM0_A3_US":"TUN","ADM0_A3_FR":"TUN","ADM0_A3_RU":"TUN","ADM0_A3_ES":"TUN","ADM0_A3_CN":"TUN","ADM0_A3_TW":"TUN","ADM0_A3_IN":"TUN","ADM0_A3_NP":"TUN","ADM0_A3_PK":"TUN","ADM0_A3_DE":"TUN","ADM0_A3_GB":"TUN","ADM0_A3_BR":"TUN","ADM0_A3_IL":"TUN","ADM0_A3_PS":"TUN","ADM0_A3_SA":"TUN","ADM0_A3_EG":"TUN","ADM0_A3_MA":"TUN","ADM0_A3_PT":"TUN","ADM0_A3_AR":"TUN","ADM0_A3_JP":"TUN","ADM0_A3_KO":"TUN","ADM0_A3_VN":"TUN","ADM0_A3_TR":"TUN","ADM0_A3_ID":"TUN","ADM0_A3_PL":"TUN","ADM0_A3_GR":"TUN","ADM0_A3_IT":"TUN","ADM0_A3_NL":"TUN","ADM0_A3_SE":"TUN","ADM0_A3_BD":"TUN","ADM0_A3_UA":"TUN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":9.007881,"LABEL_Y":33.687263,"NE_ID":1159321327,"WIKIDATAID":"Q948","NAME_AR":"تونس","NAME_BN":"তিউনিসিয়া","NAME_DE":"Tunesien","NAME_EN":"Tunisia","NAME_ES":"Túnez","NAME_FA":"تونس","NAME_FR":"Tunisie","NAME_EL":"Τυνησία","NAME_HE":"תוניסיה","NAME_HI":"ट्यूनिशिया","NAME_HU":"Tunézia","NAME_ID":"Tunisia","NAME_IT":"Tunisia","NAME_JA":"チュニジア","NAME_KO":"튀니지","NAME_NL":"Tunesië","NAME_PL":"Tunezja","NAME_PT":"Tunísia","NAME_RU":"Тунис","NAME_SV":"Tunisien","NAME_TR":"Tunus","NAME_UK":"Туніс","NAME_UR":"تونس","NAME_VI":"Tuy-ni-di","NAME_ZH":"突尼斯","NAME_ZHT":"突尼西亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[7.524482,30.307556,11.488787,37.349994],"geometry":{"type":"Polygon","coordinates":[[[9.48214,30.307556],[9.055603,32.102692],[8.439103,32.506285],[8.430473,32.748337],[7.612642,33.344115],[7.524482,34.097376],[8.140981,34.655146],[8.376368,35.479876],[8.217824,36.433177],[8.420964,36.946427],[9.509994,37.349994],[10.210002,37.230002],[10.18065,36.724038],[11.028867,37.092103],[11.100026,36.899996],[10.600005,36.41],[10.593287,35.947444],[10.939519,35.698984],[10.807847,34.833507],[10.149593,34.330773],[10.339659,33.785742],[10.856836,33.76874],[11.108501,33.293343],[11.488787,33.136996],[11.432253,32.368903],[10.94479,32.081815],[10.636901,31.761421],[9.950225,31.37607],[10.056575,30.961831],[9.970017,30.539325],[9.48214,30.307556]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Algeria","SOV_A3":"DZA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Algeria","ADM0_A3":"DZA","GEOU_DIF":0,"GEOUNIT":"Algeria","GU_A3":"DZA","SU_DIF":0,"SUBUNIT":"Algeria","SU_A3":"DZA","BRK_DIFF":0,"NAME":"Algeria","NAME_LONG":"Algeria","BRK_A3":"DZA","BRK_NAME":"Algeria","BRK_GROUP":null,"ABBREV":"Alg.","POSTAL":"DZ","FORMAL_EN":"People's Democratic Republic of Algeria","FORMAL_FR":null,"NAME_CIAWF":"Algeria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Algeria","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":43053054,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":171091,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"AG","ISO_A2":"DZ","ISO_A2_EH":"DZ","ISO_A3":"DZA","ISO_A3_EH":"DZA","ISO_N3":"012","ISO_N3_EH":"012","UN_A3":"012","WB_A2":"DZ","WB_A3":"DZA","WOE_ID":23424740,"WOE_ID_EH":23424740,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"DZA","ADM0_DIFF":null,"ADM0_TLC":"DZA","ADM0_A3_US":"DZA","ADM0_A3_FR":"DZA","ADM0_A3_RU":"DZA","ADM0_A3_ES":"DZA","ADM0_A3_CN":"DZA","ADM0_A3_TW":"DZA","ADM0_A3_IN":"DZA","ADM0_A3_NP":"DZA","ADM0_A3_PK":"DZA","ADM0_A3_DE":"DZA","ADM0_A3_GB":"DZA","ADM0_A3_BR":"DZA","ADM0_A3_IL":"DZA","ADM0_A3_PS":"DZA","ADM0_A3_SA":"DZA","ADM0_A3_EG":"DZA","ADM0_A3_MA":"DZA","ADM0_A3_PT":"DZA","ADM0_A3_AR":"DZA","ADM0_A3_JP":"DZA","ADM0_A3_KO":"DZA","ADM0_A3_VN":"DZA","ADM0_A3_TR":"DZA","ADM0_A3_ID":"DZA","ADM0_A3_PL":"DZA","ADM0_A3_GR":"DZA","ADM0_A3_IT":"DZA","ADM0_A3_NL":"DZA","ADM0_A3_SE":"DZA","ADM0_A3_BD":"DZA","ADM0_A3_UA":"DZA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":7,"LABEL_X":2.808241,"LABEL_Y":27.397406,"NE_ID":1159320565,"WIKIDATAID":"Q262","NAME_AR":"الجزائر","NAME_BN":"আলজেরিয়া","NAME_DE":"Algerien","NAME_EN":"Algeria","NAME_ES":"Argelia","NAME_FA":"الجزایر","NAME_FR":"Algérie","NAME_EL":"Αλγερία","NAME_HE":"אלג'יריה","NAME_HI":"अल्जीरिया","NAME_HU":"Algéria","NAME_ID":"Aljazair","NAME_IT":"Algeria","NAME_JA":"アルジェリア","NAME_KO":"알제리","NAME_NL":"Algerije","NAME_PL":"Algieria","NAME_PT":"Argélia","NAME_RU":"Алжир","NAME_SV":"Algeriet","NAME_TR":"Cezayir","NAME_UK":"Алжир","NAME_UR":"الجزائر","NAME_VI":"Algérie","NAME_ZH":"阿尔及利亚","NAME_ZHT":"阿爾及利亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-8.6844,19.057364,11.999506,37.118381],"geometry":{"type":"Polygon","coordinates":[[[-8.6844,27.395744],[-8.665124,27.589479],[-8.66559,27.656426],[-8.674116,28.841289],[-7.059228,29.579228],[-6.060632,29.7317],[-5.242129,30.000443],[-4.859646,30.501188],[-3.690441,30.896952],[-3.647498,31.637294],[-3.06898,31.724498],[-2.616605,32.094346],[-1.307899,32.262889],[-1.124551,32.651522],[-1.388049,32.864015],[-1.733455,33.919713],[-1.792986,34.527919],[-2.169914,35.168396],[-1.208603,35.714849],[-0.127454,35.888662],[0.503877,36.301273],[1.466919,36.605647],[3.161699,36.783905],[4.815758,36.865037],[5.32012,36.716519],[6.26182,37.110655],[7.330385,37.118381],[7.737078,36.885708],[8.420964,36.946427],[8.217824,36.433177],[8.376368,35.479876],[8.140981,34.655146],[7.524482,34.097376],[7.612642,33.344115],[8.430473,32.748337],[8.439103,32.506285],[9.055603,32.102692],[9.48214,30.307556],[9.805634,29.424638],[9.859998,28.95999],[9.683885,28.144174],[9.756128,27.688259],[9.629056,27.140953],[9.716286,26.512206],[9.319411,26.094325],[9.910693,25.365455],[9.948261,24.936954],[10.303847,24.379313],[10.771364,24.562532],[11.560669,24.097909],[11.999506,23.471668],[8.572893,21.565661],[5.677566,19.601207],[4.267419,19.155265],[3.158133,19.057364],[3.146661,19.693579],[2.683588,19.85623],[2.060991,20.142233],[1.823228,20.610809],[-1.550055,22.792666],[-4.923337,24.974574],[-8.6844,27.395744]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Jordan","SOV_A3":"JOR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Jordan","ADM0_A3":"JOR","GEOU_DIF":0,"GEOUNIT":"Jordan","GU_A3":"JOR","SU_DIF":0,"SUBUNIT":"Jordan","SU_A3":"JOR","BRK_DIFF":0,"NAME":"Jordan","NAME_LONG":"Jordan","BRK_A3":"JOR","BRK_NAME":"Jordan","BRK_GROUP":null,"ABBREV":"Jord.","POSTAL":"J","FORMAL_EN":"Hashemite Kingdom of Jordan","FORMAL_FR":null,"NAME_CIAWF":"Jordan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Jordan","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":4,"POP_EST":10101694,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":44502,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"JO","ISO_A2":"JO","ISO_A2_EH":"JO","ISO_A3":"JOR","ISO_A3_EH":"JOR","ISO_N3":"400","ISO_N3_EH":"400","UN_A3":"400","WB_A2":"JO","WB_A3":"JOR","WOE_ID":23424860,"WOE_ID_EH":23424860,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"JOR","ADM0_DIFF":null,"ADM0_TLC":"JOR","ADM0_A3_US":"JOR","ADM0_A3_FR":"JOR","ADM0_A3_RU":"JOR","ADM0_A3_ES":"JOR","ADM0_A3_CN":"JOR","ADM0_A3_TW":"JOR","ADM0_A3_IN":"JOR","ADM0_A3_NP":"JOR","ADM0_A3_PK":"JOR","ADM0_A3_DE":"JOR","ADM0_A3_GB":"JOR","ADM0_A3_BR":"JOR","ADM0_A3_IL":"JOR","ADM0_A3_PS":"JOR","ADM0_A3_SA":"JOR","ADM0_A3_EG":"JOR","ADM0_A3_MA":"JOR","ADM0_A3_PT":"JOR","ADM0_A3_AR":"JOR","ADM0_A3_JP":"JOR","ADM0_A3_KO":"JOR","ADM0_A3_VN":"JOR","ADM0_A3_TR":"JOR","ADM0_A3_ID":"JOR","ADM0_A3_PL":"JOR","ADM0_A3_GR":"JOR","ADM0_A3_IT":"JOR","ADM0_A3_NL":"JOR","ADM0_A3_SE":"JOR","ADM0_A3_BD":"JOR","ADM0_A3_UA":"JOR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":36.375991,"LABEL_Y":30.805025,"NE_ID":1159320935,"WIKIDATAID":"Q810","NAME_AR":"الأردن","NAME_BN":"জর্ডান","NAME_DE":"Jordanien","NAME_EN":"Jordan","NAME_ES":"Jordania","NAME_FA":"اردن","NAME_FR":"Jordanie","NAME_EL":"Ιορδανία","NAME_HE":"ירדן","NAME_HI":"जॉर्डन","NAME_HU":"Jordánia","NAME_ID":"Yordania","NAME_IT":"Giordania","NAME_JA":"ヨルダン","NAME_KO":"요르단","NAME_NL":"Jordanië","NAME_PL":"Jordania","NAME_PT":"Jordânia","NAME_RU":"Иордания","NAME_SV":"Jordanien","NAME_TR":"Ürdün","NAME_UK":"Йорданія","NAME_UR":"اردن","NAME_VI":"Jordan","NAME_ZH":"约旦","NAME_ZHT":"約旦","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[34.922603,29.197495,39.195468,33.378686],"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.719918,32.709192],[36.834062,32.312938],[38.792341,33.378686],[39.195468,32.161009],[39.004886,32.010217],[37.002166,31.508413],[37.998849,30.5085],[37.66812,30.338665],[37.503582,30.003776],[36.740528,29.865283],[36.501214,29.505254],[36.068941,29.197495],[34.956037,29.356555],[34.922603,29.501326],[35.420918,31.100066],[35.397561,31.489086],[35.545252,31.782505],[35.545665,32.393992]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"United Arab Emirates","SOV_A3":"ARE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"United Arab Emirates","ADM0_A3":"ARE","GEOU_DIF":0,"GEOUNIT":"United Arab Emirates","GU_A3":"ARE","SU_DIF":0,"SUBUNIT":"United Arab Emirates","SU_A3":"ARE","BRK_DIFF":0,"NAME":"United Arab Emirates","NAME_LONG":"United Arab Emirates","BRK_A3":"ARE","BRK_NAME":"United Arab Emirates","BRK_GROUP":null,"ABBREV":"U.A.E.","POSTAL":"AE","FORMAL_EN":"United Arab Emirates","FORMAL_FR":null,"NAME_CIAWF":"United Arab Emirates","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"United Arab Emirates","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":3,"POP_EST":9770529,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":421142,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"AE","ISO_A2":"AE","ISO_A2_EH":"AE","ISO_A3":"ARE","ISO_A3_EH":"ARE","ISO_N3":"784","ISO_N3_EH":"784","UN_A3":"784","WB_A2":"AE","WB_A3":"ARE","WOE_ID":23424738,"WOE_ID_EH":23424738,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ARE","ADM0_DIFF":null,"ADM0_TLC":"ARE","ADM0_A3_US":"ARE","ADM0_A3_FR":"ARE","ADM0_A3_RU":"ARE","ADM0_A3_ES":"ARE","ADM0_A3_CN":"ARE","ADM0_A3_TW":"ARE","ADM0_A3_IN":"ARE","ADM0_A3_NP":"ARE","ADM0_A3_PK":"ARE","ADM0_A3_DE":"ARE","ADM0_A3_GB":"ARE","ADM0_A3_BR":"ARE","ADM0_A3_IL":"ARE","ADM0_A3_PS":"ARE","ADM0_A3_SA":"ARE","ADM0_A3_EG":"ARE","ADM0_A3_MA":"ARE","ADM0_A3_PT":"ARE","ADM0_A3_AR":"ARE","ADM0_A3_JP":"ARE","ADM0_A3_KO":"ARE","ADM0_A3_VN":"ARE","ADM0_A3_TR":"ARE","ADM0_A3_ID":"ARE","ADM0_A3_PL":"ARE","ADM0_A3_GR":"ARE","ADM0_A3_IT":"ARE","ADM0_A3_NL":"ARE","ADM0_A3_SE":"ARE","ADM0_A3_BD":"ARE","ADM0_A3_UA":"ARE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":20,"LONG_LEN":20,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":54.547256,"LABEL_Y":23.466285,"NE_ID":1159320329,"WIKIDATAID":"Q878","NAME_AR":"الإمارات العربية المتحدة","NAME_BN":"সংযুক্ত আরব আমিরাত","NAME_DE":"Vereinigte Arabische Emirate","NAME_EN":"United Arab Emirates","NAME_ES":"Emiratos Árabes Unidos","NAME_FA":"امارات متحده عربی","NAME_FR":"Émirats arabes unis","NAME_EL":"Ηνωμένα Αραβικά Εμιράτα","NAME_HE":"איחוד האמירויות הערביות","NAME_HI":"संयुक्त अरब अमीरात","NAME_HU":"Egyesült Arab Emírségek","NAME_ID":"Uni Emirat Arab","NAME_IT":"Emirati Arabi Uniti","NAME_JA":"アラブ首長国連邦","NAME_KO":"아랍에미리트","NAME_NL":"Verenigde Arabische Emiraten","NAME_PL":"Zjednoczone Emiraty Arabskie","NAME_PT":"Emirados Árabes Unidos","NAME_RU":"Объединённые Арабские Эмираты","NAME_SV":"Förenade Arabemiraten","NAME_TR":"Birleşik Arap Emirlikleri","NAME_UK":"Об'єднані Арабські Емірати","NAME_UR":"متحدہ عرب امارات","NAME_VI":"Các Tiểu vương quốc Ả Rập Thống nhất","NAME_ZH":"阿拉伯联合酋长国","NAME_ZHT":"阿拉伯聯合大公國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[51.579519,22.496948,56.396847,26.055464],"geometry":{"type":"Polygon","coordinates":[[[51.579519,24.245497],[51.757441,24.294073],[51.794389,24.019826],[52.577081,24.177439],[53.404007,24.151317],[54.008001,24.121758],[54.693024,24.797892],[55.439025,25.439145],[56.070821,26.055464],[56.261042,25.714606],[56.396847,24.924732],[55.886233,24.920831],[55.804119,24.269604],[55.981214,24.130543],[55.528632,23.933604],[55.525841,23.524869],[55.234489,23.110993],[55.208341,22.70833],[55.006803,22.496948],[52.000733,23.001154],[51.617708,24.014219],[51.579519,24.245497]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Qatar","SOV_A3":"QAT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Qatar","ADM0_A3":"QAT","GEOU_DIF":0,"GEOUNIT":"Qatar","GU_A3":"QAT","SU_DIF":0,"SUBUNIT":"Qatar","SU_A3":"QAT","BRK_DIFF":0,"NAME":"Qatar","NAME_LONG":"Qatar","BRK_A3":"QAT","BRK_NAME":"Qatar","BRK_GROUP":null,"ABBREV":"Qatar","POSTAL":"QA","FORMAL_EN":"State of Qatar","FORMAL_FR":null,"NAME_CIAWF":"Qatar","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Qatar","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":4,"POP_EST":2832067,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":175837,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"QA","ISO_A2":"QA","ISO_A2_EH":"QA","ISO_A3":"QAT","ISO_A3_EH":"QAT","ISO_N3":"634","ISO_N3_EH":"634","UN_A3":"634","WB_A2":"QA","WB_A3":"QAT","WOE_ID":23424930,"WOE_ID_EH":23424930,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"QAT","ADM0_DIFF":null,"ADM0_TLC":"QAT","ADM0_A3_US":"QAT","ADM0_A3_FR":"QAT","ADM0_A3_RU":"QAT","ADM0_A3_ES":"QAT","ADM0_A3_CN":"QAT","ADM0_A3_TW":"QAT","ADM0_A3_IN":"QAT","ADM0_A3_NP":"QAT","ADM0_A3_PK":"QAT","ADM0_A3_DE":"QAT","ADM0_A3_GB":"QAT","ADM0_A3_BR":"QAT","ADM0_A3_IL":"QAT","ADM0_A3_PS":"QAT","ADM0_A3_SA":"QAT","ADM0_A3_EG":"QAT","ADM0_A3_MA":"QAT","ADM0_A3_PT":"QAT","ADM0_A3_AR":"QAT","ADM0_A3_JP":"QAT","ADM0_A3_KO":"QAT","ADM0_A3_VN":"QAT","ADM0_A3_TR":"QAT","ADM0_A3_ID":"QAT","ADM0_A3_PL":"QAT","ADM0_A3_GR":"QAT","ADM0_A3_IT":"QAT","ADM0_A3_NL":"QAT","ADM0_A3_SE":"QAT","ADM0_A3_BD":"QAT","ADM0_A3_UA":"QAT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":51.143509,"LABEL_Y":25.237383,"NE_ID":1159321197,"WIKIDATAID":"Q846","NAME_AR":"قطر","NAME_BN":"কাতার","NAME_DE":"Katar","NAME_EN":"Qatar","NAME_ES":"Catar","NAME_FA":"قطر","NAME_FR":"Qatar","NAME_EL":"Κατάρ","NAME_HE":"קטר","NAME_HI":"क़तर","NAME_HU":"Katar","NAME_ID":"Qatar","NAME_IT":"Qatar","NAME_JA":"カタール","NAME_KO":"카타르","NAME_NL":"Qatar","NAME_PL":"Katar","NAME_PT":"Catar","NAME_RU":"Катар","NAME_SV":"Qatar","NAME_TR":"Katar","NAME_UK":"Катар","NAME_UR":"قطر","NAME_VI":"Qatar","NAME_ZH":"卡塔尔","NAME_ZHT":"卡達","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[50.743911,24.556331,51.6067,26.114582],"geometry":{"type":"Polygon","coordinates":[[[50.810108,24.754743],[50.743911,25.482424],[51.013352,26.006992],[51.286462,26.114582],[51.589079,25.801113],[51.6067,25.21567],[51.389608,24.627386],[51.112415,24.556331],[50.810108,24.754743]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Kuwait","SOV_A3":"KWT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Kuwait","ADM0_A3":"KWT","GEOU_DIF":0,"GEOUNIT":"Kuwait","GU_A3":"KWT","SU_DIF":0,"SUBUNIT":"Kuwait","SU_A3":"KWT","BRK_DIFF":0,"NAME":"Kuwait","NAME_LONG":"Kuwait","BRK_A3":"KWT","BRK_NAME":"Kuwait","BRK_GROUP":null,"ABBREV":"Kwt.","POSTAL":"KW","FORMAL_EN":"State of Kuwait","FORMAL_FR":null,"NAME_CIAWF":"Kuwait","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kuwait","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":4207083,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":134628,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"KU","ISO_A2":"KW","ISO_A2_EH":"KW","ISO_A3":"KWT","ISO_A3_EH":"KWT","ISO_N3":"414","ISO_N3_EH":"414","UN_A3":"414","WB_A2":"KW","WB_A3":"KWT","WOE_ID":23424870,"WOE_ID_EH":23424870,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"KWT","ADM0_DIFF":null,"ADM0_TLC":"KWT","ADM0_A3_US":"KWT","ADM0_A3_FR":"KWT","ADM0_A3_RU":"KWT","ADM0_A3_ES":"KWT","ADM0_A3_CN":"KWT","ADM0_A3_TW":"KWT","ADM0_A3_IN":"KWT","ADM0_A3_NP":"KWT","ADM0_A3_PK":"KWT","ADM0_A3_DE":"KWT","ADM0_A3_GB":"KWT","ADM0_A3_BR":"KWT","ADM0_A3_IL":"KWT","ADM0_A3_PS":"KWT","ADM0_A3_SA":"KWT","ADM0_A3_EG":"KWT","ADM0_A3_MA":"KWT","ADM0_A3_PT":"KWT","ADM0_A3_AR":"KWT","ADM0_A3_JP":"KWT","ADM0_A3_KO":"KWT","ADM0_A3_VN":"KWT","ADM0_A3_TR":"KWT","ADM0_A3_ID":"KWT","ADM0_A3_PL":"KWT","ADM0_A3_GR":"KWT","ADM0_A3_IT":"KWT","ADM0_A3_NL":"KWT","ADM0_A3_SE":"KWT","ADM0_A3_BD":"KWT","ADM0_A3_UA":"KWT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":47.313999,"LABEL_Y":29.413628,"NE_ID":1159321009,"WIKIDATAID":"Q817","NAME_AR":"الكويت","NAME_BN":"কুয়েত","NAME_DE":"Kuwait","NAME_EN":"Kuwait","NAME_ES":"Kuwait","NAME_FA":"کویت","NAME_FR":"Koweït","NAME_EL":"Κουβέιτ","NAME_HE":"כווית","NAME_HI":"कुवैत","NAME_HU":"Kuvait","NAME_ID":"Kuwait","NAME_IT":"Kuwait","NAME_JA":"クウェート","NAME_KO":"쿠웨이트","NAME_NL":"Koeweit","NAME_PL":"Kuwejt","NAME_PT":"Kuwait","NAME_RU":"Кувейт","NAME_SV":"Kuwait","NAME_TR":"Kuveyt","NAME_UK":"Кувейт","NAME_UR":"کویت","NAME_VI":"Kuwait","NAME_ZH":"科威特","NAME_ZHT":"科威特","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[46.568713,28.526063,48.416094,30.05907],"geometry":{"type":"Polygon","coordinates":[[[47.974519,29.975819],[48.183189,29.534477],[48.093943,29.306299],[48.416094,28.552004],[47.708851,28.526063],[47.459822,29.002519],[46.568713,29.099025],[47.302622,30.05907],[47.974519,29.975819]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Iraq","SOV_A3":"IRQ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Iraq","ADM0_A3":"IRQ","GEOU_DIF":0,"GEOUNIT":"Iraq","GU_A3":"IRQ","SU_DIF":0,"SUBUNIT":"Iraq","SU_A3":"IRQ","BRK_DIFF":0,"NAME":"Iraq","NAME_LONG":"Iraq","BRK_A3":"IRQ","BRK_NAME":"Iraq","BRK_GROUP":null,"ABBREV":"Iraq","POSTAL":"IRQ","FORMAL_EN":"Republic of Iraq","FORMAL_FR":null,"NAME_CIAWF":"Iraq","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Iraq","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":3,"MAPCOLOR13":1,"POP_EST":39309783,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":234094,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"IZ","ISO_A2":"IQ","ISO_A2_EH":"IQ","ISO_A3":"IRQ","ISO_A3_EH":"IRQ","ISO_N3":"368","ISO_N3_EH":"368","UN_A3":"368","WB_A2":"IQ","WB_A3":"IRQ","WOE_ID":23424855,"WOE_ID_EH":23424855,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"IRQ","ADM0_DIFF":null,"ADM0_TLC":"IRQ","ADM0_A3_US":"IRQ","ADM0_A3_FR":"IRQ","ADM0_A3_RU":"IRQ","ADM0_A3_ES":"IRQ","ADM0_A3_CN":"IRQ","ADM0_A3_TW":"IRQ","ADM0_A3_IN":"IRQ","ADM0_A3_NP":"IRQ","ADM0_A3_PK":"IRQ","ADM0_A3_DE":"IRQ","ADM0_A3_GB":"IRQ","ADM0_A3_BR":"IRQ","ADM0_A3_IL":"IRQ","ADM0_A3_PS":"IRQ","ADM0_A3_SA":"IRQ","ADM0_A3_EG":"IRQ","ADM0_A3_MA":"IRQ","ADM0_A3_PT":"IRQ","ADM0_A3_AR":"IRQ","ADM0_A3_JP":"IRQ","ADM0_A3_KO":"IRQ","ADM0_A3_VN":"IRQ","ADM0_A3_TR":"IRQ","ADM0_A3_ID":"IRQ","ADM0_A3_PL":"IRQ","ADM0_A3_GR":"IRQ","ADM0_A3_IT":"IRQ","ADM0_A3_NL":"IRQ","ADM0_A3_SE":"IRQ","ADM0_A3_BD":"IRQ","ADM0_A3_UA":"IRQ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7.5,"LABEL_X":43.26181,"LABEL_Y":33.09403,"NE_ID":1159320887,"WIKIDATAID":"Q796","NAME_AR":"العراق","NAME_BN":"ইরাক","NAME_DE":"Irak","NAME_EN":"Iraq","NAME_ES":"Irak","NAME_FA":"عراق","NAME_FR":"Irak","NAME_EL":"Ιράκ","NAME_HE":"עיראק","NAME_HI":"इराक","NAME_HU":"Irak","NAME_ID":"Irak","NAME_IT":"Iraq","NAME_JA":"イラク","NAME_KO":"이라크","NAME_NL":"Irak","NAME_PL":"Irak","NAME_PT":"Iraque","NAME_RU":"Ирак","NAME_SV":"Irak","NAME_TR":"Irak","NAME_UK":"Ірак","NAME_UR":"عراق","NAME_VI":"Iraq","NAME_ZH":"伊拉克","NAME_ZHT":"伊拉克","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[38.792341,29.099025,48.567971,37.385264],"geometry":{"type":"Polygon","coordinates":[[[39.195468,32.161009],[38.792341,33.378686],[41.006159,34.419372],[41.383965,35.628317],[41.289707,36.358815],[41.837064,36.605854],[42.349591,37.229873],[42.779126,37.385264],[43.942259,37.256228],[44.293452,37.001514],[44.772677,37.170437],[45.420618,35.977546],[46.07634,35.677383],[46.151788,35.093259],[45.64846,34.748138],[45.416691,33.967798],[46.109362,33.017287],[47.334661,32.469155],[47.849204,31.709176],[47.685286,30.984853],[48.004698,30.985137],[48.014568,30.452457],[48.567971,29.926778],[47.974519,29.975819],[47.302622,30.05907],[46.568713,29.099025],[44.709499,29.178891],[41.889981,31.190009],[40.399994,31.889992],[39.195468,32.161009]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Oman","SOV_A3":"OMN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Oman","ADM0_A3":"OMN","GEOU_DIF":0,"GEOUNIT":"Oman","GU_A3":"OMN","SU_DIF":0,"SUBUNIT":"Oman","SU_A3":"OMN","BRK_DIFF":0,"NAME":"Oman","NAME_LONG":"Oman","BRK_A3":"OMN","BRK_NAME":"Oman","BRK_GROUP":null,"ABBREV":"Oman","POSTAL":"OM","FORMAL_EN":"Sultanate of Oman","FORMAL_FR":null,"NAME_CIAWF":"Oman","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Oman","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":6,"POP_EST":4974986,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":76331,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"MU","ISO_A2":"OM","ISO_A2_EH":"OM","ISO_A3":"OMN","ISO_A3_EH":"OMN","ISO_N3":"512","ISO_N3_EH":"512","UN_A3":"512","WB_A2":"OM","WB_A3":"OMN","WOE_ID":23424898,"WOE_ID_EH":23424898,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"OMN","ADM0_DIFF":null,"ADM0_TLC":"OMN","ADM0_A3_US":"OMN","ADM0_A3_FR":"OMN","ADM0_A3_RU":"OMN","ADM0_A3_ES":"OMN","ADM0_A3_CN":"OMN","ADM0_A3_TW":"OMN","ADM0_A3_IN":"OMN","ADM0_A3_NP":"OMN","ADM0_A3_PK":"OMN","ADM0_A3_DE":"OMN","ADM0_A3_GB":"OMN","ADM0_A3_BR":"OMN","ADM0_A3_IL":"OMN","ADM0_A3_PS":"OMN","ADM0_A3_SA":"OMN","ADM0_A3_EG":"OMN","ADM0_A3_MA":"OMN","ADM0_A3_PT":"OMN","ADM0_A3_AR":"OMN","ADM0_A3_JP":"OMN","ADM0_A3_KO":"OMN","ADM0_A3_VN":"OMN","ADM0_A3_TR":"OMN","ADM0_A3_ID":"OMN","ADM0_A3_PL":"OMN","ADM0_A3_GR":"OMN","ADM0_A3_IT":"OMN","ADM0_A3_NL":"OMN","ADM0_A3_SE":"OMN","ADM0_A3_BD":"OMN","ADM0_A3_UA":"OMN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":57.336553,"LABEL_Y":22.120427,"NE_ID":1159321151,"WIKIDATAID":"Q842","NAME_AR":"سلطنة عمان","NAME_BN":"ওমান","NAME_DE":"Oman","NAME_EN":"Oman","NAME_ES":"Omán","NAME_FA":"عمان","NAME_FR":"Oman","NAME_EL":"Ομάν","NAME_HE":"עומאן","NAME_HI":"ओमान","NAME_HU":"Omán","NAME_ID":"Oman","NAME_IT":"Oman","NAME_JA":"オマーン","NAME_KO":"오만","NAME_NL":"Oman","NAME_PL":"Oman","NAME_PT":"Omã","NAME_RU":"Оман","NAME_SV":"Oman","NAME_TR":"Umman","NAME_UK":"Оман","NAME_UR":"عمان","NAME_VI":"Oman","NAME_ZH":"阿曼","NAME_ZHT":"阿曼","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[52.00001,16.651051,59.80806,26.395934],"geometry":{"type":"MultiPolygon","coordinates":[[[[55.208341,22.70833],[55.234489,23.110993],[55.525841,23.524869],[55.528632,23.933604],[55.981214,24.130543],[55.804119,24.269604],[55.886233,24.920831],[56.396847,24.924732],[56.84514,24.241673],[57.403453,23.878594],[58.136948,23.747931],[58.729211,23.565668],[59.180502,22.992395],[59.450098,22.660271],[59.80806,22.533612],[59.806148,22.310525],[59.442191,21.714541],[59.282408,21.433886],[58.861141,21.114035],[58.487986,20.428986],[58.034318,20.481437],[57.826373,20.243002],[57.665762,19.736005],[57.7887,19.06757],[57.694391,18.94471],[57.234264,18.947991],[56.609651,18.574267],[56.512189,18.087113],[56.283521,17.876067],[55.661492,17.884128],[55.269939,17.632309],[55.2749,17.228354],[54.791002,16.950697],[54.239253,17.044981],[53.570508,16.707663],[53.108573,16.651051],[52.782184,17.349742],[52.00001,19.000003],[54.999982,19.999994],[55.666659,22.000001],[55.208341,22.70833]]],[[[56.261042,25.714606],[56.070821,26.055464],[56.362017,26.395934],[56.485679,26.309118],[56.391421,25.895991],[56.261042,25.714606]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Vanuatu","SOV_A3":"VUT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Vanuatu","ADM0_A3":"VUT","GEOU_DIF":0,"GEOUNIT":"Vanuatu","GU_A3":"VUT","SU_DIF":0,"SUBUNIT":"Vanuatu","SU_A3":"VUT","BRK_DIFF":0,"NAME":"Vanuatu","NAME_LONG":"Vanuatu","BRK_A3":"VUT","BRK_NAME":"Vanuatu","BRK_GROUP":null,"ABBREV":"Van.","POSTAL":"VU","FORMAL_EN":"Republic of Vanuatu","FORMAL_FR":null,"NAME_CIAWF":"Vanuatu","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Vanuatu","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":299882,"POP_RANK":10,"POP_YEAR":2019,"GDP_MD":934,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"NH","ISO_A2":"VU","ISO_A2_EH":"VU","ISO_A3":"VUT","ISO_A3_EH":"VUT","ISO_N3":"548","ISO_N3_EH":"548","UN_A3":"548","WB_A2":"VU","WB_A3":"VUT","WOE_ID":23424907,"WOE_ID_EH":23424907,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"VUT","ADM0_DIFF":null,"ADM0_TLC":"VUT","ADM0_A3_US":"VUT","ADM0_A3_FR":"VUT","ADM0_A3_RU":"VUT","ADM0_A3_ES":"VUT","ADM0_A3_CN":"VUT","ADM0_A3_TW":"VUT","ADM0_A3_IN":"VUT","ADM0_A3_NP":"VUT","ADM0_A3_PK":"VUT","ADM0_A3_DE":"VUT","ADM0_A3_GB":"VUT","ADM0_A3_BR":"VUT","ADM0_A3_IL":"VUT","ADM0_A3_PS":"VUT","ADM0_A3_SA":"VUT","ADM0_A3_EG":"VUT","ADM0_A3_MA":"VUT","ADM0_A3_PT":"VUT","ADM0_A3_AR":"VUT","ADM0_A3_JP":"VUT","ADM0_A3_KO":"VUT","ADM0_A3_VN":"VUT","ADM0_A3_TR":"VUT","ADM0_A3_ID":"VUT","ADM0_A3_PL":"VUT","ADM0_A3_GR":"VUT","ADM0_A3_IT":"VUT","ADM0_A3_NL":"VUT","ADM0_A3_SE":"VUT","ADM0_A3_BD":"VUT","ADM0_A3_UA":"VUT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":2,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":166.908762,"LABEL_Y":-15.37153,"NE_ID":1159321421,"WIKIDATAID":"Q686","NAME_AR":"فانواتو","NAME_BN":"ভানুয়াতু","NAME_DE":"Vanuatu","NAME_EN":"Vanuatu","NAME_ES":"Vanuatu","NAME_FA":"وانواتو","NAME_FR":"Vanuatu","NAME_EL":"Βανουάτου","NAME_HE":"ונואטו","NAME_HI":"वानूआटू","NAME_HU":"Vanuatu","NAME_ID":"Vanuatu","NAME_IT":"Vanuatu","NAME_JA":"バヌアツ","NAME_KO":"바누아투","NAME_NL":"Vanuatu","NAME_PL":"Vanuatu","NAME_PT":"Vanuatu","NAME_RU":"Вануату","NAME_SV":"Vanuatu","NAME_TR":"Vanuatu","NAME_UK":"Вануату","NAME_UR":"وانواتو","NAME_VI":"Vanuatu","NAME_ZH":"瓦努阿图","NAME_ZHT":"萬那杜","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[166.629137,-16.59785,167.844877,-14.626497],"geometry":{"type":"MultiPolygon","coordinates":[[[[167.216801,-15.891846],[167.844877,-16.466333],[167.515181,-16.59785],[167.180008,-16.159995],[167.216801,-15.891846]]],[[[166.793158,-15.668811],[166.649859,-15.392704],[166.629137,-14.626497],[167.107712,-14.93392],[167.270028,-15.740021],[167.001207,-15.614602],[166.793158,-15.668811]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Cambodia","SOV_A3":"KHM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Cambodia","ADM0_A3":"KHM","GEOU_DIF":0,"GEOUNIT":"Cambodia","GU_A3":"KHM","SU_DIF":0,"SUBUNIT":"Cambodia","SU_A3":"KHM","BRK_DIFF":0,"NAME":"Cambodia","NAME_LONG":"Cambodia","BRK_A3":"KHM","BRK_NAME":"Cambodia","BRK_GROUP":null,"ABBREV":"Camb.","POSTAL":"KH","FORMAL_EN":"Kingdom of Cambodia","FORMAL_FR":null,"NAME_CIAWF":"Cambodia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Cambodia","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":6,"MAPCOLOR13":5,"POP_EST":16486542,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":27089,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"CB","ISO_A2":"KH","ISO_A2_EH":"KH","ISO_A3":"KHM","ISO_A3_EH":"KHM","ISO_N3":"116","ISO_N3_EH":"116","UN_A3":"116","WB_A2":"KH","WB_A3":"KHM","WOE_ID":23424776,"WOE_ID_EH":23424776,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"KHM","ADM0_DIFF":null,"ADM0_TLC":"KHM","ADM0_A3_US":"KHM","ADM0_A3_FR":"KHM","ADM0_A3_RU":"KHM","ADM0_A3_ES":"KHM","ADM0_A3_CN":"KHM","ADM0_A3_TW":"KHM","ADM0_A3_IN":"KHM","ADM0_A3_NP":"KHM","ADM0_A3_PK":"KHM","ADM0_A3_DE":"KHM","ADM0_A3_GB":"KHM","ADM0_A3_BR":"KHM","ADM0_A3_IL":"KHM","ADM0_A3_PS":"KHM","ADM0_A3_SA":"KHM","ADM0_A3_EG":"KHM","ADM0_A3_MA":"KHM","ADM0_A3_PT":"KHM","ADM0_A3_AR":"KHM","ADM0_A3_JP":"KHM","ADM0_A3_KO":"KHM","ADM0_A3_VN":"KHM","ADM0_A3_TR":"KHM","ADM0_A3_ID":"KHM","ADM0_A3_PL":"KHM","ADM0_A3_GR":"KHM","ADM0_A3_IT":"KHM","ADM0_A3_NL":"KHM","ADM0_A3_SE":"KHM","ADM0_A3_BD":"KHM","ADM0_A3_UA":"KHM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":104.50487,"LABEL_Y":12.647584,"NE_ID":1159320979,"WIKIDATAID":"Q424","NAME_AR":"كمبوديا","NAME_BN":"কম্বোডিয়া","NAME_DE":"Kambodscha","NAME_EN":"Cambodia","NAME_ES":"Camboya","NAME_FA":"کامبوج","NAME_FR":"Cambodge","NAME_EL":"Καμπότζη","NAME_HE":"קמבודיה","NAME_HI":"कम्बोडिया","NAME_HU":"Kambodzsa","NAME_ID":"Kamboja","NAME_IT":"Cambogia","NAME_JA":"カンボジア","NAME_KO":"캄보디아","NAME_NL":"Cambodja","NAME_PL":"Kambodża","NAME_PT":"Camboja","NAME_RU":"Камбоджа","NAME_SV":"Kambodja","NAME_TR":"Kamboçya","NAME_UK":"Камбоджа","NAME_UR":"کمبوڈیا","NAME_VI":"Campuchia","NAME_ZH":"柬埔寨","NAME_ZHT":"柬埔寨","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[102.348099,10.486544,107.614548,14.570584],"geometry":{"type":"Polygon","coordinates":[[[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Thailand","SOV_A3":"THA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Thailand","ADM0_A3":"THA","GEOU_DIF":0,"GEOUNIT":"Thailand","GU_A3":"THA","SU_DIF":0,"SUBUNIT":"Thailand","SU_A3":"THA","BRK_DIFF":0,"NAME":"Thailand","NAME_LONG":"Thailand","BRK_A3":"THA","BRK_NAME":"Thailand","BRK_GROUP":null,"ABBREV":"Thai.","POSTAL":"TH","FORMAL_EN":"Kingdom of Thailand","FORMAL_FR":null,"NAME_CIAWF":"Thailand","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Thailand","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":8,"MAPCOLOR13":1,"POP_EST":69625582,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":543548,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"TH","ISO_A2":"TH","ISO_A2_EH":"TH","ISO_A3":"THA","ISO_A3_EH":"THA","ISO_N3":"764","ISO_N3_EH":"764","UN_A3":"764","WB_A2":"TH","WB_A3":"THA","WOE_ID":23424960,"WOE_ID_EH":23424960,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"THA","ADM0_DIFF":null,"ADM0_TLC":"THA","ADM0_A3_US":"THA","ADM0_A3_FR":"THA","ADM0_A3_RU":"THA","ADM0_A3_ES":"THA","ADM0_A3_CN":"THA","ADM0_A3_TW":"THA","ADM0_A3_IN":"THA","ADM0_A3_NP":"THA","ADM0_A3_PK":"THA","ADM0_A3_DE":"THA","ADM0_A3_GB":"THA","ADM0_A3_BR":"THA","ADM0_A3_IL":"THA","ADM0_A3_PS":"THA","ADM0_A3_SA":"THA","ADM0_A3_EG":"THA","ADM0_A3_MA":"THA","ADM0_A3_PT":"THA","ADM0_A3_AR":"THA","ADM0_A3_JP":"THA","ADM0_A3_KO":"THA","ADM0_A3_VN":"THA","ADM0_A3_TR":"THA","ADM0_A3_ID":"THA","ADM0_A3_PL":"THA","ADM0_A3_GR":"THA","ADM0_A3_IT":"THA","ADM0_A3_NL":"THA","ADM0_A3_SE":"THA","ADM0_A3_BD":"THA","ADM0_A3_UA":"THA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":8,"LABEL_X":101.073198,"LABEL_Y":15.45974,"NE_ID":1159321305,"WIKIDATAID":"Q869","NAME_AR":"تايلاند","NAME_BN":"থাইল্যান্ড","NAME_DE":"Thailand","NAME_EN":"Thailand","NAME_ES":"Tailandia","NAME_FA":"تایلند","NAME_FR":"Thaïlande","NAME_EL":"Ταϊλάνδη","NAME_HE":"תאילנד","NAME_HI":"थाईलैण्ड","NAME_HU":"Thaiföld","NAME_ID":"Thailand","NAME_IT":"Thailandia","NAME_JA":"タイ王国","NAME_KO":"태국","NAME_NL":"Thailand","NAME_PL":"Tajlandia","NAME_PT":"Tailândia","NAME_RU":"Таиланд","NAME_SV":"Thailand","NAME_TR":"Tayland","NAME_UK":"Таїланд","NAME_UR":"تھائی لینڈ","NAME_VI":"Thái Lan","NAME_ZH":"泰国","NAME_ZHT":"泰國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[97.375896,5.691384,105.589039,20.41785],"geometry":{"type":"Polygon","coordinates":[[[105.218777,14.273212],[104.281418,14.416743],[102.988422,14.225721],[102.348099,13.394247],[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.075516,6.204867],[100.259596,6.642825],[100.085757,6.464489],[99.690691,6.848213],[99.519642,7.343454],[98.988253,7.907993],[98.503786,8.382305],[98.339662,7.794512],[98.150009,8.350007],[98.25915,8.973923],[98.553551,9.93296],[99.038121,10.960546],[99.587286,11.892763],[99.196354,12.804748],[99.212012,13.269294],[99.097755,13.827503],[98.430819,14.622028],[98.192074,15.123703],[98.537376,15.308497],[98.903348,16.177824],[98.493761,16.837836],[97.859123,17.567946],[97.375896,18.445438],[97.797783,18.62708],[98.253724,19.708203],[98.959676,19.752981],[99.543309,20.186598],[100.115988,20.41785],[100.548881,20.109238],[100.606294,19.508344],[101.282015,19.462585],[101.035931,18.408928],[101.059548,17.512497],[102.113592,18.109102],[102.413005,17.932782],[102.998706,17.961695],[103.200192,18.309632],[103.956477,18.240954],[104.716947,17.428859],[104.779321,16.441865],[105.589039,15.570316],[105.544338,14.723934],[105.218777,14.273212]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Laos","SOV_A3":"LAO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Laos","ADM0_A3":"LAO","GEOU_DIF":0,"GEOUNIT":"Laos","GU_A3":"LAO","SU_DIF":0,"SUBUNIT":"Laos","SU_A3":"LAO","BRK_DIFF":0,"NAME":"Laos","NAME_LONG":"Lao PDR","BRK_A3":"LAO","BRK_NAME":"Laos","BRK_GROUP":null,"ABBREV":"Laos","POSTAL":"LA","FORMAL_EN":"Lao People's Democratic Republic","FORMAL_FR":null,"NAME_CIAWF":"Laos","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Lao PDR","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":1,"MAPCOLOR13":9,"POP_EST":7169455,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":18173,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"LA","ISO_A2":"LA","ISO_A2_EH":"LA","ISO_A3":"LAO","ISO_A3_EH":"LAO","ISO_N3":"418","ISO_N3_EH":"418","UN_A3":"418","WB_A2":"LA","WB_A3":"LAO","WOE_ID":23424872,"WOE_ID_EH":23424872,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LAO","ADM0_DIFF":null,"ADM0_TLC":"LAO","ADM0_A3_US":"LAO","ADM0_A3_FR":"LAO","ADM0_A3_RU":"LAO","ADM0_A3_ES":"LAO","ADM0_A3_CN":"LAO","ADM0_A3_TW":"LAO","ADM0_A3_IN":"LAO","ADM0_A3_NP":"LAO","ADM0_A3_PK":"LAO","ADM0_A3_DE":"LAO","ADM0_A3_GB":"LAO","ADM0_A3_BR":"LAO","ADM0_A3_IL":"LAO","ADM0_A3_PS":"LAO","ADM0_A3_SA":"LAO","ADM0_A3_EG":"LAO","ADM0_A3_MA":"LAO","ADM0_A3_PT":"LAO","ADM0_A3_AR":"LAO","ADM0_A3_JP":"LAO","ADM0_A3_KO":"LAO","ADM0_A3_VN":"LAO","ADM0_A3_TR":"LAO","ADM0_A3_ID":"LAO","ADM0_A3_PL":"LAO","ADM0_A3_GR":"LAO","ADM0_A3_IT":"LAO","ADM0_A3_NL":"LAO","ADM0_A3_SE":"LAO","ADM0_A3_BD":"LAO","ADM0_A3_UA":"LAO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":4,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":102.533912,"LABEL_Y":19.431821,"NE_ID":1159321011,"WIKIDATAID":"Q819","NAME_AR":"لاوس","NAME_BN":"লাওস","NAME_DE":"Laos","NAME_EN":"Laos","NAME_ES":"Laos","NAME_FA":"لائوس","NAME_FR":"Laos","NAME_EL":"Λάος","NAME_HE":"לאוס","NAME_HI":"लाओस","NAME_HU":"Laosz","NAME_ID":"Laos","NAME_IT":"Laos","NAME_JA":"ラオス","NAME_KO":"라오스","NAME_NL":"Laos","NAME_PL":"Laos","NAME_PT":"Laos","NAME_RU":"Лаос","NAME_SV":"Laos","NAME_TR":"Laos","NAME_UK":"Лаос","NAME_UR":"لاؤس","NAME_VI":"Lào","NAME_ZH":"老挝","NAME_ZHT":"寮國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[100.115988,13.881091,107.564525,22.464753],"geometry":{"type":"Polygon","coordinates":[[[107.382727,14.202441],[106.496373,14.570584],[106.043946,13.881091],[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122],[101.180005,21.436573],[101.270026,21.201652],[101.80312,21.174367],[101.652018,22.318199],[102.170436,22.464753],[102.754896,21.675137],[103.203861,20.766562],[104.435,20.758733],[104.822574,19.886642],[104.183388,19.624668],[103.896532,19.265181],[105.094598,18.666975],[105.925762,17.485315],[106.556008,16.604284],[107.312706,15.908538],[107.564525,15.202173],[107.382727,14.202441]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Myanmar","SOV_A3":"MMR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Myanmar","ADM0_A3":"MMR","GEOU_DIF":0,"GEOUNIT":"Myanmar","GU_A3":"MMR","SU_DIF":0,"SUBUNIT":"Myanmar","SU_A3":"MMR","BRK_DIFF":0,"NAME":"Myanmar","NAME_LONG":"Myanmar","BRK_A3":"MMR","BRK_NAME":"Myanmar","BRK_GROUP":null,"ABBREV":"Myan.","POSTAL":"MM","FORMAL_EN":"Republic of the Union of Myanmar","FORMAL_FR":null,"NAME_CIAWF":"Burma","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Myanmar","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":13,"POP_EST":54045420,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":76085,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"BM","ISO_A2":"MM","ISO_A2_EH":"MM","ISO_A3":"MMR","ISO_A3_EH":"MMR","ISO_N3":"104","ISO_N3_EH":"104","UN_A3":"104","WB_A2":"MM","WB_A3":"MMR","WOE_ID":23424763,"WOE_ID_EH":23424763,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MMR","ADM0_DIFF":null,"ADM0_TLC":"MMR","ADM0_A3_US":"MMR","ADM0_A3_FR":"MMR","ADM0_A3_RU":"MMR","ADM0_A3_ES":"MMR","ADM0_A3_CN":"MMR","ADM0_A3_TW":"MMR","ADM0_A3_IN":"MMR","ADM0_A3_NP":"MMR","ADM0_A3_PK":"MMR","ADM0_A3_DE":"MMR","ADM0_A3_GB":"MMR","ADM0_A3_BR":"MMR","ADM0_A3_IL":"MMR","ADM0_A3_PS":"MMR","ADM0_A3_SA":"MMR","ADM0_A3_EG":"MMR","ADM0_A3_MA":"MMR","ADM0_A3_PT":"MMR","ADM0_A3_AR":"MMR","ADM0_A3_JP":"MMR","ADM0_A3_KO":"MMR","ADM0_A3_VN":"MMR","ADM0_A3_TR":"MMR","ADM0_A3_ID":"MMR","ADM0_A3_PL":"MMR","ADM0_A3_GR":"MMR","ADM0_A3_IT":"MMR","ADM0_A3_NL":"MMR","ADM0_A3_SE":"MMR","ADM0_A3_BD":"MMR","ADM0_A3_UA":"MMR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":95.804497,"LABEL_Y":21.573855,"NE_ID":1159321067,"WIKIDATAID":"Q836","NAME_AR":"ميانمار","NAME_BN":"মিয়ানমার","NAME_DE":"Myanmar","NAME_EN":"Myanmar","NAME_ES":"Birmania","NAME_FA":"میانمار","NAME_FR":"Birmanie","NAME_EL":"Μιανμάρ","NAME_HE":"מיאנמר","NAME_HI":"म्यान्मार","NAME_HU":"Mianmar","NAME_ID":"Myanmar","NAME_IT":"Birmania","NAME_JA":"ミャンマー","NAME_KO":"미얀마","NAME_NL":"Myanmar","NAME_PL":"Mjanma","NAME_PT":"Myanmar","NAME_RU":"Мьянма","NAME_SV":"Myanmar","NAME_TR":"Myanmar","NAME_UK":"М'янма","NAME_UR":"میانمار","NAME_VI":"Myanma","NAME_ZH":"缅甸","NAME_ZHT":"緬甸","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[92.303234,9.93296,101.180005,28.335945],"geometry":{"type":"Polygon","coordinates":[[[100.115988,20.41785],[99.543309,20.186598],[98.959676,19.752981],[98.253724,19.708203],[97.797783,18.62708],[97.375896,18.445438],[97.859123,17.567946],[98.493761,16.837836],[98.903348,16.177824],[98.537376,15.308497],[98.192074,15.123703],[98.430819,14.622028],[99.097755,13.827503],[99.212012,13.269294],[99.196354,12.804748],[99.587286,11.892763],[99.038121,10.960546],[98.553551,9.93296],[98.457174,10.675266],[98.764546,11.441292],[98.428339,12.032987],[98.509574,13.122378],[98.103604,13.64046],[97.777732,14.837286],[97.597072,16.100568],[97.16454,16.928734],[96.505769,16.427241],[95.369352,15.71439],[94.808405,15.803454],[94.188804,16.037936],[94.533486,17.27724],[94.324817,18.213514],[93.540988,19.366493],[93.663255,19.726962],[93.078278,19.855145],[92.368554,20.670883],[92.303234,21.475485],[92.652257,21.324048],[92.672721,22.041239],[93.166128,22.27846],[93.060294,22.703111],[93.286327,23.043658],[93.325188,24.078556],[94.106742,23.850741],[94.552658,24.675238],[94.603249,25.162495],[95.155153,26.001307],[95.124768,26.573572],[96.419366,27.264589],[97.133999,27.083774],[97.051989,27.699059],[97.402561,27.882536],[97.327114,28.261583],[97.911988,28.335945],[98.246231,27.747221],[98.68269,27.508812],[98.712094,26.743536],[98.671838,25.918703],[97.724609,25.083637],[97.60472,23.897405],[98.660262,24.063286],[98.898749,23.142722],[99.531992,22.949039],[99.240899,22.118314],[99.983489,21.742937],[100.416538,21.558839],[101.150033,21.849984],[101.180005,21.436573],[100.329101,20.786122],[100.115988,20.41785]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Vietnam","SOV_A3":"VNM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Vietnam","ADM0_A3":"VNM","GEOU_DIF":0,"GEOUNIT":"Vietnam","GU_A3":"VNM","SU_DIF":0,"SUBUNIT":"Vietnam","SU_A3":"VNM","BRK_DIFF":0,"NAME":"Vietnam","NAME_LONG":"Vietnam","BRK_A3":"VNM","BRK_NAME":"Vietnam","BRK_GROUP":null,"ABBREV":"Viet.","POSTAL":"VN","FORMAL_EN":"Socialist Republic of Vietnam","FORMAL_FR":null,"NAME_CIAWF":"Vietnam","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Vietnam","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":4,"POP_EST":96462106,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":261921,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","FIPS_10":"VM","ISO_A2":"VN","ISO_A2_EH":"VN","ISO_A3":"VNM","ISO_A3_EH":"VNM","ISO_N3":"704","ISO_N3_EH":"704","UN_A3":"704","WB_A2":"VN","WB_A3":"VNM","WOE_ID":23424984,"WOE_ID_EH":23424984,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"VNM","ADM0_DIFF":null,"ADM0_TLC":"VNM","ADM0_A3_US":"VNM","ADM0_A3_FR":"VNM","ADM0_A3_RU":"VNM","ADM0_A3_ES":"VNM","ADM0_A3_CN":"VNM","ADM0_A3_TW":"VNM","ADM0_A3_IN":"VNM","ADM0_A3_NP":"VNM","ADM0_A3_PK":"VNM","ADM0_A3_DE":"VNM","ADM0_A3_GB":"VNM","ADM0_A3_BR":"VNM","ADM0_A3_IL":"VNM","ADM0_A3_PS":"VNM","ADM0_A3_SA":"VNM","ADM0_A3_EG":"VNM","ADM0_A3_MA":"VNM","ADM0_A3_PT":"VNM","ADM0_A3_AR":"VNM","ADM0_A3_JP":"VNM","ADM0_A3_KO":"VNM","ADM0_A3_VN":"VNM","ADM0_A3_TR":"VNM","ADM0_A3_ID":"VNM","ADM0_A3_PL":"VNM","ADM0_A3_GR":"VNM","ADM0_A3_IT":"VNM","ADM0_A3_NL":"VNM","ADM0_A3_SE":"VNM","ADM0_A3_BD":"VNM","ADM0_A3_UA":"VNM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":2,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":105.387292,"LABEL_Y":21.715416,"NE_ID":1159321417,"WIKIDATAID":"Q881","NAME_AR":"فيتنام","NAME_BN":"ভিয়েতনাম","NAME_DE":"Vietnam","NAME_EN":"Vietnam","NAME_ES":"Vietnam","NAME_FA":"ویتنام","NAME_FR":"Viêt Nam","NAME_EL":"Βιετνάμ","NAME_HE":"וייטנאם","NAME_HI":"वियतनाम","NAME_HU":"Vietnám","NAME_ID":"Vietnam","NAME_IT":"Vietnam","NAME_JA":"ベトナム","NAME_KO":"베트남","NAME_NL":"Vietnam","NAME_PL":"Wietnam","NAME_PT":"Vietname","NAME_RU":"Вьетнам","NAME_SV":"Vietnam","NAME_TR":"Vietnam","NAME_UK":"В'єтнам","NAME_UR":"ویتنام","NAME_VI":"Việt Nam","NAME_ZH":"越南","NAME_ZHT":"越南","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[102.170436,8.59976,109.33527,23.352063],"geometry":{"type":"Polygon","coordinates":[[[104.334335,10.486544],[105.199915,10.88931],[106.24967,10.961812],[105.810524,11.567615],[107.491403,12.337206],[107.614548,13.535531],[107.382727,14.202441],[107.564525,15.202173],[107.312706,15.908538],[106.556008,16.604284],[105.925762,17.485315],[105.094598,18.666975],[103.896532,19.265181],[104.183388,19.624668],[104.822574,19.886642],[104.435,20.758733],[103.203861,20.766562],[102.754896,21.675137],[102.170436,22.464753],[102.706992,22.708795],[103.504515,22.703757],[104.476858,22.81915],[105.329209,23.352063],[105.811247,22.976892],[106.725403,22.794268],[106.567273,22.218205],[107.04342,21.811899],[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"North Korea","SOV_A3":"PRK","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"North Korea","ADM0_A3":"PRK","GEOU_DIF":0,"GEOUNIT":"North Korea","GU_A3":"PRK","SU_DIF":0,"SUBUNIT":"North Korea","SU_A3":"PRK","BRK_DIFF":0,"NAME":"North Korea","NAME_LONG":"Dem. Rep. Korea","BRK_A3":"PRK","BRK_NAME":"Dem. Rep. Korea","BRK_GROUP":null,"ABBREV":"N.K.","POSTAL":"KP","FORMAL_EN":"Democratic People's Republic of Korea","FORMAL_FR":null,"NAME_CIAWF":"Korea, North","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Korea, Dem. Rep.","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":9,"POP_EST":25666161,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":40000,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"KN","ISO_A2":"KP","ISO_A2_EH":"KP","ISO_A3":"PRK","ISO_A3_EH":"PRK","ISO_N3":"408","ISO_N3_EH":"408","UN_A3":"408","WB_A2":"KP","WB_A3":"PRK","WOE_ID":23424865,"WOE_ID_EH":23424865,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PRK","ADM0_DIFF":null,"ADM0_TLC":"PRK","ADM0_A3_US":"PRK","ADM0_A3_FR":"PRK","ADM0_A3_RU":"PRK","ADM0_A3_ES":"PRK","ADM0_A3_CN":"PRK","ADM0_A3_TW":"PRK","ADM0_A3_IN":"PRK","ADM0_A3_NP":"PRK","ADM0_A3_PK":"PRK","ADM0_A3_DE":"PRK","ADM0_A3_GB":"PRK","ADM0_A3_BR":"PRK","ADM0_A3_IL":"PRK","ADM0_A3_PS":"PRK","ADM0_A3_SA":"PRK","ADM0_A3_EG":"PRK","ADM0_A3_MA":"PRK","ADM0_A3_PT":"PRK","ADM0_A3_AR":"PRK","ADM0_A3_JP":"PRK","ADM0_A3_KO":"PRK","ADM0_A3_VN":"PRK","ADM0_A3_TR":"PRK","ADM0_A3_ID":"PRK","ADM0_A3_PL":"PRK","ADM0_A3_GR":"PRK","ADM0_A3_IT":"PRK","ADM0_A3_NL":"PRK","ADM0_A3_SE":"PRK","ADM0_A3_BD":"PRK","ADM0_A3_UA":"PRK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":15,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":126.444516,"LABEL_Y":39.885252,"NE_ID":1159321181,"WIKIDATAID":"Q423","NAME_AR":"كوريا الشمالية","NAME_BN":"উত্তর কোরিয়া","NAME_DE":"Nordkorea","NAME_EN":"North Korea","NAME_ES":"Corea del Norte","NAME_FA":"کره شمالی","NAME_FR":"Corée du Nord","NAME_EL":"Βόρεια Κορέα","NAME_HE":"קוריאה הצפונית","NAME_HI":"उत्तर कोरिया","NAME_HU":"Észak-Korea","NAME_ID":"Korea Utara","NAME_IT":"Corea del Nord","NAME_JA":"朝鮮民主主義人民共和国","NAME_KO":"조선민주주의인민공화국","NAME_NL":"Noord-Korea","NAME_PL":"Korea Północna","NAME_PT":"Coreia do Norte","NAME_RU":"КНДР","NAME_SV":"Nordkorea","NAME_TR":"Kuzey Kore","NAME_UK":"Корейська Народно-Демократична Республіка","NAME_UR":"شمالی کوریا","NAME_VI":"Cộng hòa Dân chủ Nhân dân Triều Tiên","NAME_ZH":"朝鲜民主主义人民共和国","NAME_ZHT":"朝鮮民主主義人民共和國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[124.265625,37.669071,130.780007,42.985387],"geometry":{"type":"MultiPolygon","coordinates":[[[[130.780004,42.220008],[130.780005,42.22001],[130.780007,42.220007],[130.780004,42.220008]]],[[[130.64,42.395024],[130.64,42.395],[130.779992,42.22001],[130.400031,42.280004],[129.965949,41.941368],[129.667362,41.601104],[129.705189,40.882828],[129.188115,40.661808],[129.0104,40.485436],[128.633368,40.189847],[127.967414,40.025413],[127.533436,39.75685],[127.50212,39.323931],[127.385434,39.213472],[127.783343,39.050898],[128.349716,38.612243],[128.205746,38.370397],[127.780035,38.304536],[127.073309,38.256115],[126.68372,37.804773],[126.237339,37.840378],[126.174759,37.749686],[125.689104,37.94001],[125.568439,37.752089],[125.27533,37.669071],[125.240087,37.857224],[124.981033,37.948821],[124.712161,38.108346],[124.985994,38.548474],[125.221949,38.665857],[125.132859,38.848559],[125.38659,39.387958],[125.321116,39.551385],[124.737482,39.660344],[124.265625,39.928493],[125.079942,40.569824],[126.182045,41.107336],[126.869083,41.816569],[127.343783,41.503152],[128.208433,41.466772],[128.052215,41.994285],[129.596669,42.424982],[129.994267,42.985387],[130.64,42.395024]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"South Korea","SOV_A3":"KOR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"South Korea","ADM0_A3":"KOR","GEOU_DIF":0,"GEOUNIT":"South Korea","GU_A3":"KOR","SU_DIF":0,"SUBUNIT":"South Korea","SU_A3":"KOR","BRK_DIFF":0,"NAME":"South Korea","NAME_LONG":"Republic of Korea","BRK_A3":"KOR","BRK_NAME":"Republic of Korea","BRK_GROUP":null,"ABBREV":"S.K.","POSTAL":"KR","FORMAL_EN":"Republic of Korea","FORMAL_FR":null,"NAME_CIAWF":"Korea, South","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Korea, Rep.","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":1,"MAPCOLOR13":5,"POP_EST":51709098,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":1646739,"GDP_YEAR":2019,"ECONOMY":"4. Emerging region: MIKT","INCOME_GRP":"1. High income: OECD","FIPS_10":"KS","ISO_A2":"KR","ISO_A2_EH":"KR","ISO_A3":"KOR","ISO_A3_EH":"KOR","ISO_N3":"410","ISO_N3_EH":"410","UN_A3":"410","WB_A2":"KR","WB_A3":"KOR","WOE_ID":23424868,"WOE_ID_EH":23424868,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"KOR","ADM0_DIFF":null,"ADM0_TLC":"KOR","ADM0_A3_US":"KOR","ADM0_A3_FR":"KOR","ADM0_A3_RU":"KOR","ADM0_A3_ES":"KOR","ADM0_A3_CN":"KOR","ADM0_A3_TW":"KOR","ADM0_A3_IN":"KOR","ADM0_A3_NP":"KOR","ADM0_A3_PK":"KOR","ADM0_A3_DE":"KOR","ADM0_A3_GB":"KOR","ADM0_A3_BR":"KOR","ADM0_A3_IL":"KOR","ADM0_A3_PS":"KOR","ADM0_A3_SA":"KOR","ADM0_A3_EG":"KOR","ADM0_A3_MA":"KOR","ADM0_A3_PT":"KOR","ADM0_A3_AR":"KOR","ADM0_A3_JP":"KOR","ADM0_A3_KO":"KOR","ADM0_A3_VN":"KOR","ADM0_A3_TR":"KOR","ADM0_A3_ID":"KOR","ADM0_A3_PL":"KOR","ADM0_A3_GR":"KOR","ADM0_A3_IT":"KOR","ADM0_A3_NL":"KOR","ADM0_A3_SE":"KOR","ADM0_A3_BD":"KOR","ADM0_A3_UA":"KOR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":17,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":7,"LABEL_X":128.129504,"LABEL_Y":36.384924,"NE_ID":1159320985,"WIKIDATAID":"Q884","NAME_AR":"كوريا الجنوبية","NAME_BN":"দক্ষিণ কোরিয়া","NAME_DE":"Südkorea","NAME_EN":"South Korea","NAME_ES":"Corea del Sur","NAME_FA":"کره جنوبی","NAME_FR":"Corée du Sud","NAME_EL":"Νότια Κορέα","NAME_HE":"קוריאה הדרומית","NAME_HI":"दक्षिण कोरिया","NAME_HU":"Dél-Korea","NAME_ID":"Korea Selatan","NAME_IT":"Corea del Sud","NAME_JA":"大韓民国","NAME_KO":"대한민국","NAME_NL":"Zuid-Korea","NAME_PL":"Korea Południowa","NAME_PT":"Coreia do Sul","NAME_RU":"Республика Корея","NAME_SV":"Sydkorea","NAME_TR":"Güney Kore","NAME_UK":"Південна Корея","NAME_UR":"جنوبی کوریا","NAME_VI":"Hàn Quốc","NAME_ZH":"大韩民国","NAME_ZHT":"大韓民國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[126.117398,34.390046,129.468304,38.612243],"geometry":{"type":"Polygon","coordinates":[[[126.174759,37.749686],[126.237339,37.840378],[126.68372,37.804773],[127.073309,38.256115],[127.780035,38.304536],[128.205746,38.370397],[128.349716,38.612243],[129.21292,37.432392],[129.46045,36.784189],[129.468304,35.632141],[129.091377,35.082484],[128.18585,34.890377],[127.386519,34.475674],[126.485748,34.390046],[126.37392,34.93456],[126.559231,35.684541],[126.117398,36.725485],[126.860143,36.893924],[126.174759,37.749686]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Mongolia","SOV_A3":"MNG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Mongolia","ADM0_A3":"MNG","GEOU_DIF":0,"GEOUNIT":"Mongolia","GU_A3":"MNG","SU_DIF":0,"SUBUNIT":"Mongolia","SU_A3":"MNG","BRK_DIFF":0,"NAME":"Mongolia","NAME_LONG":"Mongolia","BRK_A3":"MNG","BRK_NAME":"Mongolia","BRK_GROUP":null,"ABBREV":"Mong.","POSTAL":"MN","FORMAL_EN":"Mongolia","FORMAL_FR":null,"NAME_CIAWF":"Mongolia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mongolia","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":5,"MAPCOLOR13":6,"POP_EST":3225167,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":13996,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"MG","ISO_A2":"MN","ISO_A2_EH":"MN","ISO_A3":"MNG","ISO_A3_EH":"MNG","ISO_N3":"496","ISO_N3_EH":"496","UN_A3":"496","WB_A2":"MN","WB_A3":"MNG","WOE_ID":23424887,"WOE_ID_EH":23424887,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MNG","ADM0_DIFF":null,"ADM0_TLC":"MNG","ADM0_A3_US":"MNG","ADM0_A3_FR":"MNG","ADM0_A3_RU":"MNG","ADM0_A3_ES":"MNG","ADM0_A3_CN":"MNG","ADM0_A3_TW":"MNG","ADM0_A3_IN":"MNG","ADM0_A3_NP":"MNG","ADM0_A3_PK":"MNG","ADM0_A3_DE":"MNG","ADM0_A3_GB":"MNG","ADM0_A3_BR":"MNG","ADM0_A3_IL":"MNG","ADM0_A3_PS":"MNG","ADM0_A3_SA":"MNG","ADM0_A3_EG":"MNG","ADM0_A3_MA":"MNG","ADM0_A3_PT":"MNG","ADM0_A3_AR":"MNG","ADM0_A3_JP":"MNG","ADM0_A3_KO":"MNG","ADM0_A3_VN":"MNG","ADM0_A3_TR":"MNG","ADM0_A3_ID":"MNG","ADM0_A3_PL":"MNG","ADM0_A3_GR":"MNG","ADM0_A3_IT":"MNG","ADM0_A3_NL":"MNG","ADM0_A3_SE":"MNG","ADM0_A3_BD":"MNG","ADM0_A3_UA":"MNG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7,"LABEL_X":104.150405,"LABEL_Y":45.997488,"NE_ID":1159321071,"WIKIDATAID":"Q711","NAME_AR":"منغوليا","NAME_BN":"মঙ্গোলিয়া","NAME_DE":"Mongolei","NAME_EN":"Mongolia","NAME_ES":"Mongolia","NAME_FA":"مغولستان","NAME_FR":"Mongolie","NAME_EL":"Μογγολία","NAME_HE":"מונגוליה","NAME_HI":"मंगोलिया","NAME_HU":"Mongólia","NAME_ID":"Mongolia","NAME_IT":"Mongolia","NAME_JA":"モンゴル国","NAME_KO":"몽골","NAME_NL":"Mongolië","NAME_PL":"Mongolia","NAME_PT":"Mongólia","NAME_RU":"Монголия","NAME_SV":"Mongoliet","NAME_TR":"Moğolistan","NAME_UK":"Монголія","NAME_UR":"منگولیا","NAME_VI":"Mông Cổ","NAME_ZH":"蒙古国","NAME_ZHT":"蒙古國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[87.751264,41.59741,119.772824,52.047366],"geometry":{"type":"Polygon","coordinates":[[[87.751264,49.297198],[88.805567,49.470521],[90.713667,50.331812],[92.234712,50.802171],[93.10421,50.49529],[94.147566,50.480537],[94.815949,50.013433],[95.81402,49.97746],[97.25976,49.72605],[98.231762,50.422401],[97.82574,51.010995],[98.861491,52.047366],[99.981732,51.634006],[100.88948,51.516856],[102.06521,51.25991],[102.25589,50.51056],[103.676545,50.089966],[104.62158,50.27532],[105.886591,50.406019],[106.888804,50.274296],[107.868176,49.793705],[108.475167,49.282548],[109.402449,49.292961],[110.662011,49.130128],[111.581231,49.377968],[112.89774,49.543565],[114.362456,50.248303],[114.96211,50.140247],[115.485695,49.805177],[116.678801,49.888531],[116.191802,49.134598],[115.485282,48.135383],[115.742837,47.726545],[116.308953,47.85341],[117.295507,47.697709],[118.064143,48.06673],[118.866574,47.74706],[119.772824,47.048059],[119.66327,46.69268],[118.874326,46.805412],[117.421701,46.672733],[116.717868,46.388202],[115.985096,45.727235],[114.460332,45.339817],[113.463907,44.808893],[112.436062,45.011646],[111.873306,45.102079],[111.348377,44.457442],[111.667737,44.073176],[111.829588,43.743118],[111.129682,43.406834],[110.412103,42.871234],[109.243596,42.519446],[107.744773,42.481516],[106.129316,42.134328],[104.964994,41.59741],[104.522282,41.908347],[103.312278,41.907468],[101.83304,42.514873],[100.845866,42.663804],[99.515817,42.524691],[97.451757,42.74889],[96.349396,42.725635],[95.762455,43.319449],[95.306875,44.241331],[94.688929,44.352332],[93.480734,44.975472],[92.133891,45.115076],[90.94554,45.286073],[90.585768,45.719716],[90.970809,46.888146],[90.280826,47.693549],[88.854298,48.069082],[88.013832,48.599463],[87.751264,49.297198]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"India","SOV_A3":"IND","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"India","ADM0_A3":"IND","GEOU_DIF":0,"GEOUNIT":"India","GU_A3":"IND","SU_DIF":0,"SUBUNIT":"India","SU_A3":"IND","BRK_DIFF":0,"NAME":"India","NAME_LONG":"India","BRK_A3":"IND","BRK_NAME":"India","BRK_GROUP":null,"ABBREV":"India","POSTAL":"IND","FORMAL_EN":"Republic of India","FORMAL_FR":null,"NAME_CIAWF":"India","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"India","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":1366417754,"POP_RANK":18,"POP_YEAR":2019,"GDP_MD":2868929,"GDP_YEAR":2019,"ECONOMY":"3. Emerging region: BRIC","INCOME_GRP":"4. Lower middle income","FIPS_10":"IN","ISO_A2":"IN","ISO_A2_EH":"IN","ISO_A3":"IND","ISO_A3_EH":"IND","ISO_N3":"356","ISO_N3_EH":"356","UN_A3":"356","WB_A2":"IN","WB_A3":"IND","WOE_ID":23424848,"WOE_ID_EH":23424848,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"IND","ADM0_DIFF":null,"ADM0_TLC":"IND","ADM0_A3_US":"IND","ADM0_A3_FR":"IND","ADM0_A3_RU":"IND","ADM0_A3_ES":"IND","ADM0_A3_CN":"IND","ADM0_A3_TW":"IND","ADM0_A3_IN":"IND","ADM0_A3_NP":"IND","ADM0_A3_PK":"IND","ADM0_A3_DE":"IND","ADM0_A3_GB":"IND","ADM0_A3_BR":"IND","ADM0_A3_IL":"IND","ADM0_A3_PS":"IND","ADM0_A3_SA":"IND","ADM0_A3_EG":"IND","ADM0_A3_MA":"IND","ADM0_A3_PT":"IND","ADM0_A3_AR":"IND","ADM0_A3_JP":"IND","ADM0_A3_KO":"IND","ADM0_A3_VN":"IND","ADM0_A3_TR":"IND","ADM0_A3_ID":"IND","ADM0_A3_PL":"IND","ADM0_A3_GR":"IND","ADM0_A3_IT":"IND","ADM0_A3_NL":"IND","ADM0_A3_SE":"IND","ADM0_A3_BD":"IND","ADM0_A3_UA":"IND","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":79.358105,"LABEL_Y":22.686852,"NE_ID":1159320847,"WIKIDATAID":"Q668","NAME_AR":"الهند","NAME_BN":"ভারত","NAME_DE":"Indien","NAME_EN":"India","NAME_ES":"India","NAME_FA":"هند","NAME_FR":"Inde","NAME_EL":"Ινδία","NAME_HE":"הודו","NAME_HI":"भारत","NAME_HU":"India","NAME_ID":"India","NAME_IT":"India","NAME_JA":"インド","NAME_KO":"인도","NAME_NL":"India","NAME_PL":"Indie","NAME_PT":"Índia","NAME_RU":"Индия","NAME_SV":"Indien","NAME_TR":"Hindistan","NAME_UK":"Індія","NAME_UR":"بھارت","NAME_VI":"Ấn Độ","NAME_ZH":"印度","NAME_ZHT":"印度","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[68.176645,7.965535,97.402561,35.49401],"geometry":{"type":"Polygon","coordinates":[[[97.327114,28.261583],[97.402561,27.882536],[97.051989,27.699059],[97.133999,27.083774],[96.419366,27.264589],[95.124768,26.573572],[95.155153,26.001307],[94.603249,25.162495],[94.552658,24.675238],[94.106742,23.850741],[93.325188,24.078556],[93.286327,23.043658],[93.060294,22.703111],[93.166128,22.27846],[92.672721,22.041239],[92.146035,23.627499],[91.869928,23.624346],[91.706475,22.985264],[91.158963,23.503527],[91.46773,24.072639],[91.915093,24.130414],[92.376202,24.976693],[91.799596,25.147432],[90.872211,25.132601],[89.920693,25.26975],[89.832481,25.965082],[89.355094,26.014407],[88.563049,26.446526],[88.209789,25.768066],[88.931554,25.238692],[88.306373,24.866079],[88.084422,24.501657],[88.69994,24.233715],[88.52977,23.631142],[88.876312,22.879146],[89.031961,22.055708],[88.888766,21.690588],[88.208497,21.703172],[86.975704,21.495562],[87.033169,20.743308],[86.499351,20.151638],[85.060266,19.478579],[83.941006,18.30201],[83.189217,17.671221],[82.192792,17.016636],[82.191242,16.556664],[81.692719,16.310219],[80.791999,15.951972],[80.324896,15.899185],[80.025069,15.136415],[80.233274,13.835771],[80.286294,13.006261],[79.862547,12.056215],[79.857999,10.357275],[79.340512,10.308854],[78.885345,9.546136],[79.18972,9.216544],[78.277941,8.933047],[77.941165,8.252959],[77.539898,7.965535],[76.592979,8.899276],[76.130061,10.29963],[75.746467,11.308251],[75.396101,11.781245],[74.864816,12.741936],[74.616717,13.992583],[74.443859,14.617222],[73.534199,15.990652],[73.119909,17.92857],[72.820909,19.208234],[72.824475,20.419503],[72.630533,21.356009],[71.175273,20.757441],[70.470459,20.877331],[69.16413,22.089298],[69.644928,22.450775],[69.349597,22.84318],[68.176645,23.691965],[68.842599,24.359134],[71.04324,24.356524],[70.844699,25.215102],[70.282873,25.722229],[70.168927,26.491872],[69.514393,26.940966],[70.616496,27.989196],[71.777666,27.91318],[72.823752,28.961592],[73.450638,29.976413],[74.42138,30.979815],[74.405929,31.692639],[75.258642,32.271105],[74.451559,32.7649],[74.104294,33.441473],[73.749948,34.317699],[74.240203,34.748887],[75.757061,34.504923],[76.871722,34.653544],[77.837451,35.49401],[78.912269,34.321936],[78.811086,33.506198],[79.208892,32.994395],[79.176129,32.48378],[78.458446,32.618164],[78.738894,31.515906],[79.721367,30.882715],[81.111256,30.183481],[80.476721,29.729865],[80.088425,28.79447],[81.057203,28.416095],[81.999987,27.925479],[83.304249,27.364506],[84.675018,27.234901],[85.251779,26.726198],[86.024393,26.630985],[87.227472,26.397898],[88.060238,26.414615],[88.174804,26.810405],[88.043133,27.445819],[88.120441,27.876542],[88.730326,28.086865],[88.814248,27.299316],[88.835643,27.098966],[89.744528,26.719403],[90.373275,26.875724],[91.217513,26.808648],[92.033484,26.83831],[92.103712,27.452614],[91.696657,27.771742],[92.503119,27.896876],[93.413348,28.640629],[94.56599,29.277438],[95.404802,29.031717],[96.117679,29.452802],[96.586591,28.83098],[96.248833,28.411031],[97.327114,28.261583]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Bangladesh","SOV_A3":"BGD","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Bangladesh","ADM0_A3":"BGD","GEOU_DIF":0,"GEOUNIT":"Bangladesh","GU_A3":"BGD","SU_DIF":0,"SUBUNIT":"Bangladesh","SU_A3":"BGD","BRK_DIFF":0,"NAME":"Bangladesh","NAME_LONG":"Bangladesh","BRK_A3":"BGD","BRK_NAME":"Bangladesh","BRK_GROUP":null,"ABBREV":"Bang.","POSTAL":"BD","FORMAL_EN":"People's Republic of Bangladesh","FORMAL_FR":null,"NAME_CIAWF":"Bangladesh","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bangladesh","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":4,"MAPCOLOR9":7,"MAPCOLOR13":7,"POP_EST":163046161,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":302571,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"BG","ISO_A2":"BD","ISO_A2_EH":"BD","ISO_A3":"BGD","ISO_A3_EH":"BGD","ISO_N3":"050","ISO_N3_EH":"050","UN_A3":"050","WB_A2":"BD","WB_A3":"BGD","WOE_ID":23424759,"WOE_ID_EH":23424759,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BGD","ADM0_DIFF":null,"ADM0_TLC":"BGD","ADM0_A3_US":"BGD","ADM0_A3_FR":"BGD","ADM0_A3_RU":"BGD","ADM0_A3_ES":"BGD","ADM0_A3_CN":"BGD","ADM0_A3_TW":"BGD","ADM0_A3_IN":"BGD","ADM0_A3_NP":"BGD","ADM0_A3_PK":"BGD","ADM0_A3_DE":"BGD","ADM0_A3_GB":"BGD","ADM0_A3_BR":"BGD","ADM0_A3_IL":"BGD","ADM0_A3_PS":"BGD","ADM0_A3_SA":"BGD","ADM0_A3_EG":"BGD","ADM0_A3_MA":"BGD","ADM0_A3_PT":"BGD","ADM0_A3_AR":"BGD","ADM0_A3_JP":"BGD","ADM0_A3_KO":"BGD","ADM0_A3_VN":"BGD","ADM0_A3_TR":"BGD","ADM0_A3_ID":"BGD","ADM0_A3_PL":"BGD","ADM0_A3_GR":"BGD","ADM0_A3_IT":"BGD","ADM0_A3_NL":"BGD","ADM0_A3_SE":"BGD","ADM0_A3_BD":"BGD","ADM0_A3_UA":"BGD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":89.684963,"LABEL_Y":24.214956,"NE_ID":1159320407,"WIKIDATAID":"Q902","NAME_AR":"بنغلاديش","NAME_BN":"বাংলাদেশ","NAME_DE":"Bangladesch","NAME_EN":"Bangladesh","NAME_ES":"Bangladés","NAME_FA":"بنگلادش","NAME_FR":"Bangladesh","NAME_EL":"Μπανγκλαντές","NAME_HE":"בנגלדש","NAME_HI":"बांग्लादेश","NAME_HU":"Banglades","NAME_ID":"Bangladesh","NAME_IT":"Bangladesh","NAME_JA":"バングラデシュ","NAME_KO":"방글라데시","NAME_NL":"Bangladesh","NAME_PL":"Bangladesz","NAME_PT":"Bangladesh","NAME_RU":"Бангладеш","NAME_SV":"Bangladesh","NAME_TR":"Bangladeş","NAME_UK":"Бангладеш","NAME_UR":"بنگلہ دیش","NAME_VI":"Bangladesh","NAME_ZH":"孟加拉国","NAME_ZHT":"孟加拉","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[88.084422,20.670883,92.672721,26.446526],"geometry":{"type":"Polygon","coordinates":[[[92.672721,22.041239],[92.652257,21.324048],[92.303234,21.475485],[92.368554,20.670883],[92.082886,21.192195],[92.025215,21.70157],[91.834891,22.182936],[91.417087,22.765019],[90.496006,22.805017],[90.586957,22.392794],[90.272971,21.836368],[89.847467,22.039146],[89.70205,21.857116],[89.418863,21.966179],[89.031961,22.055708],[88.876312,22.879146],[88.52977,23.631142],[88.69994,24.233715],[88.084422,24.501657],[88.306373,24.866079],[88.931554,25.238692],[88.209789,25.768066],[88.563049,26.446526],[89.355094,26.014407],[89.832481,25.965082],[89.920693,25.26975],[90.872211,25.132601],[91.799596,25.147432],[92.376202,24.976693],[91.915093,24.130414],[91.46773,24.072639],[91.158963,23.503527],[91.706475,22.985264],[91.869928,23.624346],[92.146035,23.627499],[92.672721,22.041239]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Bhutan","SOV_A3":"BTN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Bhutan","ADM0_A3":"BTN","GEOU_DIF":0,"GEOUNIT":"Bhutan","GU_A3":"BTN","SU_DIF":0,"SUBUNIT":"Bhutan","SU_A3":"BTN","BRK_DIFF":0,"NAME":"Bhutan","NAME_LONG":"Bhutan","BRK_A3":"BTN","BRK_NAME":"Bhutan","BRK_GROUP":null,"ABBREV":"Bhutan","POSTAL":"BT","FORMAL_EN":"Kingdom of Bhutan","FORMAL_FR":null,"NAME_CIAWF":"Bhutan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bhutan","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":1,"MAPCOLOR13":8,"POP_EST":763092,"POP_RANK":11,"POP_YEAR":2019,"GDP_MD":2530,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"BT","ISO_A2":"BT","ISO_A2_EH":"BT","ISO_A3":"BTN","ISO_A3_EH":"BTN","ISO_N3":"064","ISO_N3_EH":"064","UN_A3":"064","WB_A2":"BT","WB_A3":"BTN","WOE_ID":23424770,"WOE_ID_EH":23424770,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BTN","ADM0_DIFF":null,"ADM0_TLC":"BTN","ADM0_A3_US":"BTN","ADM0_A3_FR":"BTN","ADM0_A3_RU":"BTN","ADM0_A3_ES":"BTN","ADM0_A3_CN":"BTN","ADM0_A3_TW":"BTN","ADM0_A3_IN":"BTN","ADM0_A3_NP":"BTN","ADM0_A3_PK":"BTN","ADM0_A3_DE":"BTN","ADM0_A3_GB":"BTN","ADM0_A3_BR":"BTN","ADM0_A3_IL":"BTN","ADM0_A3_PS":"BTN","ADM0_A3_SA":"BTN","ADM0_A3_EG":"BTN","ADM0_A3_MA":"BTN","ADM0_A3_PT":"BTN","ADM0_A3_AR":"BTN","ADM0_A3_JP":"BTN","ADM0_A3_KO":"BTN","ADM0_A3_VN":"BTN","ADM0_A3_TR":"BTN","ADM0_A3_ID":"BTN","ADM0_A3_PL":"BTN","ADM0_A3_GR":"BTN","ADM0_A3_IT":"BTN","ADM0_A3_NL":"BTN","ADM0_A3_SE":"BTN","ADM0_A3_BD":"BTN","ADM0_A3_UA":"BTN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":90.040294,"LABEL_Y":27.536685,"NE_ID":1159320453,"WIKIDATAID":"Q917","NAME_AR":"بوتان","NAME_BN":"ভুটান","NAME_DE":"Bhutan","NAME_EN":"Bhutan","NAME_ES":"Bután","NAME_FA":"بوتان","NAME_FR":"Bhoutan","NAME_EL":"Μπουτάν","NAME_HE":"בהוטן","NAME_HI":"भूटान","NAME_HU":"Bhután","NAME_ID":"Bhutan","NAME_IT":"Bhutan","NAME_JA":"ブータン","NAME_KO":"부탄","NAME_NL":"Bhutan","NAME_PL":"Bhutan","NAME_PT":"Butão","NAME_RU":"Бутан","NAME_SV":"Bhutan","NAME_TR":"Bhutan","NAME_UK":"Бутан","NAME_UR":"بھوٹان","NAME_VI":"Bhutan","NAME_ZH":"不丹","NAME_ZHT":"不丹","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[88.814248,26.719403,92.103712,28.296439],"geometry":{"type":"Polygon","coordinates":[[[91.696657,27.771742],[92.103712,27.452614],[92.033484,26.83831],[91.217513,26.808648],[90.373275,26.875724],[89.744528,26.719403],[88.835643,27.098966],[88.814248,27.299316],[89.47581,28.042759],[90.015829,28.296439],[90.730514,28.064954],[91.258854,28.040614],[91.696657,27.771742]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Nepal","SOV_A3":"NPL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Nepal","ADM0_A3":"NPL","GEOU_DIF":0,"GEOUNIT":"Nepal","GU_A3":"NPL","SU_DIF":0,"SUBUNIT":"Nepal","SU_A3":"NPL","BRK_DIFF":0,"NAME":"Nepal","NAME_LONG":"Nepal","BRK_A3":"NPL","BRK_NAME":"Nepal","BRK_GROUP":null,"ABBREV":"Nepal","POSTAL":"NP","FORMAL_EN":"Nepal","FORMAL_FR":null,"NAME_CIAWF":"Nepal","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Nepal","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":12,"POP_EST":28608710,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":30641,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"NP","ISO_A2":"NP","ISO_A2_EH":"NP","ISO_A3":"NPL","ISO_A3_EH":"NPL","ISO_N3":"524","ISO_N3_EH":"524","UN_A3":"524","WB_A2":"NP","WB_A3":"NPL","WOE_ID":23424911,"WOE_ID_EH":23424911,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"NPL","ADM0_DIFF":null,"ADM0_TLC":"NPL","ADM0_A3_US":"NPL","ADM0_A3_FR":"NPL","ADM0_A3_RU":"NPL","ADM0_A3_ES":"NPL","ADM0_A3_CN":"NPL","ADM0_A3_TW":"NPL","ADM0_A3_IN":"NPL","ADM0_A3_NP":"NPL","ADM0_A3_PK":"NPL","ADM0_A3_DE":"NPL","ADM0_A3_GB":"NPL","ADM0_A3_BR":"NPL","ADM0_A3_IL":"NPL","ADM0_A3_PS":"NPL","ADM0_A3_SA":"NPL","ADM0_A3_EG":"NPL","ADM0_A3_MA":"NPL","ADM0_A3_PT":"NPL","ADM0_A3_AR":"NPL","ADM0_A3_JP":"NPL","ADM0_A3_KO":"NPL","ADM0_A3_VN":"NPL","ADM0_A3_TR":"NPL","ADM0_A3_ID":"NPL","ADM0_A3_PL":"NPL","ADM0_A3_GR":"NPL","ADM0_A3_IT":"NPL","ADM0_A3_NL":"NPL","ADM0_A3_SE":"NPL","ADM0_A3_BD":"NPL","ADM0_A3_UA":"NPL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":83.639914,"LABEL_Y":28.297925,"NE_ID":1159321121,"WIKIDATAID":"Q837","NAME_AR":"نيبال","NAME_BN":"নেপাল","NAME_DE":"Nepal","NAME_EN":"Nepal","NAME_ES":"Nepal","NAME_FA":"نپال","NAME_FR":"Népal","NAME_EL":"Νεπάλ","NAME_HE":"נפאל","NAME_HI":"नेपाल","NAME_HU":"Nepál","NAME_ID":"Nepal","NAME_IT":"Nepal","NAME_JA":"ネパール","NAME_KO":"네팔","NAME_NL":"Nepal","NAME_PL":"Nepal","NAME_PT":"Nepal","NAME_RU":"Непал","NAME_SV":"Nepal","NAME_TR":"Nepal","NAME_UK":"Непал","NAME_UR":"نیپال","NAME_VI":"Nepal","NAME_ZH":"尼泊尔","NAME_ZHT":"尼泊爾","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[80.088425,26.397898,88.174804,30.422717],"geometry":{"type":"Polygon","coordinates":[[[88.120441,27.876542],[88.043133,27.445819],[88.174804,26.810405],[88.060238,26.414615],[87.227472,26.397898],[86.024393,26.630985],[85.251779,26.726198],[84.675018,27.234901],[83.304249,27.364506],[81.999987,27.925479],[81.057203,28.416095],[80.088425,28.79447],[80.476721,29.729865],[81.111256,30.183481],[81.525804,30.422717],[82.327513,30.115268],[83.337115,29.463732],[83.898993,29.320226],[84.23458,28.839894],[85.011638,28.642774],[85.82332,28.203576],[86.954517,27.974262],[88.120441,27.876542]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Pakistan","SOV_A3":"PAK","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Pakistan","ADM0_A3":"PAK","GEOU_DIF":0,"GEOUNIT":"Pakistan","GU_A3":"PAK","SU_DIF":0,"SUBUNIT":"Pakistan","SU_A3":"PAK","BRK_DIFF":0,"NAME":"Pakistan","NAME_LONG":"Pakistan","BRK_A3":"PAK","BRK_NAME":"Pakistan","BRK_GROUP":null,"ABBREV":"Pak.","POSTAL":"PK","FORMAL_EN":"Islamic Republic of Pakistan","FORMAL_FR":null,"NAME_CIAWF":"Pakistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Pakistan","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":11,"POP_EST":216565318,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":278221,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","FIPS_10":"PK","ISO_A2":"PK","ISO_A2_EH":"PK","ISO_A3":"PAK","ISO_A3_EH":"PAK","ISO_N3":"586","ISO_N3_EH":"586","UN_A3":"586","WB_A2":"PK","WB_A3":"PAK","WOE_ID":23424922,"WOE_ID_EH":23424922,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PAK","ADM0_DIFF":null,"ADM0_TLC":"PAK","ADM0_A3_US":"PAK","ADM0_A3_FR":"PAK","ADM0_A3_RU":"PAK","ADM0_A3_ES":"PAK","ADM0_A3_CN":"PAK","ADM0_A3_TW":"PAK","ADM0_A3_IN":"PAK","ADM0_A3_NP":"PAK","ADM0_A3_PK":"PAK","ADM0_A3_DE":"PAK","ADM0_A3_GB":"PAK","ADM0_A3_BR":"PAK","ADM0_A3_IL":"PAK","ADM0_A3_PS":"PAK","ADM0_A3_SA":"PAK","ADM0_A3_EG":"PAK","ADM0_A3_MA":"PAK","ADM0_A3_PT":"PAK","ADM0_A3_AR":"PAK","ADM0_A3_JP":"PAK","ADM0_A3_KO":"PAK","ADM0_A3_VN":"PAK","ADM0_A3_TR":"PAK","ADM0_A3_ID":"PAK","ADM0_A3_PL":"PAK","ADM0_A3_GR":"PAK","ADM0_A3_IT":"PAK","ADM0_A3_NL":"PAK","ADM0_A3_SE":"PAK","ADM0_A3_BD":"PAK","ADM0_A3_UA":"PAK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":7,"LABEL_X":68.545632,"LABEL_Y":29.328389,"NE_ID":1159321153,"WIKIDATAID":"Q843","NAME_AR":"باكستان","NAME_BN":"পাকিস্তান","NAME_DE":"Pakistan","NAME_EN":"Pakistan","NAME_ES":"Pakistán","NAME_FA":"پاکستان","NAME_FR":"Pakistan","NAME_EL":"Πακιστάν","NAME_HE":"פקיסטן","NAME_HI":"पाकिस्तान","NAME_HU":"Pakisztán","NAME_ID":"Pakistan","NAME_IT":"Pakistan","NAME_JA":"パキスタン","NAME_KO":"파키스탄","NAME_NL":"Pakistan","NAME_PL":"Pakistan","NAME_PT":"Paquistão","NAME_RU":"Пакистан","NAME_SV":"Pakistan","NAME_TR":"Pakistan","NAME_UK":"Пакистан","NAME_UR":"پاکستان","NAME_VI":"Pakistan","NAME_ZH":"巴基斯坦","NAME_ZHT":"巴基斯坦","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[60.874248,23.691965,77.837451,37.133031],"geometry":{"type":"Polygon","coordinates":[[[77.837451,35.49401],[76.871722,34.653544],[75.757061,34.504923],[74.240203,34.748887],[73.749948,34.317699],[74.104294,33.441473],[74.451559,32.7649],[75.258642,32.271105],[74.405929,31.692639],[74.42138,30.979815],[73.450638,29.976413],[72.823752,28.961592],[71.777666,27.91318],[70.616496,27.989196],[69.514393,26.940966],[70.168927,26.491872],[70.282873,25.722229],[70.844699,25.215102],[71.04324,24.356524],[68.842599,24.359134],[68.176645,23.691965],[67.443667,23.944844],[67.145442,24.663611],[66.372828,25.425141],[64.530408,25.237039],[62.905701,25.218409],[61.497363,25.078237],[61.874187,26.239975],[63.316632,26.756532],[63.233898,27.217047],[62.755426,27.378923],[62.72783,28.259645],[61.771868,28.699334],[61.369309,29.303276],[60.874248,29.829239],[62.549857,29.318572],[63.550261,29.468331],[64.148002,29.340819],[64.350419,29.560031],[65.046862,29.472181],[66.346473,29.887943],[66.381458,30.738899],[66.938891,31.304911],[67.683394,31.303154],[67.792689,31.58293],[68.556932,31.71331],[68.926677,31.620189],[69.317764,31.901412],[69.262522,32.501944],[69.687147,33.105499],[70.323594,33.358533],[69.930543,34.02012],[70.881803,33.988856],[71.156773,34.348911],[71.115019,34.733126],[71.613076,35.153203],[71.498768,35.650563],[71.262348,36.074388],[71.846292,36.509942],[72.920025,36.720007],[74.067552,36.836176],[74.575893,37.020841],[75.158028,37.133031],[75.896897,36.666806],[76.192848,35.898403],[77.837451,35.49401]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Afghanistan","SOV_A3":"AFG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Afghanistan","ADM0_A3":"AFG","GEOU_DIF":0,"GEOUNIT":"Afghanistan","GU_A3":"AFG","SU_DIF":0,"SUBUNIT":"Afghanistan","SU_A3":"AFG","BRK_DIFF":0,"NAME":"Afghanistan","NAME_LONG":"Afghanistan","BRK_A3":"AFG","BRK_NAME":"Afghanistan","BRK_GROUP":null,"ABBREV":"Afg.","POSTAL":"AF","FORMAL_EN":"Islamic State of Afghanistan","FORMAL_FR":null,"NAME_CIAWF":"Afghanistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Afghanistan","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":8,"MAPCOLOR13":7,"POP_EST":38041754,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":19291,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"AF","ISO_A2":"AF","ISO_A2_EH":"AF","ISO_A3":"AFG","ISO_A3_EH":"AFG","ISO_N3":"004","ISO_N3_EH":"004","UN_A3":"004","WB_A2":"AF","WB_A3":"AFG","WOE_ID":23424739,"WOE_ID_EH":23424739,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"AFG","ADM0_DIFF":null,"ADM0_TLC":"AFG","ADM0_A3_US":"AFG","ADM0_A3_FR":"AFG","ADM0_A3_RU":"AFG","ADM0_A3_ES":"AFG","ADM0_A3_CN":"AFG","ADM0_A3_TW":"AFG","ADM0_A3_IN":"AFG","ADM0_A3_NP":"AFG","ADM0_A3_PK":"AFG","ADM0_A3_DE":"AFG","ADM0_A3_GB":"AFG","ADM0_A3_BR":"AFG","ADM0_A3_IL":"AFG","ADM0_A3_PS":"AFG","ADM0_A3_SA":"AFG","ADM0_A3_EG":"AFG","ADM0_A3_MA":"AFG","ADM0_A3_PT":"AFG","ADM0_A3_AR":"AFG","ADM0_A3_JP":"AFG","ADM0_A3_KO":"AFG","ADM0_A3_VN":"AFG","ADM0_A3_TR":"AFG","ADM0_A3_ID":"AFG","ADM0_A3_PL":"AFG","ADM0_A3_GR":"AFG","ADM0_A3_IT":"AFG","ADM0_A3_NL":"AFG","ADM0_A3_SE":"AFG","ADM0_A3_BD":"AFG","ADM0_A3_UA":"AFG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7,"LABEL_X":66.496586,"LABEL_Y":34.164262,"NE_ID":1159320319,"WIKIDATAID":"Q889","NAME_AR":"أفغانستان","NAME_BN":"আফগানিস্তান","NAME_DE":"Afghanistan","NAME_EN":"Afghanistan","NAME_ES":"Afganistán","NAME_FA":"افغانستان","NAME_FR":"Afghanistan","NAME_EL":"Αφγανιστάν","NAME_HE":"אפגניסטן","NAME_HI":"अफ़्गानिस्तान","NAME_HU":"Afganisztán","NAME_ID":"Afganistan","NAME_IT":"Afghanistan","NAME_JA":"アフガニスタン","NAME_KO":"아프가니스탄","NAME_NL":"Afghanistan","NAME_PL":"Afganistan","NAME_PT":"Afeganistão","NAME_RU":"Афганистан","NAME_SV":"Afghanistan","NAME_TR":"Afganistan","NAME_UK":"Афганістан","NAME_UR":"افغانستان","NAME_VI":"Afghanistan","NAME_ZH":"阿富汗","NAME_ZHT":"阿富汗","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[60.52843,29.318572,75.158028,38.486282],"geometry":{"type":"Polygon","coordinates":[[[66.518607,37.362784],[67.075782,37.356144],[67.83,37.144994],[68.135562,37.023115],[68.859446,37.344336],[69.196273,37.151144],[69.518785,37.608997],[70.116578,37.588223],[70.270574,37.735165],[70.376304,38.138396],[70.806821,38.486282],[71.348131,38.258905],[71.239404,37.953265],[71.541918,37.905774],[71.448693,37.065645],[71.844638,36.738171],[72.193041,36.948288],[72.63689,37.047558],[73.260056,37.495257],[73.948696,37.421566],[74.980002,37.41999],[75.158028,37.133031],[74.575893,37.020841],[74.067552,36.836176],[72.920025,36.720007],[71.846292,36.509942],[71.262348,36.074388],[71.498768,35.650563],[71.613076,35.153203],[71.115019,34.733126],[71.156773,34.348911],[70.881803,33.988856],[69.930543,34.02012],[70.323594,33.358533],[69.687147,33.105499],[69.262522,32.501944],[69.317764,31.901412],[68.926677,31.620189],[68.556932,31.71331],[67.792689,31.58293],[67.683394,31.303154],[66.938891,31.304911],[66.381458,30.738899],[66.346473,29.887943],[65.046862,29.472181],[64.350419,29.560031],[64.148002,29.340819],[63.550261,29.468331],[62.549857,29.318572],[60.874248,29.829239],[61.781222,30.73585],[61.699314,31.379506],[60.941945,31.548075],[60.863655,32.18292],[60.536078,32.981269],[60.9637,33.528832],[60.52843,33.676446],[60.803193,34.404102],[61.210817,35.650072],[62.230651,35.270664],[62.984662,35.404041],[63.193538,35.857166],[63.982896,36.007957],[64.546479,36.312073],[64.746105,37.111818],[65.588948,37.305217],[65.745631,37.661164],[66.217385,37.39379],[66.518607,37.362784]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Tajikistan","SOV_A3":"TJK","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Tajikistan","ADM0_A3":"TJK","GEOU_DIF":0,"GEOUNIT":"Tajikistan","GU_A3":"TJK","SU_DIF":0,"SUBUNIT":"Tajikistan","SU_A3":"TJK","BRK_DIFF":0,"NAME":"Tajikistan","NAME_LONG":"Tajikistan","BRK_A3":"TJK","BRK_NAME":"Tajikistan","BRK_GROUP":null,"ABBREV":"Tjk.","POSTAL":"TJ","FORMAL_EN":"Republic of Tajikistan","FORMAL_FR":null,"NAME_CIAWF":"Tajikistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Tajikistan","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":9321018,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":8116,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"5. Low income","FIPS_10":"TI","ISO_A2":"TJ","ISO_A2_EH":"TJ","ISO_A3":"TJK","ISO_A3_EH":"TJK","ISO_N3":"762","ISO_N3_EH":"762","UN_A3":"762","WB_A2":"TJ","WB_A3":"TJK","WOE_ID":23424961,"WOE_ID_EH":23424961,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TJK","ADM0_DIFF":null,"ADM0_TLC":"TJK","ADM0_A3_US":"TJK","ADM0_A3_FR":"TJK","ADM0_A3_RU":"TJK","ADM0_A3_ES":"TJK","ADM0_A3_CN":"TJK","ADM0_A3_TW":"TJK","ADM0_A3_IN":"TJK","ADM0_A3_NP":"TJK","ADM0_A3_PK":"TJK","ADM0_A3_DE":"TJK","ADM0_A3_GB":"TJK","ADM0_A3_BR":"TJK","ADM0_A3_IL":"TJK","ADM0_A3_PS":"TJK","ADM0_A3_SA":"TJK","ADM0_A3_EG":"TJK","ADM0_A3_MA":"TJK","ADM0_A3_PT":"TJK","ADM0_A3_AR":"TJK","ADM0_A3_JP":"TJK","ADM0_A3_KO":"TJK","ADM0_A3_VN":"TJK","ADM0_A3_TR":"TJK","ADM0_A3_ID":"TJK","ADM0_A3_PL":"TJK","ADM0_A3_GR":"TJK","ADM0_A3_IT":"TJK","ADM0_A3_NL":"TJK","ADM0_A3_SE":"TJK","ADM0_A3_BD":"TJK","ADM0_A3_UA":"TJK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":72.587276,"LABEL_Y":38.199835,"NE_ID":1159321307,"WIKIDATAID":"Q863","NAME_AR":"طاجيكستان","NAME_BN":"তাজিকিস্তান","NAME_DE":"Tadschikistan","NAME_EN":"Tajikistan","NAME_ES":"Tayikistán","NAME_FA":"تاجیکستان","NAME_FR":"Tadjikistan","NAME_EL":"Τατζικιστάν","NAME_HE":"טג׳יקיסטן","NAME_HI":"ताजिकिस्तान","NAME_HU":"Tádzsikisztán","NAME_ID":"Tajikistan","NAME_IT":"Tagikistan","NAME_JA":"タジキスタン","NAME_KO":"타지키스탄","NAME_NL":"Tadzjikistan","NAME_PL":"Tadżykistan","NAME_PT":"Tajiquistão","NAME_RU":"Таджикистан","NAME_SV":"Tadzjikistan","NAME_TR":"Tacikistan","NAME_UK":"Таджикистан","NAME_UR":"تاجکستان","NAME_VI":"Tajikistan","NAME_ZH":"塔吉克斯坦","NAME_ZHT":"塔吉克","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[67.44222,36.738171,74.980002,40.960213],"geometry":{"type":"Polygon","coordinates":[[[67.83,37.144994],[68.392033,38.157025],[68.176025,38.901553],[67.44222,39.140144],[67.701429,39.580478],[68.536416,39.533453],[69.011633,40.086158],[69.329495,40.727824],[70.666622,40.960213],[70.45816,40.496495],[70.601407,40.218527],[71.014198,40.244366],[70.648019,39.935754],[69.55961,40.103211],[69.464887,39.526683],[70.549162,39.604198],[71.784694,39.279463],[73.675379,39.431237],[73.928852,38.505815],[74.257514,38.606507],[74.864816,38.378846],[74.829986,37.990007],[74.980002,37.41999],[73.948696,37.421566],[73.260056,37.495257],[72.63689,37.047558],[72.193041,36.948288],[71.844638,36.738171],[71.448693,37.065645],[71.541918,37.905774],[71.239404,37.953265],[71.348131,38.258905],[70.806821,38.486282],[70.376304,38.138396],[70.270574,37.735165],[70.116578,37.588223],[69.518785,37.608997],[69.196273,37.151144],[68.859446,37.344336],[68.135562,37.023115],[67.83,37.144994]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Kyrgyzstan","SOV_A3":"KGZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Kyrgyzstan","ADM0_A3":"KGZ","GEOU_DIF":0,"GEOUNIT":"Kyrgyzstan","GU_A3":"KGZ","SU_DIF":0,"SUBUNIT":"Kyrgyzstan","SU_A3":"KGZ","BRK_DIFF":0,"NAME":"Kyrgyzstan","NAME_LONG":"Kyrgyzstan","BRK_A3":"KGZ","BRK_NAME":"Kyrgyzstan","BRK_GROUP":null,"ABBREV":"Kgz.","POSTAL":"KG","FORMAL_EN":"Kyrgyz Republic","FORMAL_FR":null,"NAME_CIAWF":"Kyrgyzstan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kyrgyz Republic","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":7,"MAPCOLOR9":7,"MAPCOLOR13":6,"POP_EST":6456900,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":8454,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"5. Low income","FIPS_10":"KG","ISO_A2":"KG","ISO_A2_EH":"KG","ISO_A3":"KGZ","ISO_A3_EH":"KGZ","ISO_N3":"417","ISO_N3_EH":"417","UN_A3":"417","WB_A2":"KG","WB_A3":"KGZ","WOE_ID":23424864,"WOE_ID_EH":23424864,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"KGZ","ADM0_DIFF":null,"ADM0_TLC":"KGZ","ADM0_A3_US":"KGZ","ADM0_A3_FR":"KGZ","ADM0_A3_RU":"KGZ","ADM0_A3_ES":"KGZ","ADM0_A3_CN":"KGZ","ADM0_A3_TW":"KGZ","ADM0_A3_IN":"KGZ","ADM0_A3_NP":"KGZ","ADM0_A3_PK":"KGZ","ADM0_A3_DE":"KGZ","ADM0_A3_GB":"KGZ","ADM0_A3_BR":"KGZ","ADM0_A3_IL":"KGZ","ADM0_A3_PS":"KGZ","ADM0_A3_SA":"KGZ","ADM0_A3_EG":"KGZ","ADM0_A3_MA":"KGZ","ADM0_A3_PT":"KGZ","ADM0_A3_AR":"KGZ","ADM0_A3_JP":"KGZ","ADM0_A3_KO":"KGZ","ADM0_A3_VN":"KGZ","ADM0_A3_TR":"KGZ","ADM0_A3_ID":"KGZ","ADM0_A3_PL":"KGZ","ADM0_A3_GR":"KGZ","ADM0_A3_IT":"KGZ","ADM0_A3_NL":"KGZ","ADM0_A3_SE":"KGZ","ADM0_A3_BD":"KGZ","ADM0_A3_UA":"KGZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":74.532637,"LABEL_Y":41.66854,"NE_ID":1159320977,"WIKIDATAID":"Q813","NAME_AR":"قيرغيزستان","NAME_BN":"কিরগিজস্তান","NAME_DE":"Kirgisistan","NAME_EN":"Kyrgyzstan","NAME_ES":"Kirguistán","NAME_FA":"قرقیزستان","NAME_FR":"Kirghizistan","NAME_EL":"Κιργιζία","NAME_HE":"קירגיזסטן","NAME_HI":"किर्गिज़स्तान","NAME_HU":"Kirgizisztán","NAME_ID":"Kirgizstan","NAME_IT":"Kirghizistan","NAME_JA":"キルギス","NAME_KO":"키르기스스탄","NAME_NL":"Kirgizië","NAME_PL":"Kirgistan","NAME_PT":"Quirguistão","NAME_RU":"Киргизия","NAME_SV":"Kirgizistan","NAME_TR":"Kırgızistan","NAME_UK":"Киргизстан","NAME_UR":"کرغیزستان","NAME_VI":"Kyrgyzstan","NAME_ZH":"吉尔吉斯斯坦","NAME_ZHT":"吉爾吉斯","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[69.464887,39.279463,80.25999,43.298339],"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[71.186281,42.704293],[71.844638,42.845395],[73.489758,42.500894],[73.645304,43.091272],[74.212866,43.298339],[75.636965,42.8779],[76.000354,42.988022],[77.658392,42.960686],[79.142177,42.856092],[79.643645,42.496683],[80.25999,42.349999],[80.11943,42.123941],[78.543661,41.582243],[78.187197,41.185316],[76.904484,41.066486],[76.526368,40.427946],[75.467828,40.562072],[74.776862,40.366425],[73.822244,39.893973],[73.960013,39.660008],[73.675379,39.431237],[71.784694,39.279463],[70.549162,39.604198],[69.464887,39.526683],[69.55961,40.103211],[70.648019,39.935754],[71.014198,40.244366],[71.774875,40.145844],[73.055417,40.866033],[71.870115,41.3929],[71.157859,41.143587],[70.420022,41.519998],[71.259248,42.167711],[70.962315,42.266154]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Turkmenistan","SOV_A3":"TKM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Turkmenistan","ADM0_A3":"TKM","GEOU_DIF":0,"GEOUNIT":"Turkmenistan","GU_A3":"TKM","SU_DIF":0,"SUBUNIT":"Turkmenistan","SU_A3":"TKM","BRK_DIFF":0,"NAME":"Turkmenistan","NAME_LONG":"Turkmenistan","BRK_A3":"TKM","BRK_NAME":"Turkmenistan","BRK_GROUP":null,"ABBREV":"Turkm.","POSTAL":"TM","FORMAL_EN":"Turkmenistan","FORMAL_FR":null,"NAME_CIAWF":"Turkmenistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Turkmenistan","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":1,"MAPCOLOR13":9,"POP_EST":5942089,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":40761,"GDP_YEAR":2018,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"TX","ISO_A2":"TM","ISO_A2_EH":"TM","ISO_A3":"TKM","ISO_A3_EH":"TKM","ISO_N3":"795","ISO_N3_EH":"795","UN_A3":"795","WB_A2":"TM","WB_A3":"TKM","WOE_ID":23424972,"WOE_ID_EH":23424972,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TKM","ADM0_DIFF":null,"ADM0_TLC":"TKM","ADM0_A3_US":"TKM","ADM0_A3_FR":"TKM","ADM0_A3_RU":"TKM","ADM0_A3_ES":"TKM","ADM0_A3_CN":"TKM","ADM0_A3_TW":"TKM","ADM0_A3_IN":"TKM","ADM0_A3_NP":"TKM","ADM0_A3_PK":"TKM","ADM0_A3_DE":"TKM","ADM0_A3_GB":"TKM","ADM0_A3_BR":"TKM","ADM0_A3_IL":"TKM","ADM0_A3_PS":"TKM","ADM0_A3_SA":"TKM","ADM0_A3_EG":"TKM","ADM0_A3_MA":"TKM","ADM0_A3_PT":"TKM","ADM0_A3_AR":"TKM","ADM0_A3_JP":"TKM","ADM0_A3_KO":"TKM","ADM0_A3_VN":"TKM","ADM0_A3_TR":"TKM","ADM0_A3_ID":"TKM","ADM0_A3_PL":"TKM","ADM0_A3_GR":"TKM","ADM0_A3_IT":"TKM","ADM0_A3_NL":"TKM","ADM0_A3_SE":"TKM","ADM0_A3_BD":"TKM","ADM0_A3_UA":"TKM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":58.676647,"LABEL_Y":39.855246,"NE_ID":1159321309,"WIKIDATAID":"Q874","NAME_AR":"تركمانستان","NAME_BN":"তুর্কমেনিস্তান","NAME_DE":"Turkmenistan","NAME_EN":"Turkmenistan","NAME_ES":"Turkmenistán","NAME_FA":"ترکمنستان","NAME_FR":"Turkménistan","NAME_EL":"Τουρκμενιστάν","NAME_HE":"טורקמניסטן","NAME_HI":"तुर्कमेनिस्तान","NAME_HU":"Türkmenisztán","NAME_ID":"Turkmenistan","NAME_IT":"Turkmenistan","NAME_JA":"トルクメニスタン","NAME_KO":"투르크메니스탄","NAME_NL":"Turkmenistan","NAME_PL":"Turkmenistan","NAME_PT":"Turquemenistão","NAME_RU":"Туркмения","NAME_SV":"Turkmenistan","NAME_TR":"Türkmenistan","NAME_UK":"Туркменістан","NAME_UR":"ترکمانستان","NAME_VI":"Turkmenistan","NAME_ZH":"土库曼斯坦","NAME_ZHT":"土庫曼","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[52.50246,35.270664,66.54615,42.751551],"geometry":{"type":"Polygon","coordinates":[[[52.50246,41.783316],[52.944293,42.116034],[54.079418,42.324109],[54.755345,42.043971],[55.455251,41.259859],[55.968191,41.308642],[57.096391,41.32231],[56.932215,41.826026],[57.78653,42.170553],[58.629011,42.751551],[59.976422,42.223082],[60.083341,41.425146],[60.465953,41.220327],[61.547179,41.26637],[61.882714,41.084857],[62.37426,40.053886],[63.518015,39.363257],[64.170223,38.892407],[65.215999,38.402695],[66.54615,37.974685],[66.518607,37.362784],[66.217385,37.39379],[65.745631,37.661164],[65.588948,37.305217],[64.746105,37.111818],[64.546479,36.312073],[63.982896,36.007957],[63.193538,35.857166],[62.984662,35.404041],[62.230651,35.270664],[61.210817,35.650072],[61.123071,36.491597],[60.377638,36.527383],[59.234762,37.412988],[58.436154,37.522309],[57.330434,38.029229],[56.619366,38.121394],[56.180375,37.935127],[55.511578,37.964117],[54.800304,37.392421],[53.921598,37.198918],[53.735511,37.906136],[53.880929,38.952093],[53.101028,39.290574],[53.357808,39.975286],[52.693973,40.033629],[52.915251,40.876523],[53.858139,40.631034],[54.736845,40.951015],[54.008311,41.551211],[53.721713,42.123191],[52.91675,41.868117],[52.814689,41.135371],[52.50246,41.783316]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Iran","SOV_A3":"IRN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Iran","ADM0_A3":"IRN","GEOU_DIF":0,"GEOUNIT":"Iran","GU_A3":"IRN","SU_DIF":0,"SUBUNIT":"Iran","SU_A3":"IRN","BRK_DIFF":0,"NAME":"Iran","NAME_LONG":"Iran","BRK_A3":"IRN","BRK_NAME":"Iran","BRK_GROUP":null,"ABBREV":"Iran","POSTAL":"IRN","FORMAL_EN":"Islamic Republic of Iran","FORMAL_FR":null,"NAME_CIAWF":"Iran","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Iran, Islamic Rep.","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":13,"POP_EST":82913906,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":453996,"GDP_YEAR":2018,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","FIPS_10":"IR","ISO_A2":"IR","ISO_A2_EH":"IR","ISO_A3":"IRN","ISO_A3_EH":"IRN","ISO_N3":"364","ISO_N3_EH":"364","UN_A3":"364","WB_A2":"IR","WB_A3":"IRN","WOE_ID":23424851,"WOE_ID_EH":23424851,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"IRN","ADM0_DIFF":null,"ADM0_TLC":"IRN","ADM0_A3_US":"IRN","ADM0_A3_FR":"IRN","ADM0_A3_RU":"IRN","ADM0_A3_ES":"IRN","ADM0_A3_CN":"IRN","ADM0_A3_TW":"IRN","ADM0_A3_IN":"IRN","ADM0_A3_NP":"IRN","ADM0_A3_PK":"IRN","ADM0_A3_DE":"IRN","ADM0_A3_GB":"IRN","ADM0_A3_BR":"IRN","ADM0_A3_IL":"IRN","ADM0_A3_PS":"IRN","ADM0_A3_SA":"IRN","ADM0_A3_EG":"IRN","ADM0_A3_MA":"IRN","ADM0_A3_PT":"IRN","ADM0_A3_AR":"IRN","ADM0_A3_JP":"IRN","ADM0_A3_KO":"IRN","ADM0_A3_VN":"IRN","ADM0_A3_TR":"IRN","ADM0_A3_ID":"IRN","ADM0_A3_PL":"IRN","ADM0_A3_GR":"IRN","ADM0_A3_IT":"IRN","ADM0_A3_NL":"IRN","ADM0_A3_SE":"IRN","ADM0_A3_BD":"IRN","ADM0_A3_UA":"IRN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":6.7,"LABEL_X":54.931495,"LABEL_Y":32.166225,"NE_ID":1159320881,"WIKIDATAID":"Q794","NAME_AR":"إيران","NAME_BN":"ইরান","NAME_DE":"Iran","NAME_EN":"Iran","NAME_ES":"Irán","NAME_FA":"ایران","NAME_FR":"Iran","NAME_EL":"Ιράν","NAME_HE":"איראן","NAME_HI":"ईरान","NAME_HU":"Irán","NAME_ID":"Iran","NAME_IT":"Iran","NAME_JA":"イラン","NAME_KO":"이란","NAME_NL":"Iran","NAME_PL":"Iran","NAME_PT":"Irão","NAME_RU":"Иран","NAME_SV":"Iran","NAME_TR":"İran","NAME_UK":"Іран","NAME_UR":"ایران","NAME_VI":"Iran","NAME_ZH":"伊朗","NAME_ZHT":"伊朗","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[44.109225,25.078237,63.316632,39.713003],"geometry":{"type":"Polygon","coordinates":[[[48.567971,29.926778],[48.014568,30.452457],[48.004698,30.985137],[47.685286,30.984853],[47.849204,31.709176],[47.334661,32.469155],[46.109362,33.017287],[45.416691,33.967798],[45.64846,34.748138],[46.151788,35.093259],[46.07634,35.677383],[45.420618,35.977546],[44.772677,37.170437],[44.77267,37.17045],[44.225756,37.971584],[44.421403,38.281281],[44.109225,39.428136],[44.79399,39.713003],[44.952688,39.335765],[45.457722,38.874139],[46.143623,38.741201],[46.50572,38.770605],[47.685079,39.508364],[48.060095,39.582235],[48.355529,39.288765],[48.010744,38.794015],[48.634375,38.270378],[48.883249,38.320245],[49.199612,37.582874],[50.147771,37.374567],[50.842354,36.872814],[52.264025,36.700422],[53.82579,36.965031],[53.921598,37.198918],[54.800304,37.392421],[55.511578,37.964117],[56.180375,37.935127],[56.619366,38.121394],[57.330434,38.029229],[58.436154,37.522309],[59.234762,37.412988],[60.377638,36.527383],[61.123071,36.491597],[61.210817,35.650072],[60.803193,34.404102],[60.52843,33.676446],[60.9637,33.528832],[60.536078,32.981269],[60.863655,32.18292],[60.941945,31.548075],[61.699314,31.379506],[61.781222,30.73585],[60.874248,29.829239],[61.369309,29.303276],[61.771868,28.699334],[62.72783,28.259645],[62.755426,27.378923],[63.233898,27.217047],[63.316632,26.756532],[61.874187,26.239975],[61.497363,25.078237],[59.616134,25.380157],[58.525761,25.609962],[57.397251,25.739902],[56.970766,26.966106],[56.492139,27.143305],[55.72371,26.964633],[54.71509,26.480658],[53.493097,26.812369],[52.483598,27.580849],[51.520763,27.86569],[50.852948,28.814521],[50.115009,30.147773],[49.57685,29.985715],[48.941333,30.31709],[48.567971,29.926778]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Syria","SOV_A3":"SYR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Syria","ADM0_A3":"SYR","GEOU_DIF":0,"GEOUNIT":"Syria","GU_A3":"SYR","SU_DIF":0,"SUBUNIT":"Syria","SU_A3":"SYR","BRK_DIFF":0,"NAME":"Syria","NAME_LONG":"Syria","BRK_A3":"SYR","BRK_NAME":"Syria","BRK_GROUP":null,"ABBREV":"Syria","POSTAL":"SYR","FORMAL_EN":"Syrian Arab Republic","FORMAL_FR":null,"NAME_CIAWF":"Syria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Syrian Arab Republic","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":6,"POP_EST":17070135,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":98830,"GDP_YEAR":2015,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"SY","ISO_A2":"SY","ISO_A2_EH":"SY","ISO_A3":"SYR","ISO_A3_EH":"SYR","ISO_N3":"760","ISO_N3_EH":"760","UN_A3":"760","WB_A2":"SY","WB_A3":"SYR","WOE_ID":23424956,"WOE_ID_EH":23424956,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SYR","ADM0_DIFF":null,"ADM0_TLC":"SYR","ADM0_A3_US":"SYR","ADM0_A3_FR":"SYR","ADM0_A3_RU":"SYR","ADM0_A3_ES":"SYR","ADM0_A3_CN":"SYR","ADM0_A3_TW":"SYR","ADM0_A3_IN":"SYR","ADM0_A3_NP":"SYR","ADM0_A3_PK":"SYR","ADM0_A3_DE":"SYR","ADM0_A3_GB":"SYR","ADM0_A3_BR":"SYR","ADM0_A3_IL":"SYR","ADM0_A3_PS":"SYR","ADM0_A3_SA":"SYR","ADM0_A3_EG":"SYR","ADM0_A3_MA":"SYR","ADM0_A3_PT":"SYR","ADM0_A3_AR":"SYR","ADM0_A3_JP":"SYR","ADM0_A3_KO":"SYR","ADM0_A3_VN":"SYR","ADM0_A3_TR":"SYR","ADM0_A3_ID":"SYR","ADM0_A3_PL":"SYR","ADM0_A3_GR":"SYR","ADM0_A3_IT":"SYR","ADM0_A3_NL":"SYR","ADM0_A3_SE":"SYR","ADM0_A3_BD":"SYR","ADM0_A3_UA":"SYR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":38.277783,"LABEL_Y":35.006636,"NE_ID":1159321295,"WIKIDATAID":"Q858","NAME_AR":"سوريا","NAME_BN":"সিরিয়া","NAME_DE":"Syrien","NAME_EN":"Syria","NAME_ES":"Siria","NAME_FA":"سوریه","NAME_FR":"Syrie","NAME_EL":"Συρία","NAME_HE":"סוריה","NAME_HI":"सीरिया","NAME_HU":"Szíria","NAME_ID":"Suriah","NAME_IT":"Siria","NAME_JA":"シリア","NAME_KO":"시리아","NAME_NL":"Syrië","NAME_PL":"Syria","NAME_PT":"Síria","NAME_RU":"Сирия","NAME_SV":"Syrien","NAME_TR":"Suriye","NAME_UK":"Сирія","NAME_UR":"سوریہ","NAME_VI":"Syria","NAME_ZH":"叙利亚","NAME_ZHT":"敘利亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[35.700798,32.312938,42.349591,37.229873],"geometry":{"type":"Polygon","coordinates":[[[35.719918,32.709192],[35.700798,32.716014],[35.836397,32.868123],[35.821101,33.277426],[36.06646,33.824912],[36.61175,34.201789],[36.448194,34.593935],[35.998403,34.644914],[35.905023,35.410009],[36.149763,35.821535],[36.41755,36.040617],[36.685389,36.259699],[36.739494,36.81752],[37.066761,36.623036],[38.167727,36.90121],[38.699891,36.712927],[39.52258,36.716054],[40.673259,37.091276],[41.212089,37.074352],[42.349591,37.229873],[41.837064,36.605854],[41.289707,36.358815],[41.383965,35.628317],[41.006159,34.419372],[38.792341,33.378686],[36.834062,32.312938],[35.719918,32.709192]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Armenia","SOV_A3":"ARM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Armenia","ADM0_A3":"ARM","GEOU_DIF":0,"GEOUNIT":"Armenia","GU_A3":"ARM","SU_DIF":0,"SUBUNIT":"Armenia","SU_A3":"ARM","BRK_DIFF":0,"NAME":"Armenia","NAME_LONG":"Armenia","BRK_A3":"ARM","BRK_NAME":"Armenia","BRK_GROUP":null,"ABBREV":"Arm.","POSTAL":"ARM","FORMAL_EN":"Republic of Armenia","FORMAL_FR":null,"NAME_CIAWF":"Armenia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Armenia","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":10,"POP_EST":2957731,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":13672,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"AM","ISO_A2":"AM","ISO_A2_EH":"AM","ISO_A3":"ARM","ISO_A3_EH":"ARM","ISO_N3":"051","ISO_N3_EH":"051","UN_A3":"051","WB_A2":"AM","WB_A3":"ARM","WOE_ID":23424743,"WOE_ID_EH":23424743,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ARM","ADM0_DIFF":null,"ADM0_TLC":"ARM","ADM0_A3_US":"ARM","ADM0_A3_FR":"ARM","ADM0_A3_RU":"ARM","ADM0_A3_ES":"ARM","ADM0_A3_CN":"ARM","ADM0_A3_TW":"ARM","ADM0_A3_IN":"ARM","ADM0_A3_NP":"ARM","ADM0_A3_PK":"ARM","ADM0_A3_DE":"ARM","ADM0_A3_GB":"ARM","ADM0_A3_BR":"ARM","ADM0_A3_IL":"ARM","ADM0_A3_PS":"ARM","ADM0_A3_SA":"ARM","ADM0_A3_EG":"ARM","ADM0_A3_MA":"ARM","ADM0_A3_PT":"ARM","ADM0_A3_AR":"ARM","ADM0_A3_JP":"ARM","ADM0_A3_KO":"ARM","ADM0_A3_VN":"ARM","ADM0_A3_TR":"ARM","ADM0_A3_ID":"ARM","ADM0_A3_PL":"ARM","ADM0_A3_GR":"ARM","ADM0_A3_IT":"ARM","ADM0_A3_NL":"ARM","ADM0_A3_SE":"ARM","ADM0_A3_BD":"ARM","ADM0_A3_UA":"ARM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":44.800564,"LABEL_Y":40.459077,"NE_ID":1159320333,"WIKIDATAID":"Q399","NAME_AR":"أرمينيا","NAME_BN":"আর্মেনিয়া","NAME_DE":"Armenien","NAME_EN":"Armenia","NAME_ES":"Armenia","NAME_FA":"ارمنستان","NAME_FR":"Arménie","NAME_EL":"Αρμενία","NAME_HE":"ארמניה","NAME_HI":"आर्मीनिया","NAME_HU":"Örményország","NAME_ID":"Armenia","NAME_IT":"Armenia","NAME_JA":"アルメニア","NAME_KO":"아르메니아","NAME_NL":"Armenië","NAME_PL":"Armenia","NAME_PT":"Arménia","NAME_RU":"Армения","NAME_SV":"Armenien","NAME_TR":"Ermenistan","NAME_UK":"Вірменія","NAME_UR":"آرمینیا","NAME_VI":"Armenia","NAME_ZH":"亚美尼亚","NAME_ZHT":"亞美尼亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[43.582746,38.741201,46.50572,41.248129],"geometry":{"type":"Polygon","coordinates":[[[46.50572,38.770605],[46.143623,38.741201],[45.735379,39.319719],[45.739978,39.473999],[45.298145,39.471751],[45.001987,39.740004],[44.79399,39.713003],[44.400009,40.005],[43.656436,40.253564],[43.752658,40.740201],[43.582746,41.092143],[44.97248,41.248129],[45.179496,40.985354],[45.560351,40.81229],[45.359175,40.561504],[45.891907,40.218476],[45.610012,39.899994],[46.034534,39.628021],[46.483499,39.464155],[46.50572,38.770605]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Sweden","SOV_A3":"SWE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Sweden","ADM0_A3":"SWE","GEOU_DIF":0,"GEOUNIT":"Sweden","GU_A3":"SWE","SU_DIF":0,"SUBUNIT":"Sweden","SU_A3":"SWE","BRK_DIFF":0,"NAME":"Sweden","NAME_LONG":"Sweden","BRK_A3":"SWE","BRK_NAME":"Sweden","BRK_GROUP":null,"ABBREV":"Swe.","POSTAL":"S","FORMAL_EN":"Kingdom of Sweden","FORMAL_FR":null,"NAME_CIAWF":"Sweden","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Sweden","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":2,"MAPCOLOR13":4,"POP_EST":10285453,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":530883,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"SW","ISO_A2":"SE","ISO_A2_EH":"SE","ISO_A3":"SWE","ISO_A3_EH":"SWE","ISO_N3":"752","ISO_N3_EH":"752","UN_A3":"752","WB_A2":"SE","WB_A3":"SWE","WOE_ID":23424954,"WOE_ID_EH":23424954,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SWE","ADM0_DIFF":null,"ADM0_TLC":"SWE","ADM0_A3_US":"SWE","ADM0_A3_FR":"SWE","ADM0_A3_RU":"SWE","ADM0_A3_ES":"SWE","ADM0_A3_CN":"SWE","ADM0_A3_TW":"SWE","ADM0_A3_IN":"SWE","ADM0_A3_NP":"SWE","ADM0_A3_PK":"SWE","ADM0_A3_DE":"SWE","ADM0_A3_GB":"SWE","ADM0_A3_BR":"SWE","ADM0_A3_IL":"SWE","ADM0_A3_PS":"SWE","ADM0_A3_SA":"SWE","ADM0_A3_EG":"SWE","ADM0_A3_MA":"SWE","ADM0_A3_PT":"SWE","ADM0_A3_AR":"SWE","ADM0_A3_JP":"SWE","ADM0_A3_KO":"SWE","ADM0_A3_VN":"SWE","ADM0_A3_TR":"SWE","ADM0_A3_ID":"SWE","ADM0_A3_PL":"SWE","ADM0_A3_GR":"SWE","ADM0_A3_IT":"SWE","ADM0_A3_NL":"SWE","ADM0_A3_SE":"SWE","ADM0_A3_BD":"SWE","ADM0_A3_UA":"SWE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":19.01705,"LABEL_Y":65.85918,"NE_ID":1159321287,"WIKIDATAID":"Q34","NAME_AR":"السويد","NAME_BN":"সুইডেন","NAME_DE":"Schweden","NAME_EN":"Sweden","NAME_ES":"Suecia","NAME_FA":"سوئد","NAME_FR":"Suède","NAME_EL":"Σουηδία","NAME_HE":"שוודיה","NAME_HI":"स्वीडन","NAME_HU":"Svédország","NAME_ID":"Swedia","NAME_IT":"Svezia","NAME_JA":"スウェーデン","NAME_KO":"스웨덴","NAME_NL":"Zweden","NAME_PL":"Szwecja","NAME_PT":"Suécia","NAME_RU":"Швеция","NAME_SV":"Sverige","NAME_TR":"İsveç","NAME_UK":"Швеція","NAME_UR":"سویڈن","NAME_VI":"Thụy Điển","NAME_ZH":"瑞典","NAME_ZHT":"瑞典","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[11.027369,55.361737,23.903379,69.106247],"geometry":{"type":"Polygon","coordinates":[[[11.027369,58.856149],[11.468272,59.432393],[12.300366,60.117933],[12.631147,61.293572],[11.992064,61.800362],[11.930569,63.128318],[12.579935,64.066219],[13.571916,64.049114],[13.919905,64.445421],[13.55569,64.787028],[15.108411,66.193867],[16.108712,67.302456],[16.768879,68.013937],[17.729182,68.010552],[17.993868,68.567391],[19.87856,68.407194],[20.025269,69.065139],[20.645593,69.106247],[21.978535,68.616846],[23.539473,67.936009],[23.56588,66.396051],[23.903379,66.006927],[22.183173,65.723741],[21.213517,65.026005],[21.369631,64.413588],[19.778876,63.609554],[17.847779,62.7494],[17.119555,61.341166],[17.831346,60.636583],[18.787722,60.081914],[17.869225,58.953766],[16.829185,58.719827],[16.44771,57.041118],[15.879786,56.104302],[14.666681,56.200885],[14.100721,55.407781],[12.942911,55.361737],[12.625101,56.30708],[11.787942,57.441817],[11.027369,58.856149]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Belarus","SOV_A3":"BLR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Belarus","ADM0_A3":"BLR","GEOU_DIF":0,"GEOUNIT":"Belarus","GU_A3":"BLR","SU_DIF":0,"SUBUNIT":"Belarus","SU_A3":"BLR","BRK_DIFF":0,"NAME":"Belarus","NAME_LONG":"Belarus","BRK_A3":"BLR","BRK_NAME":"Belarus","BRK_GROUP":null,"ABBREV":"Bela.","POSTAL":"BY","FORMAL_EN":"Republic of Belarus","FORMAL_FR":null,"NAME_CIAWF":"Belarus","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Belarus","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":5,"MAPCOLOR13":11,"POP_EST":9466856,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":63080,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"BO","ISO_A2":"BY","ISO_A2_EH":"BY","ISO_A3":"BLR","ISO_A3_EH":"BLR","ISO_N3":"112","ISO_N3_EH":"112","UN_A3":"112","WB_A2":"BY","WB_A3":"BLR","WOE_ID":23424765,"WOE_ID_EH":23424765,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BLR","ADM0_DIFF":null,"ADM0_TLC":"BLR","ADM0_A3_US":"BLR","ADM0_A3_FR":"BLR","ADM0_A3_RU":"BLR","ADM0_A3_ES":"BLR","ADM0_A3_CN":"BLR","ADM0_A3_TW":"BLR","ADM0_A3_IN":"BLR","ADM0_A3_NP":"BLR","ADM0_A3_PK":"BLR","ADM0_A3_DE":"BLR","ADM0_A3_GB":"BLR","ADM0_A3_BR":"BLR","ADM0_A3_IL":"BLR","ADM0_A3_PS":"BLR","ADM0_A3_SA":"BLR","ADM0_A3_EG":"BLR","ADM0_A3_MA":"BLR","ADM0_A3_PT":"BLR","ADM0_A3_AR":"BLR","ADM0_A3_JP":"BLR","ADM0_A3_KO":"BLR","ADM0_A3_VN":"BLR","ADM0_A3_TR":"BLR","ADM0_A3_ID":"BLR","ADM0_A3_PL":"BLR","ADM0_A3_GR":"BLR","ADM0_A3_IT":"BLR","ADM0_A3_NL":"BLR","ADM0_A3_SE":"BLR","ADM0_A3_BD":"BLR","ADM0_A3_UA":"BLR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":28.417701,"LABEL_Y":53.821888,"NE_ID":1159320427,"WIKIDATAID":"Q184","NAME_AR":"بيلاروسيا","NAME_BN":"বেলারুশ","NAME_DE":"Belarus","NAME_EN":"Belarus","NAME_ES":"Bielorrusia","NAME_FA":"بلاروس","NAME_FR":"Biélorussie","NAME_EL":"Λευκορωσία","NAME_HE":"בלארוס","NAME_HI":"बेलारूस","NAME_HU":"Fehéroroszország","NAME_ID":"Belarus","NAME_IT":"Bielorussia","NAME_JA":"ベラルーシ","NAME_KO":"벨라루스","NAME_NL":"Wit-Rusland","NAME_PL":"Białoruś","NAME_PT":"Bielorrússia","NAME_RU":"Белоруссия","NAME_SV":"Belarus","NAME_TR":"Beyaz Rusya","NAME_UK":"Білорусь","NAME_UR":"بیلاروس","NAME_VI":"Belarus","NAME_ZH":"白俄罗斯","NAME_ZHT":"白俄羅斯","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[23.199494,51.319503,32.693643,56.16913],"geometry":{"type":"Polygon","coordinates":[[[28.176709,56.16913],[29.229513,55.918344],[29.371572,55.670091],[29.896294,55.789463],[30.873909,55.550976],[30.971836,55.081548],[30.757534,54.811771],[31.384472,54.157056],[31.791424,53.974639],[31.731273,53.794029],[32.405599,53.618045],[32.693643,53.351421],[32.304519,53.132726],[31.49764,53.16743],[31.305201,53.073996],[31.540018,52.742052],[31.78597,52.10168],[31.785992,52.101678],[30.927549,52.042353],[30.619454,51.822806],[30.555117,51.319503],[30.157364,51.416138],[29.254938,51.368234],[28.992835,51.602044],[28.617613,51.427714],[28.241615,51.572227],[27.454066,51.592303],[26.337959,51.832289],[25.327788,51.910656],[24.553106,51.888461],[24.005078,51.617444],[23.527071,51.578454],[23.508002,52.023647],[23.199494,52.486977],[23.799199,52.691099],[23.804935,53.089731],[23.527536,53.470122],[23.484128,53.912498],[24.450684,53.905702],[25.536354,54.282423],[25.768433,54.846963],[26.588279,55.167176],[26.494331,55.615107],[27.10246,55.783314],[28.176709,56.16913]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Ukraine","SOV_A3":"UKR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Ukraine","ADM0_A3":"UKR","GEOU_DIF":0,"GEOUNIT":"Ukraine","GU_A3":"UKR","SU_DIF":0,"SUBUNIT":"Ukraine","SU_A3":"UKR","BRK_DIFF":0,"NAME":"Ukraine","NAME_LONG":"Ukraine","BRK_A3":"UKR","BRK_NAME":"Ukraine","BRK_GROUP":null,"ABBREV":"Ukr.","POSTAL":"UA","FORMAL_EN":"Ukraine","FORMAL_FR":null,"NAME_CIAWF":"Ukraine","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ukraine","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":44385155,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":153781,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"UP","ISO_A2":"UA","ISO_A2_EH":"UA","ISO_A3":"UKR","ISO_A3_EH":"UKR","ISO_N3":"804","ISO_N3_EH":"804","UN_A3":"804","WB_A2":"UA","WB_A3":"UKR","WOE_ID":23424976,"WOE_ID_EH":23424976,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"UKR","ADM0_DIFF":null,"ADM0_TLC":"UKR","ADM0_A3_US":"UKR","ADM0_A3_FR":"UKR","ADM0_A3_RU":"UKR","ADM0_A3_ES":"UKR","ADM0_A3_CN":"UKR","ADM0_A3_TW":"UKR","ADM0_A3_IN":"UKR","ADM0_A3_NP":"UKR","ADM0_A3_PK":"UKR","ADM0_A3_DE":"UKR","ADM0_A3_GB":"UKR","ADM0_A3_BR":"UKR","ADM0_A3_IL":"UKR","ADM0_A3_PS":"UKR","ADM0_A3_SA":"UKR","ADM0_A3_EG":"UKR","ADM0_A3_MA":"UKR","ADM0_A3_PT":"UKR","ADM0_A3_AR":"UKR","ADM0_A3_JP":"UKR","ADM0_A3_KO":"UKR","ADM0_A3_VN":"UKR","ADM0_A3_TR":"UKR","ADM0_A3_ID":"UKR","ADM0_A3_PL":"UKR","ADM0_A3_GR":"UKR","ADM0_A3_IT":"UKR","ADM0_A3_NL":"UKR","ADM0_A3_SE":"UKR","ADM0_A3_BD":"UKR","ADM0_A3_UA":"UKR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":7,"LABEL_X":32.140865,"LABEL_Y":49.724739,"NE_ID":1159321345,"WIKIDATAID":"Q212","NAME_AR":"أوكرانيا","NAME_BN":"ইউক্রেন","NAME_DE":"Ukraine","NAME_EN":"Ukraine","NAME_ES":"Ucrania","NAME_FA":"اوکراین","NAME_FR":"Ukraine","NAME_EL":"Ουκρανία","NAME_HE":"אוקראינה","NAME_HI":"युक्रेन","NAME_HU":"Ukrajna","NAME_ID":"Ukraina","NAME_IT":"Ucraina","NAME_JA":"ウクライナ","NAME_KO":"우크라이나","NAME_NL":"Oekraïne","NAME_PL":"Ukraina","NAME_PT":"Ucrânia","NAME_RU":"Украина","NAME_SV":"Ukraina","NAME_TR":"Ukrayna","NAME_UK":"Україна","NAME_UR":"یوکرین","NAME_VI":"Ukraina","NAME_ZH":"乌克兰","NAME_ZHT":"烏克蘭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[22.085608,45.293308,40.080789,52.335075],"geometry":{"type":"Polygon","coordinates":[[[31.785992,52.101678],[32.15944,52.06125],[32.412058,52.288695],[32.715761,52.238465],[33.7527,52.335075],[34.391731,51.768882],[34.141978,51.566413],[34.224816,51.255993],[35.022183,51.207572],[35.37791,50.77394],[35.356116,50.577197],[36.626168,50.225591],[37.39346,50.383953],[38.010631,49.915662],[38.594988,49.926462],[40.06904,49.60105],[40.080789,49.30743],[39.67465,48.78382],[39.89562,48.23241],[39.738278,47.898937],[38.77057,47.82562],[38.255112,47.5464],[38.223538,47.10219],[37.425137,47.022221],[36.759855,46.6987],[35.823685,46.645964],[34.962342,46.273197],[35.012659,45.737725],[34.861792,45.768182],[34.732017,45.965666],[34.410402,46.005162],[33.699462,46.219573],[33.435988,45.971917],[33.298567,46.080598],[31.74414,46.333348],[31.675307,46.706245],[30.748749,46.5831],[30.377609,46.03241],[29.603289,45.293308],[29.149725,45.464925],[28.679779,45.304031],[28.233554,45.488283],[28.485269,45.596907],[28.659987,45.939987],[28.933717,46.25883],[28.862972,46.437889],[29.072107,46.517678],[29.170654,46.379262],[29.759972,46.349988],[30.024659,46.423937],[29.83821,46.525326],[29.908852,46.674361],[29.559674,46.928583],[29.415135,47.346645],[29.050868,47.510227],[29.122698,47.849095],[28.670891,48.118149],[28.259547,48.155562],[27.522537,48.467119],[26.857824,48.368211],[26.619337,48.220726],[26.19745,48.220881],[25.945941,47.987149],[25.207743,47.891056],[24.866317,47.737526],[24.402056,47.981878],[23.760958,47.985598],[23.142236,48.096341],[22.710531,47.882194],[22.64082,48.15024],[22.085608,48.422264],[22.280842,48.825392],[22.558138,49.085738],[22.776419,49.027395],[22.51845,49.476774],[23.426508,50.308506],[23.922757,50.424881],[24.029986,50.705407],[23.527071,51.578454],[24.005078,51.617444],[24.553106,51.888461],[25.327788,51.910656],[26.337959,51.832289],[27.454066,51.592303],[28.241615,51.572227],[28.617613,51.427714],[28.992835,51.602044],[29.254938,51.368234],[30.157364,51.416138],[30.555117,51.319503],[30.619454,51.822806],[30.927549,52.042353],[31.785992,52.101678]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Poland","SOV_A3":"POL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Poland","ADM0_A3":"POL","GEOU_DIF":0,"GEOUNIT":"Poland","GU_A3":"POL","SU_DIF":0,"SUBUNIT":"Poland","SU_A3":"POL","BRK_DIFF":0,"NAME":"Poland","NAME_LONG":"Poland","BRK_A3":"POL","BRK_NAME":"Poland","BRK_GROUP":null,"ABBREV":"Pol.","POSTAL":"PL","FORMAL_EN":"Republic of Poland","FORMAL_FR":null,"NAME_CIAWF":"Poland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Poland","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":7,"MAPCOLOR9":1,"MAPCOLOR13":2,"POP_EST":37970874,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":595858,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"PL","ISO_A2":"PL","ISO_A2_EH":"PL","ISO_A3":"POL","ISO_A3_EH":"POL","ISO_N3":"616","ISO_N3_EH":"616","UN_A3":"616","WB_A2":"PL","WB_A3":"POL","WOE_ID":23424923,"WOE_ID_EH":23424923,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"POL","ADM0_DIFF":null,"ADM0_TLC":"POL","ADM0_A3_US":"POL","ADM0_A3_FR":"POL","ADM0_A3_RU":"POL","ADM0_A3_ES":"POL","ADM0_A3_CN":"POL","ADM0_A3_TW":"POL","ADM0_A3_IN":"POL","ADM0_A3_NP":"POL","ADM0_A3_PK":"POL","ADM0_A3_DE":"POL","ADM0_A3_GB":"POL","ADM0_A3_BR":"POL","ADM0_A3_IL":"POL","ADM0_A3_PS":"POL","ADM0_A3_SA":"POL","ADM0_A3_EG":"POL","ADM0_A3_MA":"POL","ADM0_A3_PT":"POL","ADM0_A3_AR":"POL","ADM0_A3_JP":"POL","ADM0_A3_KO":"POL","ADM0_A3_VN":"POL","ADM0_A3_TR":"POL","ADM0_A3_ID":"POL","ADM0_A3_PL":"POL","ADM0_A3_GR":"POL","ADM0_A3_IT":"POL","ADM0_A3_NL":"POL","ADM0_A3_SE":"POL","ADM0_A3_BD":"POL","ADM0_A3_UA":"POL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":7,"LABEL_X":19.490468,"LABEL_Y":51.990316,"NE_ID":1159321179,"WIKIDATAID":"Q36","NAME_AR":"بولندا","NAME_BN":"পোল্যান্ড","NAME_DE":"Polen","NAME_EN":"Poland","NAME_ES":"Polonia","NAME_FA":"لهستان","NAME_FR":"Pologne","NAME_EL":"Πολωνία","NAME_HE":"פולין","NAME_HI":"पोलैंड","NAME_HU":"Lengyelország","NAME_ID":"Polandia","NAME_IT":"Polonia","NAME_JA":"ポーランド","NAME_KO":"폴란드","NAME_NL":"Polen","NAME_PL":"Polska","NAME_PT":"Polónia","NAME_RU":"Польша","NAME_SV":"Polen","NAME_TR":"Polonya","NAME_UK":"Польща","NAME_UR":"پولینڈ","NAME_VI":"Ba Lan","NAME_ZH":"波兰","NAME_ZHT":"波蘭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[14.074521,49.027395,24.029986,54.851536],"geometry":{"type":"Polygon","coordinates":[[[23.484128,53.912498],[23.527536,53.470122],[23.804935,53.089731],[23.799199,52.691099],[23.199494,52.486977],[23.508002,52.023647],[23.527071,51.578454],[24.029986,50.705407],[23.922757,50.424881],[23.426508,50.308506],[22.51845,49.476774],[22.776419,49.027395],[22.558138,49.085738],[21.607808,49.470107],[20.887955,49.328772],[20.415839,49.431453],[19.825023,49.217125],[19.320713,49.571574],[18.909575,49.435846],[18.853144,49.49623],[18.392914,49.988629],[17.649445,50.049038],[17.554567,50.362146],[16.868769,50.473974],[16.719476,50.215747],[16.176253,50.422607],[16.238627,50.697733],[15.490972,50.78473],[15.016996,51.106674],[14.607098,51.745188],[14.685026,52.089947],[14.4376,52.62485],[14.074521,52.981263],[14.353315,53.248171],[14.119686,53.757029],[14.8029,54.050706],[16.363477,54.513159],[17.622832,54.851536],[18.620859,54.682606],[18.696255,54.438719],[19.66064,54.426084],[20.892245,54.312525],[22.731099,54.327537],[23.243987,54.220567],[23.484128,53.912498]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Austria","SOV_A3":"AUT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Austria","ADM0_A3":"AUT","GEOU_DIF":0,"GEOUNIT":"Austria","GU_A3":"AUT","SU_DIF":0,"SUBUNIT":"Austria","SU_A3":"AUT","BRK_DIFF":0,"NAME":"Austria","NAME_LONG":"Austria","BRK_A3":"AUT","BRK_NAME":"Austria","BRK_GROUP":null,"ABBREV":"Aust.","POSTAL":"A","FORMAL_EN":"Republic of Austria","FORMAL_FR":null,"NAME_CIAWF":"Austria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Austria","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":4,"POP_EST":8877067,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":445075,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"AU","ISO_A2":"AT","ISO_A2_EH":"AT","ISO_A3":"AUT","ISO_A3_EH":"AUT","ISO_N3":"040","ISO_N3_EH":"040","UN_A3":"040","WB_A2":"AT","WB_A3":"AUT","WOE_ID":23424750,"WOE_ID_EH":23424750,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"AUT","ADM0_DIFF":null,"ADM0_TLC":"AUT","ADM0_A3_US":"AUT","ADM0_A3_FR":"AUT","ADM0_A3_RU":"AUT","ADM0_A3_ES":"AUT","ADM0_A3_CN":"AUT","ADM0_A3_TW":"AUT","ADM0_A3_IN":"AUT","ADM0_A3_NP":"AUT","ADM0_A3_PK":"AUT","ADM0_A3_DE":"AUT","ADM0_A3_GB":"AUT","ADM0_A3_BR":"AUT","ADM0_A3_IL":"AUT","ADM0_A3_PS":"AUT","ADM0_A3_SA":"AUT","ADM0_A3_EG":"AUT","ADM0_A3_MA":"AUT","ADM0_A3_PT":"AUT","ADM0_A3_AR":"AUT","ADM0_A3_JP":"AUT","ADM0_A3_KO":"AUT","ADM0_A3_VN":"AUT","ADM0_A3_TR":"AUT","ADM0_A3_ID":"AUT","ADM0_A3_PL":"AUT","ADM0_A3_GR":"AUT","ADM0_A3_IT":"AUT","ADM0_A3_NL":"AUT","ADM0_A3_SE":"AUT","ADM0_A3_BD":"AUT","ADM0_A3_UA":"AUT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":14.130515,"LABEL_Y":47.518859,"NE_ID":1159320379,"WIKIDATAID":"Q40","NAME_AR":"النمسا","NAME_BN":"অস্ট্রিয়া","NAME_DE":"Österreich","NAME_EN":"Austria","NAME_ES":"Austria","NAME_FA":"اتریش","NAME_FR":"Autriche","NAME_EL":"Αυστρία","NAME_HE":"אוסטריה","NAME_HI":"ऑस्ट्रिया","NAME_HU":"Ausztria","NAME_ID":"Austria","NAME_IT":"Austria","NAME_JA":"オーストリア","NAME_KO":"오스트리아","NAME_NL":"Oostenrijk","NAME_PL":"Austria","NAME_PT":"Áustria","NAME_RU":"Австрия","NAME_SV":"Österrike","NAME_TR":"Avusturya","NAME_UK":"Австрія","NAME_UR":"آسٹریا","NAME_VI":"Áo","NAME_ZH":"奥地利","NAME_ZHT":"奧地利","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[9.47997,46.431817,16.979667,49.039074],"geometry":{"type":"Polygon","coordinates":[[[16.979667,48.123497],[16.903754,47.714866],[16.340584,47.712902],[16.534268,47.496171],[16.202298,46.852386],[16.011664,46.683611],[15.137092,46.658703],[14.632472,46.431817],[13.806475,46.509306],[12.376485,46.767559],[12.153088,47.115393],[11.164828,46.941579],[11.048556,46.751359],[10.442701,46.893546],[9.932448,46.920728],[9.47997,47.10281],[9.632932,47.347601],[9.594226,47.525058],[9.896068,47.580197],[10.402084,47.302488],[10.544504,47.566399],[11.426414,47.523766],[12.141357,47.703083],[12.62076,47.672388],[12.932627,47.467646],[13.025851,47.637584],[12.884103,48.289146],[13.243357,48.416115],[13.595946,48.877172],[14.338898,48.555305],[14.901447,48.964402],[15.253416,49.039074],[16.029647,48.733899],[16.499283,48.785808],[16.960288,48.596982],[16.879983,48.470013],[16.979667,48.123497]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Hungary","SOV_A3":"HUN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Hungary","ADM0_A3":"HUN","GEOU_DIF":0,"GEOUNIT":"Hungary","GU_A3":"HUN","SU_DIF":0,"SUBUNIT":"Hungary","SU_A3":"HUN","BRK_DIFF":0,"NAME":"Hungary","NAME_LONG":"Hungary","BRK_A3":"HUN","BRK_NAME":"Hungary","BRK_GROUP":null,"ABBREV":"Hun.","POSTAL":"HU","FORMAL_EN":"Republic of Hungary","FORMAL_FR":null,"NAME_CIAWF":"Hungary","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Hungary","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":6,"MAPCOLOR9":1,"MAPCOLOR13":5,"POP_EST":9769949,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":163469,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"HU","ISO_A2":"HU","ISO_A2_EH":"HU","ISO_A3":"HUN","ISO_A3_EH":"HUN","ISO_N3":"348","ISO_N3_EH":"348","UN_A3":"348","WB_A2":"HU","WB_A3":"HUN","WOE_ID":23424844,"WOE_ID_EH":23424844,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"HUN","ADM0_DIFF":null,"ADM0_TLC":"HUN","ADM0_A3_US":"HUN","ADM0_A3_FR":"HUN","ADM0_A3_RU":"HUN","ADM0_A3_ES":"HUN","ADM0_A3_CN":"HUN","ADM0_A3_TW":"HUN","ADM0_A3_IN":"HUN","ADM0_A3_NP":"HUN","ADM0_A3_PK":"HUN","ADM0_A3_DE":"HUN","ADM0_A3_GB":"HUN","ADM0_A3_BR":"HUN","ADM0_A3_IL":"HUN","ADM0_A3_PS":"HUN","ADM0_A3_SA":"HUN","ADM0_A3_EG":"HUN","ADM0_A3_MA":"HUN","ADM0_A3_PT":"HUN","ADM0_A3_AR":"HUN","ADM0_A3_JP":"HUN","ADM0_A3_KO":"HUN","ADM0_A3_VN":"HUN","ADM0_A3_TR":"HUN","ADM0_A3_ID":"HUN","ADM0_A3_PL":"HUN","ADM0_A3_GR":"HUN","ADM0_A3_IT":"HUN","ADM0_A3_NL":"HUN","ADM0_A3_SE":"HUN","ADM0_A3_BD":"HUN","ADM0_A3_UA":"HUN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":19.447867,"LABEL_Y":47.086841,"NE_ID":1159320841,"WIKIDATAID":"Q28","NAME_AR":"المجر","NAME_BN":"হাঙ্গেরি","NAME_DE":"Ungarn","NAME_EN":"Hungary","NAME_ES":"Hungría","NAME_FA":"مجارستان","NAME_FR":"Hongrie","NAME_EL":"Ουγγαρία","NAME_HE":"הונגריה","NAME_HI":"हंगरी","NAME_HU":"Magyarország","NAME_ID":"Hongaria","NAME_IT":"Ungheria","NAME_JA":"ハンガリー","NAME_KO":"헝가리","NAME_NL":"Hongarije","NAME_PL":"Węgry","NAME_PT":"Hungria","NAME_RU":"Венгрия","NAME_SV":"Ungern","NAME_TR":"Macaristan","NAME_UK":"Угорщина","NAME_UR":"ہنگری","NAME_VI":"Hungary","NAME_ZH":"匈牙利","NAME_ZHT":"匈牙利","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[16.202298,45.759481,22.710531,48.623854],"geometry":{"type":"Polygon","coordinates":[[[22.085608,48.422264],[22.64082,48.15024],[22.710531,47.882194],[22.099768,47.672439],[21.626515,46.994238],[21.021952,46.316088],[20.220192,46.127469],[19.596045,46.17173],[18.829838,45.908878],[18.829825,45.908872],[18.456062,45.759481],[17.630066,45.951769],[16.882515,46.380632],[16.564808,46.503751],[16.370505,46.841327],[16.202298,46.852386],[16.534268,47.496171],[16.340584,47.712902],[16.903754,47.714866],[16.979667,48.123497],[17.488473,47.867466],[17.857133,47.758429],[18.696513,47.880954],[18.777025,48.081768],[19.174365,48.111379],[19.661364,48.266615],[19.769471,48.202691],[20.239054,48.327567],[20.473562,48.56285],[20.801294,48.623854],[21.872236,48.319971],[22.085608,48.422264]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Moldova","SOV_A3":"MDA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Moldova","ADM0_A3":"MDA","GEOU_DIF":0,"GEOUNIT":"Moldova","GU_A3":"MDA","SU_DIF":0,"SUBUNIT":"Moldova","SU_A3":"MDA","BRK_DIFF":0,"NAME":"Moldova","NAME_LONG":"Moldova","BRK_A3":"MDA","BRK_NAME":"Moldova","BRK_GROUP":null,"ABBREV":"Mda.","POSTAL":"MD","FORMAL_EN":"Republic of Moldova","FORMAL_FR":null,"NAME_CIAWF":"Moldova","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Moldova","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":4,"MAPCOLOR13":12,"POP_EST":2657637,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":11968,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"MD","ISO_A2":"MD","ISO_A2_EH":"MD","ISO_A3":"MDA","ISO_A3_EH":"MDA","ISO_N3":"498","ISO_N3_EH":"498","UN_A3":"498","WB_A2":"MD","WB_A3":"MDA","WOE_ID":23424885,"WOE_ID_EH":23424885,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MDA","ADM0_DIFF":null,"ADM0_TLC":"MDA","ADM0_A3_US":"MDA","ADM0_A3_FR":"MDA","ADM0_A3_RU":"MDA","ADM0_A3_ES":"MDA","ADM0_A3_CN":"MDA","ADM0_A3_TW":"MDA","ADM0_A3_IN":"MDA","ADM0_A3_NP":"MDA","ADM0_A3_PK":"MDA","ADM0_A3_DE":"MDA","ADM0_A3_GB":"MDA","ADM0_A3_BR":"MDA","ADM0_A3_IL":"MDA","ADM0_A3_PS":"MDA","ADM0_A3_SA":"MDA","ADM0_A3_EG":"MDA","ADM0_A3_MA":"MDA","ADM0_A3_PT":"MDA","ADM0_A3_AR":"MDA","ADM0_A3_JP":"MDA","ADM0_A3_KO":"MDA","ADM0_A3_VN":"MDA","ADM0_A3_TR":"MDA","ADM0_A3_ID":"MDA","ADM0_A3_PL":"MDA","ADM0_A3_GR":"MDA","ADM0_A3_IT":"MDA","ADM0_A3_NL":"MDA","ADM0_A3_SE":"MDA","ADM0_A3_BD":"MDA","ADM0_A3_UA":"MDA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":28.487904,"LABEL_Y":47.434999,"NE_ID":1159321045,"WIKIDATAID":"Q217","NAME_AR":"مولدوفا","NAME_BN":"মলদোভা","NAME_DE":"Republik Moldau","NAME_EN":"Moldova","NAME_ES":"Moldavia","NAME_FA":"مولداوی","NAME_FR":"Moldavie","NAME_EL":"Μολδαβία","NAME_HE":"מולדובה","NAME_HI":"मॉल्डोवा","NAME_HU":"Moldova","NAME_ID":"Moldova","NAME_IT":"Moldavia","NAME_JA":"モルドバ","NAME_KO":"몰도바","NAME_NL":"Moldavië","NAME_PL":"Mołdawia","NAME_PT":"Moldávia","NAME_RU":"Молдавия","NAME_SV":"Moldavien","NAME_TR":"Moldova","NAME_UK":"Молдова","NAME_UR":"مالدووا","NAME_VI":"Moldova","NAME_ZH":"摩尔多瓦","NAME_ZHT":"摩爾多瓦","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[26.619337,45.488283,30.024659,48.467119],"geometry":{"type":"Polygon","coordinates":[[[26.619337,48.220726],[26.857824,48.368211],[27.522537,48.467119],[28.259547,48.155562],[28.670891,48.118149],[29.122698,47.849095],[29.050868,47.510227],[29.415135,47.346645],[29.559674,46.928583],[29.908852,46.674361],[29.83821,46.525326],[30.024659,46.423937],[29.759972,46.349988],[29.170654,46.379262],[29.072107,46.517678],[28.862972,46.437889],[28.933717,46.25883],[28.659987,45.939987],[28.485269,45.596907],[28.233554,45.488283],[28.054443,45.944586],[28.160018,46.371563],[28.12803,46.810476],[27.551166,47.405117],[27.233873,47.826771],[26.924176,48.123264],[26.619337,48.220726]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Romania","SOV_A3":"ROU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Romania","ADM0_A3":"ROU","GEOU_DIF":0,"GEOUNIT":"Romania","GU_A3":"ROU","SU_DIF":0,"SUBUNIT":"Romania","SU_A3":"ROU","BRK_DIFF":0,"NAME":"Romania","NAME_LONG":"Romania","BRK_A3":"ROU","BRK_NAME":"Romania","BRK_GROUP":null,"ABBREV":"Rom.","POSTAL":"RO","FORMAL_EN":"Romania","FORMAL_FR":null,"NAME_CIAWF":"Romania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Romania","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":3,"MAPCOLOR13":13,"POP_EST":19356544,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":250077,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"3. Upper middle income","FIPS_10":"RO","ISO_A2":"RO","ISO_A2_EH":"RO","ISO_A3":"ROU","ISO_A3_EH":"ROU","ISO_N3":"642","ISO_N3_EH":"642","UN_A3":"642","WB_A2":"RO","WB_A3":"ROM","WOE_ID":23424933,"WOE_ID_EH":23424933,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ROU","ADM0_DIFF":null,"ADM0_TLC":"ROU","ADM0_A3_US":"ROU","ADM0_A3_FR":"ROU","ADM0_A3_RU":"ROU","ADM0_A3_ES":"ROU","ADM0_A3_CN":"ROU","ADM0_A3_TW":"ROU","ADM0_A3_IN":"ROU","ADM0_A3_NP":"ROU","ADM0_A3_PK":"ROU","ADM0_A3_DE":"ROU","ADM0_A3_GB":"ROU","ADM0_A3_BR":"ROU","ADM0_A3_IL":"ROU","ADM0_A3_PS":"ROU","ADM0_A3_SA":"ROU","ADM0_A3_EG":"ROU","ADM0_A3_MA":"ROU","ADM0_A3_PT":"ROU","ADM0_A3_AR":"ROU","ADM0_A3_JP":"ROU","ADM0_A3_KO":"ROU","ADM0_A3_VN":"ROU","ADM0_A3_TR":"ROU","ADM0_A3_ID":"ROU","ADM0_A3_PL":"ROU","ADM0_A3_GR":"ROU","ADM0_A3_IT":"ROU","ADM0_A3_NL":"ROU","ADM0_A3_SE":"ROU","ADM0_A3_BD":"ROU","ADM0_A3_UA":"ROU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":24.972624,"LABEL_Y":45.733237,"NE_ID":1159321199,"WIKIDATAID":"Q218","NAME_AR":"رومانيا","NAME_BN":"রোমানিয়া","NAME_DE":"Rumänien","NAME_EN":"Romania","NAME_ES":"Rumania","NAME_FA":"رومانی","NAME_FR":"Roumanie","NAME_EL":"Ρουμανία","NAME_HE":"רומניה","NAME_HI":"रोमानिया","NAME_HU":"Románia","NAME_ID":"Rumania","NAME_IT":"Romania","NAME_JA":"ルーマニア","NAME_KO":"루마니아","NAME_NL":"Roemenië","NAME_PL":"Rumunia","NAME_PT":"Roménia","NAME_RU":"Румыния","NAME_SV":"Rumänien","NAME_TR":"Romanya","NAME_UK":"Румунія","NAME_UR":"رومانیہ","NAME_VI":"Romania","NAME_ZH":"罗马尼亚","NAME_ZHT":"羅馬尼亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[20.220192,43.688445,29.626543,48.220881],"geometry":{"type":"Polygon","coordinates":[[[28.233554,45.488283],[28.679779,45.304031],[29.149725,45.464925],[29.603289,45.293308],[29.626543,45.035391],[29.141612,44.82021],[28.837858,44.913874],[28.558081,43.707462],[27.970107,43.812468],[27.2424,44.175986],[26.065159,43.943494],[25.569272,43.688445],[24.100679,43.741051],[23.332302,43.897011],[22.944832,43.823785],[22.65715,44.234923],[22.474008,44.409228],[22.705726,44.578003],[22.459022,44.702517],[22.145088,44.478422],[21.562023,44.768947],[21.483526,45.18117],[20.874313,45.416375],[20.762175,45.734573],[20.220192,46.127469],[21.021952,46.316088],[21.626515,46.994238],[22.099768,47.672439],[22.710531,47.882194],[23.142236,48.096341],[23.760958,47.985598],[24.402056,47.981878],[24.866317,47.737526],[25.207743,47.891056],[25.945941,47.987149],[26.19745,48.220881],[26.619337,48.220726],[26.924176,48.123264],[27.233873,47.826771],[27.551166,47.405117],[28.12803,46.810476],[28.160018,46.371563],[28.054443,45.944586],[28.233554,45.488283]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Lithuania","SOV_A3":"LTU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Lithuania","ADM0_A3":"LTU","GEOU_DIF":0,"GEOUNIT":"Lithuania","GU_A3":"LTU","SU_DIF":0,"SUBUNIT":"Lithuania","SU_A3":"LTU","BRK_DIFF":0,"NAME":"Lithuania","NAME_LONG":"Lithuania","BRK_A3":"LTU","BRK_NAME":"Lithuania","BRK_GROUP":null,"ABBREV":"Lith.","POSTAL":"LT","FORMAL_EN":"Republic of Lithuania","FORMAL_FR":null,"NAME_CIAWF":"Lithuania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Lithuania","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":9,"POP_EST":2786844,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":54627,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"3. Upper middle income","FIPS_10":"LH","ISO_A2":"LT","ISO_A2_EH":"LT","ISO_A3":"LTU","ISO_A3_EH":"LTU","ISO_N3":"440","ISO_N3_EH":"440","UN_A3":"440","WB_A2":"LT","WB_A3":"LTU","WOE_ID":23424875,"WOE_ID_EH":23424875,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LTU","ADM0_DIFF":null,"ADM0_TLC":"LTU","ADM0_A3_US":"LTU","ADM0_A3_FR":"LTU","ADM0_A3_RU":"LTU","ADM0_A3_ES":"LTU","ADM0_A3_CN":"LTU","ADM0_A3_TW":"LTU","ADM0_A3_IN":"LTU","ADM0_A3_NP":"LTU","ADM0_A3_PK":"LTU","ADM0_A3_DE":"LTU","ADM0_A3_GB":"LTU","ADM0_A3_BR":"LTU","ADM0_A3_IL":"LTU","ADM0_A3_PS":"LTU","ADM0_A3_SA":"LTU","ADM0_A3_EG":"LTU","ADM0_A3_MA":"LTU","ADM0_A3_PT":"LTU","ADM0_A3_AR":"LTU","ADM0_A3_JP":"LTU","ADM0_A3_KO":"LTU","ADM0_A3_VN":"LTU","ADM0_A3_TR":"LTU","ADM0_A3_ID":"LTU","ADM0_A3_PL":"LTU","ADM0_A3_GR":"LTU","ADM0_A3_IT":"LTU","ADM0_A3_NL":"LTU","ADM0_A3_SE":"LTU","ADM0_A3_BD":"LTU","ADM0_A3_UA":"LTU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":24.089932,"LABEL_Y":55.103703,"NE_ID":1159321029,"WIKIDATAID":"Q37","NAME_AR":"ليتوانيا","NAME_BN":"লিথুয়ানিয়া","NAME_DE":"Litauen","NAME_EN":"Lithuania","NAME_ES":"Lituania","NAME_FA":"لیتوانی","NAME_FR":"Lituanie","NAME_EL":"Λιθουανία","NAME_HE":"ליטא","NAME_HI":"लिथुआनिया","NAME_HU":"Litvánia","NAME_ID":"Lituania","NAME_IT":"Lituania","NAME_JA":"リトアニア","NAME_KO":"리투아니아","NAME_NL":"Litouwen","NAME_PL":"Litwa","NAME_PT":"Lituânia","NAME_RU":"Литва","NAME_SV":"Litauen","NAME_TR":"Litvanya","NAME_UK":"Литва","NAME_UR":"لتھووینیا","NAME_VI":"Litva","NAME_ZH":"立陶宛","NAME_ZHT":"立陶宛","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[21.0558,53.905702,26.588279,56.372528],"geometry":{"type":"Polygon","coordinates":[[[26.494331,55.615107],[26.588279,55.167176],[25.768433,54.846963],[25.536354,54.282423],[24.450684,53.905702],[23.484128,53.912498],[23.243987,54.220567],[22.731099,54.327537],[22.651052,54.582741],[22.757764,54.856574],[22.315724,55.015299],[21.268449,55.190482],[21.0558,56.031076],[22.201157,56.337802],[23.878264,56.273671],[24.860684,56.372528],[25.000934,56.164531],[25.533047,56.100297],[26.494331,55.615107]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Latvia","SOV_A3":"LVA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Latvia","ADM0_A3":"LVA","GEOU_DIF":0,"GEOUNIT":"Latvia","GU_A3":"LVA","SU_DIF":0,"SUBUNIT":"Latvia","SU_A3":"LVA","BRK_DIFF":0,"NAME":"Latvia","NAME_LONG":"Latvia","BRK_A3":"LVA","BRK_NAME":"Latvia","BRK_GROUP":null,"ABBREV":"Lat.","POSTAL":"LV","FORMAL_EN":"Republic of Latvia","FORMAL_FR":null,"NAME_CIAWF":"Latvia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Latvia","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":7,"MAPCOLOR9":6,"MAPCOLOR13":13,"POP_EST":1912789,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":34102,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"3. Upper middle income","FIPS_10":"LG","ISO_A2":"LV","ISO_A2_EH":"LV","ISO_A3":"LVA","ISO_A3_EH":"LVA","ISO_N3":"428","ISO_N3_EH":"428","UN_A3":"428","WB_A2":"LV","WB_A3":"LVA","WOE_ID":23424874,"WOE_ID_EH":23424874,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LVA","ADM0_DIFF":null,"ADM0_TLC":"LVA","ADM0_A3_US":"LVA","ADM0_A3_FR":"LVA","ADM0_A3_RU":"LVA","ADM0_A3_ES":"LVA","ADM0_A3_CN":"LVA","ADM0_A3_TW":"LVA","ADM0_A3_IN":"LVA","ADM0_A3_NP":"LVA","ADM0_A3_PK":"LVA","ADM0_A3_DE":"LVA","ADM0_A3_GB":"LVA","ADM0_A3_BR":"LVA","ADM0_A3_IL":"LVA","ADM0_A3_PS":"LVA","ADM0_A3_SA":"LVA","ADM0_A3_EG":"LVA","ADM0_A3_MA":"LVA","ADM0_A3_PT":"LVA","ADM0_A3_AR":"LVA","ADM0_A3_JP":"LVA","ADM0_A3_KO":"LVA","ADM0_A3_VN":"LVA","ADM0_A3_TR":"LVA","ADM0_A3_ID":"LVA","ADM0_A3_PL":"LVA","ADM0_A3_GR":"LVA","ADM0_A3_IT":"LVA","ADM0_A3_NL":"LVA","ADM0_A3_SE":"LVA","ADM0_A3_BD":"LVA","ADM0_A3_UA":"LVA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":25.458723,"LABEL_Y":57.066872,"NE_ID":1159321033,"WIKIDATAID":"Q211","NAME_AR":"لاتفيا","NAME_BN":"লাতভিয়া","NAME_DE":"Lettland","NAME_EN":"Latvia","NAME_ES":"Letonia","NAME_FA":"لتونی","NAME_FR":"Lettonie","NAME_EL":"Λετονία","NAME_HE":"לטביה","NAME_HI":"लातविया","NAME_HU":"Lettország","NAME_ID":"Latvia","NAME_IT":"Lettonia","NAME_JA":"ラトビア","NAME_KO":"라트비아","NAME_NL":"Letland","NAME_PL":"Łotwa","NAME_PT":"Letónia","NAME_RU":"Латвия","NAME_SV":"Lettland","NAME_TR":"Letonya","NAME_UK":"Латвія","NAME_UR":"لٹویا","NAME_VI":"Latvia","NAME_ZH":"拉脱维亚","NAME_ZHT":"拉脫維亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[21.0558,55.615107,28.176709,57.970157],"geometry":{"type":"Polygon","coordinates":[[[27.288185,57.474528],[27.770016,57.244258],[27.855282,56.759326],[28.176709,56.16913],[27.10246,55.783314],[26.494331,55.615107],[25.533047,56.100297],[25.000934,56.164531],[24.860684,56.372528],[23.878264,56.273671],[22.201157,56.337802],[21.0558,56.031076],[21.090424,56.783873],[21.581866,57.411871],[22.524341,57.753374],[23.318453,57.006236],[24.12073,57.025693],[24.312863,57.793424],[25.164594,57.970157],[25.60281,57.847529],[26.463532,57.476389],[27.288185,57.474528]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Estonia","SOV_A3":"EST","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Estonia","ADM0_A3":"EST","GEOU_DIF":0,"GEOUNIT":"Estonia","GU_A3":"EST","SU_DIF":0,"SUBUNIT":"Estonia","SU_A3":"EST","BRK_DIFF":0,"NAME":"Estonia","NAME_LONG":"Estonia","BRK_A3":"EST","BRK_NAME":"Estonia","BRK_GROUP":null,"ABBREV":"Est.","POSTAL":"EST","FORMAL_EN":"Republic of Estonia","FORMAL_FR":null,"NAME_CIAWF":"Estonia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Estonia","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":1,"MAPCOLOR13":10,"POP_EST":1326590,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":31471,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"EN","ISO_A2":"EE","ISO_A2_EH":"EE","ISO_A3":"EST","ISO_A3_EH":"EST","ISO_N3":"233","ISO_N3_EH":"233","UN_A3":"233","WB_A2":"EE","WB_A3":"EST","WOE_ID":23424805,"WOE_ID_EH":23424805,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"EST","ADM0_DIFF":null,"ADM0_TLC":"EST","ADM0_A3_US":"EST","ADM0_A3_FR":"EST","ADM0_A3_RU":"EST","ADM0_A3_ES":"EST","ADM0_A3_CN":"EST","ADM0_A3_TW":"EST","ADM0_A3_IN":"EST","ADM0_A3_NP":"EST","ADM0_A3_PK":"EST","ADM0_A3_DE":"EST","ADM0_A3_GB":"EST","ADM0_A3_BR":"EST","ADM0_A3_IL":"EST","ADM0_A3_PS":"EST","ADM0_A3_SA":"EST","ADM0_A3_EG":"EST","ADM0_A3_MA":"EST","ADM0_A3_PT":"EST","ADM0_A3_AR":"EST","ADM0_A3_JP":"EST","ADM0_A3_KO":"EST","ADM0_A3_VN":"EST","ADM0_A3_TR":"EST","ADM0_A3_ID":"EST","ADM0_A3_PL":"EST","ADM0_A3_GR":"EST","ADM0_A3_IT":"EST","ADM0_A3_NL":"EST","ADM0_A3_SE":"EST","ADM0_A3_BD":"EST","ADM0_A3_UA":"EST","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":25.867126,"LABEL_Y":58.724865,"NE_ID":1159320615,"WIKIDATAID":"Q191","NAME_AR":"إستونيا","NAME_BN":"এস্তোনিয়া","NAME_DE":"Estland","NAME_EN":"Estonia","NAME_ES":"Estonia","NAME_FA":"استونی","NAME_FR":"Estonie","NAME_EL":"Εσθονία","NAME_HE":"אסטוניה","NAME_HI":"एस्टोनिया","NAME_HU":"Észtország","NAME_ID":"Estonia","NAME_IT":"Estonia","NAME_JA":"エストニア","NAME_KO":"에스토니아","NAME_NL":"Estland","NAME_PL":"Estonia","NAME_PT":"Estónia","NAME_RU":"Эстония","NAME_SV":"Estland","NAME_TR":"Estonya","NAME_UK":"Естонія","NAME_UR":"استونیا","NAME_VI":"Estonia","NAME_ZH":"爱沙尼亚","NAME_ZHT":"愛沙尼亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[23.339795,57.474528,28.131699,59.61109],"geometry":{"type":"Polygon","coordinates":[[[27.981127,59.475373],[27.98112,59.47537],[28.131699,59.300825],[27.42015,58.72457],[27.716686,57.791899],[27.288185,57.474528],[26.463532,57.476389],[25.60281,57.847529],[25.164594,57.970157],[24.312863,57.793424],[24.428928,58.383413],[24.061198,58.257375],[23.42656,58.612753],[23.339795,59.18724],[24.604214,59.465854],[25.864189,59.61109],[26.949136,59.445803],[27.981114,59.475388],[27.981127,59.475373]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Germany","SOV_A3":"DEU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Germany","ADM0_A3":"DEU","GEOU_DIF":0,"GEOUNIT":"Germany","GU_A3":"DEU","SU_DIF":0,"SUBUNIT":"Germany","SU_A3":"DEU","BRK_DIFF":0,"NAME":"Germany","NAME_LONG":"Germany","BRK_A3":"DEU","BRK_NAME":"Germany","BRK_GROUP":null,"ABBREV":"Ger.","POSTAL":"D","FORMAL_EN":"Federal Republic of Germany","FORMAL_FR":null,"NAME_CIAWF":"Germany","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Germany","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":5,"MAPCOLOR9":5,"MAPCOLOR13":1,"POP_EST":83132799,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":3861123,"GDP_YEAR":2019,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","FIPS_10":"GM","ISO_A2":"DE","ISO_A2_EH":"DE","ISO_A3":"DEU","ISO_A3_EH":"DEU","ISO_N3":"276","ISO_N3_EH":"276","UN_A3":"276","WB_A2":"DE","WB_A3":"DEU","WOE_ID":23424829,"WOE_ID_EH":23424829,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"DEU","ADM0_DIFF":null,"ADM0_TLC":"DEU","ADM0_A3_US":"DEU","ADM0_A3_FR":"DEU","ADM0_A3_RU":"DEU","ADM0_A3_ES":"DEU","ADM0_A3_CN":"DEU","ADM0_A3_TW":"DEU","ADM0_A3_IN":"DEU","ADM0_A3_NP":"DEU","ADM0_A3_PK":"DEU","ADM0_A3_DE":"DEU","ADM0_A3_GB":"DEU","ADM0_A3_BR":"DEU","ADM0_A3_IL":"DEU","ADM0_A3_PS":"DEU","ADM0_A3_SA":"DEU","ADM0_A3_EG":"DEU","ADM0_A3_MA":"DEU","ADM0_A3_PT":"DEU","ADM0_A3_AR":"DEU","ADM0_A3_JP":"DEU","ADM0_A3_KO":"DEU","ADM0_A3_VN":"DEU","ADM0_A3_TR":"DEU","ADM0_A3_ID":"DEU","ADM0_A3_PL":"DEU","ADM0_A3_GR":"DEU","ADM0_A3_IT":"DEU","ADM0_A3_NL":"DEU","ADM0_A3_SE":"DEU","ADM0_A3_BD":"DEU","ADM0_A3_UA":"DEU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":9.678348,"LABEL_Y":50.961733,"NE_ID":1159320539,"WIKIDATAID":"Q183","NAME_AR":"ألمانيا","NAME_BN":"জার্মানি","NAME_DE":"Deutschland","NAME_EN":"Germany","NAME_ES":"Alemania","NAME_FA":"آلمان","NAME_FR":"Allemagne","NAME_EL":"Γερμανία","NAME_HE":"גרמניה","NAME_HI":"जर्मनी","NAME_HU":"Németország","NAME_ID":"Jerman","NAME_IT":"Germania","NAME_JA":"ドイツ","NAME_KO":"독일","NAME_NL":"Duitsland","NAME_PL":"Niemcy","NAME_PT":"Alemanha","NAME_RU":"Германия","NAME_SV":"Tyskland","NAME_TR":"Almanya","NAME_UK":"Німеччина","NAME_UR":"جرمنی","NAME_VI":"Đức","NAME_ZH":"德国","NAME_ZHT":"德國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[5.988658,47.302488,15.016996,54.983104],"geometry":{"type":"Polygon","coordinates":[[[14.119686,53.757029],[14.353315,53.248171],[14.074521,52.981263],[14.4376,52.62485],[14.685026,52.089947],[14.607098,51.745188],[15.016996,51.106674],[14.570718,51.002339],[14.307013,51.117268],[14.056228,50.926918],[13.338132,50.733234],[12.966837,50.484076],[12.240111,50.266338],[12.415191,49.969121],[12.521024,49.547415],[13.031329,49.307068],[13.595946,48.877172],[13.243357,48.416115],[12.884103,48.289146],[13.025851,47.637584],[12.932627,47.467646],[12.62076,47.672388],[12.141357,47.703083],[11.426414,47.523766],[10.544504,47.566399],[10.402084,47.302488],[9.896068,47.580197],[9.594226,47.525058],[8.522612,47.830828],[8.317301,47.61358],[7.466759,47.620582],[7.593676,48.333019],[8.099279,49.017784],[6.65823,49.201958],[6.18632,49.463803],[6.242751,49.902226],[6.043073,50.128052],[6.156658,50.803721],[5.988658,51.851616],[6.589397,51.852029],[6.84287,52.22844],[7.092053,53.144043],[6.90514,53.482162],[7.100425,53.693932],[7.936239,53.748296],[8.121706,53.527792],[8.800734,54.020786],[8.572118,54.395646],[8.526229,54.962744],[9.282049,54.830865],[9.921906,54.983104],[9.93958,54.596642],[10.950112,54.363607],[10.939467,54.008693],[11.956252,54.196486],[12.51844,54.470371],[13.647467,54.075511],[14.119686,53.757029]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Bulgaria","SOV_A3":"BGR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Bulgaria","ADM0_A3":"BGR","GEOU_DIF":0,"GEOUNIT":"Bulgaria","GU_A3":"BGR","SU_DIF":0,"SUBUNIT":"Bulgaria","SU_A3":"BGR","BRK_DIFF":0,"NAME":"Bulgaria","NAME_LONG":"Bulgaria","BRK_A3":"BGR","BRK_NAME":"Bulgaria","BRK_GROUP":null,"ABBREV":"Bulg.","POSTAL":"BG","FORMAL_EN":"Republic of Bulgaria","FORMAL_FR":null,"NAME_CIAWF":"Bulgaria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bulgaria","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":1,"MAPCOLOR13":8,"POP_EST":6975761,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":68558,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"3. Upper middle income","FIPS_10":"BU","ISO_A2":"BG","ISO_A2_EH":"BG","ISO_A3":"BGR","ISO_A3_EH":"BGR","ISO_N3":"100","ISO_N3_EH":"100","UN_A3":"100","WB_A2":"BG","WB_A3":"BGR","WOE_ID":23424771,"WOE_ID_EH":23424771,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BGR","ADM0_DIFF":null,"ADM0_TLC":"BGR","ADM0_A3_US":"BGR","ADM0_A3_FR":"BGR","ADM0_A3_RU":"BGR","ADM0_A3_ES":"BGR","ADM0_A3_CN":"BGR","ADM0_A3_TW":"BGR","ADM0_A3_IN":"BGR","ADM0_A3_NP":"BGR","ADM0_A3_PK":"BGR","ADM0_A3_DE":"BGR","ADM0_A3_GB":"BGR","ADM0_A3_BR":"BGR","ADM0_A3_IL":"BGR","ADM0_A3_PS":"BGR","ADM0_A3_SA":"BGR","ADM0_A3_EG":"BGR","ADM0_A3_MA":"BGR","ADM0_A3_PT":"BGR","ADM0_A3_AR":"BGR","ADM0_A3_JP":"BGR","ADM0_A3_KO":"BGR","ADM0_A3_VN":"BGR","ADM0_A3_TR":"BGR","ADM0_A3_ID":"BGR","ADM0_A3_PL":"BGR","ADM0_A3_GR":"BGR","ADM0_A3_IT":"BGR","ADM0_A3_NL":"BGR","ADM0_A3_SE":"BGR","ADM0_A3_BD":"BGR","ADM0_A3_UA":"BGR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":25.15709,"LABEL_Y":42.508785,"NE_ID":1159320409,"WIKIDATAID":"Q219","NAME_AR":"بلغاريا","NAME_BN":"বুলগেরিয়া","NAME_DE":"Bulgarien","NAME_EN":"Bulgaria","NAME_ES":"Bulgaria","NAME_FA":"بلغارستان","NAME_FR":"Bulgarie","NAME_EL":"Βουλγαρία","NAME_HE":"בולגריה","NAME_HI":"बुल्गारिया","NAME_HU":"Bulgária","NAME_ID":"Bulgaria","NAME_IT":"Bulgaria","NAME_JA":"ブルガリア","NAME_KO":"불가리아","NAME_NL":"Bulgarije","NAME_PL":"Bułgaria","NAME_PT":"Bulgária","NAME_RU":"Болгария","NAME_SV":"Bulgarien","NAME_TR":"Bulgaristan","NAME_UK":"Болгарія","NAME_UR":"بلغاریہ","NAME_VI":"Bulgaria","NAME_ZH":"保加利亚","NAME_ZHT":"保加利亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[22.380526,41.234486,28.558081,44.234923],"geometry":{"type":"Polygon","coordinates":[[[22.65715,44.234923],[22.944832,43.823785],[23.332302,43.897011],[24.100679,43.741051],[25.569272,43.688445],[26.065159,43.943494],[27.2424,44.175986],[27.970107,43.812468],[28.558081,43.707462],[28.039095,43.293172],[27.673898,42.577892],[27.99672,42.007359],[27.135739,42.141485],[26.117042,41.826905],[26.106138,41.328899],[25.197201,41.234486],[24.492645,41.583896],[23.692074,41.309081],[22.952377,41.337994],[22.881374,41.999297],[22.380526,42.32026],[22.545012,42.461362],[22.436595,42.580321],[22.604801,42.898519],[22.986019,43.211161],[22.500157,43.642814],[22.410446,44.008063],[22.65715,44.234923]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Greece","SOV_A3":"GRC","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Greece","ADM0_A3":"GRC","GEOU_DIF":0,"GEOUNIT":"Greece","GU_A3":"GRC","SU_DIF":0,"SUBUNIT":"Greece","SU_A3":"GRC","BRK_DIFF":0,"NAME":"Greece","NAME_LONG":"Greece","BRK_A3":"GRC","BRK_NAME":"Greece","BRK_GROUP":null,"ABBREV":"Greece","POSTAL":"GR","FORMAL_EN":"Hellenic Republic","FORMAL_FR":null,"NAME_CIAWF":"Greece","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Greece","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":9,"POP_EST":10716322,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":209852,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"GR","ISO_A2":"GR","ISO_A2_EH":"GR","ISO_A3":"GRC","ISO_A3_EH":"GRC","ISO_N3":"300","ISO_N3_EH":"300","UN_A3":"300","WB_A2":"GR","WB_A3":"GRC","WOE_ID":23424833,"WOE_ID_EH":23424833,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GRC","ADM0_DIFF":null,"ADM0_TLC":"GRC","ADM0_A3_US":"GRC","ADM0_A3_FR":"GRC","ADM0_A3_RU":"GRC","ADM0_A3_ES":"GRC","ADM0_A3_CN":"GRC","ADM0_A3_TW":"GRC","ADM0_A3_IN":"GRC","ADM0_A3_NP":"GRC","ADM0_A3_PK":"GRC","ADM0_A3_DE":"GRC","ADM0_A3_GB":"GRC","ADM0_A3_BR":"GRC","ADM0_A3_IL":"GRC","ADM0_A3_PS":"GRC","ADM0_A3_SA":"GRC","ADM0_A3_EG":"GRC","ADM0_A3_MA":"GRC","ADM0_A3_PT":"GRC","ADM0_A3_AR":"GRC","ADM0_A3_JP":"GRC","ADM0_A3_KO":"GRC","ADM0_A3_VN":"GRC","ADM0_A3_TR":"GRC","ADM0_A3_ID":"GRC","ADM0_A3_PL":"GRC","ADM0_A3_GR":"GRC","ADM0_A3_IT":"GRC","ADM0_A3_NL":"GRC","ADM0_A3_SE":"GRC","ADM0_A3_BD":"GRC","ADM0_A3_UA":"GRC","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":8,"LABEL_X":21.72568,"LABEL_Y":39.492763,"NE_ID":1159320811,"WIKIDATAID":"Q41","NAME_AR":"اليونان","NAME_BN":"গ্রিস","NAME_DE":"Griechenland","NAME_EN":"Greece","NAME_ES":"Grecia","NAME_FA":"یونان","NAME_FR":"Grèce","NAME_EL":"Ελλάδα","NAME_HE":"יוון","NAME_HI":"यूनान","NAME_HU":"Görögország","NAME_ID":"Yunani","NAME_IT":"Grecia","NAME_JA":"ギリシャ","NAME_KO":"그리스","NAME_NL":"Griekenland","NAME_PL":"Grecja","NAME_PT":"Grécia","NAME_RU":"Греция","NAME_SV":"Grekland","NAME_TR":"Yunanistan","NAME_UK":"Греція","NAME_UR":"یونان","NAME_VI":"Hy Lạp","NAME_ZH":"希腊","NAME_ZHT":"希臘","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[20.150016,34.919988,26.604196,41.826905],"geometry":{"type":"MultiPolygon","coordinates":[[[[26.290003,35.29999],[26.164998,35.004995],[24.724982,34.919988],[24.735007,35.084991],[23.514978,35.279992],[23.69998,35.705004],[24.246665,35.368022],[25.025015,35.424996],[25.769208,35.354018],[25.745023,35.179998],[26.290003,35.29999]]],[[[22.952377,41.337994],[23.692074,41.309081],[24.492645,41.583896],[25.197201,41.234486],[26.106138,41.328899],[26.117042,41.826905],[26.604196,41.562115],[26.294602,40.936261],[26.056942,40.824123],[25.447677,40.852545],[24.925848,40.947062],[23.714811,40.687129],[24.407999,40.124993],[23.899968,39.962006],[23.342999,39.960998],[22.813988,40.476005],[22.626299,40.256561],[22.849748,39.659311],[23.350027,39.190011],[22.973099,38.970903],[23.530016,38.510001],[24.025025,38.219993],[24.040011,37.655015],[23.115003,37.920011],[23.409972,37.409991],[22.774972,37.30501],[23.154225,36.422506],[22.490028,36.41],[21.670026,36.844986],[21.295011,37.644989],[21.120034,38.310323],[20.730032,38.769985],[20.217712,39.340235],[20.150016,39.624998],[20.615,40.110007],[20.674997,40.435],[20.99999,40.580004],[21.02004,40.842727],[21.674161,40.931275],[22.055378,41.149866],[22.597308,41.130487],[22.76177,41.3048],[22.952377,41.337994]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Turkey","SOV_A3":"TUR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Turkey","ADM0_A3":"TUR","GEOU_DIF":0,"GEOUNIT":"Turkey","GU_A3":"TUR","SU_DIF":0,"SUBUNIT":"Turkey","SU_A3":"TUR","BRK_DIFF":0,"NAME":"Turkey","NAME_LONG":"Turkey","BRK_A3":"TUR","BRK_NAME":"Turkey","BRK_GROUP":null,"ABBREV":"Tur.","POSTAL":"TR","FORMAL_EN":"Republic of Turkey","FORMAL_FR":null,"NAME_CIAWF":"Turkey","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Turkey","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":8,"MAPCOLOR13":4,"POP_EST":83429615,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":761425,"GDP_YEAR":2019,"ECONOMY":"4. Emerging region: MIKT","INCOME_GRP":"3. Upper middle income","FIPS_10":"TU","ISO_A2":"TR","ISO_A2_EH":"TR","ISO_A3":"TUR","ISO_A3_EH":"TUR","ISO_N3":"792","ISO_N3_EH":"792","UN_A3":"792","WB_A2":"TR","WB_A3":"TUR","WOE_ID":23424969,"WOE_ID_EH":23424969,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TUR","ADM0_DIFF":null,"ADM0_TLC":"TUR","ADM0_A3_US":"TUR","ADM0_A3_FR":"TUR","ADM0_A3_RU":"TUR","ADM0_A3_ES":"TUR","ADM0_A3_CN":"TUR","ADM0_A3_TW":"TUR","ADM0_A3_IN":"TUR","ADM0_A3_NP":"TUR","ADM0_A3_PK":"TUR","ADM0_A3_DE":"TUR","ADM0_A3_GB":"TUR","ADM0_A3_BR":"TUR","ADM0_A3_IL":"TUR","ADM0_A3_PS":"TUR","ADM0_A3_SA":"TUR","ADM0_A3_EG":"TUR","ADM0_A3_MA":"TUR","ADM0_A3_PT":"TUR","ADM0_A3_AR":"TUR","ADM0_A3_JP":"TUR","ADM0_A3_KO":"TUR","ADM0_A3_VN":"TUR","ADM0_A3_TR":"TUR","ADM0_A3_ID":"TUR","ADM0_A3_PL":"TUR","ADM0_A3_GR":"TUR","ADM0_A3_IT":"TUR","ADM0_A3_NL":"TUR","ADM0_A3_SE":"TUR","ADM0_A3_BD":"TUR","ADM0_A3_UA":"TUR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":34.508268,"LABEL_Y":39.345388,"NE_ID":1159321331,"WIKIDATAID":"Q43","NAME_AR":"تركيا","NAME_BN":"তুরস্ক","NAME_DE":"Türkei","NAME_EN":"Turkey","NAME_ES":"Turquía","NAME_FA":"ترکیه","NAME_FR":"Turquie","NAME_EL":"Τουρκία","NAME_HE":"טורקיה","NAME_HI":"तुर्की","NAME_HU":"Törökország","NAME_ID":"Turki","NAME_IT":"Turchia","NAME_JA":"トルコ","NAME_KO":"터키","NAME_NL":"Turkije","NAME_PL":"Turcja","NAME_PT":"Turquia","NAME_RU":"Турция","NAME_SV":"Turkiet","NAME_TR":"Türkiye","NAME_UK":"Туреччина","NAME_UR":"ترکی","NAME_VI":"Thổ Nhĩ Kỳ","NAME_ZH":"土耳其","NAME_ZHT":"土耳其","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[26.043351,35.821535,44.79399,42.141485],"geometry":{"type":"MultiPolygon","coordinates":[[[[44.772677,37.170437],[44.293452,37.001514],[43.942259,37.256228],[42.779126,37.385264],[42.349591,37.229873],[41.212089,37.074352],[40.673259,37.091276],[39.52258,36.716054],[38.699891,36.712927],[38.167727,36.90121],[37.066761,36.623036],[36.739494,36.81752],[36.685389,36.259699],[36.41755,36.040617],[36.149763,35.821535],[35.782085,36.274995],[36.160822,36.650606],[35.550936,36.565443],[34.714553,36.795532],[34.026895,36.21996],[32.509158,36.107564],[31.699595,36.644275],[30.621625,36.677865],[30.391096,36.262981],[29.699976,36.144357],[28.732903,36.676831],[27.641187,36.658822],[27.048768,37.653361],[26.318218,38.208133],[26.8047,38.98576],[26.170785,39.463612],[27.28002,40.420014],[28.819978,40.460011],[29.240004,41.219991],[31.145934,41.087622],[32.347979,41.736264],[33.513283,42.01896],[35.167704,42.040225],[36.913127,41.335358],[38.347665,40.948586],[39.512607,41.102763],[40.373433,41.013673],[41.554084,41.535656],[42.619549,41.583173],[43.582746,41.092143],[43.752658,40.740201],[43.656436,40.253564],[44.400009,40.005],[44.79399,39.713003],[44.109225,39.428136],[44.421403,38.281281],[44.225756,37.971584],[44.77267,37.17045],[44.772677,37.170437]]],[[[26.117042,41.826905],[27.135739,42.141485],[27.99672,42.007359],[28.115525,41.622886],[28.988443,41.299934],[28.806438,41.054962],[27.619017,40.999823],[27.192377,40.690566],[26.358009,40.151994],[26.043351,40.617754],[26.056942,40.824123],[26.294602,40.936261],[26.604196,41.562115],[26.117042,41.826905]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Albania","SOV_A3":"ALB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Albania","ADM0_A3":"ALB","GEOU_DIF":0,"GEOUNIT":"Albania","GU_A3":"ALB","SU_DIF":0,"SUBUNIT":"Albania","SU_A3":"ALB","BRK_DIFF":0,"NAME":"Albania","NAME_LONG":"Albania","BRK_A3":"ALB","BRK_NAME":"Albania","BRK_GROUP":null,"ABBREV":"Alb.","POSTAL":"AL","FORMAL_EN":"Republic of Albania","FORMAL_FR":null,"NAME_CIAWF":"Albania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Albania","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":6,"POP_EST":2854191,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":15279,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"AL","ISO_A2":"AL","ISO_A2_EH":"AL","ISO_A3":"ALB","ISO_A3_EH":"ALB","ISO_N3":"008","ISO_N3_EH":"008","UN_A3":"008","WB_A2":"AL","WB_A3":"ALB","WOE_ID":23424742,"WOE_ID_EH":23424742,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ALB","ADM0_DIFF":null,"ADM0_TLC":"ALB","ADM0_A3_US":"ALB","ADM0_A3_FR":"ALB","ADM0_A3_RU":"ALB","ADM0_A3_ES":"ALB","ADM0_A3_CN":"ALB","ADM0_A3_TW":"ALB","ADM0_A3_IN":"ALB","ADM0_A3_NP":"ALB","ADM0_A3_PK":"ALB","ADM0_A3_DE":"ALB","ADM0_A3_GB":"ALB","ADM0_A3_BR":"ALB","ADM0_A3_IL":"ALB","ADM0_A3_PS":"ALB","ADM0_A3_SA":"ALB","ADM0_A3_EG":"ALB","ADM0_A3_MA":"ALB","ADM0_A3_PT":"ALB","ADM0_A3_AR":"ALB","ADM0_A3_JP":"ALB","ADM0_A3_KO":"ALB","ADM0_A3_VN":"ALB","ADM0_A3_TR":"ALB","ADM0_A3_ID":"ALB","ADM0_A3_PL":"ALB","ADM0_A3_GR":"ALB","ADM0_A3_IT":"ALB","ADM0_A3_NL":"ALB","ADM0_A3_SE":"ALB","ADM0_A3_BD":"ALB","ADM0_A3_UA":"ALB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":20.11384,"LABEL_Y":40.654855,"NE_ID":1159320325,"WIKIDATAID":"Q222","NAME_AR":"ألبانيا","NAME_BN":"আলবেনিয়া","NAME_DE":"Albanien","NAME_EN":"Albania","NAME_ES":"Albania","NAME_FA":"آلبانی","NAME_FR":"Albanie","NAME_EL":"Αλβανία","NAME_HE":"אלבניה","NAME_HI":"अल्बानिया","NAME_HU":"Albánia","NAME_ID":"Albania","NAME_IT":"Albania","NAME_JA":"アルバニア","NAME_KO":"알바니아","NAME_NL":"Albanië","NAME_PL":"Albania","NAME_PT":"Albânia","NAME_RU":"Албания","NAME_SV":"Albanien","NAME_TR":"Arnavutluk","NAME_UK":"Албанія","NAME_UR":"البانیا","NAME_VI":"Albania","NAME_ZH":"阿尔巴尼亚","NAME_ZHT":"阿爾巴尼亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[19.304486,39.624998,21.02004,42.688247],"geometry":{"type":"Polygon","coordinates":[[[21.02004,40.842727],[20.99999,40.580004],[20.674997,40.435],[20.615,40.110007],[20.150016,39.624998],[19.98,39.694993],[19.960002,39.915006],[19.406082,40.250773],[19.319059,40.72723],[19.40355,41.409566],[19.540027,41.719986],[19.371769,41.877548],[19.371768,41.877551],[19.304486,42.195745],[19.738051,42.688247],[19.801613,42.500093],[20.0707,42.58863],[20.283755,42.32026],[20.52295,42.21787],[20.590247,41.855409],[20.590247,41.855404],[20.463175,41.515089],[20.605182,41.086226],[21.02004,40.842727]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Croatia","SOV_A3":"HRV","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Croatia","ADM0_A3":"HRV","GEOU_DIF":0,"GEOUNIT":"Croatia","GU_A3":"HRV","SU_DIF":0,"SUBUNIT":"Croatia","SU_A3":"HRV","BRK_DIFF":0,"NAME":"Croatia","NAME_LONG":"Croatia","BRK_A3":"HRV","BRK_NAME":"Croatia","BRK_GROUP":null,"ABBREV":"Cro.","POSTAL":"HR","FORMAL_EN":"Republic of Croatia","FORMAL_FR":null,"NAME_CIAWF":"Croatia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Croatia","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":4,"MAPCOLOR9":5,"MAPCOLOR13":1,"POP_EST":4067500,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":60752,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"HR","ISO_A2":"HR","ISO_A2_EH":"HR","ISO_A3":"HRV","ISO_A3_EH":"HRV","ISO_N3":"191","ISO_N3_EH":"191","UN_A3":"191","WB_A2":"HR","WB_A3":"HRV","WOE_ID":23424843,"WOE_ID_EH":23424843,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"HRV","ADM0_DIFF":null,"ADM0_TLC":"HRV","ADM0_A3_US":"HRV","ADM0_A3_FR":"HRV","ADM0_A3_RU":"HRV","ADM0_A3_ES":"HRV","ADM0_A3_CN":"HRV","ADM0_A3_TW":"HRV","ADM0_A3_IN":"HRV","ADM0_A3_NP":"HRV","ADM0_A3_PK":"HRV","ADM0_A3_DE":"HRV","ADM0_A3_GB":"HRV","ADM0_A3_BR":"HRV","ADM0_A3_IL":"HRV","ADM0_A3_PS":"HRV","ADM0_A3_SA":"HRV","ADM0_A3_EG":"HRV","ADM0_A3_MA":"HRV","ADM0_A3_PT":"HRV","ADM0_A3_AR":"HRV","ADM0_A3_JP":"HRV","ADM0_A3_KO":"HRV","ADM0_A3_VN":"HRV","ADM0_A3_TR":"HRV","ADM0_A3_ID":"HRV","ADM0_A3_PL":"HRV","ADM0_A3_GR":"HRV","ADM0_A3_IT":"HRV","ADM0_A3_NL":"HRV","ADM0_A3_SE":"HRV","ADM0_A3_BD":"HRV","ADM0_A3_UA":"HRV","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":16.37241,"LABEL_Y":45.805799,"NE_ID":1159320833,"WIKIDATAID":"Q224","NAME_AR":"كرواتيا","NAME_BN":"ক্রোয়েশিয়া","NAME_DE":"Kroatien","NAME_EN":"Croatia","NAME_ES":"Croacia","NAME_FA":"کرواسی","NAME_FR":"Croatie","NAME_EL":"Κροατία","NAME_HE":"קרואטיה","NAME_HI":"क्रोएशिया","NAME_HU":"Horvátország","NAME_ID":"Kroasia","NAME_IT":"Croazia","NAME_JA":"クロアチア","NAME_KO":"크로아티아","NAME_NL":"Kroatië","NAME_PL":"Chorwacja","NAME_PT":"Croácia","NAME_RU":"Хорватия","NAME_SV":"Kroatien","NAME_TR":"Hırvatistan","NAME_UK":"Хорватія","NAME_UR":"کروشیا","NAME_VI":"Croatia","NAME_ZH":"克罗地亚","NAME_ZHT":"克羅地亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[13.656976,42.479991,19.390476,46.503751],"geometry":{"type":"Polygon","coordinates":[[[16.564808,46.503751],[16.882515,46.380632],[17.630066,45.951769],[18.456062,45.759481],[18.829825,45.908872],[19.072769,45.521511],[19.390476,45.236516],[19.005485,44.860234],[18.553214,45.08159],[17.861783,45.06774],[17.002146,45.233777],[16.534939,45.211608],[16.318157,45.004127],[15.959367,45.233777],[15.750026,44.818712],[16.23966,44.351143],[16.456443,44.04124],[16.916156,43.667722],[17.297373,43.446341],[17.674922,43.028563],[18.56,42.65],[18.450017,42.479992],[18.450016,42.479991],[17.50997,42.849995],[16.930006,43.209998],[16.015385,43.507215],[15.174454,44.243191],[15.37625,44.317915],[14.920309,44.738484],[14.901602,45.07606],[14.258748,45.233777],[13.952255,44.802124],[13.656976,45.136935],[13.679403,45.484149],[13.71506,45.500324],[14.411968,45.466166],[14.595109,45.634941],[14.935244,45.471695],[15.327675,45.452316],[15.323954,45.731783],[15.67153,45.834154],[15.768733,46.238108],[16.564808,46.503751]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Switzerland","SOV_A3":"CHE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Switzerland","ADM0_A3":"CHE","GEOU_DIF":0,"GEOUNIT":"Switzerland","GU_A3":"CHE","SU_DIF":0,"SUBUNIT":"Switzerland","SU_A3":"CHE","BRK_DIFF":0,"NAME":"Switzerland","NAME_LONG":"Switzerland","BRK_A3":"CHE","BRK_NAME":"Switzerland","BRK_GROUP":null,"ABBREV":"Switz.","POSTAL":"CH","FORMAL_EN":"Swiss Confederation","FORMAL_FR":null,"NAME_CIAWF":"Switzerland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Switzerland","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":2,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":8574832,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":703082,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"SZ","ISO_A2":"CH","ISO_A2_EH":"CH","ISO_A3":"CHE","ISO_A3_EH":"CHE","ISO_N3":"756","ISO_N3_EH":"756","UN_A3":"756","WB_A2":"CH","WB_A3":"CHE","WOE_ID":23424957,"WOE_ID_EH":23424957,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CHE","ADM0_DIFF":null,"ADM0_TLC":"CHE","ADM0_A3_US":"CHE","ADM0_A3_FR":"CHE","ADM0_A3_RU":"CHE","ADM0_A3_ES":"CHE","ADM0_A3_CN":"CHE","ADM0_A3_TW":"CHE","ADM0_A3_IN":"CHE","ADM0_A3_NP":"CHE","ADM0_A3_PK":"CHE","ADM0_A3_DE":"CHE","ADM0_A3_GB":"CHE","ADM0_A3_BR":"CHE","ADM0_A3_IL":"CHE","ADM0_A3_PS":"CHE","ADM0_A3_SA":"CHE","ADM0_A3_EG":"CHE","ADM0_A3_MA":"CHE","ADM0_A3_PT":"CHE","ADM0_A3_AR":"CHE","ADM0_A3_JP":"CHE","ADM0_A3_KO":"CHE","ADM0_A3_VN":"CHE","ADM0_A3_TR":"CHE","ADM0_A3_ID":"CHE","ADM0_A3_PL":"CHE","ADM0_A3_GR":"CHE","ADM0_A3_IT":"CHE","ADM0_A3_NL":"CHE","ADM0_A3_SE":"CHE","ADM0_A3_BD":"CHE","ADM0_A3_UA":"CHE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":7.463965,"LABEL_Y":46.719114,"NE_ID":1159320491,"WIKIDATAID":"Q39","NAME_AR":"سويسرا","NAME_BN":"সুইজারল্যান্ড","NAME_DE":"Schweiz","NAME_EN":"Switzerland","NAME_ES":"Suiza","NAME_FA":"سوئیس","NAME_FR":"Suisse","NAME_EL":"Ελβετία","NAME_HE":"שווייץ","NAME_HI":"स्विट्ज़रलैण्ड","NAME_HU":"Svájc","NAME_ID":"Swiss","NAME_IT":"Svizzera","NAME_JA":"スイス","NAME_KO":"스위스","NAME_NL":"Zwitserland","NAME_PL":"Szwajcaria","NAME_PT":"Suíça","NAME_RU":"Швейцария","NAME_SV":"Schweiz","NAME_TR":"İsviçre","NAME_UK":"Швейцарія","NAME_UR":"سویٹزرلینڈ","NAME_VI":"Thụy Sĩ","NAME_ZH":"瑞士","NAME_ZHT":"瑞士","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[6.022609,45.776948,10.442701,47.830828],"geometry":{"type":"Polygon","coordinates":[[[9.594226,47.525058],[9.632932,47.347601],[9.47997,47.10281],[9.932448,46.920728],[10.442701,46.893546],[10.363378,46.483571],[9.922837,46.314899],[9.182882,46.440215],[8.966306,46.036932],[8.489952,46.005151],[8.31663,46.163642],[7.755992,45.82449],[7.273851,45.776948],[6.843593,45.991147],[6.5001,46.429673],[6.022609,46.27299],[6.037389,46.725779],[6.768714,47.287708],[6.736571,47.541801],[7.192202,47.449766],[7.466759,47.620582],[8.317301,47.61358],[8.522612,47.830828],[9.594226,47.525058]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Luxembourg","SOV_A3":"LUX","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Luxembourg","ADM0_A3":"LUX","GEOU_DIF":0,"GEOUNIT":"Luxembourg","GU_A3":"LUX","SU_DIF":0,"SUBUNIT":"Luxembourg","SU_A3":"LUX","BRK_DIFF":0,"NAME":"Luxembourg","NAME_LONG":"Luxembourg","BRK_A3":"LUX","BRK_NAME":"Luxembourg","BRK_GROUP":null,"ABBREV":"Lux.","POSTAL":"L","FORMAL_EN":"Grand Duchy of Luxembourg","FORMAL_FR":null,"NAME_CIAWF":"Luxembourg","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Luxembourg","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":7,"MAPCOLOR9":3,"MAPCOLOR13":7,"POP_EST":619896,"POP_RANK":11,"POP_YEAR":2019,"GDP_MD":71104,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"LU","ISO_A2":"LU","ISO_A2_EH":"LU","ISO_A3":"LUX","ISO_A3_EH":"LUX","ISO_N3":"442","ISO_N3_EH":"442","UN_A3":"442","WB_A2":"LU","WB_A3":"LUX","WOE_ID":23424881,"WOE_ID_EH":23424881,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LUX","ADM0_DIFF":null,"ADM0_TLC":"LUX","ADM0_A3_US":"LUX","ADM0_A3_FR":"LUX","ADM0_A3_RU":"LUX","ADM0_A3_ES":"LUX","ADM0_A3_CN":"LUX","ADM0_A3_TW":"LUX","ADM0_A3_IN":"LUX","ADM0_A3_NP":"LUX","ADM0_A3_PK":"LUX","ADM0_A3_DE":"LUX","ADM0_A3_GB":"LUX","ADM0_A3_BR":"LUX","ADM0_A3_IL":"LUX","ADM0_A3_PS":"LUX","ADM0_A3_SA":"LUX","ADM0_A3_EG":"LUX","ADM0_A3_MA":"LUX","ADM0_A3_PT":"LUX","ADM0_A3_AR":"LUX","ADM0_A3_JP":"LUX","ADM0_A3_KO":"LUX","ADM0_A3_VN":"LUX","ADM0_A3_TR":"LUX","ADM0_A3_ID":"LUX","ADM0_A3_PL":"LUX","ADM0_A3_GR":"LUX","ADM0_A3_IT":"LUX","ADM0_A3_NL":"LUX","ADM0_A3_SE":"LUX","ADM0_A3_BD":"LUX","ADM0_A3_UA":"LUX","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":5,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5.7,"MAX_LABEL":10,"LABEL_X":6.07762,"LABEL_Y":49.733732,"NE_ID":1159321031,"WIKIDATAID":"Q32","NAME_AR":"لوكسمبورغ","NAME_BN":"লুক্সেমবুর্গ","NAME_DE":"Luxemburg","NAME_EN":"Luxembourg","NAME_ES":"Luxemburgo","NAME_FA":"لوکزامبورگ","NAME_FR":"Luxembourg","NAME_EL":"Λουξεμβούργο","NAME_HE":"לוקסמבורג","NAME_HI":"लक्ज़मबर्ग","NAME_HU":"Luxemburg","NAME_ID":"Luksemburg","NAME_IT":"Lussemburgo","NAME_JA":"ルクセンブルク","NAME_KO":"룩셈부르크","NAME_NL":"Luxemburg","NAME_PL":"Luksemburg","NAME_PT":"Luxemburgo","NAME_RU":"Люксембург","NAME_SV":"Luxemburg","NAME_TR":"Lüksemburg","NAME_UK":"Люксембург","NAME_UR":"لکسمبرگ","NAME_VI":"Luxembourg","NAME_ZH":"卢森堡","NAME_ZHT":"盧森堡","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[5.674052,49.442667,6.242751,50.128052],"geometry":{"type":"Polygon","coordinates":[[[6.043073,50.128052],[6.242751,49.902226],[6.18632,49.463803],[5.897759,49.442667],[5.674052,49.529484],[5.782417,50.090328],[6.043073,50.128052]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Belgium","SOV_A3":"BEL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Belgium","ADM0_A3":"BEL","GEOU_DIF":0,"GEOUNIT":"Belgium","GU_A3":"BEL","SU_DIF":0,"SUBUNIT":"Belgium","SU_A3":"BEL","BRK_DIFF":0,"NAME":"Belgium","NAME_LONG":"Belgium","BRK_A3":"BEL","BRK_NAME":"Belgium","BRK_GROUP":null,"ABBREV":"Belg.","POSTAL":"B","FORMAL_EN":"Kingdom of Belgium","FORMAL_FR":null,"NAME_CIAWF":"Belgium","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Belgium","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":1,"MAPCOLOR13":8,"POP_EST":11484055,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":533097,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"BE","ISO_A2":"BE","ISO_A2_EH":"BE","ISO_A3":"BEL","ISO_A3_EH":"BEL","ISO_N3":"056","ISO_N3_EH":"056","UN_A3":"056","WB_A2":"BE","WB_A3":"BEL","WOE_ID":23424757,"WOE_ID_EH":23424757,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BEL","ADM0_DIFF":null,"ADM0_TLC":"BEL","ADM0_A3_US":"BEL","ADM0_A3_FR":"BEL","ADM0_A3_RU":"BEL","ADM0_A3_ES":"BEL","ADM0_A3_CN":"BEL","ADM0_A3_TW":"BEL","ADM0_A3_IN":"BEL","ADM0_A3_NP":"BEL","ADM0_A3_PK":"BEL","ADM0_A3_DE":"BEL","ADM0_A3_GB":"BEL","ADM0_A3_BR":"BEL","ADM0_A3_IL":"BEL","ADM0_A3_PS":"BEL","ADM0_A3_SA":"BEL","ADM0_A3_EG":"BEL","ADM0_A3_MA":"BEL","ADM0_A3_PT":"BEL","ADM0_A3_AR":"BEL","ADM0_A3_JP":"BEL","ADM0_A3_KO":"BEL","ADM0_A3_VN":"BEL","ADM0_A3_TR":"BEL","ADM0_A3_ID":"BEL","ADM0_A3_PL":"BEL","ADM0_A3_GR":"BEL","ADM0_A3_IT":"BEL","ADM0_A3_NL":"BEL","ADM0_A3_SE":"BEL","ADM0_A3_BD":"BEL","ADM0_A3_UA":"BEL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":4.800448,"LABEL_Y":50.785392,"NE_ID":1159320389,"WIKIDATAID":"Q31","NAME_AR":"بلجيكا","NAME_BN":"বেলজিয়াম","NAME_DE":"Belgien","NAME_EN":"Belgium","NAME_ES":"Bélgica","NAME_FA":"بلژیک","NAME_FR":"Belgique","NAME_EL":"Βέλγιο","NAME_HE":"בלגיה","NAME_HI":"बेल्जियम","NAME_HU":"Belgium","NAME_ID":"Belgia","NAME_IT":"Belgio","NAME_JA":"ベルギー","NAME_KO":"벨기에","NAME_NL":"België","NAME_PL":"Belgia","NAME_PT":"Bélgica","NAME_RU":"Бельгия","NAME_SV":"Belgien","NAME_TR":"Belçika","NAME_UK":"Бельгія","NAME_UR":"بلجئیم","NAME_VI":"Bỉ","NAME_ZH":"比利时","NAME_ZHT":"比利時","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[2.513573,49.529484,6.156658,51.475024],"geometry":{"type":"Polygon","coordinates":[[[6.156658,50.803721],[6.043073,50.128052],[5.782417,50.090328],[5.674052,49.529484],[4.799222,49.985373],[4.286023,49.907497],[3.588184,50.378992],[3.123252,50.780363],[2.658422,50.796848],[2.513573,51.148506],[3.314971,51.345781],[3.315011,51.345777],[3.314971,51.345755],[4.047071,51.267259],[4.973991,51.475024],[5.606976,51.037298],[6.156658,50.803721]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Netherlands","SOV_A3":"NL1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"Netherlands","ADM0_A3":"NLD","GEOU_DIF":0,"GEOUNIT":"Netherlands","GU_A3":"NLD","SU_DIF":0,"SUBUNIT":"Netherlands","SU_A3":"NLD","BRK_DIFF":0,"NAME":"Netherlands","NAME_LONG":"Netherlands","BRK_A3":"NLD","BRK_NAME":"Netherlands","BRK_GROUP":null,"ABBREV":"Neth.","POSTAL":"NL","FORMAL_EN":"Kingdom of the Netherlands","FORMAL_FR":null,"NAME_CIAWF":"Netherlands","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Netherlands","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":9,"POP_EST":17332850,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":907050,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"NL","ISO_A2":"NL","ISO_A2_EH":"NL","ISO_A3":"NLD","ISO_A3_EH":"NLD","ISO_N3":"528","ISO_N3_EH":"528","UN_A3":"528","WB_A2":"NL","WB_A3":"NLD","WOE_ID":-90,"WOE_ID_EH":23424909,"WOE_NOTE":"Doesn't include new former units of Netherlands Antilles (24549811, 24549808, and 24549809)","ADM0_ISO":"NLD","ADM0_DIFF":null,"ADM0_TLC":"NLD","ADM0_A3_US":"NLD","ADM0_A3_FR":"NLD","ADM0_A3_RU":"NLD","ADM0_A3_ES":"NLD","ADM0_A3_CN":"NLD","ADM0_A3_TW":"NLD","ADM0_A3_IN":"NLD","ADM0_A3_NP":"NLD","ADM0_A3_PK":"NLD","ADM0_A3_DE":"NLD","ADM0_A3_GB":"NLD","ADM0_A3_BR":"NLD","ADM0_A3_IL":"NLD","ADM0_A3_PS":"NLD","ADM0_A3_SA":"NLD","ADM0_A3_EG":"NLD","ADM0_A3_MA":"NLD","ADM0_A3_PT":"NLD","ADM0_A3_AR":"NLD","ADM0_A3_JP":"NLD","ADM0_A3_KO":"NLD","ADM0_A3_VN":"NLD","ADM0_A3_TR":"NLD","ADM0_A3_ID":"NLD","ADM0_A3_PL":"NLD","ADM0_A3_GR":"NLD","ADM0_A3_IT":"NLD","ADM0_A3_NL":"NLD","ADM0_A3_SE":"NLD","ADM0_A3_BD":"NLD","ADM0_A3_UA":"NLD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":10,"LABEL_X":5.61144,"LABEL_Y":52.422211,"NE_ID":1159321101,"WIKIDATAID":"Q55","NAME_AR":"هولندا","NAME_BN":"নেদারল্যান্ডস","NAME_DE":"Niederlande","NAME_EN":"Netherlands","NAME_ES":"Países Bajos","NAME_FA":"هلند","NAME_FR":"Pays-Bas","NAME_EL":"Ολλανδία","NAME_HE":"הולנד","NAME_HI":"नीदरलैण्ड","NAME_HU":"Hollandia","NAME_ID":"Belanda","NAME_IT":"Paesi Bassi","NAME_JA":"オランダ","NAME_KO":"네덜란드","NAME_NL":"Nederland","NAME_PL":"Holandia","NAME_PT":"Países Baixos","NAME_RU":"Нидерланды","NAME_SV":"Nederländerna","NAME_TR":"Hollanda","NAME_UK":"Нідерланди","NAME_UR":"نیدرلینڈز","NAME_VI":"Hà Lan","NAME_ZH":"荷兰","NAME_ZHT":"荷蘭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[3.314971,50.803721,7.092053,53.510403],"geometry":{"type":"Polygon","coordinates":[[[6.90514,53.482162],[7.092053,53.144043],[6.84287,52.22844],[6.589397,51.852029],[5.988658,51.851616],[6.156658,50.803721],[5.606976,51.037298],[4.973991,51.475024],[4.047071,51.267259],[3.314971,51.345755],[3.315011,51.345777],[3.830289,51.620545],[4.705997,53.091798],[6.074183,53.510403],[6.90514,53.482162]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Portugal","SOV_A3":"PRT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Portugal","ADM0_A3":"PRT","GEOU_DIF":0,"GEOUNIT":"Portugal","GU_A3":"PRT","SU_DIF":1,"SUBUNIT":"Portugal","SU_A3":"PR1","BRK_DIFF":0,"NAME":"Portugal","NAME_LONG":"Portugal","BRK_A3":"PR1","BRK_NAME":"Portugal","BRK_GROUP":null,"ABBREV":"Port.","POSTAL":"P","FORMAL_EN":"Portuguese Republic","FORMAL_FR":null,"NAME_CIAWF":"Portugal","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Portugal","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":7,"MAPCOLOR9":1,"MAPCOLOR13":4,"POP_EST":10269417,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":238785,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"PO","ISO_A2":"PT","ISO_A2_EH":"PT","ISO_A3":"PRT","ISO_A3_EH":"PRT","ISO_N3":"620","ISO_N3_EH":"620","UN_A3":"620","WB_A2":"PT","WB_A3":"PRT","WOE_ID":23424925,"WOE_ID_EH":23424925,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PR1","ADM0_DIFF":null,"ADM0_TLC":"PR1","ADM0_A3_US":"PRT","ADM0_A3_FR":"PRT","ADM0_A3_RU":"PRT","ADM0_A3_ES":"PRT","ADM0_A3_CN":"PRT","ADM0_A3_TW":"PRT","ADM0_A3_IN":"PRT","ADM0_A3_NP":"PRT","ADM0_A3_PK":"PRT","ADM0_A3_DE":"PRT","ADM0_A3_GB":"PRT","ADM0_A3_BR":"PRT","ADM0_A3_IL":"PRT","ADM0_A3_PS":"PRT","ADM0_A3_SA":"PRT","ADM0_A3_EG":"PRT","ADM0_A3_MA":"PRT","ADM0_A3_PT":"PRT","ADM0_A3_AR":"PRT","ADM0_A3_JP":"PRT","ADM0_A3_KO":"PRT","ADM0_A3_VN":"PRT","ADM0_A3_TR":"PRT","ADM0_A3_ID":"PRT","ADM0_A3_PL":"PRT","ADM0_A3_GR":"PRT","ADM0_A3_IT":"PRT","ADM0_A3_NL":"PRT","ADM0_A3_SE":"PRT","ADM0_A3_BD":"PRT","ADM0_A3_UA":"PRT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-8.271754,"LABEL_Y":39.606675,"NE_ID":1159321187,"WIKIDATAID":"Q45","NAME_AR":"البرتغال","NAME_BN":"পর্তুগাল","NAME_DE":"Portugal","NAME_EN":"Portugal","NAME_ES":"Portugal","NAME_FA":"پرتغال","NAME_FR":"Portugal","NAME_EL":"Πορτογαλία","NAME_HE":"פורטוגל","NAME_HI":"पुर्तगाल","NAME_HU":"Portugália","NAME_ID":"Portugal","NAME_IT":"Portogallo","NAME_JA":"ポルトガル","NAME_KO":"포르투갈","NAME_NL":"Portugal","NAME_PL":"Portugalia","NAME_PT":"Portugal","NAME_RU":"Португалия","NAME_SV":"Portugal","NAME_TR":"Portekiz","NAME_UK":"Португалія","NAME_UR":"پرتگال","NAME_VI":"Bồ Đào Nha","NAME_ZH":"葡萄牙","NAME_ZHT":"葡萄牙","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-9.526571,36.838269,-6.389088,42.280469],"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.671946,42.134689],[-8.263857,42.280469],[-8.013175,41.790886],[-7.422513,41.792075],[-7.251309,41.918346],[-6.668606,41.883387],[-6.389088,41.381815],[-6.851127,41.111083],[-6.86402,40.330872],[-7.026413,40.184524],[-7.066592,39.711892],[-7.498632,39.629571],[-7.098037,39.030073],[-7.374092,38.373059],[-7.029281,38.075764],[-7.166508,37.803894],[-7.537105,37.428904],[-7.453726,37.097788],[-7.855613,36.838269],[-8.382816,36.97888],[-8.898857,36.868809],[-8.746101,37.651346],[-8.839998,38.266243],[-9.287464,38.358486],[-9.526571,38.737429],[-9.446989,39.392066],[-9.048305,39.755093],[-8.977353,40.159306],[-8.768684,40.760639],[-8.790853,41.184334],[-8.990789,41.543459],[-9.034818,41.880571]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Spain","SOV_A3":"ESP","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Spain","ADM0_A3":"ESP","GEOU_DIF":0,"GEOUNIT":"Spain","GU_A3":"ESP","SU_DIF":0,"SUBUNIT":"Spain","SU_A3":"ESP","BRK_DIFF":0,"NAME":"Spain","NAME_LONG":"Spain","BRK_A3":"ESP","BRK_NAME":"Spain","BRK_GROUP":null,"ABBREV":"Sp.","POSTAL":"E","FORMAL_EN":"Kingdom of Spain","FORMAL_FR":null,"NAME_CIAWF":"Spain","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Spain","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":5,"MAPCOLOR13":5,"POP_EST":47076781,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":1393490,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"SP","ISO_A2":"ES","ISO_A2_EH":"ES","ISO_A3":"ESP","ISO_A3_EH":"ESP","ISO_N3":"724","ISO_N3_EH":"724","UN_A3":"724","WB_A2":"ES","WB_A3":"ESP","WOE_ID":23424950,"WOE_ID_EH":23424950,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ESP","ADM0_DIFF":null,"ADM0_TLC":"ESP","ADM0_A3_US":"ESP","ADM0_A3_FR":"ESP","ADM0_A3_RU":"ESP","ADM0_A3_ES":"ESP","ADM0_A3_CN":"ESP","ADM0_A3_TW":"ESP","ADM0_A3_IN":"ESP","ADM0_A3_NP":"ESP","ADM0_A3_PK":"ESP","ADM0_A3_DE":"ESP","ADM0_A3_GB":"ESP","ADM0_A3_BR":"ESP","ADM0_A3_IL":"ESP","ADM0_A3_PS":"ESP","ADM0_A3_SA":"ESP","ADM0_A3_EG":"ESP","ADM0_A3_MA":"ESP","ADM0_A3_PT":"ESP","ADM0_A3_AR":"ESP","ADM0_A3_JP":"ESP","ADM0_A3_KO":"ESP","ADM0_A3_VN":"ESP","ADM0_A3_TR":"ESP","ADM0_A3_ID":"ESP","ADM0_A3_PL":"ESP","ADM0_A3_GR":"ESP","ADM0_A3_IT":"ESP","ADM0_A3_NL":"ESP","ADM0_A3_SE":"ESP","ADM0_A3_BD":"ESP","ADM0_A3_UA":"ESP","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":3,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":-3.464718,"LABEL_Y":40.090953,"NE_ID":1159320587,"WIKIDATAID":"Q29","NAME_AR":"إسبانيا","NAME_BN":"স্পেন","NAME_DE":"Spanien","NAME_EN":"Spain","NAME_ES":"España","NAME_FA":"اسپانیا","NAME_FR":"Espagne","NAME_EL":"Ισπανία","NAME_HE":"ספרד","NAME_HI":"स्पेन","NAME_HU":"Spanyolország","NAME_ID":"Spanyol","NAME_IT":"Spagna","NAME_JA":"スペイン","NAME_KO":"스페인","NAME_NL":"Spanje","NAME_PL":"Hiszpania","NAME_PT":"Espanha","NAME_RU":"Испания","NAME_SV":"Spanien","NAME_TR":"İspanya","NAME_UK":"Іспанія","NAME_UR":"ہسپانیہ","NAME_VI":"Tây Ban Nha","NAME_ZH":"西班牙","NAME_ZHT":"西班牙","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-9.392884,35.94685,3.039484,43.748338],"geometry":{"type":"Polygon","coordinates":[[[-7.453726,37.097788],[-7.537105,37.428904],[-7.166508,37.803894],[-7.029281,38.075764],[-7.374092,38.373059],[-7.098037,39.030073],[-7.498632,39.629571],[-7.066592,39.711892],[-7.026413,40.184524],[-6.86402,40.330872],[-6.851127,41.111083],[-6.389088,41.381815],[-6.668606,41.883387],[-7.251309,41.918346],[-7.422513,41.792075],[-8.013175,41.790886],[-8.263857,42.280469],[-8.671946,42.134689],[-9.034818,41.880571],[-8.984433,42.592775],[-9.392884,43.026625],[-7.97819,43.748338],[-6.754492,43.567909],[-5.411886,43.57424],[-4.347843,43.403449],[-3.517532,43.455901],[-1.901351,43.422802],[-1.502771,43.034014],[0.338047,42.579546],[0.701591,42.795734],[1.826793,42.343385],[2.985999,42.473015],[3.039484,41.89212],[2.091842,41.226089],[0.810525,41.014732],[0.721331,40.678318],[0.106692,40.123934],[-0.278711,39.309978],[0.111291,38.738514],[-0.467124,38.292366],[-0.683389,37.642354],[-1.438382,37.443064],[-2.146453,36.674144],[-3.415781,36.6589],[-4.368901,36.677839],[-4.995219,36.324708],[-5.37716,35.94685],[-5.866432,36.029817],[-6.236694,36.367677],[-6.520191,36.942913],[-7.453726,37.097788]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Ireland","SOV_A3":"IRL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Ireland","ADM0_A3":"IRL","GEOU_DIF":0,"GEOUNIT":"Ireland","GU_A3":"IRL","SU_DIF":0,"SUBUNIT":"Ireland","SU_A3":"IRL","BRK_DIFF":0,"NAME":"Ireland","NAME_LONG":"Ireland","BRK_A3":"IRL","BRK_NAME":"Ireland","BRK_GROUP":null,"ABBREV":"Ire.","POSTAL":"IRL","FORMAL_EN":"Ireland","FORMAL_FR":null,"NAME_CIAWF":"Ireland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ireland","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":4941444,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":388698,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"EI","ISO_A2":"IE","ISO_A2_EH":"IE","ISO_A3":"IRL","ISO_A3_EH":"IRL","ISO_N3":"372","ISO_N3_EH":"372","UN_A3":"372","WB_A2":"IE","WB_A3":"IRL","WOE_ID":23424803,"WOE_ID_EH":23424803,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"IRL","ADM0_DIFF":null,"ADM0_TLC":"IRL","ADM0_A3_US":"IRL","ADM0_A3_FR":"IRL","ADM0_A3_RU":"IRL","ADM0_A3_ES":"IRL","ADM0_A3_CN":"IRL","ADM0_A3_TW":"IRL","ADM0_A3_IN":"IRL","ADM0_A3_NP":"IRL","ADM0_A3_PK":"IRL","ADM0_A3_DE":"IRL","ADM0_A3_GB":"IRL","ADM0_A3_BR":"IRL","ADM0_A3_IL":"IRL","ADM0_A3_PS":"IRL","ADM0_A3_SA":"IRL","ADM0_A3_EG":"IRL","ADM0_A3_MA":"IRL","ADM0_A3_PT":"IRL","ADM0_A3_AR":"IRL","ADM0_A3_JP":"IRL","ADM0_A3_KO":"IRL","ADM0_A3_VN":"IRL","ADM0_A3_TR":"IRL","ADM0_A3_ID":"IRL","ADM0_A3_PL":"IRL","ADM0_A3_GR":"IRL","ADM0_A3_IT":"IRL","ADM0_A3_NL":"IRL","ADM0_A3_SE":"IRL","ADM0_A3_BD":"IRL","ADM0_A3_UA":"IRL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-7.798588,"LABEL_Y":53.078726,"NE_ID":1159320877,"WIKIDATAID":"Q27","NAME_AR":"جمهورية أيرلندا","NAME_BN":"প্রজাতন্ত্রী আয়ারল্যান্ড","NAME_DE":"Irland","NAME_EN":"Ireland","NAME_ES":"Irlanda","NAME_FA":"ایرلند","NAME_FR":"Irlande","NAME_EL":"Δημοκρατία της Ιρλανδίας","NAME_HE":"אירלנד","NAME_HI":"आयरलैण्ड","NAME_HU":"Írország","NAME_ID":"Republik Irlandia","NAME_IT":"Irlanda","NAME_JA":"アイルランド","NAME_KO":"아일랜드","NAME_NL":"Ierland","NAME_PL":"Irlandia","NAME_PT":"República da Irlanda","NAME_RU":"Ирландия","NAME_SV":"Irland","NAME_TR":"İrlanda","NAME_UK":"Ірландія","NAME_UR":"جمہوریہ آئرلینڈ","NAME_VI":"Cộng hòa Ireland","NAME_ZH":"爱尔兰","NAME_ZHT":"愛爾蘭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-9.977086,51.669301,-6.032985,55.131622],"geometry":{"type":"Polygon","coordinates":[[[-6.197885,53.867565],[-6.032985,53.153164],[-6.788857,52.260118],[-8.561617,51.669301],[-9.977086,51.820455],[-9.166283,52.864629],[-9.688525,53.881363],[-8.327987,54.664519],[-7.572168,55.131622],[-7.366031,54.595841],[-7.572168,54.059956],[-6.95373,54.073702],[-6.197885,53.867565]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"France","SOV_A3":"FR1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Dependency","TLC":"1","ADMIN":"New Caledonia","ADM0_A3":"NCL","GEOU_DIF":0,"GEOUNIT":"New Caledonia","GU_A3":"NCL","SU_DIF":0,"SUBUNIT":"New Caledonia","SU_A3":"NCL","BRK_DIFF":0,"NAME":"New Caledonia","NAME_LONG":"New Caledonia","BRK_A3":"NCL","BRK_NAME":"New Caledonia","BRK_GROUP":null,"ABBREV":"New C.","POSTAL":"NC","FORMAL_EN":"New Caledonia","FORMAL_FR":"Nouvelle-Calédonie","NAME_CIAWF":"New Caledonia","NOTE_ADM0":"Fr.","NOTE_BRK":null,"NAME_SORT":"New Caledonia","NAME_ALT":null,"MAPCOLOR7":7,"MAPCOLOR8":5,"MAPCOLOR9":9,"MAPCOLOR13":11,"POP_EST":287800,"POP_RANK":10,"POP_YEAR":2019,"GDP_MD":10770,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"NC","ISO_A2":"NC","ISO_A2_EH":"NC","ISO_A3":"NCL","ISO_A3_EH":"NCL","ISO_N3":"540","ISO_N3_EH":"540","UN_A3":"540","WB_A2":"NC","WB_A3":"NCL","WOE_ID":23424903,"WOE_ID_EH":23424903,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"NCL","ADM0_DIFF":null,"ADM0_TLC":"NCL","ADM0_A3_US":"NCL","ADM0_A3_FR":"NCL","ADM0_A3_RU":"NCL","ADM0_A3_ES":"NCL","ADM0_A3_CN":"NCL","ADM0_A3_TW":"NCL","ADM0_A3_IN":"NCL","ADM0_A3_NP":"NCL","ADM0_A3_PK":"NCL","ADM0_A3_DE":"NCL","ADM0_A3_GB":"NCL","ADM0_A3_BR":"NCL","ADM0_A3_IL":"NCL","ADM0_A3_PS":"NCL","ADM0_A3_SA":"NCL","ADM0_A3_EG":"NCL","ADM0_A3_MA":"NCL","ADM0_A3_PT":"NCL","ADM0_A3_AR":"NCL","ADM0_A3_JP":"NCL","ADM0_A3_KO":"NCL","ADM0_A3_VN":"NCL","ADM0_A3_TR":"NCL","ADM0_A3_ID":"NCL","ADM0_A3_PL":"NCL","ADM0_A3_GR":"NCL","ADM0_A3_IT":"NCL","ADM0_A3_NL":"NCL","ADM0_A3_SE":"NCL","ADM0_A3_BD":"NCL","ADM0_A3_UA":"NCL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":13,"LONG_LEN":13,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":4.6,"MAX_LABEL":8,"LABEL_X":165.084004,"LABEL_Y":-21.064697,"NE_ID":1159320641,"WIKIDATAID":"Q33788","NAME_AR":"كاليدونيا الجديدة","NAME_BN":"নতুন ক্যালিডোনিয়া","NAME_DE":"Neukaledonien","NAME_EN":"New Caledonia","NAME_ES":"Nueva Caledonia","NAME_FA":"کالدونیای جدید","NAME_FR":"Nouvelle-Calédonie","NAME_EL":"Νέα Καληδονία","NAME_HE":"קלדוניה החדשה","NAME_HI":"नया कैलेडोनिया","NAME_HU":"Új-Kaledónia","NAME_ID":"Kaledonia Baru","NAME_IT":"Nuova Caledonia","NAME_JA":"ニューカレドニア","NAME_KO":"누벨칼레도니","NAME_NL":"Nieuw-Caledonië","NAME_PL":"Nowa Kaledonia","NAME_PT":"Nova Caledónia","NAME_RU":"Новая Каледония","NAME_SV":"Nya Kaledonien","NAME_TR":"Yeni Kaledonya","NAME_UK":"Нова Каледонія","NAME_UR":"نیو کیلیڈونیا","NAME_VI":"Nouvelle-Calédonie","NAME_ZH":"新喀里多尼亚","NAME_ZHT":"新喀里多尼亞","FCLASS_ISO":"Admin-0 dependency","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 dependency","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[164.029606,-22.399976,167.120011,-20.105646],"geometry":{"type":"Polygon","coordinates":[[[165.77999,-21.080005],[166.599991,-21.700019],[167.120011,-22.159991],[166.740035,-22.399976],[166.189732,-22.129708],[165.474375,-21.679607],[164.829815,-21.14982],[164.167995,-20.444747],[164.029606,-20.105646],[164.459967,-20.120012],[165.020036,-20.459991],[165.460009,-20.800022],[165.77999,-21.080005]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Solomon Islands","SOV_A3":"SLB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Solomon Islands","ADM0_A3":"SLB","GEOU_DIF":0,"GEOUNIT":"Solomon Islands","GU_A3":"SLB","SU_DIF":0,"SUBUNIT":"Solomon Islands","SU_A3":"SLB","BRK_DIFF":0,"NAME":"Solomon Is.","NAME_LONG":"Solomon Islands","BRK_A3":"SLB","BRK_NAME":"Solomon Is.","BRK_GROUP":null,"ABBREV":"S. Is.","POSTAL":"SB","FORMAL_EN":null,"FORMAL_FR":null,"NAME_CIAWF":"Solomon Islands","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Solomon Islands","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":6,"POP_EST":669823,"POP_RANK":11,"POP_YEAR":2019,"GDP_MD":1589,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"BP","ISO_A2":"SB","ISO_A2_EH":"SB","ISO_A3":"SLB","ISO_A3_EH":"SLB","ISO_N3":"090","ISO_N3_EH":"090","UN_A3":"090","WB_A2":"SB","WB_A3":"SLB","WOE_ID":23424766,"WOE_ID_EH":23424766,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SLB","ADM0_DIFF":null,"ADM0_TLC":"SLB","ADM0_A3_US":"SLB","ADM0_A3_FR":"SLB","ADM0_A3_RU":"SLB","ADM0_A3_ES":"SLB","ADM0_A3_CN":"SLB","ADM0_A3_TW":"SLB","ADM0_A3_IN":"SLB","ADM0_A3_NP":"SLB","ADM0_A3_PK":"SLB","ADM0_A3_DE":"SLB","ADM0_A3_GB":"SLB","ADM0_A3_BR":"SLB","ADM0_A3_IL":"SLB","ADM0_A3_PS":"SLB","ADM0_A3_SA":"SLB","ADM0_A3_EG":"SLB","ADM0_A3_MA":"SLB","ADM0_A3_PT":"SLB","ADM0_A3_AR":"SLB","ADM0_A3_JP":"SLB","ADM0_A3_KO":"SLB","ADM0_A3_VN":"SLB","ADM0_A3_TR":"SLB","ADM0_A3_ID":"SLB","ADM0_A3_PL":"SLB","ADM0_A3_GR":"SLB","ADM0_A3_IT":"SLB","ADM0_A3_NL":"SLB","ADM0_A3_SE":"SLB","ADM0_A3_BD":"SLB","ADM0_A3_UA":"SLB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":15,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":159.170468,"LABEL_Y":-8.029548,"NE_ID":1159321249,"WIKIDATAID":"Q685","NAME_AR":"جزر سليمان","NAME_BN":"সলোমন দ্বীপপুঞ্জ","NAME_DE":"Salomonen","NAME_EN":"Solomon Islands","NAME_ES":"Islas Salomón","NAME_FA":"جزایر سلیمان","NAME_FR":"Îles Salomon","NAME_EL":"Νησιά Σολομώντα","NAME_HE":"איי שלמה","NAME_HI":"सोलोमन द्वीपसमूह","NAME_HU":"Salamon-szigetek","NAME_ID":"Kepulauan Solomon","NAME_IT":"Isole Salomone","NAME_JA":"ソロモン諸島","NAME_KO":"솔로몬 제도","NAME_NL":"Salomonseilanden","NAME_PL":"Wyspy Salomona","NAME_PT":"Ilhas Salomão","NAME_RU":"Соломоновы Острова","NAME_SV":"Salomonöarna","NAME_TR":"Solomon Adaları","NAME_UK":"Соломонові Острови","NAME_UR":"جزائر سلیمان","NAME_VI":"Quần đảo Solomon","NAME_ZH":"所罗门群岛","NAME_ZHT":"索羅門群島","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[156.491358,-10.826367,162.398646,-6.599338],"geometry":{"type":"MultiPolygon","coordinates":[[[[162.119025,-10.482719],[162.398646,-10.826367],[161.700032,-10.820011],[161.319797,-10.204751],[161.917383,-10.446701],[162.119025,-10.482719]]],[[[161.679982,-9.599982],[161.529397,-9.784312],[160.788253,-8.917543],[160.579997,-8.320009],[160.920028,-8.320009],[161.280006,-9.120011],[161.679982,-9.599982]]],[[[160.852229,-9.872937],[160.462588,-9.89521],[159.849447,-9.794027],[159.640003,-9.63998],[159.702945,-9.24295],[160.362956,-9.400304],[160.688518,-9.610162],[160.852229,-9.872937]]],[[[159.640003,-8.020027],[159.875027,-8.33732],[159.917402,-8.53829],[159.133677,-8.114181],[158.586114,-7.754824],[158.21115,-7.421872],[158.359978,-7.320018],[158.820001,-7.560003],[159.640003,-8.020027]]],[[[157.14,-7.021638],[157.538426,-7.34782],[157.33942,-7.404767],[156.90203,-7.176874],[156.491358,-6.765943],[156.542828,-6.599338],[157.14,-7.021638]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"New Zealand","SOV_A3":"NZ1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"New Zealand","ADM0_A3":"NZL","GEOU_DIF":0,"GEOUNIT":"New Zealand","GU_A3":"NZL","SU_DIF":0,"SUBUNIT":"New Zealand","SU_A3":"NZL","BRK_DIFF":0,"NAME":"New Zealand","NAME_LONG":"New Zealand","BRK_A3":"NZL","BRK_NAME":"New Zealand","BRK_GROUP":null,"ABBREV":"N.Z.","POSTAL":"NZ","FORMAL_EN":"New Zealand","FORMAL_FR":null,"NAME_CIAWF":"New Zealand","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"New Zealand","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":4,"POP_EST":4917000,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":206928,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"NZ","ISO_A2":"NZ","ISO_A2_EH":"NZ","ISO_A3":"NZL","ISO_A3_EH":"NZL","ISO_N3":"554","ISO_N3_EH":"554","UN_A3":"554","WB_A2":"NZ","WB_A3":"NZL","WOE_ID":23424916,"WOE_ID_EH":23424916,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"NZL","ADM0_DIFF":null,"ADM0_TLC":"NZL","ADM0_A3_US":"NZL","ADM0_A3_FR":"NZL","ADM0_A3_RU":"NZL","ADM0_A3_ES":"NZL","ADM0_A3_CN":"NZL","ADM0_A3_TW":"NZL","ADM0_A3_IN":"NZL","ADM0_A3_NP":"NZL","ADM0_A3_PK":"NZL","ADM0_A3_DE":"NZL","ADM0_A3_GB":"NZL","ADM0_A3_BR":"NZL","ADM0_A3_IL":"NZL","ADM0_A3_PS":"NZL","ADM0_A3_SA":"NZL","ADM0_A3_EG":"NZL","ADM0_A3_MA":"NZL","ADM0_A3_PT":"NZL","ADM0_A3_AR":"NZL","ADM0_A3_JP":"NZL","ADM0_A3_KO":"NZL","ADM0_A3_VN":"NZL","ADM0_A3_TR":"NZL","ADM0_A3_ID":"NZL","ADM0_A3_PL":"NZL","ADM0_A3_GR":"NZL","ADM0_A3_IT":"NZL","ADM0_A3_NL":"NZL","ADM0_A3_SE":"NZL","ADM0_A3_BD":"NZL","ADM0_A3_UA":"NZL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Australia and New Zealand","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":6.7,"LABEL_X":172.787,"LABEL_Y":-39.759,"NE_ID":1159321135,"WIKIDATAID":"Q664","NAME_AR":"نيوزيلندا","NAME_BN":"নিউজিল্যান্ড","NAME_DE":"Neuseeland","NAME_EN":"New Zealand","NAME_ES":"Nueva Zelanda","NAME_FA":"نیوزیلند","NAME_FR":"Nouvelle-Zélande","NAME_EL":"Νέα Ζηλανδία","NAME_HE":"ניו זילנד","NAME_HI":"न्यूज़ीलैण्ड","NAME_HU":"Új-Zéland","NAME_ID":"Selandia Baru","NAME_IT":"Nuova Zelanda","NAME_JA":"ニュージーランド","NAME_KO":"뉴질랜드","NAME_NL":"Nieuw-Zeeland","NAME_PL":"Nowa Zelandia","NAME_PT":"Nova Zelândia","NAME_RU":"Новая Зеландия","NAME_SV":"Nya Zeeland","NAME_TR":"Yeni Zelanda","NAME_UK":"Нова Зеландія","NAME_UR":"نیوزی لینڈ","NAME_VI":"New Zealand","NAME_ZH":"新西兰","NAME_ZHT":"新西蘭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[166.509144,-46.641235,178.517094,-34.450662],"geometry":{"type":"MultiPolygon","coordinates":[[[[176.885824,-40.065978],[176.508017,-40.604808],[176.01244,-41.289624],[175.239567,-41.688308],[175.067898,-41.425895],[174.650973,-41.281821],[175.22763,-40.459236],[174.900157,-39.908933],[173.824047,-39.508854],[173.852262,-39.146602],[174.574802,-38.797683],[174.743474,-38.027808],[174.697017,-37.381129],[174.292028,-36.711092],[174.319004,-36.534824],[173.840997,-36.121981],[173.054171,-35.237125],[172.636005,-34.529107],[173.007042,-34.450662],[173.551298,-35.006183],[174.32939,-35.265496],[174.612009,-36.156397],[175.336616,-37.209098],[175.357596,-36.526194],[175.808887,-36.798942],[175.95849,-37.555382],[176.763195,-37.881253],[177.438813,-37.961248],[178.010354,-37.579825],[178.517094,-37.695373],[178.274731,-38.582813],[177.97046,-39.166343],[177.206993,-39.145776],[176.939981,-39.449736],[177.032946,-39.879943],[176.885824,-40.065978]]],[[[169.667815,-43.555326],[170.52492,-43.031688],[171.12509,-42.512754],[171.569714,-41.767424],[171.948709,-41.514417],[172.097227,-40.956104],[172.79858,-40.493962],[173.020375,-40.919052],[173.247234,-41.331999],[173.958405,-40.926701],[174.247587,-41.349155],[174.248517,-41.770008],[173.876447,-42.233184],[173.22274,-42.970038],[172.711246,-43.372288],[173.080113,-43.853344],[172.308584,-43.865694],[171.452925,-44.242519],[171.185138,-44.897104],[170.616697,-45.908929],[169.831422,-46.355775],[169.332331,-46.641235],[168.411354,-46.619945],[167.763745,-46.290197],[166.676886,-46.219917],[166.509144,-45.852705],[167.046424,-45.110941],[168.303763,-44.123973],[168.949409,-43.935819],[169.667815,-43.555326]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Australia","SOV_A3":"AU1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"Australia","ADM0_A3":"AUS","GEOU_DIF":0,"GEOUNIT":"Australia","GU_A3":"AUS","SU_DIF":0,"SUBUNIT":"Australia","SU_A3":"AUS","BRK_DIFF":0,"NAME":"Australia","NAME_LONG":"Australia","BRK_A3":"AUS","BRK_NAME":"Australia","BRK_GROUP":null,"ABBREV":"Auz.","POSTAL":"AU","FORMAL_EN":"Commonwealth of Australia","FORMAL_FR":null,"NAME_CIAWF":"Australia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Australia","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":7,"POP_EST":25364307,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":1396567,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"AS","ISO_A2":"AU","ISO_A2_EH":"AU","ISO_A3":"AUS","ISO_A3_EH":"AUS","ISO_N3":"036","ISO_N3_EH":"036","UN_A3":"036","WB_A2":"AU","WB_A3":"AUS","WOE_ID":-90,"WOE_ID_EH":23424748,"WOE_NOTE":"Includes Ashmore and Cartier Islands (23424749) and Coral Sea Islands (23424790).","ADM0_ISO":"AUS","ADM0_DIFF":null,"ADM0_TLC":"AUS","ADM0_A3_US":"AUS","ADM0_A3_FR":"AUS","ADM0_A3_RU":"AUS","ADM0_A3_ES":"AUS","ADM0_A3_CN":"AUS","ADM0_A3_TW":"AUS","ADM0_A3_IN":"AUS","ADM0_A3_NP":"AUS","ADM0_A3_PK":"AUS","ADM0_A3_DE":"AUS","ADM0_A3_GB":"AUS","ADM0_A3_BR":"AUS","ADM0_A3_IL":"AUS","ADM0_A3_PS":"AUS","ADM0_A3_SA":"AUS","ADM0_A3_EG":"AUS","ADM0_A3_MA":"AUS","ADM0_A3_PT":"AUS","ADM0_A3_AR":"AUS","ADM0_A3_JP":"AUS","ADM0_A3_KO":"AUS","ADM0_A3_VN":"AUS","ADM0_A3_TR":"AUS","ADM0_A3_ID":"AUS","ADM0_A3_PL":"AUS","ADM0_A3_GR":"AUS","ADM0_A3_IT":"AUS","ADM0_A3_NL":"AUS","ADM0_A3_SE":"AUS","ADM0_A3_BD":"AUS","ADM0_A3_UA":"AUS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Australia and New Zealand","REGION_WB":"East Asia & Pacific","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7,"LABEL_X":134.04972,"LABEL_Y":-24.129522,"NE_ID":1159320355,"WIKIDATAID":"Q408","NAME_AR":"أستراليا","NAME_BN":"অস্ট্রেলিয়া","NAME_DE":"Australien","NAME_EN":"Australia","NAME_ES":"Australia","NAME_FA":"استرالیا","NAME_FR":"Australie","NAME_EL":"Αυστραλία","NAME_HE":"אוסטרליה","NAME_HI":"ऑस्ट्रेलिया","NAME_HU":"Ausztrália","NAME_ID":"Australia","NAME_IT":"Australia","NAME_JA":"オーストラリア","NAME_KO":"오스트레일리아","NAME_NL":"Australië","NAME_PL":"Australia","NAME_PT":"Austrália","NAME_RU":"Австралия","NAME_SV":"Australien","NAME_TR":"Avustralya","NAME_UK":"Австралія","NAME_UR":"آسٹریلیا","NAME_VI":"Úc","NAME_ZH":"澳大利亚","NAME_ZHT":"澳大利亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[113.338953,-43.634597,153.569469,-10.668186],"geometry":{"type":"MultiPolygon","coordinates":[[[[147.689259,-40.808258],[148.289068,-40.875438],[148.359865,-42.062445],[148.017301,-42.407024],[147.914052,-43.211522],[147.564564,-42.937689],[146.870343,-43.634597],[146.663327,-43.580854],[146.048378,-43.549745],[145.43193,-42.693776],[145.29509,-42.03361],[144.718071,-41.162552],[144.743755,-40.703975],[145.397978,-40.792549],[146.364121,-41.137695],[146.908584,-41.000546],[147.689259,-40.808258]]],[[[126.148714,-32.215966],[125.088623,-32.728751],[124.221648,-32.959487],[124.028947,-33.483847],[123.659667,-33.890179],[122.811036,-33.914467],[122.183064,-34.003402],[121.299191,-33.821036],[120.580268,-33.930177],[119.893695,-33.976065],[119.298899,-34.509366],[119.007341,-34.464149],[118.505718,-34.746819],[118.024972,-35.064733],[117.295507,-35.025459],[116.625109,-35.025097],[115.564347,-34.386428],[115.026809,-34.196517],[115.048616,-33.623425],[115.545123,-33.487258],[115.714674,-33.259572],[115.679379,-32.900369],[115.801645,-32.205062],[115.689611,-31.612437],[115.160909,-30.601594],[114.997043,-30.030725],[115.040038,-29.461095],[114.641974,-28.810231],[114.616498,-28.516399],[114.173579,-28.118077],[114.048884,-27.334765],[113.477498,-26.543134],[113.338953,-26.116545],[113.778358,-26.549025],[113.440962,-25.621278],[113.936901,-25.911235],[114.232852,-26.298446],[114.216161,-25.786281],[113.721255,-24.998939],[113.625344,-24.683971],[113.393523,-24.384764],[113.502044,-23.80635],[113.706993,-23.560215],[113.843418,-23.059987],[113.736552,-22.475475],[114.149756,-21.755881],[114.225307,-22.517488],[114.647762,-21.82952],[115.460167,-21.495173],[115.947373,-21.068688],[116.711615,-20.701682],[117.166316,-20.623599],[117.441545,-20.746899],[118.229559,-20.374208],[118.836085,-20.263311],[118.987807,-20.044203],[119.252494,-19.952942],[119.805225,-19.976506],[120.85622,-19.683708],[121.399856,-19.239756],[121.655138,-18.705318],[122.241665,-18.197649],[122.286624,-17.798603],[122.312772,-17.254967],[123.012574,-16.4052],[123.433789,-17.268558],[123.859345,-17.069035],[123.503242,-16.596506],[123.817073,-16.111316],[124.258287,-16.327944],[124.379726,-15.56706],[124.926153,-15.0751],[125.167275,-14.680396],[125.670087,-14.51007],[125.685796,-14.230656],[126.125149,-14.347341],[126.142823,-14.095987],[126.582589,-13.952791],[127.065867,-13.817968],[127.804633,-14.276906],[128.35969,-14.86917],[128.985543,-14.875991],[129.621473,-14.969784],[129.4096,-14.42067],[129.888641,-13.618703],[130.339466,-13.357376],[130.183506,-13.10752],[130.617795,-12.536392],[131.223495,-12.183649],[131.735091,-12.302453],[132.575298,-12.114041],[132.557212,-11.603012],[131.824698,-11.273782],[132.357224,-11.128519],[133.019561,-11.376411],[133.550846,-11.786515],[134.393068,-12.042365],[134.678632,-11.941183],[135.298491,-12.248606],[135.882693,-11.962267],[136.258381,-12.049342],[136.492475,-11.857209],[136.95162,-12.351959],[136.685125,-12.887223],[136.305407,-13.29123],[135.961758,-13.324509],[136.077617,-13.724278],[135.783836,-14.223989],[135.428664,-14.715432],[135.500184,-14.997741],[136.295175,-15.550265],[137.06536,-15.870762],[137.580471,-16.215082],[138.303217,-16.807604],[138.585164,-16.806622],[139.108543,-17.062679],[139.260575,-17.371601],[140.215245,-17.710805],[140.875463,-17.369069],[141.07111,-16.832047],[141.274095,-16.38887],[141.398222,-15.840532],[141.702183,-15.044921],[141.56338,-14.561333],[141.63552,-14.270395],[141.519869,-13.698078],[141.65092,-12.944688],[141.842691,-12.741548],[141.68699,-12.407614],[141.928629,-11.877466],[142.118488,-11.328042],[142.143706,-11.042737],[142.51526,-10.668186],[142.79731,-11.157355],[142.866763,-11.784707],[143.115947,-11.90563],[143.158632,-12.325656],[143.522124,-12.834358],[143.597158,-13.400422],[143.561811,-13.763656],[143.922099,-14.548311],[144.563714,-14.171176],[144.894908,-14.594458],[145.374724,-14.984976],[145.271991,-15.428205],[145.48526,-16.285672],[145.637033,-16.784918],[145.888904,-16.906926],[146.160309,-17.761655],[146.063674,-18.280073],[146.387478,-18.958274],[147.471082,-19.480723],[148.177602,-19.955939],[148.848414,-20.39121],[148.717465,-20.633469],[149.28942,-21.260511],[149.678337,-22.342512],[150.077382,-22.122784],[150.482939,-22.556142],[150.727265,-22.402405],[150.899554,-23.462237],[151.609175,-24.076256],[152.07354,-24.457887],[152.855197,-25.267501],[153.136162,-26.071173],[153.161949,-26.641319],[153.092909,-27.2603],[153.569469,-28.110067],[153.512108,-28.995077],[153.339095,-29.458202],[153.069241,-30.35024],[153.089602,-30.923642],[152.891578,-31.640446],[152.450002,-32.550003],[151.709117,-33.041342],[151.343972,-33.816023],[151.010555,-34.31036],[150.714139,-35.17346],[150.32822,-35.671879],[150.075212,-36.420206],[149.946124,-37.109052],[149.997284,-37.425261],[149.423882,-37.772681],[148.304622,-37.809061],[147.381733,-38.219217],[146.922123,-38.606532],[146.317922,-39.035757],[145.489652,-38.593768],[144.876976,-38.417448],[145.032212,-37.896188],[144.485682,-38.085324],[143.609974,-38.809465],[142.745427,-38.538268],[142.17833,-38.380034],[141.606582,-38.308514],[140.638579,-38.019333],[139.992158,-37.402936],[139.806588,-36.643603],[139.574148,-36.138362],[139.082808,-35.732754],[138.120748,-35.612296],[138.449462,-35.127261],[138.207564,-34.384723],[137.71917,-35.076825],[136.829406,-35.260535],[137.352371,-34.707339],[137.503886,-34.130268],[137.890116,-33.640479],[137.810328,-32.900007],[136.996837,-33.752771],[136.372069,-34.094766],[135.989043,-34.890118],[135.208213,-34.47867],[135.239218,-33.947953],[134.613417,-33.222778],[134.085904,-32.848072],[134.273903,-32.617234],[132.990777,-32.011224],[132.288081,-31.982647],[131.326331,-31.495803],[129.535794,-31.590423],[128.240938,-31.948489],[127.102867,-32.282267],[126.148714,-32.215966]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Sri Lanka","SOV_A3":"LKA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Sri Lanka","ADM0_A3":"LKA","GEOU_DIF":0,"GEOUNIT":"Sri Lanka","GU_A3":"LKA","SU_DIF":0,"SUBUNIT":"Sri Lanka","SU_A3":"LKA","BRK_DIFF":0,"NAME":"Sri Lanka","NAME_LONG":"Sri Lanka","BRK_A3":"LKA","BRK_NAME":"Sri Lanka","BRK_GROUP":null,"ABBREV":"Sri L.","POSTAL":"LK","FORMAL_EN":"Democratic Socialist Republic of Sri Lanka","FORMAL_FR":null,"NAME_CIAWF":"Sri Lanka","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Sri Lanka","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":4,"MAPCOLOR13":9,"POP_EST":21803000,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":84008,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"CE","ISO_A2":"LK","ISO_A2_EH":"LK","ISO_A3":"LKA","ISO_A3_EH":"LKA","ISO_N3":"144","ISO_N3_EH":"144","UN_A3":"144","WB_A2":"LK","WB_A3":"LKA","WOE_ID":23424778,"WOE_ID_EH":23424778,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LKA","ADM0_DIFF":null,"ADM0_TLC":"LKA","ADM0_A3_US":"LKA","ADM0_A3_FR":"LKA","ADM0_A3_RU":"LKA","ADM0_A3_ES":"LKA","ADM0_A3_CN":"LKA","ADM0_A3_TW":"LKA","ADM0_A3_IN":"LKA","ADM0_A3_NP":"LKA","ADM0_A3_PK":"LKA","ADM0_A3_DE":"LKA","ADM0_A3_GB":"LKA","ADM0_A3_BR":"LKA","ADM0_A3_IL":"LKA","ADM0_A3_PS":"LKA","ADM0_A3_SA":"LKA","ADM0_A3_EG":"LKA","ADM0_A3_MA":"LKA","ADM0_A3_PT":"LKA","ADM0_A3_AR":"LKA","ADM0_A3_JP":"LKA","ADM0_A3_KO":"LKA","ADM0_A3_VN":"LKA","ADM0_A3_TR":"LKA","ADM0_A3_ID":"LKA","ADM0_A3_PL":"LKA","ADM0_A3_GR":"LKA","ADM0_A3_IT":"LKA","ADM0_A3_NL":"LKA","ADM0_A3_SE":"LKA","ADM0_A3_BD":"LKA","ADM0_A3_UA":"LKA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":80.704823,"LABEL_Y":7.581097,"NE_ID":1159321025,"WIKIDATAID":"Q854","NAME_AR":"سريلانكا","NAME_BN":"শ্রীলঙ্কা","NAME_DE":"Sri Lanka","NAME_EN":"Sri Lanka","NAME_ES":"Sri Lanka","NAME_FA":"سریلانکا","NAME_FR":"Sri Lanka","NAME_EL":"Σρι Λάνκα","NAME_HE":"סרי לנקה","NAME_HI":"श्रीलंका","NAME_HU":"Srí Lanka","NAME_ID":"Sri Lanka","NAME_IT":"Sri Lanka","NAME_JA":"スリランカ","NAME_KO":"스리랑카","NAME_NL":"Sri Lanka","NAME_PL":"Sri Lanka","NAME_PT":"Sri Lanka","NAME_RU":"Шри-Ланка","NAME_SV":"Sri Lanka","NAME_TR":"Sri Lanka","NAME_UK":"Шрі-Ланка","NAME_UR":"سری لنکا","NAME_VI":"Sri Lanka","NAME_ZH":"斯里兰卡","NAME_ZHT":"斯里蘭卡","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[79.695167,5.96837,81.787959,9.824078],"geometry":{"type":"Polygon","coordinates":[[[81.787959,7.523055],[81.637322,6.481775],[81.21802,6.197141],[80.348357,5.96837],[79.872469,6.763463],[79.695167,8.200843],[80.147801,9.824078],[80.838818,9.268427],[81.304319,8.564206],[81.787959,7.523055]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"China","SOV_A3":"CH1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"China","ADM0_A3":"CHN","GEOU_DIF":0,"GEOUNIT":"China","GU_A3":"CHN","SU_DIF":0,"SUBUNIT":"China","SU_A3":"CHN","BRK_DIFF":0,"NAME":"China","NAME_LONG":"China","BRK_A3":"CHN","BRK_NAME":"China","BRK_GROUP":null,"ABBREV":"China","POSTAL":"CN","FORMAL_EN":"People's Republic of China","FORMAL_FR":null,"NAME_CIAWF":"China","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"China","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":3,"POP_EST":1397715000,"POP_RANK":18,"POP_YEAR":2019,"GDP_MD":14342903,"GDP_YEAR":2019,"ECONOMY":"3. Emerging region: BRIC","INCOME_GRP":"3. Upper middle income","FIPS_10":"CH","ISO_A2":"CN","ISO_A2_EH":"CN","ISO_A3":"CHN","ISO_A3_EH":"CHN","ISO_N3":"156","ISO_N3_EH":"156","UN_A3":"156","WB_A2":"CN","WB_A3":"CHN","WOE_ID":23424781,"WOE_ID_EH":23424781,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CHN","ADM0_DIFF":null,"ADM0_TLC":"CHN","ADM0_A3_US":"CHN","ADM0_A3_FR":"CHN","ADM0_A3_RU":"CHN","ADM0_A3_ES":"CHN","ADM0_A3_CN":"CHN","ADM0_A3_TW":"TWN","ADM0_A3_IN":"CHN","ADM0_A3_NP":"CHN","ADM0_A3_PK":"CHN","ADM0_A3_DE":"CHN","ADM0_A3_GB":"CHN","ADM0_A3_BR":"CHN","ADM0_A3_IL":"CHN","ADM0_A3_PS":"CHN","ADM0_A3_SA":"CHN","ADM0_A3_EG":"CHN","ADM0_A3_MA":"CHN","ADM0_A3_PT":"CHN","ADM0_A3_AR":"CHN","ADM0_A3_JP":"CHN","ADM0_A3_KO":"CHN","ADM0_A3_VN":"CHN","ADM0_A3_TR":"CHN","ADM0_A3_ID":"CHN","ADM0_A3_PL":"CHN","ADM0_A3_GR":"CHN","ADM0_A3_IT":"CHN","ADM0_A3_NL":"CHN","ADM0_A3_SE":"CHN","ADM0_A3_BD":"CHN","ADM0_A3_UA":"CHN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7,"LABEL_X":106.337289,"LABEL_Y":32.498178,"NE_ID":1159320471,"WIKIDATAID":"Q148","NAME_AR":"الصين","NAME_BN":"গণচীন","NAME_DE":"Volksrepublik China","NAME_EN":"People's Republic of China","NAME_ES":"China","NAME_FA":"جمهوری خلق چین","NAME_FR":"République populaire de Chine","NAME_EL":"Λαϊκή Δημοκρατία της Κίνας","NAME_HE":"הרפובליקה העממית של סין","NAME_HI":"चीनी जनवादी गणराज्य","NAME_HU":"Kína","NAME_ID":"Republik Rakyat Tiongkok","NAME_IT":"Cina","NAME_JA":"中華人民共和国","NAME_KO":"중화인민공화국","NAME_NL":"Volksrepubliek China","NAME_PL":"Chińska Republika Ludowa","NAME_PT":"China","NAME_RU":"Китайская Народная Республика","NAME_SV":"Kina","NAME_TR":"Çin Halk Cumhuriyeti","NAME_UK":"Китайська Народна Республіка","NAME_UR":"عوامی جمہوریہ چین","NAME_VI":"Trung Quốc","NAME_ZH":"中华人民共和国","NAME_ZHT":"中華人民共和國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":"Unrecognized","FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[73.675379,18.197701,135.026311,53.4588],"geometry":{"type":"MultiPolygon","coordinates":[[[[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395],[109.47521,18.197701]]],[[[80.25999,42.349999],[80.18015,42.920068],[80.866206,43.180362],[79.966106,44.917517],[81.947071,45.317027],[82.458926,45.53965],[83.180484,47.330031],[85.16429,47.000956],[85.720484,47.452969],[85.768233,48.455751],[86.598776,48.549182],[87.35997,49.214981],[87.751264,49.297198],[88.013832,48.599463],[88.854298,48.069082],[90.280826,47.693549],[90.970809,46.888146],[90.585768,45.719716],[90.94554,45.286073],[92.133891,45.115076],[93.480734,44.975472],[94.688929,44.352332],[95.306875,44.241331],[95.762455,43.319449],[96.349396,42.725635],[97.451757,42.74889],[99.515817,42.524691],[100.845866,42.663804],[101.83304,42.514873],[103.312278,41.907468],[104.522282,41.908347],[104.964994,41.59741],[106.129316,42.134328],[107.744773,42.481516],[109.243596,42.519446],[110.412103,42.871234],[111.129682,43.406834],[111.829588,43.743118],[111.667737,44.073176],[111.348377,44.457442],[111.873306,45.102079],[112.436062,45.011646],[113.463907,44.808893],[114.460332,45.339817],[115.985096,45.727235],[116.717868,46.388202],[117.421701,46.672733],[118.874326,46.805412],[119.66327,46.69268],[119.772824,47.048059],[118.866574,47.74706],[118.064143,48.06673],[117.295507,47.697709],[116.308953,47.85341],[115.742837,47.726545],[115.485282,48.135383],[116.191802,49.134598],[116.678801,49.888531],[117.879244,49.510983],[119.288461,50.142883],[119.27939,50.58292],[120.18208,51.64355],[120.7382,51.96411],[120.725789,52.516226],[120.177089,52.753886],[121.003085,53.251401],[122.245748,53.431726],[123.57147,53.4588],[125.068211,53.161045],[125.946349,52.792799],[126.564399,51.784255],[126.939157,51.353894],[127.287456,50.739797],[127.6574,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.98726,47.79013],[132.50669,47.78896],[133.373596,48.183442],[135.026311,48.47823],[134.50081,47.57845],[134.11235,47.21248],[133.769644,46.116927],[133.09712,45.14409],[131.883454,45.321162],[131.02519,44.96796],[131.288555,44.11152],[131.144688,42.92999],[130.633866,42.903015],[130.64,42.395024],[129.994267,42.985387],[129.596669,42.424982],[128.052215,41.994285],[128.208433,41.466772],[127.343783,41.503152],[126.869083,41.816569],[126.182045,41.107336],[125.079942,40.569824],[124.265625,39.928493],[122.86757,39.637788],[122.131388,39.170452],[121.054554,38.897471],[121.585995,39.360854],[121.376757,39.750261],[122.168595,40.422443],[121.640359,40.94639],[120.768629,40.593388],[119.639602,39.898056],[119.023464,39.252333],[118.042749,39.204274],[117.532702,38.737636],[118.059699,38.061476],[118.87815,37.897325],[118.911636,37.448464],[119.702802,37.156389],[120.823457,37.870428],[121.711259,37.481123],[122.357937,37.454484],[122.519995,36.930614],[121.104164,36.651329],[120.637009,36.11144],[119.664562,35.609791],[119.151208,34.909859],[120.227525,34.360332],[120.620369,33.376723],[121.229014,32.460319],[121.908146,31.692174],[121.891919,30.949352],[121.264257,30.676267],[121.503519,30.142915],[122.092114,29.83252],[121.938428,29.018022],[121.684439,28.225513],[121.125661,28.135673],[120.395473,27.053207],[119.585497,25.740781],[118.656871,24.547391],[117.281606,23.624501],[115.890735,22.782873],[114.763827,22.668074],[114.152547,22.22376],[113.80678,22.54834],[113.241078,22.051367],[111.843592,21.550494],[110.785466,21.397144],[110.444039,20.341033],[109.889861,20.282457],[109.627655,21.008227],[109.864488,21.395051],[108.522813,21.715212],[108.05018,21.55238],[107.04342,21.811899],[106.567273,22.218205],[106.725403,22.794268],[105.811247,22.976892],[105.329209,23.352063],[104.476858,22.81915],[103.504515,22.703757],[102.706992,22.708795],[102.170436,22.464753],[101.652018,22.318199],[101.80312,21.174367],[101.270026,21.201652],[101.180005,21.436573],[101.150033,21.849984],[100.416538,21.558839],[99.983489,21.742937],[99.240899,22.118314],[99.531992,22.949039],[98.898749,23.142722],[98.660262,24.063286],[97.60472,23.897405],[97.724609,25.083637],[98.671838,25.918703],[98.712094,26.743536],[98.68269,27.508812],[98.246231,27.747221],[97.911988,28.335945],[97.327114,28.261583],[96.248833,28.411031],[96.586591,28.83098],[96.117679,29.452802],[95.404802,29.031717],[94.56599,29.277438],[93.413348,28.640629],[92.503119,27.896876],[91.696657,27.771742],[91.258854,28.040614],[90.730514,28.064954],[90.015829,28.296439],[89.47581,28.042759],[88.814248,27.299316],[88.730326,28.086865],[88.120441,27.876542],[86.954517,27.974262],[85.82332,28.203576],[85.011638,28.642774],[84.23458,28.839894],[83.898993,29.320226],[83.337115,29.463732],[82.327513,30.115268],[81.525804,30.422717],[81.111256,30.183481],[79.721367,30.882715],[78.738894,31.515906],[78.458446,32.618164],[79.176129,32.48378],[79.208892,32.994395],[78.811086,33.506198],[78.912269,34.321936],[77.837451,35.49401],[76.192848,35.898403],[75.896897,36.666806],[75.158028,37.133031],[74.980002,37.41999],[74.829986,37.990007],[74.864816,38.378846],[74.257514,38.606507],[73.928852,38.505815],[73.675379,39.431237],[73.960013,39.660008],[73.822244,39.893973],[74.776862,40.366425],[75.467828,40.562072],[76.526368,40.427946],[76.904484,41.066486],[78.187197,41.185316],[78.543661,41.582243],[80.11943,42.123941],[80.25999,42.349999]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Taiwan","SOV_A3":"TWN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Taiwan","ADM0_A3":"TWN","GEOU_DIF":0,"GEOUNIT":"Taiwan","GU_A3":"TWN","SU_DIF":0,"SUBUNIT":"Taiwan","SU_A3":"TWN","BRK_DIFF":0,"NAME":"Taiwan","NAME_LONG":"Taiwan","BRK_A3":"TWN","BRK_NAME":"Taiwan","BRK_GROUP":null,"ABBREV":"Taiwan","POSTAL":"TW","FORMAL_EN":null,"FORMAL_FR":null,"NAME_CIAWF":"Taiwan","NOTE_ADM0":null,"NOTE_BRK":"Self admin.; Claimed by China","NAME_SORT":"Taiwan","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":7,"MAPCOLOR13":2,"POP_EST":23568378,"POP_RANK":15,"POP_YEAR":2020,"GDP_MD":1127000,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"TW","ISO_A2":"CN-TW","ISO_A2_EH":"TW","ISO_A3":"TWN","ISO_A3_EH":"TWN","ISO_N3":"158","ISO_N3_EH":"158","UN_A3":"-099","WB_A2":"-99","WB_A3":"-99","WOE_ID":23424971,"WOE_ID_EH":23424971,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TWN","ADM0_DIFF":null,"ADM0_TLC":"TWN","ADM0_A3_US":"TWN","ADM0_A3_FR":"TWN","ADM0_A3_RU":"CHN","ADM0_A3_ES":"TWN","ADM0_A3_CN":"CHN","ADM0_A3_TW":"TWN","ADM0_A3_IN":"TWN","ADM0_A3_NP":"CHN","ADM0_A3_PK":"CHN","ADM0_A3_DE":"TWN","ADM0_A3_GB":"TWN","ADM0_A3_BR":"TWN","ADM0_A3_IL":"TWN","ADM0_A3_PS":"TWN","ADM0_A3_SA":"TWN","ADM0_A3_EG":"CHN","ADM0_A3_MA":"CHN","ADM0_A3_PT":"TWN","ADM0_A3_AR":"TWN","ADM0_A3_JP":"TWN","ADM0_A3_KO":"TWN","ADM0_A3_VN":"TWN","ADM0_A3_TR":"TWN","ADM0_A3_ID":"CHN","ADM0_A3_PL":"TWN","ADM0_A3_GR":"TWN","ADM0_A3_IT":"TWN","ADM0_A3_NL":"TWN","ADM0_A3_SE":"TWN","ADM0_A3_BD":"CHN","ADM0_A3_UA":"TWN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":8,"LABEL_X":120.868204,"LABEL_Y":23.652408,"NE_ID":1159321335,"WIKIDATAID":"Q865","NAME_AR":"تايوان","NAME_BN":"তাইওয়ান","NAME_DE":"Republik China","NAME_EN":"Taiwan","NAME_ES":"República de China","NAME_FA":"تایوان","NAME_FR":"Taïwan","NAME_EL":"Δημοκρατία της Κίνας","NAME_HE":"טאיוואן","NAME_HI":"चीनी गणराज्य","NAME_HU":"Kínai Köztársaság","NAME_ID":"Taiwan","NAME_IT":"Taiwan","NAME_JA":"中華民国","NAME_KO":"중화민국","NAME_NL":"Taiwan","NAME_PL":"Republika Chińska","NAME_PT":"Taiwan","NAME_RU":"Тайвань","NAME_SV":"Taiwan","NAME_TR":"Çin Cumhuriyeti","NAME_UK":"Республіка Китай","NAME_UR":"تائیوان","NAME_VI":"Đài Loan","NAME_ZH":"中华民国","NAME_ZHT":"中華民國","FCLASS_ISO":"Admin-1 states provinces","TLC_DIFF":"1","FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":"Admin-1 states provinces","FCLASS_TW":"Admin-0 country","FCLASS_IN":null,"FCLASS_NP":"Admin-1 states provinces","FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":"Admin-1 states provinces","FCLASS_MA":"Admin-1 states provinces","FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":"Admin-1 states provinces","FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":"Admin-1 states provinces","FCLASS_UA":null},"bbox":[120.106189,21.970571,121.951244,25.295459],"geometry":{"type":"Polygon","coordinates":[[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Italy","SOV_A3":"ITA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Italy","ADM0_A3":"ITA","GEOU_DIF":0,"GEOUNIT":"Italy","GU_A3":"ITA","SU_DIF":0,"SUBUNIT":"Italy","SU_A3":"ITA","BRK_DIFF":0,"NAME":"Italy","NAME_LONG":"Italy","BRK_A3":"ITA","BRK_NAME":"Italy","BRK_GROUP":null,"ABBREV":"Italy","POSTAL":"I","FORMAL_EN":"Italian Republic","FORMAL_FR":null,"NAME_CIAWF":"Italy","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Italy","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":7,"MAPCOLOR9":8,"MAPCOLOR13":7,"POP_EST":60297396,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":2003576,"GDP_YEAR":2019,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","FIPS_10":"IT","ISO_A2":"IT","ISO_A2_EH":"IT","ISO_A3":"ITA","ISO_A3_EH":"ITA","ISO_N3":"380","ISO_N3_EH":"380","UN_A3":"380","WB_A2":"IT","WB_A3":"ITA","WOE_ID":23424853,"WOE_ID_EH":23424853,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ITA","ADM0_DIFF":null,"ADM0_TLC":"ITA","ADM0_A3_US":"ITA","ADM0_A3_FR":"ITA","ADM0_A3_RU":"ITA","ADM0_A3_ES":"ITA","ADM0_A3_CN":"ITA","ADM0_A3_TW":"ITA","ADM0_A3_IN":"ITA","ADM0_A3_NP":"ITA","ADM0_A3_PK":"ITA","ADM0_A3_DE":"ITA","ADM0_A3_GB":"ITA","ADM0_A3_BR":"ITA","ADM0_A3_IL":"ITA","ADM0_A3_PS":"ITA","ADM0_A3_SA":"ITA","ADM0_A3_EG":"ITA","ADM0_A3_MA":"ITA","ADM0_A3_PT":"ITA","ADM0_A3_AR":"ITA","ADM0_A3_JP":"ITA","ADM0_A3_KO":"ITA","ADM0_A3_VN":"ITA","ADM0_A3_TR":"ITA","ADM0_A3_ID":"ITA","ADM0_A3_PL":"ITA","ADM0_A3_GR":"ITA","ADM0_A3_IT":"ITA","ADM0_A3_NL":"ITA","ADM0_A3_SE":"ITA","ADM0_A3_BD":"ITA","ADM0_A3_UA":"ITA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":11.076907,"LABEL_Y":44.732482,"NE_ID":1159320919,"WIKIDATAID":"Q38","NAME_AR":"إيطاليا","NAME_BN":"ইতালি","NAME_DE":"Italien","NAME_EN":"Italy","NAME_ES":"Italia","NAME_FA":"ایتالیا","NAME_FR":"Italie","NAME_EL":"Ιταλία","NAME_HE":"איטליה","NAME_HI":"इटली","NAME_HU":"Olaszország","NAME_ID":"Italia","NAME_IT":"Italia","NAME_JA":"イタリア","NAME_KO":"이탈리아","NAME_NL":"Italië","NAME_PL":"Włochy","NAME_PT":"Itália","NAME_RU":"Италия","NAME_SV":"Italien","NAME_TR":"İtalya","NAME_UK":"Італія","NAME_UR":"اطالیہ","NAME_VI":"Ý","NAME_ZH":"意大利","NAME_ZHT":"義大利","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[6.749955,36.619987,18.480247,47.115393],"geometry":{"type":"MultiPolygon","coordinates":[[[[10.442701,46.893546],[11.048556,46.751359],[11.164828,46.941579],[12.153088,47.115393],[12.376485,46.767559],[13.806475,46.509306],[13.69811,46.016778],[13.93763,45.591016],[13.141606,45.736692],[12.328581,45.381778],[12.383875,44.885374],[12.261453,44.600482],[12.589237,44.091366],[13.526906,43.587727],[14.029821,42.761008],[15.14257,41.95514],[15.926191,41.961315],[16.169897,41.740295],[15.889346,41.541082],[16.785002,41.179606],[17.519169,40.877143],[18.376687,40.355625],[18.480247,40.168866],[18.293385,39.810774],[17.73838,40.277671],[16.869596,40.442235],[16.448743,39.795401],[17.17149,39.4247],[17.052841,38.902871],[16.635088,38.843572],[16.100961,37.985899],[15.684087,37.908849],[15.687963,38.214593],[15.891981,38.750942],[16.109332,38.964547],[15.718814,39.544072],[15.413613,40.048357],[14.998496,40.172949],[14.703268,40.60455],[14.060672,40.786348],[13.627985,41.188287],[12.888082,41.25309],[12.106683,41.704535],[11.191906,42.355425],[10.511948,42.931463],[10.200029,43.920007],[9.702488,44.036279],[8.888946,44.366336],[8.428561,44.231228],[7.850767,43.767148],[7.435185,43.693845],[7.549596,44.127901],[7.007562,44.254767],[6.749955,45.028518],[7.096652,45.333099],[6.802355,45.70858],[6.843593,45.991147],[7.273851,45.776948],[7.755992,45.82449],[8.31663,46.163642],[8.489952,46.005151],[8.966306,46.036932],[9.182882,46.440215],[9.922837,46.314899],[10.363378,46.483571],[10.442701,46.893546]]],[[[14.761249,38.143874],[15.520376,38.231155],[15.160243,37.444046],[15.309898,37.134219],[15.099988,36.619987],[14.335229,36.996631],[13.826733,37.104531],[12.431004,37.61295],[12.570944,38.126381],[13.741156,38.034966],[14.761249,38.143874]]],[[[8.709991,40.899984],[9.210012,41.209991],[9.809975,40.500009],[9.669519,39.177376],[9.214818,39.240473],[8.806936,38.906618],[8.428302,39.171847],[8.388253,40.378311],[8.159998,40.950007],[8.709991,40.899984]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Denmark","SOV_A3":"DN1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"Denmark","ADM0_A3":"DNK","GEOU_DIF":0,"GEOUNIT":"Denmark","GU_A3":"DNK","SU_DIF":0,"SUBUNIT":"Denmark","SU_A3":"DNK","BRK_DIFF":0,"NAME":"Denmark","NAME_LONG":"Denmark","BRK_A3":"DNK","BRK_NAME":"Denmark","BRK_GROUP":null,"ABBREV":"Den.","POSTAL":"DK","FORMAL_EN":"Kingdom of Denmark","FORMAL_FR":null,"NAME_CIAWF":"Denmark","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Denmark","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":12,"POP_EST":5818553,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":350104,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"DA","ISO_A2":"DK","ISO_A2_EH":"DK","ISO_A3":"DNK","ISO_A3_EH":"DNK","ISO_N3":"208","ISO_N3_EH":"208","UN_A3":"208","WB_A2":"DK","WB_A3":"DNK","WOE_ID":23424796,"WOE_ID_EH":23424796,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"DNK","ADM0_DIFF":null,"ADM0_TLC":"DNK","ADM0_A3_US":"DNK","ADM0_A3_FR":"DNK","ADM0_A3_RU":"DNK","ADM0_A3_ES":"DNK","ADM0_A3_CN":"DNK","ADM0_A3_TW":"DNK","ADM0_A3_IN":"DNK","ADM0_A3_NP":"DNK","ADM0_A3_PK":"DNK","ADM0_A3_DE":"DNK","ADM0_A3_GB":"DNK","ADM0_A3_BR":"DNK","ADM0_A3_IL":"DNK","ADM0_A3_PS":"DNK","ADM0_A3_SA":"DNK","ADM0_A3_EG":"DNK","ADM0_A3_MA":"DNK","ADM0_A3_PT":"DNK","ADM0_A3_AR":"DNK","ADM0_A3_JP":"DNK","ADM0_A3_KO":"DNK","ADM0_A3_VN":"DNK","ADM0_A3_TR":"DNK","ADM0_A3_ID":"DNK","ADM0_A3_PL":"DNK","ADM0_A3_GR":"DNK","ADM0_A3_IT":"DNK","ADM0_A3_NL":"DNK","ADM0_A3_SE":"DNK","ADM0_A3_BD":"DNK","ADM0_A3_UA":"DNK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":9.018163,"LABEL_Y":55.966965,"NE_ID":1159320547,"WIKIDATAID":"Q35","NAME_AR":"الدنمارك","NAME_BN":"ডেনমার্ক","NAME_DE":"Dänemark","NAME_EN":"Denmark","NAME_ES":"Dinamarca","NAME_FA":"دانمارک","NAME_FR":"Danemark","NAME_EL":"Δανία","NAME_HE":"דנמרק","NAME_HI":"डेनमार्क","NAME_HU":"Dánia","NAME_ID":"Denmark","NAME_IT":"Danimarca","NAME_JA":"デンマーク","NAME_KO":"덴마크","NAME_NL":"Denemarken","NAME_PL":"Dania","NAME_PT":"Dinamarca","NAME_RU":"Дания","NAME_SV":"Danmark","NAME_TR":"Danimarka","NAME_UK":"Данія","NAME_UR":"ڈنمارک","NAME_VI":"Đan Mạch","NAME_ZH":"丹麦","NAME_ZHT":"丹麥","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[8.089977,54.800015,12.690006,57.730017],"geometry":{"type":"MultiPolygon","coordinates":[[[[9.921906,54.983104],[9.282049,54.830865],[8.526229,54.962744],[8.120311,55.517723],[8.089977,56.540012],[8.256582,56.809969],[8.543438,57.110003],[9.424469,57.172066],[9.775559,57.447941],[10.580006,57.730017],[10.546106,57.215733],[10.25,56.890016],[10.369993,56.609982],[10.912182,56.458621],[10.667804,56.081383],[10.369993,56.190007],[9.649985,55.469999],[9.921906,54.983104]]],[[[12.370904,56.111407],[12.690006,55.609991],[12.089991,54.800015],[11.043543,55.364864],[10.903914,55.779955],[12.370904,56.111407]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"United Kingdom","SOV_A3":"GB1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"United Kingdom","ADM0_A3":"GBR","GEOU_DIF":0,"GEOUNIT":"United Kingdom","GU_A3":"GBR","SU_DIF":0,"SUBUNIT":"United Kingdom","SU_A3":"GBR","BRK_DIFF":0,"NAME":"United Kingdom","NAME_LONG":"United Kingdom","BRK_A3":"GBR","BRK_NAME":"United Kingdom","BRK_GROUP":null,"ABBREV":"U.K.","POSTAL":"GB","FORMAL_EN":"United Kingdom of Great Britain and Northern Ireland","FORMAL_FR":null,"NAME_CIAWF":"United Kingdom","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"United Kingdom","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":66834405,"POP_RANK":16,"POP_YEAR":2019,"GDP_MD":2829108,"GDP_YEAR":2019,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","FIPS_10":"UK","ISO_A2":"GB","ISO_A2_EH":"GB","ISO_A3":"GBR","ISO_A3_EH":"GBR","ISO_N3":"826","ISO_N3_EH":"826","UN_A3":"826","WB_A2":"GB","WB_A3":"GBR","WOE_ID":-90,"WOE_ID_EH":23424975,"WOE_NOTE":"Eh ID includes Channel Islands and Isle of Man. UK constituent countries of England (24554868), Wales (12578049), Scotland (12578048), and Northern Ireland (20070563).","ADM0_ISO":"GBR","ADM0_DIFF":null,"ADM0_TLC":"GBR","ADM0_A3_US":"GBR","ADM0_A3_FR":"GBR","ADM0_A3_RU":"GBR","ADM0_A3_ES":"GBR","ADM0_A3_CN":"GBR","ADM0_A3_TW":"GBR","ADM0_A3_IN":"GBR","ADM0_A3_NP":"GBR","ADM0_A3_PK":"GBR","ADM0_A3_DE":"GBR","ADM0_A3_GB":"GBR","ADM0_A3_BR":"GBR","ADM0_A3_IL":"GBR","ADM0_A3_PS":"GBR","ADM0_A3_SA":"GBR","ADM0_A3_EG":"GBR","ADM0_A3_MA":"GBR","ADM0_A3_PT":"GBR","ADM0_A3_AR":"GBR","ADM0_A3_JP":"GBR","ADM0_A3_KO":"GBR","ADM0_A3_VN":"GBR","ADM0_A3_TR":"GBR","ADM0_A3_ID":"GBR","ADM0_A3_PL":"GBR","ADM0_A3_GR":"GBR","ADM0_A3_IT":"GBR","ADM0_A3_NL":"GBR","ADM0_A3_SE":"GBR","ADM0_A3_BD":"GBR","ADM0_A3_UA":"GBR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":14,"LONG_LEN":14,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":-2.116346,"LABEL_Y":54.402739,"NE_ID":1159320713,"WIKIDATAID":"Q145","NAME_AR":"المملكة المتحدة","NAME_BN":"যুক্তরাজ্য","NAME_DE":"Vereinigtes Königreich","NAME_EN":"United Kingdom","NAME_ES":"Reino Unido","NAME_FA":"بریتانیا","NAME_FR":"Royaume-Uni","NAME_EL":"Ηνωμένο Βασίλειο","NAME_HE":"הממלכה המאוחדת","NAME_HI":"यूनाइटेड किंगडम","NAME_HU":"Egyesült Királyság","NAME_ID":"Britania Raya","NAME_IT":"Regno Unito","NAME_JA":"イギリス","NAME_KO":"영국","NAME_NL":"Verenigd Koninkrijk","NAME_PL":"Wielka Brytania","NAME_PT":"Reino Unido","NAME_RU":"Великобритания","NAME_SV":"Storbritannien","NAME_TR":"Birleşik Krallık","NAME_UK":"Велика Британія","NAME_UR":"مملکت متحدہ","NAME_VI":"Vương quốc Liên hiệp Anh và Bắc Ireland","NAME_ZH":"英国","NAME_ZHT":"英國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-7.572168,49.96,1.681531,58.635],"geometry":{"type":"MultiPolygon","coordinates":[[[[-6.197885,53.867565],[-6.95373,54.073702],[-7.572168,54.059956],[-7.366031,54.595841],[-7.572168,55.131622],[-6.733847,55.17286],[-5.661949,54.554603],[-6.197885,53.867565]]],[[[-3.093831,53.404547],[-3.09208,53.404441],[-2.945009,53.985],[-3.614701,54.600937],[-3.630005,54.615013],[-4.844169,54.790971],[-5.082527,55.061601],[-4.719112,55.508473],[-5.047981,55.783986],[-5.586398,55.311146],[-5.644999,56.275015],[-6.149981,56.78501],[-5.786825,57.818848],[-5.009999,58.630013],[-4.211495,58.550845],[-3.005005,58.635],[-4.073828,57.553025],[-3.055002,57.690019],[-1.959281,57.6848],[-2.219988,56.870017],[-3.119003,55.973793],[-2.085009,55.909998],[-2.005676,55.804903],[-1.114991,54.624986],[-0.430485,54.464376],[0.184981,53.325014],[0.469977,52.929999],[1.681531,52.73952],[1.559988,52.099998],[1.050562,51.806761],[1.449865,51.289428],[0.550334,50.765739],[-0.787517,50.774989],[-2.489998,50.500019],[-2.956274,50.69688],[-3.617448,50.228356],[-4.542508,50.341837],[-5.245023,49.96],[-5.776567,50.159678],[-4.30999,51.210001],[-3.414851,51.426009],[-3.422719,51.426848],[-4.984367,51.593466],[-5.267296,51.9914],[-4.222347,52.301356],[-4.770013,52.840005],[-4.579999,53.495004],[-3.093831,53.404547]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Iceland","SOV_A3":"ISL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Iceland","ADM0_A3":"ISL","GEOU_DIF":0,"GEOUNIT":"Iceland","GU_A3":"ISL","SU_DIF":0,"SUBUNIT":"Iceland","SU_A3":"ISL","BRK_DIFF":0,"NAME":"Iceland","NAME_LONG":"Iceland","BRK_A3":"ISL","BRK_NAME":"Iceland","BRK_GROUP":null,"ABBREV":"Iceland","POSTAL":"IS","FORMAL_EN":"Republic of Iceland","FORMAL_FR":null,"NAME_CIAWF":"Iceland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Iceland","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":9,"POP_EST":361313,"POP_RANK":10,"POP_YEAR":2019,"GDP_MD":24188,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"IC","ISO_A2":"IS","ISO_A2_EH":"IS","ISO_A3":"ISL","ISO_A3_EH":"ISL","ISO_N3":"352","ISO_N3_EH":"352","UN_A3":"352","WB_A2":"IS","WB_A3":"ISL","WOE_ID":23424845,"WOE_ID_EH":23424845,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ISL","ADM0_DIFF":null,"ADM0_TLC":"ISL","ADM0_A3_US":"ISL","ADM0_A3_FR":"ISL","ADM0_A3_RU":"ISL","ADM0_A3_ES":"ISL","ADM0_A3_CN":"ISL","ADM0_A3_TW":"ISL","ADM0_A3_IN":"ISL","ADM0_A3_NP":"ISL","ADM0_A3_PK":"ISL","ADM0_A3_DE":"ISL","ADM0_A3_GB":"ISL","ADM0_A3_BR":"ISL","ADM0_A3_IL":"ISL","ADM0_A3_PS":"ISL","ADM0_A3_SA":"ISL","ADM0_A3_EG":"ISL","ADM0_A3_MA":"ISL","ADM0_A3_PT":"ISL","ADM0_A3_AR":"ISL","ADM0_A3_JP":"ISL","ADM0_A3_KO":"ISL","ADM0_A3_VN":"ISL","ADM0_A3_TR":"ISL","ADM0_A3_ID":"ISL","ADM0_A3_PL":"ISL","ADM0_A3_GR":"ISL","ADM0_A3_IT":"ISL","ADM0_A3_NL":"ISL","ADM0_A3_SE":"ISL","ADM0_A3_BD":"ISL","ADM0_A3_UA":"ISL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":-18.673711,"LABEL_Y":64.779286,"NE_ID":1159320917,"WIKIDATAID":"Q189","NAME_AR":"آيسلندا","NAME_BN":"আইসল্যান্ড","NAME_DE":"Island","NAME_EN":"Iceland","NAME_ES":"Islandia","NAME_FA":"ایسلند","NAME_FR":"Islande","NAME_EL":"Ισλανδία","NAME_HE":"איסלנד","NAME_HI":"आइसलैण्ड","NAME_HU":"Izland","NAME_ID":"Islandia","NAME_IT":"Islanda","NAME_JA":"アイスランド","NAME_KO":"아이슬란드","NAME_NL":"IJsland","NAME_PL":"Islandia","NAME_PT":"Islândia","NAME_RU":"Исландия","NAME_SV":"Island","NAME_TR":"İzlanda","NAME_UK":"Ісландія","NAME_UR":"آئس لینڈ","NAME_VI":"Iceland","NAME_ZH":"冰岛","NAME_ZHT":"冰島","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-24.326184,63.496383,-13.609732,66.526792],"geometry":{"type":"Polygon","coordinates":[[[-14.508695,66.455892],[-14.739637,65.808748],[-13.609732,65.126671],[-14.909834,64.364082],[-17.794438,63.678749],[-18.656246,63.496383],[-19.972755,63.643635],[-22.762972,63.960179],[-21.778484,64.402116],[-23.955044,64.89113],[-22.184403,65.084968],[-22.227423,65.378594],[-24.326184,65.611189],[-23.650515,66.262519],[-22.134922,66.410469],[-20.576284,65.732112],[-19.056842,66.276601],[-17.798624,65.993853],[-16.167819,66.526792],[-14.508695,66.455892]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Azerbaijan","SOV_A3":"AZE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Azerbaijan","ADM0_A3":"AZE","GEOU_DIF":0,"GEOUNIT":"Azerbaijan","GU_A3":"AZE","SU_DIF":0,"SUBUNIT":"Azerbaijan","SU_A3":"AZE","BRK_DIFF":0,"NAME":"Azerbaijan","NAME_LONG":"Azerbaijan","BRK_A3":"AZE","BRK_NAME":"Azerbaijan","BRK_GROUP":null,"ABBREV":"Aze.","POSTAL":"AZ","FORMAL_EN":"Republic of Azerbaijan","FORMAL_FR":null,"NAME_CIAWF":"Azerbaijan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Azerbaijan","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":8,"POP_EST":10023318,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":48047,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"AJ","ISO_A2":"AZ","ISO_A2_EH":"AZ","ISO_A3":"AZE","ISO_A3_EH":"AZE","ISO_N3":"031","ISO_N3_EH":"031","UN_A3":"031","WB_A2":"AZ","WB_A3":"AZE","WOE_ID":23424741,"WOE_ID_EH":23424741,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"AZE","ADM0_DIFF":null,"ADM0_TLC":"AZE","ADM0_A3_US":"AZE","ADM0_A3_FR":"AZE","ADM0_A3_RU":"AZE","ADM0_A3_ES":"AZE","ADM0_A3_CN":"AZE","ADM0_A3_TW":"AZE","ADM0_A3_IN":"AZE","ADM0_A3_NP":"AZE","ADM0_A3_PK":"AZE","ADM0_A3_DE":"AZE","ADM0_A3_GB":"AZE","ADM0_A3_BR":"AZE","ADM0_A3_IL":"AZE","ADM0_A3_PS":"AZE","ADM0_A3_SA":"AZE","ADM0_A3_EG":"AZE","ADM0_A3_MA":"AZE","ADM0_A3_PT":"AZE","ADM0_A3_AR":"AZE","ADM0_A3_JP":"AZE","ADM0_A3_KO":"AZE","ADM0_A3_VN":"AZE","ADM0_A3_TR":"AZE","ADM0_A3_ID":"AZE","ADM0_A3_PL":"AZE","ADM0_A3_GR":"AZE","ADM0_A3_IT":"AZE","ADM0_A3_NL":"AZE","ADM0_A3_SE":"AZE","ADM0_A3_BD":"AZE","ADM0_A3_UA":"AZE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":47.210994,"LABEL_Y":40.402387,"NE_ID":1159320381,"WIKIDATAID":"Q227","NAME_AR":"أذربيجان","NAME_BN":"আজারবাইজান","NAME_DE":"Aserbaidschan","NAME_EN":"Azerbaijan","NAME_ES":"Azerbaiyán","NAME_FA":"جمهوری آذربایجان","NAME_FR":"Azerbaïdjan","NAME_EL":"Αζερμπαϊτζάν","NAME_HE":"אזרבייג'ן","NAME_HI":"अज़रबैजान","NAME_HU":"Azerbajdzsán","NAME_ID":"Azerbaijan","NAME_IT":"Azerbaigian","NAME_JA":"アゼルバイジャン","NAME_KO":"아제르바이잔","NAME_NL":"Azerbeidzjan","NAME_PL":"Azerbejdżan","NAME_PT":"Azerbaijão","NAME_RU":"Азербайджан","NAME_SV":"Azerbajdzjan","NAME_TR":"Azerbaycan","NAME_UK":"Азербайджан","NAME_UR":"آذربائیجان","NAME_VI":"Azerbaijan","NAME_ZH":"阿塞拜疆","NAME_ZHT":"亞塞拜然","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[44.79399,38.270378,50.392821,41.860675],"geometry":{"type":"MultiPolygon","coordinates":[[[[46.404951,41.860675],[46.686071,41.827137],[47.373315,41.219732],[47.815666,41.151416],[47.987283,41.405819],[48.584353,41.808869],[49.110264,41.282287],[49.618915,40.572924],[50.08483,40.526157],[50.392821,40.256561],[49.569202,40.176101],[49.395259,39.399482],[49.223228,39.049219],[48.856532,38.815486],[48.883249,38.320245],[48.634375,38.270378],[48.010744,38.794015],[48.355529,39.288765],[48.060095,39.582235],[47.685079,39.508364],[46.50572,38.770605],[46.483499,39.464155],[46.034534,39.628021],[45.610012,39.899994],[45.891907,40.218476],[45.359175,40.561504],[45.560351,40.81229],[45.179496,40.985354],[44.97248,41.248129],[45.217426,41.411452],[45.962601,41.123873],[46.501637,41.064445],[46.637908,41.181673],[46.145432,41.722802],[46.404951,41.860675]]],[[[46.143623,38.741201],[45.457722,38.874139],[44.952688,39.335765],[44.79399,39.713003],[45.001987,39.740004],[45.298145,39.471751],[45.739978,39.473999],[45.735379,39.319719],[46.143623,38.741201]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Georgia","SOV_A3":"GEO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Georgia","ADM0_A3":"GEO","GEOU_DIF":0,"GEOUNIT":"Georgia","GU_A3":"GEO","SU_DIF":0,"SUBUNIT":"Georgia","SU_A3":"GEO","BRK_DIFF":0,"NAME":"Georgia","NAME_LONG":"Georgia","BRK_A3":"GEO","BRK_NAME":"Georgia","BRK_GROUP":null,"ABBREV":"Geo.","POSTAL":"GE","FORMAL_EN":"Georgia","FORMAL_FR":null,"NAME_CIAWF":"Georgia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Georgia","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":2,"POP_EST":3720382,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":17477,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"GG","ISO_A2":"GE","ISO_A2_EH":"GE","ISO_A3":"GEO","ISO_A3_EH":"GEO","ISO_N3":"268","ISO_N3_EH":"268","UN_A3":"268","WB_A2":"GE","WB_A3":"GEO","WOE_ID":23424823,"WOE_ID_EH":23424823,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"GEO","ADM0_DIFF":null,"ADM0_TLC":"GEO","ADM0_A3_US":"GEO","ADM0_A3_FR":"GEO","ADM0_A3_RU":"GEO","ADM0_A3_ES":"GEO","ADM0_A3_CN":"GEO","ADM0_A3_TW":"GEO","ADM0_A3_IN":"GEO","ADM0_A3_NP":"GEO","ADM0_A3_PK":"GEO","ADM0_A3_DE":"GEO","ADM0_A3_GB":"GEO","ADM0_A3_BR":"GEO","ADM0_A3_IL":"GEO","ADM0_A3_PS":"GEO","ADM0_A3_SA":"GEO","ADM0_A3_EG":"GEO","ADM0_A3_MA":"GEO","ADM0_A3_PT":"GEO","ADM0_A3_AR":"GEO","ADM0_A3_JP":"GEO","ADM0_A3_KO":"GEO","ADM0_A3_VN":"GEO","ADM0_A3_TR":"GEO","ADM0_A3_ID":"GEO","ADM0_A3_PL":"GEO","ADM0_A3_GR":"GEO","ADM0_A3_IT":"GEO","ADM0_A3_NL":"GEO","ADM0_A3_SE":"GEO","ADM0_A3_BD":"GEO","ADM0_A3_UA":"GEO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":43.735724,"LABEL_Y":41.870087,"NE_ID":1159320779,"WIKIDATAID":"Q230","NAME_AR":"جورجيا","NAME_BN":"জর্জিয়া","NAME_DE":"Georgien","NAME_EN":"Georgia","NAME_ES":"Georgia","NAME_FA":"گرجستان","NAME_FR":"Géorgie","NAME_EL":"Γεωργία","NAME_HE":"גאורגיה","NAME_HI":"जॉर्जिया","NAME_HU":"Grúzia","NAME_ID":"Georgia","NAME_IT":"Georgia","NAME_JA":"ジョージア","NAME_KO":"조지아","NAME_NL":"Georgië","NAME_PL":"Gruzja","NAME_PT":"Geórgia","NAME_RU":"Грузия","NAME_SV":"Georgien","NAME_TR":"Gürcistan","NAME_UK":"Грузія","NAME_UR":"جارجیا","NAME_VI":"Gruzia","NAME_ZH":"格鲁吉亚","NAME_ZHT":"喬治亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[39.955009,41.064445,46.637908,43.553104],"geometry":{"type":"Polygon","coordinates":[[[39.955009,43.434998],[40.076965,43.553104],[40.92219,43.38215],[42.3944,43.2203],[43.75599,42.74083],[43.93121,42.55496],[44.537623,42.711993],[45.470279,42.502781],[45.7764,42.09244],[46.404951,41.860675],[46.145432,41.722802],[46.637908,41.181673],[46.501637,41.064445],[45.962601,41.123873],[45.217426,41.411452],[44.97248,41.248129],[43.582746,41.092143],[42.619549,41.583173],[41.554084,41.535656],[41.703171,41.962943],[41.45347,42.645123],[40.875469,43.013628],[40.321394,43.128634],[39.955009,43.434998]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Philippines","SOV_A3":"PHL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Philippines","ADM0_A3":"PHL","GEOU_DIF":0,"GEOUNIT":"Philippines","GU_A3":"PHL","SU_DIF":0,"SUBUNIT":"Philippines","SU_A3":"PHL","BRK_DIFF":0,"NAME":"Philippines","NAME_LONG":"Philippines","BRK_A3":"PHL","BRK_NAME":"Philippines","BRK_GROUP":null,"ABBREV":"Phil.","POSTAL":"PH","FORMAL_EN":"Republic of the Philippines","FORMAL_FR":null,"NAME_CIAWF":"Philippines","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Philippines","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":8,"POP_EST":108116615,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":376795,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","FIPS_10":"RP","ISO_A2":"PH","ISO_A2_EH":"PH","ISO_A3":"PHL","ISO_A3_EH":"PHL","ISO_N3":"608","ISO_N3_EH":"608","UN_A3":"608","WB_A2":"PH","WB_A3":"PHL","WOE_ID":23424934,"WOE_ID_EH":23424934,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PHL","ADM0_DIFF":null,"ADM0_TLC":"PHL","ADM0_A3_US":"PHL","ADM0_A3_FR":"PHL","ADM0_A3_RU":"PHL","ADM0_A3_ES":"PHL","ADM0_A3_CN":"PHL","ADM0_A3_TW":"PHL","ADM0_A3_IN":"PHL","ADM0_A3_NP":"PHL","ADM0_A3_PK":"PHL","ADM0_A3_DE":"PHL","ADM0_A3_GB":"PHL","ADM0_A3_BR":"PHL","ADM0_A3_IL":"PHL","ADM0_A3_PS":"PHL","ADM0_A3_SA":"PHL","ADM0_A3_EG":"PHL","ADM0_A3_MA":"PHL","ADM0_A3_PT":"PHL","ADM0_A3_AR":"PHL","ADM0_A3_JP":"PHL","ADM0_A3_KO":"PHL","ADM0_A3_VN":"PHL","ADM0_A3_TR":"PHL","ADM0_A3_ID":"PHL","ADM0_A3_PL":"PHL","ADM0_A3_GR":"PHL","ADM0_A3_IT":"PHL","ADM0_A3_NL":"PHL","ADM0_A3_SE":"PHL","ADM0_A3_BD":"PHL","ADM0_A3_UA":"PHL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":7,"LABEL_X":122.465,"LABEL_Y":11.198,"NE_ID":1159321169,"WIKIDATAID":"Q928","NAME_AR":"الفلبين","NAME_BN":"ফিলিপাইন","NAME_DE":"Philippinen","NAME_EN":"Philippines","NAME_ES":"Filipinas","NAME_FA":"فیلیپین","NAME_FR":"Philippines","NAME_EL":"Φιλιππίνες","NAME_HE":"הפיליפינים","NAME_HI":"फ़िलीपीन्स","NAME_HU":"Fülöp-szigetek","NAME_ID":"Filipina","NAME_IT":"Filippine","NAME_JA":"フィリピン","NAME_KO":"필리핀","NAME_NL":"Filipijnen","NAME_PL":"Filipiny","NAME_PT":"Filipinas","NAME_RU":"Филиппины","NAME_SV":"Filippinerna","NAME_TR":"Filipinler","NAME_UK":"Філіппіни","NAME_UR":"فلپائن","NAME_VI":"Philippines","NAME_ZH":"菲律宾","NAME_ZHT":"菲律賓","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[117.174275,5.581003,126.537424,18.505227],"geometry":{"type":"MultiPolygon","coordinates":[[[[120.833896,12.704496],[120.323436,13.466413],[121.180128,13.429697],[121.527394,13.06959],[121.26219,12.20556],[120.833896,12.704496]]],[[[122.586089,9.981045],[122.837081,10.261157],[122.947411,10.881868],[123.49885,10.940624],[123.337774,10.267384],[124.077936,11.232726],[123.982438,10.278779],[123.623183,9.950091],[123.309921,9.318269],[122.995883,9.022189],[122.380055,9.713361],[122.586089,9.981045]]],[[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122.942398,8.316237],[123.487688,8.69301],[123.841154,8.240324],[124.60147,8.514158],[124.764612,8.960409],[125.471391,8.986997],[125.412118,9.760335],[126.222714,9.286074],[126.306637,8.782487],[126.376814,8.414706]]],[[[118.504581,9.316383],[117.174275,8.3675],[117.664477,9.066889],[118.386914,9.6845],[118.987342,10.376292],[119.511496,11.369668],[119.689677,10.554291],[119.029458,10.003653],[118.504581,9.316383]]],[[[122.336957,18.224883],[122.174279,17.810283],[122.515654,17.093505],[122.252311,16.262444],[121.662786,15.931018],[121.50507,15.124814],[121.728829,14.328376],[122.258925,14.218202],[122.701276,14.336541],[123.950295,13.782131],[123.855107,13.237771],[124.181289,12.997527],[124.077419,12.536677],[123.298035,13.027526],[122.928652,13.55292],[122.671355,13.185836],[122.03465,13.784482],[121.126385,13.636687],[120.628637,13.857656],[120.679384,14.271016],[120.991819,14.525393],[120.693336,14.756671],[120.564145,14.396279],[120.070429,14.970869],[119.920929,15.406347],[119.883773,16.363704],[120.286488,16.034629],[120.390047,17.599081],[120.715867,18.505227],[121.321308,18.504065],[121.937601,18.218552],[122.246006,18.47895],[122.336957,18.224883]]],[[[122.03837,11.415841],[121.883548,11.891755],[122.483821,11.582187],[123.120217,11.58366],[123.100838,11.165934],[122.637714,10.741308],[122.00261,10.441017],[121.967367,10.905691],[122.03837,11.415841]]],[[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Malaysia","SOV_A3":"MYS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Malaysia","ADM0_A3":"MYS","GEOU_DIF":0,"GEOUNIT":"Malaysia","GU_A3":"MYS","SU_DIF":0,"SUBUNIT":"Malaysia","SU_A3":"MYS","BRK_DIFF":0,"NAME":"Malaysia","NAME_LONG":"Malaysia","BRK_A3":"MYS","BRK_NAME":"Malaysia","BRK_GROUP":null,"ABBREV":"Malay.","POSTAL":"MY","FORMAL_EN":"Malaysia","FORMAL_FR":null,"NAME_CIAWF":"Malaysia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Malaysia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":4,"MAPCOLOR9":3,"MAPCOLOR13":6,"POP_EST":31949777,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":364681,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"MY","ISO_A2":"MY","ISO_A2_EH":"MY","ISO_A3":"MYS","ISO_A3_EH":"MYS","ISO_N3":"458","ISO_N3_EH":"458","UN_A3":"458","WB_A2":"MY","WB_A3":"MYS","WOE_ID":23424901,"WOE_ID_EH":23424901,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MYS","ADM0_DIFF":null,"ADM0_TLC":"MYS","ADM0_A3_US":"MYS","ADM0_A3_FR":"MYS","ADM0_A3_RU":"MYS","ADM0_A3_ES":"MYS","ADM0_A3_CN":"MYS","ADM0_A3_TW":"MYS","ADM0_A3_IN":"MYS","ADM0_A3_NP":"MYS","ADM0_A3_PK":"MYS","ADM0_A3_DE":"MYS","ADM0_A3_GB":"MYS","ADM0_A3_BR":"MYS","ADM0_A3_IL":"MYS","ADM0_A3_PS":"MYS","ADM0_A3_SA":"MYS","ADM0_A3_EG":"MYS","ADM0_A3_MA":"MYS","ADM0_A3_PT":"MYS","ADM0_A3_AR":"MYS","ADM0_A3_JP":"MYS","ADM0_A3_KO":"MYS","ADM0_A3_VN":"MYS","ADM0_A3_TR":"MYS","ADM0_A3_ID":"MYS","ADM0_A3_PL":"MYS","ADM0_A3_GR":"MYS","ADM0_A3_IT":"MYS","ADM0_A3_NL":"MYS","ADM0_A3_SE":"MYS","ADM0_A3_BD":"MYS","ADM0_A3_UA":"MYS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":113.83708,"LABEL_Y":2.528667,"NE_ID":1159321083,"WIKIDATAID":"Q833","NAME_AR":"ماليزيا","NAME_BN":"মালয়েশিয়া","NAME_DE":"Malaysia","NAME_EN":"Malaysia","NAME_ES":"Malasia","NAME_FA":"مالزی","NAME_FR":"Malaisie","NAME_EL":"Μαλαισία","NAME_HE":"מלזיה","NAME_HI":"मलेशिया","NAME_HU":"Malajzia","NAME_ID":"Malaysia","NAME_IT":"Malaysia","NAME_JA":"マレーシア","NAME_KO":"말레이시아","NAME_NL":"Maleisië","NAME_PL":"Malezja","NAME_PT":"Malásia","NAME_RU":"Малайзия","NAME_SV":"Malaysia","NAME_TR":"Malezya","NAME_UK":"Малайзія","NAME_UR":"ملائیشیا","NAME_VI":"Malaysia","NAME_ZH":"马来西亚","NAME_ZHT":"馬來西亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[100.085757,0.773131,119.181904,6.928053],"geometry":{"type":"MultiPolygon","coordinates":[[[[100.085757,6.464489],[100.259596,6.642825],[101.075516,6.204867],[101.154219,5.691384],[101.814282,5.810808],[102.141187,6.221636],[102.371147,6.128205],[102.961705,5.524495],[103.381215,4.855001],[103.438575,4.181606],[103.332122,3.726698],[103.429429,3.382869],[103.502448,2.791019],[103.854674,2.515454],[104.247932,1.631141],[104.228811,1.293048],[103.519707,1.226334],[102.573615,1.967115],[101.390638,2.760814],[101.27354,3.270292],[100.695435,3.93914],[100.557408,4.76728],[100.196706,5.312493],[100.30626,6.040562],[100.085757,6.464489]]],[[[117.882035,4.137551],[117.015214,4.306094],[115.865517,4.306559],[115.519078,3.169238],[115.134037,2.821482],[114.621355,1.430688],[113.80585,1.217549],[112.859809,1.49779],[112.380252,1.410121],[111.797548,0.904441],[111.159138,0.976478],[110.514061,0.773131],[109.830227,1.338136],[109.66326,2.006467],[110.396135,1.663775],[111.168853,1.850637],[111.370081,2.697303],[111.796928,2.885897],[112.995615,3.102395],[113.712935,3.893509],[114.204017,4.525874],[114.659596,4.007637],[114.869557,4.348314],[115.347461,4.316636],[115.4057,4.955228],[115.45071,5.44773],[116.220741,6.143191],[116.725103,6.924771],[117.129626,6.928053],[117.643393,6.422166],[117.689075,5.98749],[118.347691,5.708696],[119.181904,5.407836],[119.110694,5.016128],[118.439727,4.966519],[118.618321,4.478202],[117.882035,4.137551]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Brunei","SOV_A3":"BRN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Brunei","ADM0_A3":"BRN","GEOU_DIF":0,"GEOUNIT":"Brunei","GU_A3":"BRN","SU_DIF":0,"SUBUNIT":"Brunei","SU_A3":"BRN","BRK_DIFF":0,"NAME":"Brunei","NAME_LONG":"Brunei Darussalam","BRK_A3":"BRN","BRK_NAME":"Brunei","BRK_GROUP":null,"ABBREV":"Brunei","POSTAL":"BN","FORMAL_EN":"Negara Brunei Darussalam","FORMAL_FR":null,"NAME_CIAWF":"Brunei","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Brunei","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":12,"POP_EST":433285,"POP_RANK":10,"POP_YEAR":2019,"GDP_MD":13469,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"BX","ISO_A2":"BN","ISO_A2_EH":"BN","ISO_A3":"BRN","ISO_A3_EH":"BRN","ISO_N3":"096","ISO_N3_EH":"096","UN_A3":"096","WB_A2":"BN","WB_A3":"BRN","WOE_ID":23424773,"WOE_ID_EH":23424773,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BRN","ADM0_DIFF":null,"ADM0_TLC":"BRN","ADM0_A3_US":"BRN","ADM0_A3_FR":"BRN","ADM0_A3_RU":"BRN","ADM0_A3_ES":"BRN","ADM0_A3_CN":"BRN","ADM0_A3_TW":"BRN","ADM0_A3_IN":"BRN","ADM0_A3_NP":"BRN","ADM0_A3_PK":"BRN","ADM0_A3_DE":"BRN","ADM0_A3_GB":"BRN","ADM0_A3_BR":"BRN","ADM0_A3_IL":"BRN","ADM0_A3_PS":"BRN","ADM0_A3_SA":"BRN","ADM0_A3_EG":"BRN","ADM0_A3_MA":"BRN","ADM0_A3_PT":"BRN","ADM0_A3_AR":"BRN","ADM0_A3_JP":"BRN","ADM0_A3_KO":"BRN","ADM0_A3_VN":"BRN","ADM0_A3_TR":"BRN","ADM0_A3_ID":"BRN","ADM0_A3_PL":"BRN","ADM0_A3_GR":"BRN","ADM0_A3_IT":"BRN","ADM0_A3_NL":"BRN","ADM0_A3_SE":"BRN","ADM0_A3_BD":"BRN","ADM0_A3_UA":"BRN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":6,"LONG_LEN":17,"ABBREV_LEN":6,"TINY":2,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":114.551943,"LABEL_Y":4.448298,"NE_ID":1159320451,"WIKIDATAID":"Q921","NAME_AR":"بروناي","NAME_BN":"ব্রুনাই","NAME_DE":"Brunei","NAME_EN":"Brunei","NAME_ES":"Brunéi","NAME_FA":"برونئی","NAME_FR":"Brunei","NAME_EL":"Μπρουνέι","NAME_HE":"ברוניי","NAME_HI":"ब्रुनेई","NAME_HU":"Brunei","NAME_ID":"Brunei Darussalam","NAME_IT":"Brunei","NAME_JA":"ブルネイ","NAME_KO":"브루나이","NAME_NL":"Brunei","NAME_PL":"Brunei","NAME_PT":"Brunei","NAME_RU":"Бруней","NAME_SV":"Brunei","NAME_TR":"Brunei","NAME_UK":"Бруней","NAME_UR":"برونائی دار السلام","NAME_VI":"Brunei","NAME_ZH":"文莱","NAME_ZHT":"汶萊","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[114.204017,4.007637,115.45071,5.44773],"geometry":{"type":"Polygon","coordinates":[[[115.45071,5.44773],[115.4057,4.955228],[115.347461,4.316636],[114.869557,4.348314],[114.659596,4.007637],[114.204017,4.525874],[114.599961,4.900011],[115.45071,5.44773]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Slovenia","SOV_A3":"SVN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Slovenia","ADM0_A3":"SVN","GEOU_DIF":0,"GEOUNIT":"Slovenia","GU_A3":"SVN","SU_DIF":0,"SUBUNIT":"Slovenia","SU_A3":"SVN","BRK_DIFF":0,"NAME":"Slovenia","NAME_LONG":"Slovenia","BRK_A3":"SVN","BRK_NAME":"Slovenia","BRK_GROUP":null,"ABBREV":"Slo.","POSTAL":"SLO","FORMAL_EN":"Republic of Slovenia","FORMAL_FR":null,"NAME_CIAWF":"Slovenia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Slovenia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":12,"POP_EST":2087946,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":54174,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"SI","ISO_A2":"SI","ISO_A2_EH":"SI","ISO_A3":"SVN","ISO_A3_EH":"SVN","ISO_N3":"705","ISO_N3_EH":"705","UN_A3":"705","WB_A2":"SI","WB_A3":"SVN","WOE_ID":23424945,"WOE_ID_EH":23424945,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SVN","ADM0_DIFF":null,"ADM0_TLC":"SVN","ADM0_A3_US":"SVN","ADM0_A3_FR":"SVN","ADM0_A3_RU":"SVN","ADM0_A3_ES":"SVN","ADM0_A3_CN":"SVN","ADM0_A3_TW":"SVN","ADM0_A3_IN":"SVN","ADM0_A3_NP":"SVN","ADM0_A3_PK":"SVN","ADM0_A3_DE":"SVN","ADM0_A3_GB":"SVN","ADM0_A3_BR":"SVN","ADM0_A3_IL":"SVN","ADM0_A3_PS":"SVN","ADM0_A3_SA":"SVN","ADM0_A3_EG":"SVN","ADM0_A3_MA":"SVN","ADM0_A3_PT":"SVN","ADM0_A3_AR":"SVN","ADM0_A3_JP":"SVN","ADM0_A3_KO":"SVN","ADM0_A3_VN":"SVN","ADM0_A3_TR":"SVN","ADM0_A3_ID":"SVN","ADM0_A3_PL":"SVN","ADM0_A3_GR":"SVN","ADM0_A3_IT":"SVN","ADM0_A3_NL":"SVN","ADM0_A3_SE":"SVN","ADM0_A3_BD":"SVN","ADM0_A3_UA":"SVN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":14.915312,"LABEL_Y":46.06076,"NE_ID":1159321285,"WIKIDATAID":"Q215","NAME_AR":"سلوفينيا","NAME_BN":"স্লোভেনিয়া","NAME_DE":"Slowenien","NAME_EN":"Slovenia","NAME_ES":"Eslovenia","NAME_FA":"اسلوونی","NAME_FR":"Slovénie","NAME_EL":"Σλοβενία","NAME_HE":"סלובניה","NAME_HI":"स्लोवेनिया","NAME_HU":"Szlovénia","NAME_ID":"Slovenia","NAME_IT":"Slovenia","NAME_JA":"スロベニア","NAME_KO":"슬로베니아","NAME_NL":"Slovenië","NAME_PL":"Słowenia","NAME_PT":"Eslovénia","NAME_RU":"Словения","NAME_SV":"Slovenien","NAME_TR":"Slovenya","NAME_UK":"Словенія","NAME_UR":"سلووینیا","NAME_VI":"Slovenia","NAME_ZH":"斯洛文尼亚","NAME_ZHT":"斯洛維尼亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[13.69811,45.452316,16.564808,46.852386],"geometry":{"type":"Polygon","coordinates":[[[13.806475,46.509306],[14.632472,46.431817],[15.137092,46.658703],[16.011664,46.683611],[16.202298,46.852386],[16.370505,46.841327],[16.564808,46.503751],[15.768733,46.238108],[15.67153,45.834154],[15.323954,45.731783],[15.327675,45.452316],[14.935244,45.471695],[14.595109,45.634941],[14.411968,45.466166],[13.71506,45.500324],[13.93763,45.591016],[13.69811,46.016778],[13.806475,46.509306]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Finland","SOV_A3":"FI1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","TLC":"1","ADMIN":"Finland","ADM0_A3":"FIN","GEOU_DIF":0,"GEOUNIT":"Finland","GU_A3":"FIN","SU_DIF":0,"SUBUNIT":"Finland","SU_A3":"FIN","BRK_DIFF":0,"NAME":"Finland","NAME_LONG":"Finland","BRK_A3":"FIN","BRK_NAME":"Finland","BRK_GROUP":null,"ABBREV":"Fin.","POSTAL":"FIN","FORMAL_EN":"Republic of Finland","FORMAL_FR":null,"NAME_CIAWF":"Finland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Finland","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":6,"POP_EST":5520314,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":269296,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"FI","ISO_A2":"FI","ISO_A2_EH":"FI","ISO_A3":"FIN","ISO_A3_EH":"FIN","ISO_N3":"246","ISO_N3_EH":"246","UN_A3":"246","WB_A2":"FI","WB_A3":"FIN","WOE_ID":23424812,"WOE_ID_EH":23424812,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"FIN","ADM0_DIFF":null,"ADM0_TLC":"FIN","ADM0_A3_US":"FIN","ADM0_A3_FR":"FIN","ADM0_A3_RU":"FIN","ADM0_A3_ES":"FIN","ADM0_A3_CN":"FIN","ADM0_A3_TW":"FIN","ADM0_A3_IN":"FIN","ADM0_A3_NP":"FIN","ADM0_A3_PK":"FIN","ADM0_A3_DE":"FIN","ADM0_A3_GB":"FIN","ADM0_A3_BR":"FIN","ADM0_A3_IL":"FIN","ADM0_A3_PS":"FIN","ADM0_A3_SA":"FIN","ADM0_A3_EG":"FIN","ADM0_A3_MA":"FIN","ADM0_A3_PT":"FIN","ADM0_A3_AR":"FIN","ADM0_A3_JP":"FIN","ADM0_A3_KO":"FIN","ADM0_A3_VN":"FIN","ADM0_A3_TR":"FIN","ADM0_A3_ID":"FIN","ADM0_A3_PL":"FIN","ADM0_A3_GR":"FIN","ADM0_A3_IT":"FIN","ADM0_A3_NL":"FIN","ADM0_A3_SE":"FIN","ADM0_A3_BD":"FIN","ADM0_A3_UA":"FIN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":27.276449,"LABEL_Y":63.252361,"NE_ID":1159320623,"WIKIDATAID":"Q33","NAME_AR":"فنلندا","NAME_BN":"ফিনল্যান্ড","NAME_DE":"Finnland","NAME_EN":"Finland","NAME_ES":"Finlandia","NAME_FA":"فنلاند","NAME_FR":"Finlande","NAME_EL":"Φινλανδία","NAME_HE":"פינלנד","NAME_HI":"फ़िनलैण्ड","NAME_HU":"Finnország","NAME_ID":"Finlandia","NAME_IT":"Finlandia","NAME_JA":"フィンランド","NAME_KO":"핀란드","NAME_NL":"Finland","NAME_PL":"Finlandia","NAME_PT":"Finlândia","NAME_RU":"Финляндия","NAME_SV":"Finland","NAME_TR":"Finlandiya","NAME_UK":"Фінляндія","NAME_UR":"فن لینڈ","NAME_VI":"Phần Lan","NAME_ZH":"芬兰","NAME_ZHT":"芬蘭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[20.645593,59.846373,31.516092,70.164193],"geometry":{"type":"Polygon","coordinates":[[[28.59193,69.064777],[28.445944,68.364613],[29.977426,67.698297],[29.054589,66.944286],[30.21765,65.80598],[29.54443,64.948672],[30.444685,64.204453],[30.035872,63.552814],[31.516092,62.867687],[31.139991,62.357693],[30.211107,61.780028],[28.07,60.50352],[28.070002,60.503519],[28.069998,60.503517],[26.255173,60.423961],[24.496624,60.057316],[22.869695,59.846373],[22.290764,60.391921],[21.322244,60.72017],[21.544866,61.705329],[21.059211,62.607393],[21.536029,63.189735],[22.442744,63.81781],[24.730512,64.902344],[25.398068,65.111427],[25.294043,65.534346],[23.903379,66.006927],[23.56588,66.396051],[23.539473,67.936009],[21.978535,68.616846],[20.645593,69.106247],[21.244936,69.370443],[22.356238,68.841741],[23.66205,68.891247],[24.735679,68.649557],[25.689213,69.092114],[26.179622,69.825299],[27.732292,70.164193],[29.015573,69.766491],[28.59193,69.064777]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Slovakia","SOV_A3":"SVK","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Slovakia","ADM0_A3":"SVK","GEOU_DIF":0,"GEOUNIT":"Slovakia","GU_A3":"SVK","SU_DIF":0,"SUBUNIT":"Slovakia","SU_A3":"SVK","BRK_DIFF":0,"NAME":"Slovakia","NAME_LONG":"Slovakia","BRK_A3":"SVK","BRK_NAME":"Slovakia","BRK_GROUP":null,"ABBREV":"Svk.","POSTAL":"SK","FORMAL_EN":"Slovak Republic","FORMAL_FR":null,"NAME_CIAWF":"Slovakia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Slovak Republic","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":9,"POP_EST":5454073,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":105079,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"LO","ISO_A2":"SK","ISO_A2_EH":"SK","ISO_A3":"SVK","ISO_A3_EH":"SVK","ISO_N3":"703","ISO_N3_EH":"703","UN_A3":"703","WB_A2":"SK","WB_A3":"SVK","WOE_ID":23424877,"WOE_ID_EH":23424877,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SVK","ADM0_DIFF":null,"ADM0_TLC":"SVK","ADM0_A3_US":"SVK","ADM0_A3_FR":"SVK","ADM0_A3_RU":"SVK","ADM0_A3_ES":"SVK","ADM0_A3_CN":"SVK","ADM0_A3_TW":"SVK","ADM0_A3_IN":"SVK","ADM0_A3_NP":"SVK","ADM0_A3_PK":"SVK","ADM0_A3_DE":"SVK","ADM0_A3_GB":"SVK","ADM0_A3_BR":"SVK","ADM0_A3_IL":"SVK","ADM0_A3_PS":"SVK","ADM0_A3_SA":"SVK","ADM0_A3_EG":"SVK","ADM0_A3_MA":"SVK","ADM0_A3_PT":"SVK","ADM0_A3_AR":"SVK","ADM0_A3_JP":"SVK","ADM0_A3_KO":"SVK","ADM0_A3_VN":"SVK","ADM0_A3_TR":"SVK","ADM0_A3_ID":"SVK","ADM0_A3_PL":"SVK","ADM0_A3_GR":"SVK","ADM0_A3_IT":"SVK","ADM0_A3_NL":"SVK","ADM0_A3_SE":"SVK","ADM0_A3_BD":"SVK","ADM0_A3_UA":"SVK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":19.049868,"LABEL_Y":48.734044,"NE_ID":1159321283,"WIKIDATAID":"Q214","NAME_AR":"سلوفاكيا","NAME_BN":"স্লোভাকিয়া","NAME_DE":"Slowakei","NAME_EN":"Slovakia","NAME_ES":"Eslovaquia","NAME_FA":"اسلواکی","NAME_FR":"Slovaquie","NAME_EL":"Σλοβακία","NAME_HE":"סלובקיה","NAME_HI":"स्लोवाकिया","NAME_HU":"Szlovákia","NAME_ID":"Slowakia","NAME_IT":"Slovacchia","NAME_JA":"スロバキア","NAME_KO":"슬로바키아","NAME_NL":"Slowakije","NAME_PL":"Słowacja","NAME_PT":"Eslováquia","NAME_RU":"Словакия","NAME_SV":"Slovakien","NAME_TR":"Slovakya","NAME_UK":"Словаччина","NAME_UR":"سلوواکیہ","NAME_VI":"Slovakia","NAME_ZH":"斯洛伐克","NAME_ZHT":"斯洛伐克","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[16.879983,47.758429,22.558138,49.571574],"geometry":{"type":"Polygon","coordinates":[[[22.558138,49.085738],[22.280842,48.825392],[22.085608,48.422264],[21.872236,48.319971],[20.801294,48.623854],[20.473562,48.56285],[20.239054,48.327567],[19.769471,48.202691],[19.661364,48.266615],[19.174365,48.111379],[18.777025,48.081768],[18.696513,47.880954],[17.857133,47.758429],[17.488473,47.867466],[16.979667,48.123497],[16.879983,48.470013],[16.960288,48.596982],[17.101985,48.816969],[17.545007,48.800019],[17.886485,48.903475],[17.913512,48.996493],[18.104973,49.043983],[18.170498,49.271515],[18.399994,49.315001],[18.554971,49.495015],[18.853144,49.49623],[18.909575,49.435846],[19.320713,49.571574],[19.825023,49.217125],[20.415839,49.431453],[20.887955,49.328772],[21.607808,49.470107],[22.558138,49.085738]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Czechia","SOV_A3":"CZE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Czechia","ADM0_A3":"CZE","GEOU_DIF":0,"GEOUNIT":"Czechia","GU_A3":"CZE","SU_DIF":0,"SUBUNIT":"Czechia","SU_A3":"CZE","BRK_DIFF":0,"NAME":"Czechia","NAME_LONG":"Czech Republic","BRK_A3":"CZE","BRK_NAME":"Czechia","BRK_GROUP":null,"ABBREV":"Cz.","POSTAL":"CZ","FORMAL_EN":"Czech Republic","FORMAL_FR":"la République tchèque","NAME_CIAWF":"Czechia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Czechia","NAME_ALT":"Česko","MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":6,"POP_EST":10669709,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":250680,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","FIPS_10":"EZ","ISO_A2":"CZ","ISO_A2_EH":"CZ","ISO_A3":"CZE","ISO_A3_EH":"CZE","ISO_N3":"203","ISO_N3_EH":"203","UN_A3":"203","WB_A2":"CZ","WB_A3":"CZE","WOE_ID":23424810,"WOE_ID_EH":23424810,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"CZE","ADM0_DIFF":null,"ADM0_TLC":"CZE","ADM0_A3_US":"CZE","ADM0_A3_FR":"CZE","ADM0_A3_RU":"CZE","ADM0_A3_ES":"CZE","ADM0_A3_CN":"CZE","ADM0_A3_TW":"CZE","ADM0_A3_IN":"CZE","ADM0_A3_NP":"CZE","ADM0_A3_PK":"CZE","ADM0_A3_DE":"CZE","ADM0_A3_GB":"CZE","ADM0_A3_BR":"CZE","ADM0_A3_IL":"CZE","ADM0_A3_PS":"CZE","ADM0_A3_SA":"CZE","ADM0_A3_EG":"CZE","ADM0_A3_MA":"CZE","ADM0_A3_PT":"CZE","ADM0_A3_AR":"CZE","ADM0_A3_JP":"CZE","ADM0_A3_KO":"CZE","ADM0_A3_VN":"CZE","ADM0_A3_TR":"CZE","ADM0_A3_ID":"CZE","ADM0_A3_PL":"CZE","ADM0_A3_GR":"CZE","ADM0_A3_IT":"CZE","ADM0_A3_NL":"CZE","ADM0_A3_SE":"CZE","ADM0_A3_BD":"CZE","ADM0_A3_UA":"CZE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":14,"ABBREV_LEN":3,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":15.377555,"LABEL_Y":49.882364,"NE_ID":1159320535,"WIKIDATAID":"Q213","NAME_AR":"التشيك","NAME_BN":"চেক প্রজাতন্ত্র","NAME_DE":"Tschechien","NAME_EN":"Czech Republic","NAME_ES":"República Checa","NAME_FA":"جمهوری چک","NAME_FR":"Tchéquie","NAME_EL":"Τσεχία","NAME_HE":"צ'כיה","NAME_HI":"चेक गणराज्य","NAME_HU":"Csehország","NAME_ID":"Republik Ceko","NAME_IT":"Repubblica Ceca","NAME_JA":"チェコ","NAME_KO":"체코","NAME_NL":"Tsjechië","NAME_PL":"Czechy","NAME_PT":"Chéquia","NAME_RU":"Чехия","NAME_SV":"Tjeckien","NAME_TR":"Çek Cumhuriyeti","NAME_UK":"Чехія","NAME_UR":"چیک جمہوریہ","NAME_VI":"Cộng hòa Séc","NAME_ZH":"捷克","NAME_ZHT":"捷克共和國","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[12.240111,48.555305,18.853144,51.117268],"geometry":{"type":"Polygon","coordinates":[[[15.016996,51.106674],[15.490972,50.78473],[16.238627,50.697733],[16.176253,50.422607],[16.719476,50.215747],[16.868769,50.473974],[17.554567,50.362146],[17.649445,50.049038],[18.392914,49.988629],[18.853144,49.49623],[18.554971,49.495015],[18.399994,49.315001],[18.170498,49.271515],[18.104973,49.043983],[17.913512,48.996493],[17.886485,48.903475],[17.545007,48.800019],[17.101985,48.816969],[16.960288,48.596982],[16.499283,48.785808],[16.029647,48.733899],[15.253416,49.039074],[14.901447,48.964402],[14.338898,48.555305],[13.595946,48.877172],[13.031329,49.307068],[12.521024,49.547415],[12.415191,49.969121],[12.240111,50.266338],[12.966837,50.484076],[13.338132,50.733234],[14.056228,50.926918],[14.307013,51.117268],[14.570718,51.002339],[15.016996,51.106674]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Eritrea","SOV_A3":"ERI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Eritrea","ADM0_A3":"ERI","GEOU_DIF":0,"GEOUNIT":"Eritrea","GU_A3":"ERI","SU_DIF":0,"SUBUNIT":"Eritrea","SU_A3":"ERI","BRK_DIFF":0,"NAME":"Eritrea","NAME_LONG":"Eritrea","BRK_A3":"ERI","BRK_NAME":"Eritrea","BRK_GROUP":null,"ABBREV":"Erit.","POSTAL":"ER","FORMAL_EN":"State of Eritrea","FORMAL_FR":null,"NAME_CIAWF":"Eritrea","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Eritrea","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":12,"POP_EST":6081196,"POP_RANK":13,"POP_YEAR":2020,"GDP_MD":2065,"GDP_YEAR":2011,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"ER","ISO_A2":"ER","ISO_A2_EH":"ER","ISO_A3":"ERI","ISO_A3_EH":"ERI","ISO_N3":"232","ISO_N3_EH":"232","UN_A3":"232","WB_A2":"ER","WB_A3":"ERI","WOE_ID":23424806,"WOE_ID_EH":23424806,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ERI","ADM0_DIFF":null,"ADM0_TLC":"ERI","ADM0_A3_US":"ERI","ADM0_A3_FR":"ERI","ADM0_A3_RU":"ERI","ADM0_A3_ES":"ERI","ADM0_A3_CN":"ERI","ADM0_A3_TW":"ERI","ADM0_A3_IN":"ERI","ADM0_A3_NP":"ERI","ADM0_A3_PK":"ERI","ADM0_A3_DE":"ERI","ADM0_A3_GB":"ERI","ADM0_A3_BR":"ERI","ADM0_A3_IL":"ERI","ADM0_A3_PS":"ERI","ADM0_A3_SA":"ERI","ADM0_A3_EG":"ERI","ADM0_A3_MA":"ERI","ADM0_A3_PT":"ERI","ADM0_A3_AR":"ERI","ADM0_A3_JP":"ERI","ADM0_A3_KO":"ERI","ADM0_A3_VN":"ERI","ADM0_A3_TR":"ERI","ADM0_A3_ID":"ERI","ADM0_A3_PL":"ERI","ADM0_A3_GR":"ERI","ADM0_A3_IT":"ERI","ADM0_A3_NL":"ERI","ADM0_A3_SE":"ERI","ADM0_A3_BD":"ERI","ADM0_A3_UA":"ERI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":38.285566,"LABEL_Y":15.787401,"NE_ID":1159320581,"WIKIDATAID":"Q986","NAME_AR":"إريتريا","NAME_BN":"ইরিত্রিয়া","NAME_DE":"Eritrea","NAME_EN":"Eritrea","NAME_ES":"Eritrea","NAME_FA":"اریتره","NAME_FR":"Érythrée","NAME_EL":"Ερυθραία","NAME_HE":"אריתריאה","NAME_HI":"इरित्रिया","NAME_HU":"Eritrea","NAME_ID":"Eritrea","NAME_IT":"Eritrea","NAME_JA":"エリトリア","NAME_KO":"에리트레아","NAME_NL":"Eritrea","NAME_PL":"Erytrea","NAME_PT":"Eritreia","NAME_RU":"Эритрея","NAME_SV":"Eritrea","NAME_TR":"Eritre","NAME_UK":"Еритрея","NAME_UR":"اریتریا","NAME_VI":"Eritrea","NAME_ZH":"厄立特里亚","NAME_ZHT":"厄利垂亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[36.32322,12.455416,43.081226,17.998307],"geometry":{"type":"Polygon","coordinates":[[[36.42951,14.42211],[36.32322,14.82249],[36.75389,16.29186],[36.85253,16.95655],[37.16747,17.26314],[37.904,17.42754],[38.41009,17.998307],[38.990623,16.840626],[39.26611,15.922723],[39.814294,15.435647],[41.179275,14.49108],[41.734952,13.921037],[42.276831,13.343992],[42.589576,13.000421],[43.081226,12.699639],[42.779642,12.455416],[42.35156,12.54223],[42.00975,12.86582],[41.59856,13.45209],[41.1552,13.77333],[40.8966,14.11864],[40.02625,14.51959],[39.34061,14.53155],[39.0994,14.74064],[38.51295,14.50547],[37.90607,14.95943],[37.59377,14.2131],[36.42951,14.42211]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Japan","SOV_A3":"JPN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Japan","ADM0_A3":"JPN","GEOU_DIF":0,"GEOUNIT":"Japan","GU_A3":"JPN","SU_DIF":0,"SUBUNIT":"Japan","SU_A3":"JPN","BRK_DIFF":0,"NAME":"Japan","NAME_LONG":"Japan","BRK_A3":"JPN","BRK_NAME":"Japan","BRK_GROUP":null,"ABBREV":"Japan","POSTAL":"J","FORMAL_EN":"Japan","FORMAL_FR":null,"NAME_CIAWF":"Japan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Japan","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":5,"MAPCOLOR13":4,"POP_EST":126264931,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":5081769,"GDP_YEAR":2019,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","FIPS_10":"JA","ISO_A2":"JP","ISO_A2_EH":"JP","ISO_A3":"JPN","ISO_A3_EH":"JPN","ISO_N3":"392","ISO_N3_EH":"392","UN_A3":"392","WB_A2":"JP","WB_A3":"JPN","WOE_ID":23424856,"WOE_ID_EH":23424856,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"JPN","ADM0_DIFF":null,"ADM0_TLC":"JPN","ADM0_A3_US":"JPN","ADM0_A3_FR":"JPN","ADM0_A3_RU":"JPN","ADM0_A3_ES":"JPN","ADM0_A3_CN":"JPN","ADM0_A3_TW":"JPN","ADM0_A3_IN":"JPN","ADM0_A3_NP":"JPN","ADM0_A3_PK":"JPN","ADM0_A3_DE":"JPN","ADM0_A3_GB":"JPN","ADM0_A3_BR":"JPN","ADM0_A3_IL":"JPN","ADM0_A3_PS":"JPN","ADM0_A3_SA":"JPN","ADM0_A3_EG":"JPN","ADM0_A3_MA":"JPN","ADM0_A3_PT":"JPN","ADM0_A3_AR":"JPN","ADM0_A3_JP":"JPN","ADM0_A3_KO":"JPN","ADM0_A3_VN":"JPN","ADM0_A3_TR":"JPN","ADM0_A3_ID":"JPN","ADM0_A3_PL":"JPN","ADM0_A3_GR":"JPN","ADM0_A3_IT":"JPN","ADM0_A3_NL":"JPN","ADM0_A3_SE":"JPN","ADM0_A3_BD":"JPN","ADM0_A3_UA":"JPN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":7,"LABEL_X":138.44217,"LABEL_Y":36.142538,"NE_ID":1159320937,"WIKIDATAID":"Q17","NAME_AR":"اليابان","NAME_BN":"জাপান","NAME_DE":"Japan","NAME_EN":"Japan","NAME_ES":"Japón","NAME_FA":"ژاپن","NAME_FR":"Japon","NAME_EL":"Ιαπωνία","NAME_HE":"יפן","NAME_HI":"जापान","NAME_HU":"Japán","NAME_ID":"Jepang","NAME_IT":"Giappone","NAME_JA":"日本","NAME_KO":"일본","NAME_NL":"Japan","NAME_PL":"Japonia","NAME_PT":"Japão","NAME_RU":"Япония","NAME_SV":"Japan","NAME_TR":"Japonya","NAME_UK":"Японія","NAME_UR":"جاپان","NAME_VI":"Nhật Bản","NAME_ZH":"日本","NAME_ZHT":"日本","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[129.408463,31.029579,145.543137,45.551483],"geometry":{"type":"MultiPolygon","coordinates":[[[[141.884601,39.180865],[140.959489,38.174001],[140.976388,37.142074],[140.59977,36.343983],[140.774074,35.842877],[140.253279,35.138114],[138.975528,34.6676],[137.217599,34.606286],[135.792983,33.464805],[135.120983,33.849071],[135.079435,34.596545],[133.340316,34.375938],[132.156771,33.904933],[130.986145,33.885761],[132.000036,33.149992],[131.33279,31.450355],[130.686318,31.029579],[130.20242,31.418238],[130.447676,32.319475],[129.814692,32.61031],[129.408463,33.296056],[130.353935,33.604151],[130.878451,34.232743],[131.884229,34.749714],[132.617673,35.433393],[134.608301,35.731618],[135.677538,35.527134],[136.723831,37.304984],[137.390612,36.827391],[138.857602,37.827485],[139.426405,38.215962],[140.05479,39.438807],[139.883379,40.563312],[140.305783,41.195005],[141.368973,41.37856],[141.914263,39.991616],[141.884601,39.180865]]],[[[144.613427,43.960883],[145.320825,44.384733],[145.543137,43.262088],[144.059662,42.988358],[143.18385,41.995215],[141.611491,42.678791],[141.067286,41.584594],[139.955106,41.569556],[139.817544,42.563759],[140.312087,43.333273],[141.380549,43.388825],[141.671952,44.772125],[141.967645,45.551483],[143.14287,44.510358],[143.910162,44.1741],[144.613427,43.960883]]],[[[132.371176,33.463642],[132.924373,34.060299],[133.492968,33.944621],[133.904106,34.364931],[134.638428,34.149234],[134.766379,33.806335],[134.203416,33.201178],[133.79295,33.521985],[133.280268,33.28957],[133.014858,32.704567],[132.363115,32.989382],[132.371176,33.463642]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Paraguay","SOV_A3":"PRY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Paraguay","ADM0_A3":"PRY","GEOU_DIF":0,"GEOUNIT":"Paraguay","GU_A3":"PRY","SU_DIF":0,"SUBUNIT":"Paraguay","SU_A3":"PRY","BRK_DIFF":0,"NAME":"Paraguay","NAME_LONG":"Paraguay","BRK_A3":"PRY","BRK_NAME":"Paraguay","BRK_GROUP":null,"ABBREV":"Para.","POSTAL":"PY","FORMAL_EN":"Republic of Paraguay","FORMAL_FR":null,"NAME_CIAWF":"Paraguay","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Paraguay","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":6,"MAPCOLOR13":2,"POP_EST":7044636,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":38145,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","FIPS_10":"PA","ISO_A2":"PY","ISO_A2_EH":"PY","ISO_A3":"PRY","ISO_A3_EH":"PRY","ISO_N3":"600","ISO_N3_EH":"600","UN_A3":"600","WB_A2":"PY","WB_A3":"PRY","WOE_ID":23424917,"WOE_ID_EH":23424917,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"PRY","ADM0_DIFF":null,"ADM0_TLC":"PRY","ADM0_A3_US":"PRY","ADM0_A3_FR":"PRY","ADM0_A3_RU":"PRY","ADM0_A3_ES":"PRY","ADM0_A3_CN":"PRY","ADM0_A3_TW":"PRY","ADM0_A3_IN":"PRY","ADM0_A3_NP":"PRY","ADM0_A3_PK":"PRY","ADM0_A3_DE":"PRY","ADM0_A3_GB":"PRY","ADM0_A3_BR":"PRY","ADM0_A3_IL":"PRY","ADM0_A3_PS":"PRY","ADM0_A3_SA":"PRY","ADM0_A3_EG":"PRY","ADM0_A3_MA":"PRY","ADM0_A3_PT":"PRY","ADM0_A3_AR":"PRY","ADM0_A3_JP":"PRY","ADM0_A3_KO":"PRY","ADM0_A3_VN":"PRY","ADM0_A3_TR":"PRY","ADM0_A3_ID":"PRY","ADM0_A3_PL":"PRY","ADM0_A3_GR":"PRY","ADM0_A3_IT":"PRY","ADM0_A3_NL":"PRY","ADM0_A3_SE":"PRY","ADM0_A3_BD":"PRY","ADM0_A3_UA":"PRY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":-60.146394,"LABEL_Y":-21.674509,"NE_ID":1159321195,"WIKIDATAID":"Q733","NAME_AR":"باراغواي","NAME_BN":"প্যারাগুয়ে","NAME_DE":"Paraguay","NAME_EN":"Paraguay","NAME_ES":"Paraguay","NAME_FA":"پاراگوئه","NAME_FR":"Paraguay","NAME_EL":"Παραγουάη","NAME_HE":"פרגוואי","NAME_HI":"पैराग्वे","NAME_HU":"Paraguay","NAME_ID":"Paraguay","NAME_IT":"Paraguay","NAME_JA":"パラグアイ","NAME_KO":"파라과이","NAME_NL":"Paraguay","NAME_PL":"Paragwaj","NAME_PT":"Paraguai","NAME_RU":"Парагвай","NAME_SV":"Paraguay","NAME_TR":"Paraguay","NAME_UK":"Парагвай","NAME_UR":"پیراگوئے","NAME_VI":"Paraguay","NAME_ZH":"巴拉圭","NAME_ZHT":"巴拉圭","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-62.685057,-27.548499,-54.29296,-19.342747],"geometry":{"type":"Polygon","coordinates":[[[-58.166392,-20.176701],[-57.870674,-20.732688],[-57.937156,-22.090176],[-56.88151,-22.282154],[-56.473317,-22.0863],[-55.797958,-22.35693],[-55.610683,-22.655619],[-55.517639,-23.571998],[-55.400747,-23.956935],[-55.027902,-24.001274],[-54.652834,-23.839578],[-54.29296,-24.021014],[-54.293476,-24.5708],[-54.428946,-25.162185],[-54.625291,-25.739255],[-54.788795,-26.621786],[-55.695846,-27.387837],[-56.486702,-27.548499],[-57.60976,-27.395899],[-58.618174,-27.123719],[-57.63366,-25.603657],[-57.777217,-25.16234],[-58.807128,-24.771459],[-60.028966,-24.032796],[-60.846565,-23.880713],[-62.685057,-22.249029],[-62.291179,-21.051635],[-62.265961,-20.513735],[-61.786326,-19.633737],[-60.043565,-19.342747],[-59.115042,-19.356906],[-58.183471,-19.868399],[-58.166392,-20.176701]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Yemen","SOV_A3":"YEM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Yemen","ADM0_A3":"YEM","GEOU_DIF":0,"GEOUNIT":"Yemen","GU_A3":"YEM","SU_DIF":0,"SUBUNIT":"Yemen","SU_A3":"YEM","BRK_DIFF":0,"NAME":"Yemen","NAME_LONG":"Yemen","BRK_A3":"YEM","BRK_NAME":"Yemen","BRK_GROUP":null,"ABBREV":"Yem.","POSTAL":"YE","FORMAL_EN":"Republic of Yemen","FORMAL_FR":null,"NAME_CIAWF":"Yemen","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Yemen, Rep.","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":11,"POP_EST":29161922,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":22581,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"YM","ISO_A2":"YE","ISO_A2_EH":"YE","ISO_A3":"YEM","ISO_A3_EH":"YEM","ISO_N3":"887","ISO_N3_EH":"887","UN_A3":"887","WB_A2":"RY","WB_A3":"YEM","WOE_ID":23425002,"WOE_ID_EH":23425002,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"YEM","ADM0_DIFF":null,"ADM0_TLC":"YEM","ADM0_A3_US":"YEM","ADM0_A3_FR":"YEM","ADM0_A3_RU":"YEM","ADM0_A3_ES":"YEM","ADM0_A3_CN":"YEM","ADM0_A3_TW":"YEM","ADM0_A3_IN":"YEM","ADM0_A3_NP":"YEM","ADM0_A3_PK":"YEM","ADM0_A3_DE":"YEM","ADM0_A3_GB":"YEM","ADM0_A3_BR":"YEM","ADM0_A3_IL":"YEM","ADM0_A3_PS":"YEM","ADM0_A3_SA":"YEM","ADM0_A3_EG":"YEM","ADM0_A3_MA":"YEM","ADM0_A3_PT":"YEM","ADM0_A3_AR":"YEM","ADM0_A3_JP":"YEM","ADM0_A3_KO":"YEM","ADM0_A3_VN":"YEM","ADM0_A3_TR":"YEM","ADM0_A3_ID":"YEM","ADM0_A3_PL":"YEM","ADM0_A3_GR":"YEM","ADM0_A3_IT":"YEM","ADM0_A3_NL":"YEM","ADM0_A3_SE":"YEM","ADM0_A3_BD":"YEM","ADM0_A3_UA":"YEM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":45.874383,"LABEL_Y":15.328226,"NE_ID":1159321425,"WIKIDATAID":"Q805","NAME_AR":"اليمن","NAME_BN":"ইয়েমেন","NAME_DE":"Jemen","NAME_EN":"Yemen","NAME_ES":"Yemen","NAME_FA":"یمن","NAME_FR":"Yémen","NAME_EL":"Υεμένη","NAME_HE":"תימן","NAME_HI":"यमन","NAME_HU":"Jemen","NAME_ID":"Yaman","NAME_IT":"Yemen","NAME_JA":"イエメン","NAME_KO":"예멘","NAME_NL":"Jemen","NAME_PL":"Jemen","NAME_PT":"Iémen","NAME_RU":"Йемен","NAME_SV":"Jemen","NAME_TR":"Yemen","NAME_UK":"Ємен","NAME_UR":"یمن","NAME_VI":"Yemen","NAME_ZH":"也门","NAME_ZHT":"葉門","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[42.604873,12.58595,53.108573,19.000003],"geometry":{"type":"Polygon","coordinates":[[[52.00001,19.000003],[52.782184,17.349742],[53.108573,16.651051],[52.385206,16.382411],[52.191729,15.938433],[52.168165,15.59742],[51.172515,15.17525],[49.574576,14.708767],[48.679231,14.003202],[48.238947,13.94809],[47.938914,14.007233],[47.354454,13.59222],[46.717076,13.399699],[45.877593,13.347764],[45.62505,13.290946],[45.406459,13.026905],[45.144356,12.953938],[44.989533,12.699587],[44.494576,12.721653],[44.175113,12.58595],[43.482959,12.6368],[43.222871,13.22095],[43.251448,13.767584],[43.087944,14.06263],[42.892245,14.802249],[42.604873,15.213335],[42.805015,15.261963],[42.702438,15.718886],[42.823671,15.911742],[42.779332,16.347891],[43.218375,16.66689],[43.115798,17.08844],[43.380794,17.579987],[43.791519,17.319977],[44.062613,17.410359],[45.216651,17.433329],[45.399999,17.333335],[46.366659,17.233315],[46.749994,17.283338],[47.000005,16.949999],[47.466695,17.116682],[48.183344,18.166669],[49.116672,18.616668],[52.00001,19.000003]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Saudi Arabia","SOV_A3":"SAU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Saudi Arabia","ADM0_A3":"SAU","GEOU_DIF":0,"GEOUNIT":"Saudi Arabia","GU_A3":"SAU","SU_DIF":0,"SUBUNIT":"Saudi Arabia","SU_A3":"SAU","BRK_DIFF":0,"NAME":"Saudi Arabia","NAME_LONG":"Saudi Arabia","BRK_A3":"SAU","BRK_NAME":"Saudi Arabia","BRK_GROUP":null,"ABBREV":"Saud.","POSTAL":"SA","FORMAL_EN":"Kingdom of Saudi Arabia","FORMAL_FR":null,"NAME_CIAWF":"Saudi Arabia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Saudi Arabia","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":1,"MAPCOLOR9":6,"MAPCOLOR13":7,"POP_EST":34268528,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":792966,"GDP_YEAR":2019,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"SA","ISO_A2":"SA","ISO_A2_EH":"SA","ISO_A3":"SAU","ISO_A3_EH":"SAU","ISO_N3":"682","ISO_N3_EH":"682","UN_A3":"682","WB_A2":"SA","WB_A3":"SAU","WOE_ID":23424938,"WOE_ID_EH":23424938,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"SAU","ADM0_DIFF":null,"ADM0_TLC":"SAU","ADM0_A3_US":"SAU","ADM0_A3_FR":"SAU","ADM0_A3_RU":"SAU","ADM0_A3_ES":"SAU","ADM0_A3_CN":"SAU","ADM0_A3_TW":"SAU","ADM0_A3_IN":"SAU","ADM0_A3_NP":"SAU","ADM0_A3_PK":"SAU","ADM0_A3_DE":"SAU","ADM0_A3_GB":"SAU","ADM0_A3_BR":"SAU","ADM0_A3_IL":"SAU","ADM0_A3_PS":"SAU","ADM0_A3_SA":"SAU","ADM0_A3_EG":"SAU","ADM0_A3_MA":"SAU","ADM0_A3_PT":"SAU","ADM0_A3_AR":"SAU","ADM0_A3_JP":"SAU","ADM0_A3_KO":"SAU","ADM0_A3_VN":"SAU","ADM0_A3_TR":"SAU","ADM0_A3_ID":"SAU","ADM0_A3_PL":"SAU","ADM0_A3_GR":"SAU","ADM0_A3_IT":"SAU","ADM0_A3_NL":"SAU","ADM0_A3_SE":"SAU","ADM0_A3_BD":"SAU","ADM0_A3_UA":"SAU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":7,"LABEL_X":44.6996,"LABEL_Y":23.806908,"NE_ID":1159321225,"WIKIDATAID":"Q851","NAME_AR":"السعودية","NAME_BN":"সৌদি আরব","NAME_DE":"Saudi-Arabien","NAME_EN":"Saudi Arabia","NAME_ES":"Arabia Saudita","NAME_FA":"عربستان سعودی","NAME_FR":"Arabie saoudite","NAME_EL":"Σαουδική Αραβία","NAME_HE":"ערב הסעודית","NAME_HI":"सउदी अरब","NAME_HU":"Szaúd-Arábia","NAME_ID":"Arab Saudi","NAME_IT":"Arabia Saudita","NAME_JA":"サウジアラビア","NAME_KO":"사우디아라비아","NAME_NL":"Saoedi-Arabië","NAME_PL":"Arabia Saudyjska","NAME_PT":"Arábia Saudita","NAME_RU":"Саудовская Аравия","NAME_SV":"Saudiarabien","NAME_TR":"Suudi Arabistan","NAME_UK":"Саудівська Аравія","NAME_UR":"سعودی عرب","NAME_VI":"Ả Rập Saudi","NAME_ZH":"沙特阿拉伯","NAME_ZHT":"沙烏地阿拉伯","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[34.632336,16.347891,55.666659,32.161009],"geometry":{"type":"Polygon","coordinates":[[[34.956037,29.356555],[36.068941,29.197495],[36.501214,29.505254],[36.740528,29.865283],[37.503582,30.003776],[37.66812,30.338665],[37.998849,30.5085],[37.002166,31.508413],[39.004886,32.010217],[39.195468,32.161009],[40.399994,31.889992],[41.889981,31.190009],[44.709499,29.178891],[46.568713,29.099025],[47.459822,29.002519],[47.708851,28.526063],[48.416094,28.552004],[48.807595,27.689628],[49.299554,27.461218],[49.470914,27.109999],[50.152422,26.689663],[50.212935,26.277027],[50.113303,25.943972],[50.239859,25.60805],[50.527387,25.327808],[50.660557,24.999896],[50.810108,24.754743],[51.112415,24.556331],[51.389608,24.627386],[51.579519,24.245497],[51.617708,24.014219],[52.000733,23.001154],[55.006803,22.496948],[55.208341,22.70833],[55.666659,22.000001],[54.999982,19.999994],[52.00001,19.000003],[49.116672,18.616668],[48.183344,18.166669],[47.466695,17.116682],[47.000005,16.949999],[46.749994,17.283338],[46.366659,17.233315],[45.399999,17.333335],[45.216651,17.433329],[44.062613,17.410359],[43.791519,17.319977],[43.380794,17.579987],[43.115798,17.08844],[43.218375,16.66689],[42.779332,16.347891],[42.649573,16.774635],[42.347989,17.075806],[42.270888,17.474722],[41.754382,17.833046],[41.221391,18.6716],[40.939341,19.486485],[40.247652,20.174635],[39.801685,20.338862],[39.139399,21.291905],[39.023696,21.986875],[39.066329,22.579656],[38.492772,23.688451],[38.02386,24.078686],[37.483635,24.285495],[37.154818,24.858483],[37.209491,25.084542],[36.931627,25.602959],[36.639604,25.826228],[36.249137,26.570136],[35.640182,27.37652],[35.130187,28.063352],[34.632336,28.058546],[34.787779,28.607427],[34.83222,28.957483],[34.956037,29.356555]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":4,"SOVEREIGNT":"Antarctica","SOV_A3":"ATA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Indeterminate","TLC":"1","ADMIN":"Antarctica","ADM0_A3":"ATA","GEOU_DIF":0,"GEOUNIT":"Antarctica","GU_A3":"ATA","SU_DIF":0,"SUBUNIT":"Antarctica","SU_A3":"ATA","BRK_DIFF":0,"NAME":"Antarctica","NAME_LONG":"Antarctica","BRK_A3":"ATA","BRK_NAME":"Antarctica","BRK_GROUP":null,"ABBREV":"Ant.","POSTAL":"AQ","FORMAL_EN":null,"FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":"By treaty","NOTE_BRK":"Multiple claims held in abeyance by treaty","NAME_SORT":"Antarctica","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":1,"MAPCOLOR13":-99,"POP_EST":4490,"POP_RANK":4,"POP_YEAR":2019,"GDP_MD":898,"GDP_YEAR":2013,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"AY","ISO_A2":"AQ","ISO_A2_EH":"AQ","ISO_A3":"ATA","ISO_A3_EH":"ATA","ISO_N3":"010","ISO_N3_EH":"010","UN_A3":"010","WB_A2":"-99","WB_A3":"-99","WOE_ID":28289409,"WOE_ID_EH":28289409,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ATA","ADM0_DIFF":null,"ADM0_TLC":"ATA","ADM0_A3_US":"ATA","ADM0_A3_FR":"ATA","ADM0_A3_RU":"ATA","ADM0_A3_ES":"ATA","ADM0_A3_CN":"ATA","ADM0_A3_TW":"ATA","ADM0_A3_IN":"ATA","ADM0_A3_NP":"ATA","ADM0_A3_PK":"ATA","ADM0_A3_DE":"ATA","ADM0_A3_GB":"ATA","ADM0_A3_BR":"ATA","ADM0_A3_IL":"ATA","ADM0_A3_PS":"ATA","ADM0_A3_SA":"ATA","ADM0_A3_EG":"ATA","ADM0_A3_MA":"ATA","ADM0_A3_PT":"ATA","ADM0_A3_AR":"ATA","ADM0_A3_JP":"ATA","ADM0_A3_KO":"ATA","ADM0_A3_VN":"ATA","ADM0_A3_TR":"ATA","ADM0_A3_ID":"ATA","ADM0_A3_PL":"ATA","ADM0_A3_GR":"ATA","ADM0_A3_IT":"ATA","ADM0_A3_NL":"ATA","ADM0_A3_SE":"ATA","ADM0_A3_BD":"ATA","ADM0_A3_UA":"ATA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Antarctica","REGION_UN":"Antarctica","SUBREGION":"Antarctica","REGION_WB":"Antarctica","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":35.885455,"LABEL_Y":-79.843222,"NE_ID":1159320335,"WIKIDATAID":"Q51","NAME_AR":"القارة القطبية الجنوبية","NAME_BN":"অ্যান্টার্কটিকা","NAME_DE":"Antarktika","NAME_EN":"Antarctica","NAME_ES":"Antártida","NAME_FA":"جنوبگان","NAME_FR":"Antarctique","NAME_EL":"Ανταρκτική","NAME_HE":"אנטארקטיקה","NAME_HI":"अंटार्कटिका","NAME_HU":"Antarktika","NAME_ID":"Antartika","NAME_IT":"Antartide","NAME_JA":"南極大陸","NAME_KO":"남극","NAME_NL":"Antarctica","NAME_PL":"Antarktyda","NAME_PT":"Antártida","NAME_RU":"Антарктида","NAME_SV":"Antarktis","NAME_TR":"Antarktika","NAME_UK":"Антарктида","NAME_UR":"انٹارکٹکا","NAME_VI":"Châu Nam Cực","NAME_ZH":"南极洲","NAME_ZHT":"南極洲","FCLASS_ISO":"Admin-0 dependency","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 dependency","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-180,-90,180,-63.27066],"geometry":{"type":"MultiPolygon","coordinates":[[[[-48.660616,-78.047019],[-48.151396,-78.04707],[-46.662857,-77.831476],[-45.154758,-78.04707],[-43.920828,-78.478103],[-43.48995,-79.08556],[-43.372438,-79.516645],[-43.333267,-80.026123],[-44.880537,-80.339644],[-46.506174,-80.594357],[-48.386421,-80.829485],[-50.482107,-81.025442],[-52.851988,-80.966685],[-54.164259,-80.633528],[-53.987991,-80.222028],[-51.853134,-79.94773],[-50.991326,-79.614623],[-50.364595,-79.183487],[-49.914131,-78.811209],[-49.306959,-78.458569],[-48.660616,-78.047018],[-48.660616,-78.047019]]],[[[-66.290031,-80.255773],[-64.037688,-80.294944],[-61.883246,-80.39287],[-61.138976,-79.981371],[-60.610119,-79.628679],[-59.572095,-80.040179],[-59.865849,-80.549657],[-60.159656,-81.000327],[-62.255393,-80.863178],[-64.488125,-80.921934],[-65.741666,-80.588827],[-65.741666,-80.549657],[-66.290031,-80.255773]]],[[[-73.915819,-71.269345],[-73.915819,-71.269344],[-73.230331,-71.15178],[-72.074717,-71.190951],[-71.780962,-70.681473],[-71.72218,-70.309196],[-71.741791,-69.505782],[-71.173815,-69.035475],[-70.253252,-68.87874],[-69.724447,-69.251017],[-69.489422,-69.623346],[-69.058518,-70.074016],[-68.725541,-70.505153],[-68.451346,-70.955823],[-68.333834,-71.406493],[-68.510128,-71.798407],[-68.784297,-72.170736],[-69.959471,-72.307885],[-71.075889,-72.503842],[-72.388134,-72.484257],[-71.8985,-72.092343],[-73.073622,-72.229492],[-74.19004,-72.366693],[-74.953895,-72.072757],[-75.012625,-71.661258],[-73.915819,-71.269345]]],[[[-102.330725,-71.894164],[-102.330725,-71.894164],[-101.703967,-71.717792],[-100.430919,-71.854993],[-98.98155,-71.933334],[-97.884743,-72.070535],[-96.787937,-71.952971],[-96.20035,-72.521205],[-96.983765,-72.442864],[-98.198083,-72.482035],[-99.432013,-72.442864],[-100.783455,-72.50162],[-101.801868,-72.305663],[-102.330725,-71.894164]]],[[[-122.621735,-73.657778],[-122.621735,-73.657777],[-122.406245,-73.324619],[-121.211511,-73.50099],[-119.918851,-73.657725],[-118.724143,-73.481353],[-119.292119,-73.834097],[-120.232217,-74.08881],[-121.62283,-74.010468],[-122.621735,-73.657778]]],[[[-127.28313,-73.461769],[-127.28313,-73.461768],[-126.558472,-73.246226],[-125.559566,-73.481353],[-124.031882,-73.873268],[-124.619469,-73.834097],[-125.912181,-73.736118],[-127.28313,-73.461769]]],[[[-163.712896,-78.595667],[-163.712896,-78.595667],[-163.105801,-78.223338],[-161.245113,-78.380176],[-160.246208,-78.693645],[-159.482405,-79.046338],[-159.208184,-79.497059],[-161.127601,-79.634209],[-162.439847,-79.281465],[-163.027408,-78.928774],[-163.066604,-78.869966],[-163.712896,-78.595667]]],[[[180,-84.71338],[180,-90],[-180,-90],[-180,-84.71338],[-179.942499,-84.721443],[-179.058677,-84.139412],[-177.256772,-84.452933],[-177.140807,-84.417941],[-176.084673,-84.099259],[-175.947235,-84.110449],[-175.829882,-84.117914],[-174.382503,-84.534323],[-173.116559,-84.117914],[-172.889106,-84.061019],[-169.951223,-83.884647],[-168.999989,-84.117914],[-168.530199,-84.23739],[-167.022099,-84.570497],[-164.182144,-84.82521],[-161.929775,-85.138731],[-158.07138,-85.37391],[-155.192253,-85.09956],[-150.942099,-85.295517],[-148.533073,-85.609038],[-145.888918,-85.315102],[-143.107718,-85.040752],[-142.892279,-84.570497],[-146.829068,-84.531274],[-150.060732,-84.296146],[-150.902928,-83.904232],[-153.586201,-83.68869],[-153.409907,-83.23802],[-153.037759,-82.82652],[-152.665637,-82.454192],[-152.861517,-82.042692],[-154.526299,-81.768394],[-155.29018,-81.41565],[-156.83745,-81.102129],[-154.408787,-81.160937],[-152.097662,-81.004151],[-150.648293,-81.337309],[-148.865998,-81.043373],[-147.22075,-80.671045],[-146.417749,-80.337938],[-146.770286,-79.926439],[-148.062947,-79.652089],[-149.531901,-79.358205],[-151.588416,-79.299397],[-153.390322,-79.162248],[-155.329376,-79.064269],[-155.975668,-78.69194],[-157.268302,-78.378419],[-158.051768,-78.025676],[-158.365134,-76.889207],[-157.875474,-76.987238],[-156.974573,-77.300759],[-155.329376,-77.202728],[-153.742832,-77.065579],[-152.920247,-77.496664],[-151.33378,-77.398737],[-150.00195,-77.183143],[-148.748486,-76.908845],[-147.612483,-76.575738],[-146.104409,-76.47776],[-146.143528,-76.105431],[-146.496091,-75.733154],[-146.20231,-75.380411],[-144.909624,-75.204039],[-144.322037,-75.537197],[-142.794353,-75.34124],[-141.638764,-75.086475],[-140.209007,-75.06689],[-138.85759,-74.968911],[-137.5062,-74.733783],[-136.428901,-74.518241],[-135.214583,-74.302699],[-134.431194,-74.361455],[-133.745654,-74.439848],[-132.257168,-74.302699],[-130.925311,-74.479019],[-129.554284,-74.459433],[-128.242038,-74.322284],[-126.890622,-74.420263],[-125.402082,-74.518241],[-124.011496,-74.479019],[-122.562152,-74.498604],[-121.073613,-74.518241],[-119.70256,-74.479019],[-118.684145,-74.185083],[-117.469801,-74.028348],[-116.216312,-74.243891],[-115.021552,-74.067519],[-113.944331,-73.714828],[-113.297988,-74.028348],[-112.945452,-74.38104],[-112.299083,-74.714198],[-111.261059,-74.420263],[-110.066325,-74.79254],[-108.714909,-74.910103],[-107.559346,-75.184454],[-106.149148,-75.125698],[-104.876074,-74.949326],[-103.367949,-74.988497],[-102.016507,-75.125698],[-100.645531,-75.302018],[-100.1167,-74.870933],[-100.763043,-74.537826],[-101.252703,-74.185083],[-102.545337,-74.106742],[-103.113313,-73.734413],[-103.328752,-73.362084],[-103.681289,-72.61753],[-102.917485,-72.754679],[-101.60524,-72.813436],[-100.312528,-72.754679],[-99.13738,-72.911414],[-98.118889,-73.20535],[-97.688037,-73.558041],[-96.336595,-73.616849],[-95.043961,-73.4797],[-93.672907,-73.283743],[-92.439003,-73.166179],[-91.420564,-73.401307],[-90.088733,-73.322914],[-89.226951,-72.558722],[-88.423951,-73.009393],[-87.268337,-73.185764],[-86.014822,-73.087786],[-85.192236,-73.4797],[-83.879991,-73.518871],[-82.665646,-73.636434],[-81.470913,-73.851977],[-80.687447,-73.4797],[-80.295791,-73.126956],[-79.296886,-73.518871],[-77.925858,-73.420892],[-76.907367,-73.636434],[-76.221879,-73.969541],[-74.890049,-73.871614],[-73.852024,-73.65602],[-72.833533,-73.401307],[-71.619215,-73.264157],[-70.209042,-73.146542],[-68.935916,-73.009393],[-67.956622,-72.79385],[-67.369061,-72.480329],[-67.134036,-72.049244],[-67.251548,-71.637745],[-67.56494,-71.245831],[-67.917477,-70.853917],[-68.230843,-70.462055],[-68.485452,-70.109311],[-68.544209,-69.717397],[-68.446282,-69.325535],[-67.976233,-68.953206],[-67.5845,-68.541707],[-67.427843,-68.149844],[-67.62367,-67.718759],[-67.741183,-67.326845],[-67.251548,-66.876175],[-66.703184,-66.58224],[-66.056815,-66.209963],[-65.371327,-65.89639],[-64.568276,-65.602506],[-64.176542,-65.171423],[-63.628152,-64.897073],[-63.001394,-64.642308],[-62.041686,-64.583552],[-61.414928,-64.270031],[-60.709855,-64.074074],[-59.887269,-63.95651],[-59.162585,-63.701745],[-58.594557,-63.388224],[-57.811143,-63.27066],[-57.223582,-63.525425],[-57.59573,-63.858532],[-58.614143,-64.152467],[-59.045073,-64.36801],[-59.789342,-64.211223],[-60.611928,-64.309202],[-61.297416,-64.54433],[-62.0221,-64.799094],[-62.51176,-65.09303],[-62.648858,-65.484942],[-62.590128,-65.857219],[-62.120079,-66.190326],[-62.805567,-66.425505],[-63.74569,-66.503847],[-64.294106,-66.837004],[-64.881693,-67.150474],[-65.508425,-67.58161],[-65.665082,-67.953887],[-65.312545,-68.365335],[-64.783715,-68.678908],[-63.961103,-68.913984],[-63.1973,-69.227556],[-62.785955,-69.619419],[-62.570516,-69.991747],[-62.276736,-70.383661],[-61.806661,-70.716768],[-61.512906,-71.089045],[-61.375809,-72.010074],[-61.081977,-72.382351],[-61.003661,-72.774265],[-60.690269,-73.166179],[-60.827367,-73.695242],[-61.375809,-74.106742],[-61.96337,-74.439848],[-63.295201,-74.576997],[-63.74569,-74.92974],[-64.352836,-75.262847],[-65.860987,-75.635124],[-67.192818,-75.79191],[-68.446282,-76.007452],[-69.797724,-76.222995],[-70.600724,-76.634494],[-72.206776,-76.673665],[-73.969536,-76.634494],[-75.555977,-76.712887],[-77.24037,-76.712887],[-76.926979,-77.104802],[-75.399294,-77.28107],[-74.282876,-77.55542],[-73.656119,-77.908112],[-74.772536,-78.221633],[-76.4961,-78.123654],[-77.925858,-78.378419],[-77.984666,-78.789918],[-78.023785,-79.181833],[-76.848637,-79.514939],[-76.633224,-79.887216],[-75.360097,-80.259545],[-73.244852,-80.416331],[-71.442946,-80.69063],[-70.013163,-81.004151],[-68.191646,-81.317672],[-65.704279,-81.474458],[-63.25603,-81.748757],[-61.552026,-82.042692],[-59.691416,-82.37585],[-58.712121,-82.846106],[-58.222487,-83.218434],[-57.008117,-82.865691],[-55.362894,-82.571755],[-53.619771,-82.258235],[-51.543644,-82.003521],[-49.76135,-81.729171],[-47.273931,-81.709586],[-44.825708,-81.846735],[-42.808363,-82.081915],[-42.16202,-81.65083],[-40.771433,-81.356894],[-38.244818,-81.337309],[-36.26667,-81.121715],[-34.386397,-80.906172],[-32.310296,-80.769023],[-30.097098,-80.592651],[-28.549802,-80.337938],[-29.254901,-79.985195],[-29.685805,-79.632503],[-29.685805,-79.260226],[-31.624808,-79.299397],[-33.681324,-79.456132],[-35.639912,-79.456132],[-35.914107,-79.083855],[-35.77701,-78.339248],[-35.326546,-78.123654],[-33.896763,-77.888526],[-32.212369,-77.65345],[-30.998051,-77.359515],[-29.783732,-77.065579],[-28.882779,-76.673665],[-27.511752,-76.497345],[-26.160336,-76.360144],[-25.474822,-76.281803],[-23.927552,-76.24258],[-22.458598,-76.105431],[-21.224694,-75.909474],[-20.010375,-75.674346],[-18.913543,-75.439218],[-17.522982,-75.125698],[-16.641589,-74.79254],[-15.701491,-74.498604],[-15.40771,-74.106742],[-16.46532,-73.871614],[-16.112784,-73.460114],[-15.446855,-73.146542],[-14.408805,-72.950585],[-13.311973,-72.715457],[-12.293508,-72.401936],[-11.510067,-72.010074],[-11.020433,-71.539767],[-10.295774,-71.265416],[-9.101015,-71.324224],[-8.611381,-71.65733],[-7.416622,-71.696501],[-7.377451,-71.324224],[-6.868232,-70.93231],[-5.790985,-71.030289],[-5.536375,-71.402617],[-4.341667,-71.461373],[-3.048981,-71.285053],[-1.795492,-71.167438],[-0.659489,-71.226246],[-0.228637,-71.637745],[0.868195,-71.304639],[1.886686,-71.128267],[3.022638,-70.991118],[4.139055,-70.853917],[5.157546,-70.618789],[6.273912,-70.462055],[7.13572,-70.246512],[7.742866,-69.893769],[8.48711,-70.148534],[9.525135,-70.011333],[10.249845,-70.48164],[10.817821,-70.834332],[11.953824,-70.638375],[12.404287,-70.246512],[13.422778,-69.972162],[14.734998,-70.030918],[15.126757,-70.403247],[15.949342,-70.030918],[17.026589,-69.913354],[18.201711,-69.874183],[19.259373,-69.893769],[20.375739,-70.011333],[21.452985,-70.07014],[21.923034,-70.403247],[22.569403,-70.697182],[23.666184,-70.520811],[24.841357,-70.48164],[25.977309,-70.48164],[27.093726,-70.462055],[28.09258,-70.324854],[29.150242,-70.20729],[30.031583,-69.93294],[30.971733,-69.75662],[31.990172,-69.658641],[32.754053,-69.384291],[33.302443,-68.835642],[33.870419,-68.502588],[34.908495,-68.659271],[35.300202,-69.012014],[36.16201,-69.247142],[37.200035,-69.168748],[37.905108,-69.52144],[38.649404,-69.776205],[39.667894,-69.541077],[40.020431,-69.109941],[40.921358,-68.933621],[41.959434,-68.600514],[42.938702,-68.463313],[44.113876,-68.267408],[44.897291,-68.051866],[45.719928,-67.816738],[46.503343,-67.601196],[47.44344,-67.718759],[48.344419,-67.366068],[48.990736,-67.091718],[49.930885,-67.111303],[50.753471,-66.876175],[50.949325,-66.523484],[51.791547,-66.249133],[52.614133,-66.053176],[53.613038,-65.89639],[54.53355,-65.818049],[55.414943,-65.876805],[56.355041,-65.974783],[57.158093,-66.249133],[57.255968,-66.680218],[58.137361,-67.013324],[58.744508,-67.287675],[59.939318,-67.405239],[60.605221,-67.679589],[61.427806,-67.953887],[62.387489,-68.012695],[63.19049,-67.816738],[64.052349,-67.405239],[64.992447,-67.620729],[65.971715,-67.738345],[66.911864,-67.855909],[67.891133,-67.934302],[68.890038,-67.934302],[69.712624,-68.972791],[69.673453,-69.227556],[69.555941,-69.678226],[68.596258,-69.93294],[67.81274,-70.305268],[67.949889,-70.697182],[69.066307,-70.677545],[68.929157,-71.069459],[68.419989,-71.441788],[67.949889,-71.853287],[68.71377,-72.166808],[69.869307,-72.264787],[71.024895,-72.088415],[71.573285,-71.696501],[71.906288,-71.324224],[72.454627,-71.010703],[73.08141,-70.716768],[73.33602,-70.364024],[73.864877,-69.874183],[74.491557,-69.776205],[75.62756,-69.737034],[76.626465,-69.619419],[77.644904,-69.462684],[78.134539,-69.07077],[78.428371,-68.698441],[79.113859,-68.326216],[80.093127,-68.071503],[80.93535,-67.875546],[81.483792,-67.542388],[82.051767,-67.366068],[82.776426,-67.209282],[83.775331,-67.30726],[84.676206,-67.209282],[85.655527,-67.091718],[86.752359,-67.150474],[87.477017,-66.876175],[87.986289,-66.209911],[88.358411,-66.484261],[88.828408,-66.954568],[89.67063,-67.150474],[90.630365,-67.228867],[91.5901,-67.111303],[92.608539,-67.189696],[93.548637,-67.209282],[94.17542,-67.111303],[95.017591,-67.170111],[95.781472,-67.385653],[96.682399,-67.248504],[97.759646,-67.248504],[98.68021,-67.111303],[99.718182,-67.248504],[100.384188,-66.915346],[100.893356,-66.58224],[101.578896,-66.30789],[102.832411,-65.563284],[103.478676,-65.700485],[104.242557,-65.974783],[104.90846,-66.327527],[106.181561,-66.934931],[107.160881,-66.954568],[108.081393,-66.954568],[109.15864,-66.837004],[110.235835,-66.699804],[111.058472,-66.425505],[111.74396,-66.13157],[112.860378,-66.092347],[113.604673,-65.876805],[114.388088,-66.072762],[114.897308,-66.386283],[115.602381,-66.699804],[116.699161,-66.660633],[117.384701,-66.915346],[118.57946,-67.170111],[119.832924,-67.268089],[120.871,-67.189696],[121.654415,-66.876175],[122.320369,-66.562654],[123.221296,-66.484261],[124.122274,-66.621462],[125.160247,-66.719389],[126.100396,-66.562654],[127.001427,-66.562654],[127.882768,-66.660633],[128.80328,-66.758611],[129.704259,-66.58224],[130.781454,-66.425505],[131.799945,-66.386283],[132.935896,-66.386283],[133.85646,-66.288304],[134.757387,-66.209963],[135.031582,-65.72007],[135.070753,-65.308571],[135.697485,-65.582869],[135.873805,-66.033591],[136.206705,-66.44509],[136.618049,-66.778197],[137.460271,-66.954568],[138.596223,-66.895761],[139.908442,-66.876175],[140.809421,-66.817367],[142.121692,-66.817367],[143.061842,-66.797782],[144.374061,-66.837004],[145.490427,-66.915346],[146.195552,-67.228867],[145.999699,-67.601196],[146.646067,-67.895131],[147.723263,-68.130259],[148.839629,-68.385024],[150.132314,-68.561292],[151.483705,-68.71813],[152.502247,-68.874813],[153.638199,-68.894502],[154.284567,-68.561292],[155.165857,-68.835642],[155.92979,-69.149215],[156.811132,-69.384291],[158.025528,-69.482269],[159.181013,-69.599833],[159.670699,-69.991747],[160.80665,-70.226875],[161.570479,-70.579618],[162.686897,-70.736353],[163.842434,-70.716768],[164.919681,-70.775524],[166.11444,-70.755938],[167.309095,-70.834332],[168.425616,-70.971481],[169.463589,-71.20666],[170.501665,-71.402617],[171.20679,-71.696501],[171.089227,-72.088415],[170.560422,-72.441159],[170.109958,-72.891829],[169.75737,-73.24452],[169.287321,-73.65602],[167.975101,-73.812806],[167.387489,-74.165498],[166.094803,-74.38104],[165.644391,-74.772954],[164.958851,-75.145283],[164.234193,-75.458804],[163.822797,-75.870303],[163.568239,-76.24258],[163.47026,-76.693302],[163.489897,-77.065579],[164.057873,-77.457442],[164.273363,-77.82977],[164.743464,-78.182514],[166.604126,-78.319611],[166.995781,-78.750748],[165.193876,-78.907483],[163.666217,-79.123025],[161.766385,-79.162248],[160.924162,-79.730482],[160.747894,-80.200737],[160.316964,-80.573066],[159.788211,-80.945395],[161.120016,-81.278501],[161.629287,-81.690001],[162.490992,-82.062278],[163.705336,-82.395435],[165.095949,-82.708956],[166.604126,-83.022477],[168.895665,-83.335998],[169.404782,-83.825891],[172.283934,-84.041433],[172.477049,-84.117914],[173.224083,-84.41371],[175.985672,-84.158997],[178.277212,-84.472518],[180,-84.71338]]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Northern Cyprus","SOV_A3":"CYN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Northern Cyprus","ADM0_A3":"CYN","GEOU_DIF":0,"GEOUNIT":"Northern Cyprus","GU_A3":"CYN","SU_DIF":0,"SUBUNIT":"Northern Cyprus","SU_A3":"CYN","BRK_DIFF":0,"NAME":"N. Cyprus","NAME_LONG":"Northern Cyprus","BRK_A3":"CYN","BRK_NAME":"N. Cyprus","BRK_GROUP":null,"ABBREV":"N. Cy.","POSTAL":"CN","FORMAL_EN":"Turkish Republic of Northern Cyprus","FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":"Self admin.","NOTE_BRK":"Self admin.; Claimed by Cyprus","NAME_SORT":"Cyprus, Northern","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":8,"POP_EST":326000,"POP_RANK":10,"POP_YEAR":2017,"GDP_MD":3600,"GDP_YEAR":2013,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"-99","ISO_A2":"-99","ISO_A2_EH":"-99","ISO_A3":"-99","ISO_A3_EH":"-99","ISO_N3":"-99","ISO_N3_EH":"-99","UN_A3":"-099","WB_A2":"-99","WB_A3":"-99","WOE_ID":-90,"WOE_ID_EH":23424995,"WOE_NOTE":"WOE lists as subunit of united Cyprus","ADM0_ISO":"CYP","ADM0_DIFF":"1","ADM0_TLC":"CYN","ADM0_A3_US":"CYP","ADM0_A3_FR":"CYP","ADM0_A3_RU":"CYP","ADM0_A3_ES":"CYP","ADM0_A3_CN":"CYP","ADM0_A3_TW":"CYP","ADM0_A3_IN":"CYP","ADM0_A3_NP":"CYP","ADM0_A3_PK":"CYP","ADM0_A3_DE":"CYP","ADM0_A3_GB":"CYP","ADM0_A3_BR":"CYP","ADM0_A3_IL":"CYP","ADM0_A3_PS":"CYP","ADM0_A3_SA":"CYP","ADM0_A3_EG":"CYP","ADM0_A3_MA":"CYP","ADM0_A3_PT":"CYP","ADM0_A3_AR":"CYP","ADM0_A3_JP":"CYP","ADM0_A3_KO":"CYP","ADM0_A3_VN":"CYP","ADM0_A3_TR":"CYN","ADM0_A3_ID":"CYP","ADM0_A3_PL":"CYP","ADM0_A3_GR":"CYP","ADM0_A3_IT":"CYP","ADM0_A3_NL":"CYP","ADM0_A3_SE":"CYP","ADM0_A3_BD":"CYP","ADM0_A3_UA":"CYP","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":9,"LONG_LEN":15,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":6,"MAX_LABEL":10,"LABEL_X":33.692434,"LABEL_Y":35.216071,"NE_ID":1159320531,"WIKIDATAID":"Q23681","NAME_AR":"قبرص الشمالية","NAME_BN":"উত্তর সাইপ্রাস","NAME_DE":"Türkische Republik Nordzypern","NAME_EN":"Turkish Republic of Northern Cyprus","NAME_ES":"República Turca del Norte de Chipre","NAME_FA":"جمهوری ترک قبرس شمالی","NAME_FR":"Chypre du Nord","NAME_EL":"Τουρκική Δημοκρατία της Βόρειας Κύπρου","NAME_HE":"הרפובליקה הטורקית של צפון קפריסין","NAME_HI":"उत्तरी साइप्रस","NAME_HU":"Észak-Ciprus","NAME_ID":"Republik Turki Siprus Utara","NAME_IT":"Cipro del Nord","NAME_JA":"北キプロス・トルコ共和国","NAME_KO":"북키프로스","NAME_NL":"Noord-Cyprus","NAME_PL":"Cypr Północny","NAME_PT":"República Turca do Chipre do Norte","NAME_RU":"Турецкая Республика Северного Кипра","NAME_SV":"Nordcypern","NAME_TR":"Kuzey Kıbrıs Türk Cumhuriyeti","NAME_UK":"Турецька Республіка Північного Кіпру","NAME_UR":"ترک جمہوریہ شمالی قبرص","NAME_VI":"Bắc Síp","NAME_ZH":"北塞浦路斯土耳其共和国","NAME_ZHT":"北賽普勒斯土耳其共和國","FCLASS_ISO":"Unrecognized","TLC_DIFF":"1","FCLASS_TLC":"Admin-0 country","FCLASS_US":"Admin-0 breakaway and disputed","FCLASS_FR":"Unrecognized","FCLASS_RU":"Unrecognized","FCLASS_ES":"Unrecognized","FCLASS_CN":"Unrecognized","FCLASS_TW":"Unrecognized","FCLASS_IN":"Unrecognized","FCLASS_NP":"Unrecognized","FCLASS_PK":"Unrecognized","FCLASS_DE":"Unrecognized","FCLASS_GB":"Unrecognized","FCLASS_BR":"Unrecognized","FCLASS_IL":"Unrecognized","FCLASS_PS":"Unrecognized","FCLASS_SA":"Unrecognized","FCLASS_EG":"Unrecognized","FCLASS_MA":"Unrecognized","FCLASS_PT":"Unrecognized","FCLASS_AR":"Unrecognized","FCLASS_JP":"Unrecognized","FCLASS_KO":"Unrecognized","FCLASS_VN":"Unrecognized","FCLASS_TR":"Admin-0 country","FCLASS_ID":"Unrecognized","FCLASS_PL":"Unrecognized","FCLASS_GR":"Unrecognized","FCLASS_IT":"Unrecognized","FCLASS_NL":"Unrecognized","FCLASS_SE":"Unrecognized","FCLASS_BD":"Unrecognized","FCLASS_UA":"Unrecognized"},"bbox":[32.73178,35.000345,34.576474,35.671596],"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.802474,35.145504],[32.946961,35.386703],[33.667227,35.373216],[34.576474,35.671596],[33.900804,35.245756],[33.973617,35.058506],[33.86644,35.093595],[33.675392,35.017863],[33.525685,35.038688],[33.475817,35.000345],[33.455922,35.101424],[33.383833,35.162712],[33.190977,35.173125],[32.919572,35.087833],[32.73178,35.140026]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Cyprus","SOV_A3":"CYP","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Cyprus","ADM0_A3":"CYP","GEOU_DIF":0,"GEOUNIT":"Cyprus","GU_A3":"CYP","SU_DIF":0,"SUBUNIT":"Cyprus","SU_A3":"CYP","BRK_DIFF":0,"NAME":"Cyprus","NAME_LONG":"Cyprus","BRK_A3":"CYP","BRK_NAME":"Cyprus","BRK_GROUP":null,"ABBREV":"Cyp.","POSTAL":"CY","FORMAL_EN":"Republic of Cyprus","FORMAL_FR":null,"NAME_CIAWF":"Cyprus","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Cyprus","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":7,"POP_EST":1198575,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":24948,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"CY","ISO_A2":"CY","ISO_A2_EH":"CY","ISO_A3":"CYP","ISO_A3_EH":"CYP","ISO_N3":"196","ISO_N3_EH":"196","UN_A3":"196","WB_A2":"CY","WB_A3":"CYP","WOE_ID":-90,"WOE_ID_EH":23424994,"WOE_NOTE":"WOE lists as subunit of united Cyprus","ADM0_ISO":"CYP","ADM0_DIFF":null,"ADM0_TLC":"CYP","ADM0_A3_US":"CYP","ADM0_A3_FR":"CYP","ADM0_A3_RU":"CYP","ADM0_A3_ES":"CYP","ADM0_A3_CN":"CYP","ADM0_A3_TW":"CYP","ADM0_A3_IN":"CYP","ADM0_A3_NP":"CYP","ADM0_A3_PK":"CYP","ADM0_A3_DE":"CYP","ADM0_A3_GB":"CYP","ADM0_A3_BR":"CYP","ADM0_A3_IL":"CYP","ADM0_A3_PS":"CYP","ADM0_A3_SA":"CYP","ADM0_A3_EG":"CYP","ADM0_A3_MA":"CYP","ADM0_A3_PT":"CYP","ADM0_A3_AR":"CYP","ADM0_A3_JP":"CYP","ADM0_A3_KO":"CYP","ADM0_A3_VN":"CYP","ADM0_A3_TR":"CYP","ADM0_A3_ID":"CYP","ADM0_A3_PL":"CYP","ADM0_A3_GR":"CYP","ADM0_A3_IT":"CYP","ADM0_A3_NL":"CYP","ADM0_A3_SE":"CYP","ADM0_A3_BD":"CYP","ADM0_A3_UA":"CYP","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5,"LABEL_X":33.084182,"LABEL_Y":34.913329,"NE_ID":1159320533,"WIKIDATAID":"Q229","NAME_AR":"قبرص","NAME_BN":"সাইপ্রাস","NAME_DE":"Republik Zypern","NAME_EN":"Cyprus","NAME_ES":"Chipre","NAME_FA":"قبرس","NAME_FR":"Chypre","NAME_EL":"Κύπρος","NAME_HE":"קפריסין","NAME_HI":"साइप्रस","NAME_HU":"Ciprus","NAME_ID":"Siprus","NAME_IT":"Cipro","NAME_JA":"キプロス","NAME_KO":"키프로스","NAME_NL":"Cyprus","NAME_PL":"Cypr","NAME_PT":"Chipre","NAME_RU":"Кипр","NAME_SV":"Cypern","NAME_TR":"Kıbrıs Cumhuriyeti","NAME_UK":"Кіпр","NAME_UR":"قبرص","NAME_VI":"Cộng hòa Síp","NAME_ZH":"塞浦路斯","NAME_ZHT":"賽普勒斯","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[32.256667,34.571869,34.004881,35.173125],"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.919572,35.087833],[33.190977,35.173125],[33.383833,35.162712],[33.455922,35.101424],[33.475817,35.000345],[33.525685,35.038688],[33.675392,35.017863],[33.86644,35.093595],[33.973617,35.058506],[34.004881,34.978098],[32.979827,34.571869],[32.490296,34.701655],[32.256667,35.103232],[32.73178,35.140026]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Morocco","SOV_A3":"MAR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Morocco","ADM0_A3":"MAR","GEOU_DIF":0,"GEOUNIT":"Morocco","GU_A3":"MAR","SU_DIF":0,"SUBUNIT":"Morocco","SU_A3":"MAR","BRK_DIFF":0,"NAME":"Morocco","NAME_LONG":"Morocco","BRK_A3":"MAR","BRK_NAME":"Morocco","BRK_GROUP":null,"ABBREV":"Mor.","POSTAL":"MA","FORMAL_EN":"Kingdom of Morocco","FORMAL_FR":null,"NAME_CIAWF":"Morocco","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Morocco","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":9,"POP_EST":36471769,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":119700,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"MO","ISO_A2":"MA","ISO_A2_EH":"MA","ISO_A3":"MAR","ISO_A3_EH":"MAR","ISO_N3":"504","ISO_N3_EH":"504","UN_A3":"504","WB_A2":"MA","WB_A3":"MAR","WOE_ID":23424893,"WOE_ID_EH":23424893,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MAR","ADM0_DIFF":null,"ADM0_TLC":"MAR","ADM0_A3_US":"MAR","ADM0_A3_FR":"MAR","ADM0_A3_RU":"MAR","ADM0_A3_ES":"MAR","ADM0_A3_CN":"MAR","ADM0_A3_TW":"MAR","ADM0_A3_IN":"MAR","ADM0_A3_NP":"MAR","ADM0_A3_PK":"MAR","ADM0_A3_DE":"MAR","ADM0_A3_GB":"MAR","ADM0_A3_BR":"MAR","ADM0_A3_IL":"MAR","ADM0_A3_PS":"MAR","ADM0_A3_SA":"MAR","ADM0_A3_EG":"MAR","ADM0_A3_MA":"MAR","ADM0_A3_PT":"MAR","ADM0_A3_AR":"MAR","ADM0_A3_JP":"MAR","ADM0_A3_KO":"MAR","ADM0_A3_VN":"MAR","ADM0_A3_TR":"MAR","ADM0_A3_ID":"MAR","ADM0_A3_PL":"MAR","ADM0_A3_GR":"MAR","ADM0_A3_IT":"MAR","ADM0_A3_NL":"MAR","ADM0_A3_SE":"MAR","ADM0_A3_BD":"MAR","ADM0_A3_UA":"MAR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":8,"LABEL_X":-7.187296,"LABEL_Y":31.650723,"NE_ID":1159321035,"WIKIDATAID":"Q1028","NAME_AR":"المغرب","NAME_BN":"মরক্কো","NAME_DE":"Marokko","NAME_EN":"Morocco","NAME_ES":"Marruecos","NAME_FA":"مراکش","NAME_FR":"Maroc","NAME_EL":"Μαρόκο","NAME_HE":"מרוקו","NAME_HI":"मोरक्को","NAME_HU":"Marokkó","NAME_ID":"Maroko","NAME_IT":"Marocco","NAME_JA":"モロッコ","NAME_KO":"모로코","NAME_NL":"Marokko","NAME_PL":"Maroko","NAME_PT":"Marrocos","NAME_RU":"Марокко","NAME_SV":"Marocko","NAME_TR":"Fas","NAME_UK":"Марокко","NAME_UR":"مراکش","NAME_VI":"Maroc","NAME_ZH":"摩洛哥","NAME_ZHT":"摩洛哥","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-17.020428,21.420734,-1.124551,35.759988],"geometry":{"type":"Polygon","coordinates":[[[-2.169914,35.168396],[-1.792986,34.527919],[-1.733455,33.919713],[-1.388049,32.864015],[-1.124551,32.651522],[-1.307899,32.262889],[-2.616605,32.094346],[-3.06898,31.724498],[-3.647498,31.637294],[-3.690441,30.896952],[-4.859646,30.501188],[-5.242129,30.000443],[-6.060632,29.7317],[-7.059228,29.579228],[-8.674116,28.841289],[-8.66559,27.656426],[-8.817828,27.656426],[-8.794884,27.120696],[-9.413037,27.088476],[-9.735343,26.860945],[-10.189424,26.860945],[-10.551263,26.990808],[-11.392555,26.883424],[-11.71822,26.104092],[-12.030759,26.030866],[-12.500963,24.770116],[-13.89111,23.691009],[-14.221168,22.310163],[-14.630833,21.86094],[-14.750955,21.5006],[-17.002962,21.420734],[-17.020428,21.42231],[-16.973248,21.885745],[-16.589137,22.158234],[-16.261922,22.67934],[-16.326414,23.017768],[-15.982611,23.723358],[-15.426004,24.359134],[-15.089332,24.520261],[-14.824645,25.103533],[-14.800926,25.636265],[-14.43994,26.254418],[-13.773805,26.618892],[-13.139942,27.640148],[-13.121613,27.654148],[-12.618837,28.038186],[-11.688919,28.148644],[-10.900957,28.832142],[-10.399592,29.098586],[-9.564811,29.933574],[-9.814718,31.177736],[-9.434793,32.038096],[-9.300693,32.564679],[-8.657476,33.240245],[-7.654178,33.697065],[-6.912544,34.110476],[-6.244342,35.145865],[-5.929994,35.759988],[-5.193863,35.755182],[-4.591006,35.330712],[-3.640057,35.399855],[-2.604306,35.179093],[-2.169914,35.168396]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Egypt","SOV_A3":"EGY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Egypt","ADM0_A3":"EGY","GEOU_DIF":0,"GEOUNIT":"Egypt","GU_A3":"EGY","SU_DIF":0,"SUBUNIT":"Egypt","SU_A3":"EGY","BRK_DIFF":0,"NAME":"Egypt","NAME_LONG":"Egypt","BRK_A3":"EGY","BRK_NAME":"Egypt","BRK_GROUP":null,"ABBREV":"Egypt","POSTAL":"EG","FORMAL_EN":"Arab Republic of Egypt","FORMAL_FR":null,"NAME_CIAWF":"Egypt","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Egypt, Arab Rep.","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":6,"MAPCOLOR9":7,"MAPCOLOR13":2,"POP_EST":100388073,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":303092,"GDP_YEAR":2019,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","FIPS_10":"EG","ISO_A2":"EG","ISO_A2_EH":"EG","ISO_A3":"EGY","ISO_A3_EH":"EGY","ISO_N3":"818","ISO_N3_EH":"818","UN_A3":"818","WB_A2":"EG","WB_A3":"EGY","WOE_ID":23424802,"WOE_ID_EH":23424802,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"EGY","ADM0_DIFF":null,"ADM0_TLC":"EGY","ADM0_A3_US":"EGY","ADM0_A3_FR":"EGY","ADM0_A3_RU":"EGY","ADM0_A3_ES":"EGY","ADM0_A3_CN":"EGY","ADM0_A3_TW":"EGY","ADM0_A3_IN":"EGY","ADM0_A3_NP":"EGY","ADM0_A3_PK":"EGY","ADM0_A3_DE":"EGY","ADM0_A3_GB":"EGY","ADM0_A3_BR":"EGY","ADM0_A3_IL":"EGY","ADM0_A3_PS":"EGY","ADM0_A3_SA":"EGY","ADM0_A3_EG":"EGY","ADM0_A3_MA":"EGY","ADM0_A3_PT":"EGY","ADM0_A3_AR":"EGY","ADM0_A3_JP":"EGY","ADM0_A3_KO":"EGY","ADM0_A3_VN":"EGY","ADM0_A3_TR":"EGY","ADM0_A3_ID":"EGY","ADM0_A3_PL":"EGY","ADM0_A3_GR":"EGY","ADM0_A3_IT":"EGY","ADM0_A3_NL":"EGY","ADM0_A3_SE":"EGY","ADM0_A3_BD":"EGY","ADM0_A3_UA":"EGY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7,"LABEL_X":29.445837,"LABEL_Y":26.186173,"NE_ID":1159320575,"WIKIDATAID":"Q79","NAME_AR":"مصر","NAME_BN":"মিশর","NAME_DE":"Ägypten","NAME_EN":"Egypt","NAME_ES":"Egipto","NAME_FA":"مصر","NAME_FR":"Égypte","NAME_EL":"Αίγυπτος","NAME_HE":"מצרים","NAME_HI":"मिस्र","NAME_HU":"Egyiptom","NAME_ID":"Mesir","NAME_IT":"Egitto","NAME_JA":"エジプト","NAME_KO":"이집트","NAME_NL":"Egypte","NAME_PL":"Egipt","NAME_PT":"Egito","NAME_RU":"Египет","NAME_SV":"Egypten","NAME_TR":"Mısır","NAME_UK":"Єгипет","NAME_UR":"مصر","NAME_VI":"Ai Cập","NAME_ZH":"埃及","NAME_ZHT":"埃及","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[24.70007,22,36.86623,31.58568],"geometry":{"type":"Polygon","coordinates":[[[36.86623,22],[32.9,22],[29.02,22],[25,22],[25,25.6825],[25,29.238655],[24.70007,30.04419],[24.95762,30.6616],[24.80287,31.08929],[25.16482,31.56915],[26.49533,31.58568],[27.45762,31.32126],[28.45048,31.02577],[28.91353,30.87005],[29.68342,31.18686],[30.09503,31.4734],[30.97693,31.55586],[31.68796,31.4296],[31.96041,30.9336],[32.19247,31.26034],[32.99392,31.02407],[33.7734,30.96746],[34.265435,31.219357],[34.26544,31.21936],[34.823243,29.761081],[34.9226,29.50133],[34.64174,29.09942],[34.42655,28.34399],[34.15451,27.8233],[33.92136,27.6487],[33.58811,27.97136],[33.13676,28.41765],[32.42323,29.85108],[32.32046,29.76043],[32.73482,28.70523],[33.34876,27.69989],[34.10455,26.14227],[34.47387,25.59856],[34.79507,25.03375],[35.69241,23.92671],[35.49372,23.75237],[35.52598,23.10244],[36.69069,22.20485],[36.86623,22]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Libya","SOV_A3":"LBY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Libya","ADM0_A3":"LBY","GEOU_DIF":0,"GEOUNIT":"Libya","GU_A3":"LBY","SU_DIF":0,"SUBUNIT":"Libya","SU_A3":"LBY","BRK_DIFF":0,"NAME":"Libya","NAME_LONG":"Libya","BRK_A3":"LBY","BRK_NAME":"Libya","BRK_GROUP":null,"ABBREV":"Libya","POSTAL":"LY","FORMAL_EN":"Libya","FORMAL_FR":null,"NAME_CIAWF":"Libya","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Libya","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":11,"POP_EST":6777452,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":52091,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"LY","ISO_A2":"LY","ISO_A2_EH":"LY","ISO_A3":"LBY","ISO_A3_EH":"LBY","ISO_N3":"434","ISO_N3_EH":"434","UN_A3":"434","WB_A2":"LY","WB_A3":"LBY","WOE_ID":23424882,"WOE_ID_EH":23424882,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"LBY","ADM0_DIFF":null,"ADM0_TLC":"LBY","ADM0_A3_US":"LBY","ADM0_A3_FR":"LBY","ADM0_A3_RU":"LBY","ADM0_A3_ES":"LBY","ADM0_A3_CN":"LBY","ADM0_A3_TW":"LBY","ADM0_A3_IN":"LBY","ADM0_A3_NP":"LBY","ADM0_A3_PK":"LBY","ADM0_A3_DE":"LBY","ADM0_A3_GB":"LBY","ADM0_A3_BR":"LBY","ADM0_A3_IL":"LBY","ADM0_A3_PS":"LBY","ADM0_A3_SA":"LBY","ADM0_A3_EG":"LBY","ADM0_A3_MA":"LBY","ADM0_A3_PT":"LBY","ADM0_A3_AR":"LBY","ADM0_A3_JP":"LBY","ADM0_A3_KO":"LBY","ADM0_A3_VN":"LBY","ADM0_A3_TR":"LBY","ADM0_A3_ID":"LBY","ADM0_A3_PL":"LBY","ADM0_A3_GR":"LBY","ADM0_A3_IT":"LBY","ADM0_A3_NL":"LBY","ADM0_A3_SE":"LBY","ADM0_A3_BD":"LBY","ADM0_A3_UA":"LBY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":18.011015,"LABEL_Y":26.638944,"NE_ID":1159321017,"WIKIDATAID":"Q1016","NAME_AR":"ليبيا","NAME_BN":"লিবিয়া","NAME_DE":"Libyen","NAME_EN":"Libya","NAME_ES":"Libia","NAME_FA":"لیبی","NAME_FR":"Libye","NAME_EL":"Λιβύη","NAME_HE":"לוב","NAME_HI":"लीबिया","NAME_HU":"Líbia","NAME_ID":"Libya","NAME_IT":"Libia","NAME_JA":"リビア","NAME_KO":"리비아","NAME_NL":"Libië","NAME_PL":"Libia","NAME_PT":"Líbia","NAME_RU":"Ливия","NAME_SV":"Libyen","NAME_TR":"Libya","NAME_UK":"Лівія","NAME_UR":"لیبیا","NAME_VI":"Libya","NAME_ZH":"利比亚","NAME_ZHT":"利比亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[9.319411,19.58047,25.16482,33.136996],"geometry":{"type":"Polygon","coordinates":[[[25,22],[25,20.00304],[23.85,20],[23.83766,19.58047],[19.84926,21.49509],[15.86085,23.40972],[14.8513,22.86295],[14.143871,22.491289],[13.581425,23.040506],[11.999506,23.471668],[11.560669,24.097909],[10.771364,24.562532],[10.303847,24.379313],[9.948261,24.936954],[9.910693,25.365455],[9.319411,26.094325],[9.716286,26.512206],[9.629056,27.140953],[9.756128,27.688259],[9.683885,28.144174],[9.859998,28.95999],[9.805634,29.424638],[9.48214,30.307556],[9.970017,30.539325],[10.056575,30.961831],[9.950225,31.37607],[10.636901,31.761421],[10.94479,32.081815],[11.432253,32.368903],[11.488787,33.136996],[12.66331,32.79278],[13.08326,32.87882],[13.91868,32.71196],[15.24563,32.26508],[15.71394,31.37626],[16.61162,31.18218],[18.02109,30.76357],[19.08641,30.26639],[19.57404,30.52582],[20.05335,30.98576],[19.82033,31.75179],[20.13397,32.2382],[20.85452,32.7068],[21.54298,32.8432],[22.89576,32.63858],[23.2368,32.19149],[23.60913,32.18726],[23.9275,32.01667],[24.92114,31.89936],[25.16482,31.56915],[24.80287,31.08929],[24.95762,30.6616],[24.70007,30.04419],[25,29.238655],[25,25.6825],[25,22]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":2,"SOVEREIGNT":"Ethiopia","SOV_A3":"ETH","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Ethiopia","ADM0_A3":"ETH","GEOU_DIF":0,"GEOUNIT":"Ethiopia","GU_A3":"ETH","SU_DIF":0,"SUBUNIT":"Ethiopia","SU_A3":"ETH","BRK_DIFF":0,"NAME":"Ethiopia","NAME_LONG":"Ethiopia","BRK_A3":"ETH","BRK_NAME":"Ethiopia","BRK_GROUP":null,"ABBREV":"Eth.","POSTAL":"ET","FORMAL_EN":"Federal Democratic Republic of Ethiopia","FORMAL_FR":null,"NAME_CIAWF":"Ethiopia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ethiopia","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":13,"POP_EST":112078730,"POP_RANK":17,"POP_YEAR":2019,"GDP_MD":95912,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"ET","ISO_A2":"ET","ISO_A2_EH":"ET","ISO_A3":"ETH","ISO_A3_EH":"ETH","ISO_N3":"231","ISO_N3_EH":"231","UN_A3":"231","WB_A2":"ET","WB_A3":"ETH","WOE_ID":23424808,"WOE_ID_EH":23424808,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"ETH","ADM0_DIFF":null,"ADM0_TLC":"ETH","ADM0_A3_US":"ETH","ADM0_A3_FR":"ETH","ADM0_A3_RU":"ETH","ADM0_A3_ES":"ETH","ADM0_A3_CN":"ETH","ADM0_A3_TW":"ETH","ADM0_A3_IN":"ETH","ADM0_A3_NP":"ETH","ADM0_A3_PK":"ETH","ADM0_A3_DE":"ETH","ADM0_A3_GB":"ETH","ADM0_A3_BR":"ETH","ADM0_A3_IL":"ETH","ADM0_A3_PS":"ETH","ADM0_A3_SA":"ETH","ADM0_A3_EG":"ETH","ADM0_A3_MA":"ETH","ADM0_A3_PT":"ETH","ADM0_A3_AR":"ETH","ADM0_A3_JP":"ETH","ADM0_A3_KO":"ETH","ADM0_A3_VN":"ETH","ADM0_A3_TR":"ETH","ADM0_A3_ID":"ETH","ADM0_A3_PL":"ETH","ADM0_A3_GR":"ETH","ADM0_A3_IT":"ETH","ADM0_A3_NL":"ETH","ADM0_A3_SE":"ETH","ADM0_A3_BD":"ETH","ADM0_A3_UA":"ETH","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7,"LABEL_X":39.0886,"LABEL_Y":8.032795,"NE_ID":1159320617,"WIKIDATAID":"Q115","NAME_AR":"إثيوبيا","NAME_BN":"ইথিওপিয়া","NAME_DE":"Äthiopien","NAME_EN":"Ethiopia","NAME_ES":"Etiopía","NAME_FA":"اتیوپی","NAME_FR":"Éthiopie","NAME_EL":"Αιθιοπία","NAME_HE":"אתיופיה","NAME_HI":"इथियोपिया","NAME_HU":"Etiópia","NAME_ID":"Ethiopia","NAME_IT":"Etiopia","NAME_JA":"エチオピア","NAME_KO":"에티오피아","NAME_NL":"Ethiopië","NAME_PL":"Etiopia","NAME_PT":"Etiópia","NAME_RU":"Эфиопия","NAME_SV":"Etiopien","NAME_TR":"Etiyopya","NAME_UK":"Ефіопія","NAME_UR":"ایتھوپیا","NAME_VI":"Ethiopia","NAME_ZH":"埃塞俄比亚","NAME_ZHT":"衣索比亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[32.95418,3.42206,47.78942,14.95943],"geometry":{"type":"Polygon","coordinates":[[[47.78942,8.003],[44.9636,5.00162],[43.66087,4.95755],[42.76967,4.25259],[42.12861,4.23413],[41.855083,3.918912],[41.1718,3.91909],[40.76848,4.25702],[39.85494,3.83879],[39.559384,3.42206],[38.89251,3.50074],[38.67114,3.61607],[38.43697,3.58851],[38.120915,3.598605],[36.855093,4.447864],[36.159079,4.447864],[35.817448,4.776966],[35.817448,5.338232],[35.298007,5.506],[34.70702,6.59422],[34.25032,6.82607],[34.0751,7.22595],[33.56829,7.71334],[32.95418,7.78497],[33.2948,8.35458],[33.8255,8.37916],[33.97498,8.68456],[33.96162,9.58358],[34.25745,10.63009],[34.73115,10.91017],[34.83163,11.31896],[35.26049,12.08286],[35.86363,12.57828],[36.27022,13.56333],[36.42951,14.42211],[37.59377,14.2131],[37.90607,14.95943],[38.51295,14.50547],[39.0994,14.74064],[39.34061,14.53155],[40.02625,14.51959],[40.8966,14.11864],[41.1552,13.77333],[41.59856,13.45209],[42.00975,12.86582],[42.35156,12.54223],[42,12.1],[41.66176,11.6312],[41.73959,11.35511],[41.75557,11.05091],[42.31414,11.0342],[42.55493,11.10511],[42.776852,10.926879],[42.55876,10.57258],[42.92812,10.02194],[43.29699,9.54048],[43.67875,9.18358],[46.94834,7.99688],[47.78942,8.003]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Djibouti","SOV_A3":"DJI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Djibouti","ADM0_A3":"DJI","GEOU_DIF":0,"GEOUNIT":"Djibouti","GU_A3":"DJI","SU_DIF":0,"SUBUNIT":"Djibouti","SU_A3":"DJI","BRK_DIFF":0,"NAME":"Djibouti","NAME_LONG":"Djibouti","BRK_A3":"DJI","BRK_NAME":"Djibouti","BRK_GROUP":null,"ABBREV":"Dji.","POSTAL":"DJ","FORMAL_EN":"Republic of Djibouti","FORMAL_FR":null,"NAME_CIAWF":"Djibouti","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Djibouti","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":4,"MAPCOLOR13":8,"POP_EST":973560,"POP_RANK":11,"POP_YEAR":2019,"GDP_MD":3324,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","FIPS_10":"DJ","ISO_A2":"DJ","ISO_A2_EH":"DJ","ISO_A3":"DJI","ISO_A3_EH":"DJI","ISO_N3":"262","ISO_N3_EH":"262","UN_A3":"262","WB_A2":"DJ","WB_A3":"DJI","WOE_ID":23424797,"WOE_ID_EH":23424797,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"DJI","ADM0_DIFF":null,"ADM0_TLC":"DJI","ADM0_A3_US":"DJI","ADM0_A3_FR":"DJI","ADM0_A3_RU":"DJI","ADM0_A3_ES":"DJI","ADM0_A3_CN":"DJI","ADM0_A3_TW":"DJI","ADM0_A3_IN":"DJI","ADM0_A3_NP":"DJI","ADM0_A3_PK":"DJI","ADM0_A3_DE":"DJI","ADM0_A3_GB":"DJI","ADM0_A3_BR":"DJI","ADM0_A3_IL":"DJI","ADM0_A3_PS":"DJI","ADM0_A3_SA":"DJI","ADM0_A3_EG":"DJI","ADM0_A3_MA":"DJI","ADM0_A3_PT":"DJI","ADM0_A3_AR":"DJI","ADM0_A3_JP":"DJI","ADM0_A3_KO":"DJI","ADM0_A3_VN":"DJI","ADM0_A3_TR":"DJI","ADM0_A3_ID":"DJI","ADM0_A3_PL":"DJI","ADM0_A3_GR":"DJI","ADM0_A3_IT":"DJI","ADM0_A3_NL":"DJI","ADM0_A3_SE":"DJI","ADM0_A3_BD":"DJI","ADM0_A3_UA":"DJI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9,"LABEL_X":42.498825,"LABEL_Y":11.976343,"NE_ID":1159320541,"WIKIDATAID":"Q977","NAME_AR":"جيبوتي","NAME_BN":"জিবুতি","NAME_DE":"Dschibuti","NAME_EN":"Djibouti","NAME_ES":"Yibuti","NAME_FA":"جیبوتی","NAME_FR":"Djibouti","NAME_EL":"Τζιμπουτί","NAME_HE":"ג'יבוטי","NAME_HI":"जिबूती","NAME_HU":"Dzsibuti","NAME_ID":"Djibouti","NAME_IT":"Gibuti","NAME_JA":"ジブチ","NAME_KO":"지부티","NAME_NL":"Djibouti","NAME_PL":"Dżibuti","NAME_PT":"Djibouti","NAME_RU":"Джибути","NAME_SV":"Djibouti","NAME_TR":"Cibuti","NAME_UK":"Джибуті","NAME_UR":"جبوتی","NAME_VI":"Djibouti","NAME_ZH":"吉布提","NAME_ZHT":"吉布地","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[41.66176,10.926879,43.317852,12.699639],"geometry":{"type":"Polygon","coordinates":[[[42.35156,12.54223],[42.779642,12.455416],[43.081226,12.699639],[43.317852,12.390148],[43.286381,11.974928],[42.715874,11.735641],[43.145305,11.46204],[42.776852,10.926879],[42.55493,11.10511],[42.31414,11.0342],[41.75557,11.05091],[41.73959,11.35511],[41.66176,11.6312],[42,12.1],[42.35156,12.54223]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Somaliland","SOV_A3":"SOL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Somaliland","ADM0_A3":"SOL","GEOU_DIF":0,"GEOUNIT":"Somaliland","GU_A3":"SOL","SU_DIF":0,"SUBUNIT":"Somaliland","SU_A3":"SOL","BRK_DIFF":0,"NAME":"Somaliland","NAME_LONG":"Somaliland","BRK_A3":"SOL","BRK_NAME":"Somaliland","BRK_GROUP":null,"ABBREV":"Solnd.","POSTAL":"SL","FORMAL_EN":"Republic of Somaliland","FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":"Disputed","NOTE_BRK":"Self admin.; Claimed by Somalia","NAME_SORT":"Somaliland","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":2,"POP_EST":5096159,"POP_RANK":13,"POP_YEAR":2014,"GDP_MD":17836,"GDP_YEAR":2013,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"-99","ISO_A2":"-99","ISO_A2_EH":"-99","ISO_A3":"-99","ISO_A3_EH":"-99","ISO_N3":"-99","ISO_N3_EH":"-99","UN_A3":"-099","WB_A2":"-99","WB_A3":"-99","WOE_ID":-99,"WOE_ID_EH":-99,"WOE_NOTE":"Includes old states of 2347021, 2347020, 2347017 and portion of 2347016.","ADM0_ISO":"SOM","ADM0_DIFF":"1","ADM0_TLC":"SOL","ADM0_A3_US":"SOM","ADM0_A3_FR":"SOM","ADM0_A3_RU":"SOM","ADM0_A3_ES":"SOM","ADM0_A3_CN":"SOM","ADM0_A3_TW":"SOL","ADM0_A3_IN":"SOM","ADM0_A3_NP":"SOM","ADM0_A3_PK":"SOM","ADM0_A3_DE":"SOM","ADM0_A3_GB":"SOM","ADM0_A3_BR":"SOM","ADM0_A3_IL":"SOM","ADM0_A3_PS":"SOM","ADM0_A3_SA":"SOM","ADM0_A3_EG":"SOM","ADM0_A3_MA":"SOM","ADM0_A3_PT":"SOM","ADM0_A3_AR":"SOM","ADM0_A3_JP":"SOM","ADM0_A3_KO":"SOM","ADM0_A3_VN":"SOM","ADM0_A3_TR":"SOM","ADM0_A3_ID":"SOM","ADM0_A3_PL":"SOM","ADM0_A3_GR":"SOM","ADM0_A3_IT":"SOM","ADM0_A3_NL":"SOM","ADM0_A3_SE":"SOM","ADM0_A3_BD":"SOM","ADM0_A3_UA":"SOM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":4,"MIN_LABEL":4.5,"MAX_LABEL":9,"LABEL_X":46.731595,"LABEL_Y":9.443889,"NE_ID":1159321259,"WIKIDATAID":"Q34754","NAME_AR":"صوماليلاند","NAME_BN":"সোমালিল্যান্ড","NAME_DE":"Somaliland","NAME_EN":"Somaliland","NAME_ES":"Somalilandia","NAME_FA":"سومالیلند","NAME_FR":"Somaliland","NAME_EL":"Σομαλιλάνδη","NAME_HE":"סומלילנד","NAME_HI":"सोमालीदेश","NAME_HU":"Szomáliföld","NAME_ID":"Somaliland","NAME_IT":"Somaliland","NAME_JA":"ソマリランド","NAME_KO":"소말릴란드","NAME_NL":"Somaliland","NAME_PL":"Somaliland","NAME_PT":"Somalilândia","NAME_RU":"Сомалиленд","NAME_SV":"Somaliland","NAME_TR":"Somaliland","NAME_UK":"Сомаліленд","NAME_UR":"صومالی لینڈ","NAME_VI":"Somaliland","NAME_ZH":"索马里兰","NAME_ZHT":"索馬利蘭","FCLASS_ISO":"Unrecognized","TLC_DIFF":"1","FCLASS_TLC":"Admin-0 country","FCLASS_US":"Unrecognized","FCLASS_FR":"Unrecognized","FCLASS_RU":"Unrecognized","FCLASS_ES":"Unrecognized","FCLASS_CN":"Unrecognized","FCLASS_TW":"Admin-0 country","FCLASS_IN":"Unrecognized","FCLASS_NP":"Unrecognized","FCLASS_PK":"Unrecognized","FCLASS_DE":"Unrecognized","FCLASS_GB":"Unrecognized","FCLASS_BR":"Unrecognized","FCLASS_IL":"Unrecognized","FCLASS_PS":"Unrecognized","FCLASS_SA":"Unrecognized","FCLASS_EG":"Unrecognized","FCLASS_MA":"Unrecognized","FCLASS_PT":"Unrecognized","FCLASS_AR":"Unrecognized","FCLASS_JP":"Unrecognized","FCLASS_KO":"Unrecognized","FCLASS_VN":"Unrecognized","FCLASS_TR":"Unrecognized","FCLASS_ID":"Unrecognized","FCLASS_PL":"Unrecognized","FCLASS_GR":"Unrecognized","FCLASS_IT":"Unrecognized","FCLASS_NL":"Unrecognized","FCLASS_SE":"Unrecognized","FCLASS_BD":"Unrecognized","FCLASS_UA":"Unrecognized"},"bbox":[42.55876,7.99688,48.948206,11.46204],"geometry":{"type":"Polygon","coordinates":[[[48.948205,11.410617],[48.948205,11.410617],[48.942005,11.394266],[48.938491,10.982327],[48.938233,9.9735],[48.93813,9.451749],[48.486736,8.837626],[47.78942,8.003],[46.94834,7.99688],[43.67875,9.18358],[43.29699,9.54048],[42.92812,10.02194],[42.55876,10.57258],[42.776852,10.926879],[43.145305,11.46204],[43.47066,11.27771],[43.666668,10.864169],[44.117804,10.445538],[44.614259,10.442205],[45.556941,10.698029],[46.645401,10.816549],[47.525658,11.127228],[48.021596,11.193064],[48.378784,11.375482],[48.948206,11.410622],[48.948205,11.410617]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Uganda","SOV_A3":"UGA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Uganda","ADM0_A3":"UGA","GEOU_DIF":0,"GEOUNIT":"Uganda","GU_A3":"UGA","SU_DIF":0,"SUBUNIT":"Uganda","SU_A3":"UGA","BRK_DIFF":0,"NAME":"Uganda","NAME_LONG":"Uganda","BRK_A3":"UGA","BRK_NAME":"Uganda","BRK_GROUP":null,"ABBREV":"Uga.","POSTAL":"UG","FORMAL_EN":"Republic of Uganda","FORMAL_FR":null,"NAME_CIAWF":"Uganda","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Uganda","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":6,"MAPCOLOR13":4,"POP_EST":44269594,"POP_RANK":15,"POP_YEAR":2019,"GDP_MD":35165,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"UG","ISO_A2":"UG","ISO_A2_EH":"UG","ISO_A3":"UGA","ISO_A3_EH":"UGA","ISO_N3":"800","ISO_N3_EH":"800","UN_A3":"800","WB_A2":"UG","WB_A3":"UGA","WOE_ID":23424974,"WOE_ID_EH":23424974,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"UGA","ADM0_DIFF":null,"ADM0_TLC":"UGA","ADM0_A3_US":"UGA","ADM0_A3_FR":"UGA","ADM0_A3_RU":"UGA","ADM0_A3_ES":"UGA","ADM0_A3_CN":"UGA","ADM0_A3_TW":"UGA","ADM0_A3_IN":"UGA","ADM0_A3_NP":"UGA","ADM0_A3_PK":"UGA","ADM0_A3_DE":"UGA","ADM0_A3_GB":"UGA","ADM0_A3_BR":"UGA","ADM0_A3_IL":"UGA","ADM0_A3_PS":"UGA","ADM0_A3_SA":"UGA","ADM0_A3_EG":"UGA","ADM0_A3_MA":"UGA","ADM0_A3_PT":"UGA","ADM0_A3_AR":"UGA","ADM0_A3_JP":"UGA","ADM0_A3_KO":"UGA","ADM0_A3_VN":"UGA","ADM0_A3_TR":"UGA","ADM0_A3_ID":"UGA","ADM0_A3_PL":"UGA","ADM0_A3_GR":"UGA","ADM0_A3_IT":"UGA","ADM0_A3_NL":"UGA","ADM0_A3_SE":"UGA","ADM0_A3_BD":"UGA","ADM0_A3_UA":"UGA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":32.948555,"LABEL_Y":1.972589,"NE_ID":1159321343,"WIKIDATAID":"Q1036","NAME_AR":"أوغندا","NAME_BN":"উগান্ডা","NAME_DE":"Uganda","NAME_EN":"Uganda","NAME_ES":"Uganda","NAME_FA":"اوگاندا","NAME_FR":"Ouganda","NAME_EL":"Ουγκάντα","NAME_HE":"אוגנדה","NAME_HI":"युगाण्डा","NAME_HU":"Uganda","NAME_ID":"Uganda","NAME_IT":"Uganda","NAME_JA":"ウガンダ","NAME_KO":"우간다","NAME_NL":"Oeganda","NAME_PL":"Uganda","NAME_PT":"Uganda","NAME_RU":"Уганда","NAME_SV":"Uganda","NAME_TR":"Uganda","NAME_UK":"Уганда","NAME_UR":"یوگنڈا","NAME_VI":"Uganda","NAME_ZH":"乌干达","NAME_ZHT":"烏干達","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[29.579466,-1.443322,35.03599,4.249885],"geometry":{"type":"Polygon","coordinates":[[[33.903711,-0.95],[31.86617,-1.02736],[30.76986,-1.01455],[30.419105,-1.134659],[29.821519,-1.443322],[29.579466,-1.341313],[29.587838,-0.587406],[29.819503,-0.20531],[29.875779,0.59738],[30.086154,1.062313],[30.468508,1.583805],[30.85267,1.849396],[31.174149,2.204465],[30.773347,2.339883],[30.83386,3.509166],[30.833852,3.509172],[31.24556,3.7819],[31.88145,3.55827],[32.68642,3.79232],[33.39,3.79],[34.005,4.249885],[34.47913,3.5556],[34.59607,3.05374],[35.03599,1.90584],[34.6721,1.17694],[34.18,0.515],[33.893569,0.109814],[33.903711,-0.95]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"Rwanda","SOV_A3":"RWA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Rwanda","ADM0_A3":"RWA","GEOU_DIF":0,"GEOUNIT":"Rwanda","GU_A3":"RWA","SU_DIF":0,"SUBUNIT":"Rwanda","SU_A3":"RWA","BRK_DIFF":0,"NAME":"Rwanda","NAME_LONG":"Rwanda","BRK_A3":"RWA","BRK_NAME":"Rwanda","BRK_GROUP":null,"ABBREV":"Rwa.","POSTAL":"RW","FORMAL_EN":"Republic of Rwanda","FORMAL_FR":null,"NAME_CIAWF":"Rwanda","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Rwanda","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":10,"POP_EST":12626950,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":10354,"GDP_YEAR":2019,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"RW","ISO_A2":"RW","ISO_A2_EH":"RW","ISO_A3":"RWA","ISO_A3_EH":"RWA","ISO_N3":"646","ISO_N3_EH":"646","UN_A3":"646","WB_A2":"RW","WB_A3":"RWA","WOE_ID":23424937,"WOE_ID_EH":23424937,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"RWA","ADM0_DIFF":null,"ADM0_TLC":"RWA","ADM0_A3_US":"RWA","ADM0_A3_FR":"RWA","ADM0_A3_RU":"RWA","ADM0_A3_ES":"RWA","ADM0_A3_CN":"RWA","ADM0_A3_TW":"RWA","ADM0_A3_IN":"RWA","ADM0_A3_NP":"RWA","ADM0_A3_PK":"RWA","ADM0_A3_DE":"RWA","ADM0_A3_GB":"RWA","ADM0_A3_BR":"RWA","ADM0_A3_IL":"RWA","ADM0_A3_PS":"RWA","ADM0_A3_SA":"RWA","ADM0_A3_EG":"RWA","ADM0_A3_MA":"RWA","ADM0_A3_PT":"RWA","ADM0_A3_AR":"RWA","ADM0_A3_JP":"RWA","ADM0_A3_KO":"RWA","ADM0_A3_VN":"RWA","ADM0_A3_TR":"RWA","ADM0_A3_ID":"RWA","ADM0_A3_PL":"RWA","ADM0_A3_GR":"RWA","ADM0_A3_IT":"RWA","ADM0_A3_NL":"RWA","ADM0_A3_SE":"RWA","ADM0_A3_BD":"RWA","ADM0_A3_UA":"RWA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":30.103894,"LABEL_Y":-1.897196,"NE_ID":1159321219,"WIKIDATAID":"Q1037","NAME_AR":"رواندا","NAME_BN":"রুয়ান্ডা","NAME_DE":"Ruanda","NAME_EN":"Rwanda","NAME_ES":"Ruanda","NAME_FA":"رواندا","NAME_FR":"Rwanda","NAME_EL":"Ρουάντα","NAME_HE":"רואנדה","NAME_HI":"रवाण्डा","NAME_HU":"Ruanda","NAME_ID":"Rwanda","NAME_IT":"Ruanda","NAME_JA":"ルワンダ","NAME_KO":"르완다","NAME_NL":"Rwanda","NAME_PL":"Rwanda","NAME_PT":"Ruanda","NAME_RU":"Руанда","NAME_SV":"Rwanda","NAME_TR":"Ruanda","NAME_UK":"Руанда","NAME_UR":"روانڈا","NAME_VI":"Rwanda","NAME_ZH":"卢旺达","NAME_ZHT":"盧旺達","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[29.024926,-2.917858,30.816135,-1.134659],"geometry":{"type":"Polygon","coordinates":[[[30.419105,-1.134659],[30.816135,-1.698914],[30.758309,-2.28725],[30.46967,-2.41383],[30.469674,-2.413855],[29.938359,-2.348487],[29.632176,-2.917858],[29.024926,-2.839258],[29.117479,-2.292211],[29.254835,-2.21511],[29.291887,-1.620056],[29.579466,-1.341313],[29.821519,-1.443322],[30.419105,-1.134659]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Bosnia and Herzegovina","SOV_A3":"BIH","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Bosnia and Herzegovina","ADM0_A3":"BIH","GEOU_DIF":0,"GEOUNIT":"Bosnia and Herzegovina","GU_A3":"BIH","SU_DIF":0,"SUBUNIT":"Bosnia and Herzegovina","SU_A3":"BIH","BRK_DIFF":0,"NAME":"Bosnia and Herz.","NAME_LONG":"Bosnia and Herzegovina","BRK_A3":"BIH","BRK_NAME":"Bosnia and Herz.","BRK_GROUP":null,"ABBREV":"B.H.","POSTAL":"BiH","FORMAL_EN":"Bosnia and Herzegovina","FORMAL_FR":null,"NAME_CIAWF":"Bosnia and Herzegovina","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bosnia and Herzegovina","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":1,"MAPCOLOR13":2,"POP_EST":3301000,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":20164,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"BK","ISO_A2":"BA","ISO_A2_EH":"BA","ISO_A3":"BIH","ISO_A3_EH":"BIH","ISO_N3":"070","ISO_N3_EH":"070","UN_A3":"070","WB_A2":"BA","WB_A3":"BIH","WOE_ID":23424761,"WOE_ID_EH":23424761,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"BIH","ADM0_DIFF":null,"ADM0_TLC":"BIH","ADM0_A3_US":"BIH","ADM0_A3_FR":"BIH","ADM0_A3_RU":"BIH","ADM0_A3_ES":"BIH","ADM0_A3_CN":"BIH","ADM0_A3_TW":"BIH","ADM0_A3_IN":"BIH","ADM0_A3_NP":"BIH","ADM0_A3_PK":"BIH","ADM0_A3_DE":"BIH","ADM0_A3_GB":"BIH","ADM0_A3_BR":"BIH","ADM0_A3_IL":"BIH","ADM0_A3_PS":"BIH","ADM0_A3_SA":"BIH","ADM0_A3_EG":"BIH","ADM0_A3_MA":"BIH","ADM0_A3_PT":"BIH","ADM0_A3_AR":"BIH","ADM0_A3_JP":"BIH","ADM0_A3_KO":"BIH","ADM0_A3_VN":"BIH","ADM0_A3_TR":"BIH","ADM0_A3_ID":"BIH","ADM0_A3_PL":"BIH","ADM0_A3_GR":"BIH","ADM0_A3_IT":"BIH","ADM0_A3_NL":"BIH","ADM0_A3_SE":"BIH","ADM0_A3_BD":"BIH","ADM0_A3_UA":"BIH","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":16,"LONG_LEN":22,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":6.8,"LABEL_X":18.06841,"LABEL_Y":44.091051,"NE_ID":1159320417,"WIKIDATAID":"Q225","NAME_AR":"البوسنة والهرسك","NAME_BN":"বসনিয়া ও হার্জেগোভিনা","NAME_DE":"Bosnien und Herzegowina","NAME_EN":"Bosnia and Herzegovina","NAME_ES":"Bosnia y Herzegovina","NAME_FA":"بوسنی و هرزگوین","NAME_FR":"Bosnie-Herzégovine","NAME_EL":"Βοσνία και Ερζεγοβίνη","NAME_HE":"בוסניה והרצגובינה","NAME_HI":"बॉस्निया और हर्ज़ेगोविना","NAME_HU":"Bosznia-Hercegovina","NAME_ID":"Bosnia dan Herzegovina","NAME_IT":"Bosnia ed Erzegovina","NAME_JA":"ボスニア・ヘルツェゴビナ","NAME_KO":"보스니아 헤르체고비나","NAME_NL":"Bosnië en Herzegovina","NAME_PL":"Bośnia i Hercegowina","NAME_PT":"Bósnia e Herzegovina","NAME_RU":"Босния и Герцеговина","NAME_SV":"Bosnien och Hercegovina","NAME_TR":"Bosna-Hersek","NAME_UK":"Боснія і Герцеговина","NAME_UR":"بوسنیا و ہرزیگووینا","NAME_VI":"Bosna và Hercegovina","NAME_ZH":"波斯尼亚和黑塞哥维那","NAME_ZHT":"波士尼亞與赫塞哥維納","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[15.750026,42.65,19.59976,45.233777],"geometry":{"type":"Polygon","coordinates":[[[18.56,42.65],[17.674922,43.028563],[17.297373,43.446341],[16.916156,43.667722],[16.456443,44.04124],[16.23966,44.351143],[15.750026,44.818712],[15.959367,45.233777],[16.318157,45.004127],[16.534939,45.211608],[17.002146,45.233777],[17.861783,45.06774],[18.553214,45.08159],[19.005485,44.860234],[19.00548,44.86023],[19.36803,44.863],[19.11761,44.42307],[19.59976,44.03847],[19.454,43.5681],[19.21852,43.52384],[19.03165,43.43253],[18.70648,43.20011],[18.56,42.65]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"North Macedonia","SOV_A3":"MKD","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"North Macedonia","ADM0_A3":"MKD","GEOU_DIF":0,"GEOUNIT":"North Macedonia","GU_A3":"MKD","SU_DIF":0,"SUBUNIT":"North Macedonia","SU_A3":"MKD","BRK_DIFF":0,"NAME":"North Macedonia","NAME_LONG":"North Macedonia","BRK_A3":"MKD","BRK_NAME":"North Macedonia","BRK_GROUP":null,"ABBREV":"N. Mac.","POSTAL":"NM","FORMAL_EN":"Republic of North Macedonia","FORMAL_FR":null,"NAME_CIAWF":"North Macedonia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"North Macedonia","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":2083459,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":12547,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"MK","ISO_A2":"MK","ISO_A2_EH":"MK","ISO_A3":"MKD","ISO_A3_EH":"MKD","ISO_N3":"807","ISO_N3_EH":"807","UN_A3":"807","WB_A2":"MK","WB_A3":"MKD","WOE_ID":23424890,"WOE_ID_EH":23424890,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MKD","ADM0_DIFF":null,"ADM0_TLC":"MKD","ADM0_A3_US":"MKD","ADM0_A3_FR":"MKD","ADM0_A3_RU":"MKD","ADM0_A3_ES":"MKD","ADM0_A3_CN":"MKD","ADM0_A3_TW":"MKD","ADM0_A3_IN":"MKD","ADM0_A3_NP":"MKD","ADM0_A3_PK":"MKD","ADM0_A3_DE":"MKD","ADM0_A3_GB":"MKD","ADM0_A3_BR":"MKD","ADM0_A3_IL":"MKD","ADM0_A3_PS":"MKD","ADM0_A3_SA":"MKD","ADM0_A3_EG":"MKD","ADM0_A3_MA":"MKD","ADM0_A3_PT":"MKD","ADM0_A3_AR":"MKD","ADM0_A3_JP":"MKD","ADM0_A3_KO":"MKD","ADM0_A3_VN":"MKD","ADM0_A3_TR":"MKD","ADM0_A3_ID":"MKD","ADM0_A3_PL":"MKD","ADM0_A3_GR":"MKD","ADM0_A3_IT":"MKD","ADM0_A3_NL":"MKD","ADM0_A3_SE":"MKD","ADM0_A3_BD":"MKD","ADM0_A3_UA":"MKD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":15,"LONG_LEN":15,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":21.555839,"LABEL_Y":41.558223,"NE_ID":1159321061,"WIKIDATAID":"Q221","NAME_AR":"مقدونيا الشمالية","NAME_BN":"উত্তর মেসিডোনিয়া","NAME_DE":"Nordmazedonien","NAME_EN":"North Macedonia","NAME_ES":"Macedonia del Norte","NAME_FA":"مقدونیه شمالی","NAME_FR":"Macédoine du Nord","NAME_EL":"Βόρεια Μακεδονία","NAME_HE":"מקדוניה הצפונית","NAME_HI":"उत्तर मैसिडोनिया","NAME_HU":"Észak-Macedónia","NAME_ID":"Republik Makedonia Utara","NAME_IT":"Macedonia del Nord","NAME_JA":"北マケドニア","NAME_KO":"북마케도니아","NAME_NL":"Noord-Macedonië","NAME_PL":"Macedonia Północna","NAME_PT":"Macedónia do Norte","NAME_RU":"Северная Македония","NAME_SV":"Nordmakedonien","NAME_TR":"Kuzey Makedonya","NAME_UK":"Північна Македонія","NAME_UR":"شمالی مقدونیہ","NAME_VI":"Bắc Macedonia","NAME_ZH":"北马其顿","NAME_ZHT":"北馬其頓","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[20.463175,40.842727,22.952377,42.32026],"geometry":{"type":"Polygon","coordinates":[[[22.380526,42.32026],[22.881374,41.999297],[22.952377,41.337994],[22.76177,41.3048],[22.597308,41.130487],[22.055378,41.149866],[21.674161,40.931275],[21.02004,40.842727],[20.605182,41.086226],[20.463175,41.515089],[20.590247,41.855404],[20.590247,41.855409],[20.71731,41.84711],[20.76216,42.05186],[21.3527,42.2068],[21.576636,42.245224],[21.91708,42.30364],[22.380526,42.32026]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Republic of Serbia","SOV_A3":"SRB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Republic of Serbia","ADM0_A3":"SRB","GEOU_DIF":0,"GEOUNIT":"Republic of Serbia","GU_A3":"SRB","SU_DIF":0,"SUBUNIT":"Republic of Serbia","SU_A3":"SRB","BRK_DIFF":0,"NAME":"Serbia","NAME_LONG":"Serbia","BRK_A3":"SRB","BRK_NAME":"Serbia","BRK_GROUP":null,"ABBREV":"Serb.","POSTAL":"RS","FORMAL_EN":"Republic of Serbia","FORMAL_FR":null,"NAME_CIAWF":"Serbia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Serbia","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":10,"POP_EST":6944975,"POP_RANK":13,"POP_YEAR":2019,"GDP_MD":51475,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"RI","ISO_A2":"RS","ISO_A2_EH":"RS","ISO_A3":"SRB","ISO_A3_EH":"SRB","ISO_N3":"688","ISO_N3_EH":"688","UN_A3":"688","WB_A2":"YF","WB_A3":"SRB","WOE_ID":-90,"WOE_ID_EH":20069818,"WOE_NOTE":"Expired WOE also contains Kosovo.","ADM0_ISO":"SRB","ADM0_DIFF":null,"ADM0_TLC":"SRB","ADM0_A3_US":"SRB","ADM0_A3_FR":"SRB","ADM0_A3_RU":"SRB","ADM0_A3_ES":"SRB","ADM0_A3_CN":"SRB","ADM0_A3_TW":"SRB","ADM0_A3_IN":"SRB","ADM0_A3_NP":"SRB","ADM0_A3_PK":"SRB","ADM0_A3_DE":"SRB","ADM0_A3_GB":"SRB","ADM0_A3_BR":"SRB","ADM0_A3_IL":"SRB","ADM0_A3_PS":"SRB","ADM0_A3_SA":"SRB","ADM0_A3_EG":"SRB","ADM0_A3_MA":"SRB","ADM0_A3_PT":"SRB","ADM0_A3_AR":"SRB","ADM0_A3_JP":"SRB","ADM0_A3_KO":"SRB","ADM0_A3_VN":"SRB","ADM0_A3_TR":"SRB","ADM0_A3_ID":"SRB","ADM0_A3_PL":"SRB","ADM0_A3_GR":"SRB","ADM0_A3_IT":"SRB","ADM0_A3_NL":"SRB","ADM0_A3_SE":"SRB","ADM0_A3_BD":"SRB","ADM0_A3_UA":"SRB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":7,"LABEL_X":20.787989,"LABEL_Y":44.189919,"NE_ID":1159321267,"WIKIDATAID":"Q403","NAME_AR":"صربيا","NAME_BN":"সার্বিয়া","NAME_DE":"Serbien","NAME_EN":"Serbia","NAME_ES":"Serbia","NAME_FA":"صربستان","NAME_FR":"Serbie","NAME_EL":"Σερβία","NAME_HE":"סרביה","NAME_HI":"सर्बिया","NAME_HU":"Szerbia","NAME_ID":"Serbia","NAME_IT":"Serbia","NAME_JA":"セルビア","NAME_KO":"세르비아","NAME_NL":"Servië","NAME_PL":"Serbia","NAME_PT":"Sérvia","NAME_RU":"Сербия","NAME_SV":"Serbien","NAME_TR":"Sırbistan","NAME_UK":"Сербія","NAME_UR":"سربیا","NAME_VI":"Serbia","NAME_ZH":"塞尔维亚","NAME_ZHT":"塞爾維亞","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[18.829825,42.245224,22.986019,46.17173],"geometry":{"type":"Polygon","coordinates":[[[18.829825,45.908872],[18.829838,45.908878],[19.596045,46.17173],[20.220192,46.127469],[20.762175,45.734573],[20.874313,45.416375],[21.483526,45.18117],[21.562023,44.768947],[22.145088,44.478422],[22.459022,44.702517],[22.705726,44.578003],[22.474008,44.409228],[22.65715,44.234923],[22.410446,44.008063],[22.500157,43.642814],[22.986019,43.211161],[22.604801,42.898519],[22.436595,42.580321],[22.545012,42.461362],[22.380526,42.32026],[21.91708,42.30364],[21.576636,42.245224],[21.54332,42.32025],[21.66292,42.43922],[21.77505,42.6827],[21.63302,42.67717],[21.43866,42.86255],[21.27421,42.90959],[21.143395,43.068685],[20.95651,43.13094],[20.81448,43.27205],[20.63508,43.21671],[20.49679,42.88469],[20.25758,42.81275],[20.3398,42.89852],[19.95857,43.10604],[19.63,43.21378],[19.48389,43.35229],[19.21852,43.52384],[19.454,43.5681],[19.59976,44.03847],[19.11761,44.42307],[19.36803,44.863],[19.00548,44.86023],[19.005485,44.860234],[19.390476,45.236516],[19.072769,45.521511],[18.829825,45.908872]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Montenegro","SOV_A3":"MNE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Montenegro","ADM0_A3":"MNE","GEOU_DIF":0,"GEOUNIT":"Montenegro","GU_A3":"MNE","SU_DIF":0,"SUBUNIT":"Montenegro","SU_A3":"MNE","BRK_DIFF":0,"NAME":"Montenegro","NAME_LONG":"Montenegro","BRK_A3":"MNE","BRK_NAME":"Montenegro","BRK_GROUP":null,"ABBREV":"Mont.","POSTAL":"ME","FORMAL_EN":"Montenegro","FORMAL_FR":null,"NAME_CIAWF":"Montenegro","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Montenegro","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":5,"POP_EST":622137,"POP_RANK":11,"POP_YEAR":2019,"GDP_MD":5542,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","FIPS_10":"MJ","ISO_A2":"ME","ISO_A2_EH":"ME","ISO_A3":"MNE","ISO_A3_EH":"MNE","ISO_N3":"499","ISO_N3_EH":"499","UN_A3":"499","WB_A2":"ME","WB_A3":"MNE","WOE_ID":20069817,"WOE_ID_EH":20069817,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"MNE","ADM0_DIFF":null,"ADM0_TLC":"MNE","ADM0_A3_US":"MNE","ADM0_A3_FR":"MNE","ADM0_A3_RU":"MNE","ADM0_A3_ES":"MNE","ADM0_A3_CN":"MNE","ADM0_A3_TW":"MNE","ADM0_A3_IN":"MNE","ADM0_A3_NP":"MNE","ADM0_A3_PK":"MNE","ADM0_A3_DE":"MNE","ADM0_A3_GB":"MNE","ADM0_A3_BR":"MNE","ADM0_A3_IL":"MNE","ADM0_A3_PS":"MNE","ADM0_A3_SA":"MNE","ADM0_A3_EG":"MNE","ADM0_A3_MA":"MNE","ADM0_A3_PT":"MNE","ADM0_A3_AR":"MNE","ADM0_A3_JP":"MNE","ADM0_A3_KO":"MNE","ADM0_A3_VN":"MNE","ADM0_A3_TR":"MNE","ADM0_A3_ID":"MNE","ADM0_A3_PL":"MNE","ADM0_A3_GR":"MNE","ADM0_A3_IT":"MNE","ADM0_A3_NL":"MNE","ADM0_A3_SE":"MNE","ADM0_A3_BD":"MNE","ADM0_A3_UA":"MNE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":19.143727,"LABEL_Y":42.803101,"NE_ID":1159321069,"WIKIDATAID":"Q236","NAME_AR":"الجبل الأسود","NAME_BN":"মন্টিনিগ্রো","NAME_DE":"Montenegro","NAME_EN":"Montenegro","NAME_ES":"Montenegro","NAME_FA":"مونتهنگرو","NAME_FR":"Monténégro","NAME_EL":"Μαυροβούνιο","NAME_HE":"מונטנגרו","NAME_HI":"मॉन्टेनीग्रो","NAME_HU":"Montenegró","NAME_ID":"Montenegro","NAME_IT":"Montenegro","NAME_JA":"モンテネグロ","NAME_KO":"몬테네그로","NAME_NL":"Montenegro","NAME_PL":"Czarnogóra","NAME_PT":"Montenegro","NAME_RU":"Черногория","NAME_SV":"Montenegro","NAME_TR":"Karadağ","NAME_UK":"Чорногорія","NAME_UR":"مونٹینیگرو","NAME_VI":"Montenegro","NAME_ZH":"黑山","NAME_ZHT":"蒙特內哥羅","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[18.450017,41.877551,20.3398,43.52384],"geometry":{"type":"Polygon","coordinates":[[[20.0707,42.58863],[19.801613,42.500093],[19.738051,42.688247],[19.304486,42.195745],[19.371768,41.877551],[19.16246,41.95502],[18.88214,42.28151],[18.450017,42.479992],[18.56,42.65],[18.70648,43.20011],[19.03165,43.43253],[19.21852,43.52384],[19.48389,43.35229],[19.63,43.21378],[19.95857,43.10604],[20.3398,42.89852],[20.25758,42.81275],[20.0707,42.58863]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":6,"SOVEREIGNT":"Kosovo","SOV_A3":"KOS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Disputed","TLC":"1","ADMIN":"Kosovo","ADM0_A3":"KOS","GEOU_DIF":0,"GEOUNIT":"Kosovo","GU_A3":"KOS","SU_DIF":0,"SUBUNIT":"Kosovo","SU_A3":"KOS","BRK_DIFF":0,"NAME":"Kosovo","NAME_LONG":"Kosovo","BRK_A3":"KOS","BRK_NAME":"Kosovo","BRK_GROUP":null,"ABBREV":"Kos.","POSTAL":"KO","FORMAL_EN":"Republic of Kosovo","FORMAL_FR":null,"NAME_CIAWF":"Kosovo","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kosovo","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":11,"POP_EST":1794248,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":7926,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","FIPS_10":"KV","ISO_A2":"-99","ISO_A2_EH":"XK","ISO_A3":"-99","ISO_A3_EH":"-99","ISO_N3":"-99","ISO_N3_EH":"-99","UN_A3":"-099","WB_A2":"KV","WB_A3":"KSV","WOE_ID":-90,"WOE_ID_EH":29389201,"WOE_NOTE":"Subunit of Serbia in WOE still; should include 29389201, 29389207, 29389218, 29389209 and 29389214.","ADM0_ISO":"SRB","ADM0_DIFF":"1","ADM0_TLC":"KOS","ADM0_A3_US":"KOS","ADM0_A3_FR":"KOS","ADM0_A3_RU":"SRB","ADM0_A3_ES":"SRB","ADM0_A3_CN":"SRB","ADM0_A3_TW":"KOS","ADM0_A3_IN":"SRB","ADM0_A3_NP":"SRB","ADM0_A3_PK":"KOS","ADM0_A3_DE":"KOS","ADM0_A3_GB":"SRB","ADM0_A3_BR":"KOS","ADM0_A3_IL":"KOS","ADM0_A3_PS":"SRB","ADM0_A3_SA":"KOS","ADM0_A3_EG":"KOS","ADM0_A3_MA":"SRB","ADM0_A3_PT":"KOS","ADM0_A3_AR":"SRB","ADM0_A3_JP":"KOS","ADM0_A3_KO":"KOS","ADM0_A3_VN":"SRB","ADM0_A3_TR":"KOS","ADM0_A3_ID":"SRB","ADM0_A3_PL":"KOS","ADM0_A3_GR":"SRB","ADM0_A3_IT":"KOS","ADM0_A3_NL":"KOS","ADM0_A3_SE":"KOS","ADM0_A3_BD":"KOS","ADM0_A3_UA":"SRB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10,"LABEL_X":20.860719,"LABEL_Y":42.593587,"NE_ID":1159321007,"WIKIDATAID":"Q1246","NAME_AR":"كوسوفو","NAME_BN":"কসোভো","NAME_DE":"Kosovo","NAME_EN":"Kosovo","NAME_ES":"Kosovo","NAME_FA":"کوزووو","NAME_FR":"Kosovo","NAME_EL":"Κοσσυφοπέδιο","NAME_HE":"קוסובו","NAME_HI":"कोसोवो गणराज्य","NAME_HU":"Koszovó","NAME_ID":"Kosovo","NAME_IT":"Kosovo","NAME_JA":"コソボ共和国","NAME_KO":"코소보","NAME_NL":"Kosovo","NAME_PL":"Kosowo","NAME_PT":"Kosovo","NAME_RU":"Республика Косово","NAME_SV":"Kosovo","NAME_TR":"Kosova","NAME_UK":"Косово","NAME_UR":"کوسووہ","NAME_VI":"Kosovo","NAME_ZH":"科索沃","NAME_ZHT":"科索沃","FCLASS_ISO":"Unrecognized","TLC_DIFF":"1","FCLASS_TLC":"Admin-0 country","FCLASS_US":"Admin-0 country","FCLASS_FR":"Admin-0 country","FCLASS_RU":"Admin-1 region","FCLASS_ES":"Unrecognized","FCLASS_CN":"Unrecognized","FCLASS_TW":"Admin-0 country","FCLASS_IN":"Admin-1 region","FCLASS_NP":"Unrecognized","FCLASS_PK":"Admin-0 country","FCLASS_DE":"Admin-0 country","FCLASS_GB":"Admin-0 country","FCLASS_BR":"Unrecognized","FCLASS_IL":"Admin-0 country","FCLASS_PS":"Unrecognized","FCLASS_SA":"Admin-0 country","FCLASS_EG":"Admin-0 country","FCLASS_MA":"Unrecognized","FCLASS_PT":"Admin-0 country","FCLASS_AR":"Unrecognized","FCLASS_JP":"Admin-0 country","FCLASS_KO":"Admin-0 country","FCLASS_VN":"Unrecognized","FCLASS_TR":"Admin-0 country","FCLASS_ID":"Unrecognized","FCLASS_PL":"Admin-0 country","FCLASS_GR":"Unrecognized","FCLASS_IT":"Admin-0 country","FCLASS_NL":"Admin-0 country","FCLASS_SE":"Admin-0 country","FCLASS_BD":"Admin-0 country","FCLASS_UA":"Unrecognized"},"bbox":[20.0707,41.84711,21.77505,43.27205],"geometry":{"type":"Polygon","coordinates":[[[20.590247,41.855409],[20.52295,42.21787],[20.283755,42.32026],[20.0707,42.58863],[20.25758,42.81275],[20.49679,42.88469],[20.63508,43.21671],[20.81448,43.27205],[20.95651,43.13094],[21.143395,43.068685],[21.27421,42.90959],[21.43866,42.86255],[21.63302,42.67717],[21.77505,42.6827],[21.66292,42.43922],[21.54332,42.32025],[21.576636,42.245224],[21.3527,42.2068],[20.76216,42.05186],[20.71731,41.84711],[20.590247,41.855409]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":5,"SOVEREIGNT":"Trinidad and Tobago","SOV_A3":"TTO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"Trinidad and Tobago","ADM0_A3":"TTO","GEOU_DIF":0,"GEOUNIT":"Trinidad and Tobago","GU_A3":"TTO","SU_DIF":0,"SUBUNIT":"Trinidad and Tobago","SU_A3":"TTO","BRK_DIFF":0,"NAME":"Trinidad and Tobago","NAME_LONG":"Trinidad and Tobago","BRK_A3":"TTO","BRK_NAME":"Trinidad and Tobago","BRK_GROUP":null,"ABBREV":"Tr.T.","POSTAL":"TT","FORMAL_EN":"Republic of Trinidad and Tobago","FORMAL_FR":null,"NAME_CIAWF":"Trinidad and Tobago","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Trinidad and Tobago","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":1394973,"POP_RANK":12,"POP_YEAR":2019,"GDP_MD":24269,"GDP_YEAR":2019,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","FIPS_10":"TD","ISO_A2":"TT","ISO_A2_EH":"TT","ISO_A3":"TTO","ISO_A3_EH":"TTO","ISO_N3":"780","ISO_N3_EH":"780","UN_A3":"780","WB_A2":"TT","WB_A3":"TTO","WOE_ID":23424958,"WOE_ID_EH":23424958,"WOE_NOTE":"Exact WOE match as country","ADM0_ISO":"TTO","ADM0_DIFF":null,"ADM0_TLC":"TTO","ADM0_A3_US":"TTO","ADM0_A3_FR":"TTO","ADM0_A3_RU":"TTO","ADM0_A3_ES":"TTO","ADM0_A3_CN":"TTO","ADM0_A3_TW":"TTO","ADM0_A3_IN":"TTO","ADM0_A3_NP":"TTO","ADM0_A3_PK":"TTO","ADM0_A3_DE":"TTO","ADM0_A3_GB":"TTO","ADM0_A3_BR":"TTO","ADM0_A3_IL":"TTO","ADM0_A3_PS":"TTO","ADM0_A3_SA":"TTO","ADM0_A3_EG":"TTO","ADM0_A3_MA":"TTO","ADM0_A3_PT":"TTO","ADM0_A3_AR":"TTO","ADM0_A3_JP":"TTO","ADM0_A3_KO":"TTO","ADM0_A3_VN":"TTO","ADM0_A3_TR":"TTO","ADM0_A3_ID":"TTO","ADM0_A3_PL":"TTO","ADM0_A3_GR":"TTO","ADM0_A3_IT":"TTO","ADM0_A3_NL":"TTO","ADM0_A3_SE":"TTO","ADM0_A3_BD":"TTO","ADM0_A3_UA":"TTO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":19,"LONG_LEN":19,"ABBREV_LEN":5,"TINY":2,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5,"LABEL_X":-60.9184,"LABEL_Y":10.9989,"NE_ID":1159321321,"WIKIDATAID":"Q754","NAME_AR":"ترينيداد وتوباغو","NAME_BN":"ত্রিনিদাদ ও টোবাগো","NAME_DE":"Trinidad und Tobago","NAME_EN":"Trinidad and Tobago","NAME_ES":"Trinidad y Tobago","NAME_FA":"ترینیداد و توباگو","NAME_FR":"Trinité-et-Tobago","NAME_EL":"Τρινιντάντ και Τομπάγκο","NAME_HE":"טרינידד וטובגו","NAME_HI":"त्रिनिदाद और टोबैगो","NAME_HU":"Trinidad és Tobago","NAME_ID":"Trinidad dan Tobago","NAME_IT":"Trinidad e Tobago","NAME_JA":"トリニダード・トバゴ","NAME_KO":"트리니다드 토바고","NAME_NL":"Trinidad en Tobago","NAME_PL":"Trynidad i Tobago","NAME_PT":"Trinidad e Tobago","NAME_RU":"Тринидад и Тобаго","NAME_SV":"Trinidad och Tobago","NAME_TR":"Trinidad ve Tobago","NAME_UK":"Тринідад і Тобаго","NAME_UR":"ٹرینیڈاڈ و ٹوباگو","NAME_VI":"Trinidad và Tobago","NAME_ZH":"特立尼达和多巴哥","NAME_ZHT":"千里達及托巴哥","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[-61.95,10,-60.895,10.89],"geometry":{"type":"Polygon","coordinates":[[[-61.68,10.76],[-61.105,10.89],[-60.895,10.855],[-60.935,10.11],[-61.77,10],[-61.95,10.09],[-61.66,10.365],[-61.68,10.76]]]}},{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"LABELRANK":3,"SOVEREIGNT":"South Sudan","SOV_A3":"SDS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","TLC":"1","ADMIN":"South Sudan","ADM0_A3":"SDS","GEOU_DIF":0,"GEOUNIT":"South Sudan","GU_A3":"SDS","SU_DIF":0,"SUBUNIT":"South Sudan","SU_A3":"SDS","BRK_DIFF":0,"NAME":"S. Sudan","NAME_LONG":"South Sudan","BRK_A3":"SDS","BRK_NAME":"S. Sudan","BRK_GROUP":null,"ABBREV":"S. Sud.","POSTAL":"SS","FORMAL_EN":"Republic of South Sudan","FORMAL_FR":null,"NAME_CIAWF":"South Sudan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"South Sudan","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":5,"POP_EST":11062113,"POP_RANK":14,"POP_YEAR":2019,"GDP_MD":11998,"GDP_YEAR":2015,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","FIPS_10":"-99","ISO_A2":"SS","ISO_A2_EH":"SS","ISO_A3":"SSD","ISO_A3_EH":"SSD","ISO_N3":"728","ISO_N3_EH":"728","UN_A3":"728","WB_A2":"SS","WB_A3":"SSD","WOE_ID":-99,"WOE_ID_EH":-99,"WOE_NOTE":"Includes states of 20069899, 20069897, 20069898, 20069901, 20069909, and 20069908 but maybe more?","ADM0_ISO":"SSD","ADM0_DIFF":"1","ADM0_TLC":"SDS","ADM0_A3_US":"SDS","ADM0_A3_FR":"SDS","ADM0_A3_RU":"SDS","ADM0_A3_ES":"SDS","ADM0_A3_CN":"SDS","ADM0_A3_TW":"SDS","ADM0_A3_IN":"SDS","ADM0_A3_NP":"SDS","ADM0_A3_PK":"SDS","ADM0_A3_DE":"SDS","ADM0_A3_GB":"SDS","ADM0_A3_BR":"SDS","ADM0_A3_IL":"SDS","ADM0_A3_PS":"SDS","ADM0_A3_SA":"SDS","ADM0_A3_EG":"SDS","ADM0_A3_MA":"SDS","ADM0_A3_PT":"SDS","ADM0_A3_AR":"SDS","ADM0_A3_JP":"SDS","ADM0_A3_KO":"SDS","ADM0_A3_VN":"SDS","ADM0_A3_TR":"SDS","ADM0_A3_ID":"SDS","ADM0_A3_PL":"SDS","ADM0_A3_GR":"SDS","ADM0_A3_IT":"SDS","ADM0_A3_NL":"SDS","ADM0_A3_SE":"SDS","ADM0_A3_BD":"SDS","ADM0_A3_UA":"SDS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":11,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8,"LABEL_X":30.390151,"LABEL_Y":7.230477,"NE_ID":1159321235,"WIKIDATAID":"Q958","NAME_AR":"جنوب السودان","NAME_BN":"দক্ষিণ সুদান","NAME_DE":"Südsudan","NAME_EN":"South Sudan","NAME_ES":"Sudán del Sur","NAME_FA":"سودان جنوبی","NAME_FR":"Soudan du Sud","NAME_EL":"Νότιο Σουδάν","NAME_HE":"דרום סודאן","NAME_HI":"दक्षिण सूडान","NAME_HU":"Dél-Szudán","NAME_ID":"Sudan Selatan","NAME_IT":"Sudan del Sud","NAME_JA":"南スーダン","NAME_KO":"남수단","NAME_NL":"Zuid-Soedan","NAME_PL":"Sudan Południowy","NAME_PT":"Sudão do Sul","NAME_RU":"Южный Судан","NAME_SV":"Sydsudan","NAME_TR":"Güney Sudan","NAME_UK":"Південний Судан","NAME_UR":"جنوبی سوڈان","NAME_VI":"Nam Sudan","NAME_ZH":"南苏丹","NAME_ZHT":"南蘇丹","FCLASS_ISO":"Admin-0 country","TLC_DIFF":null,"FCLASS_TLC":"Admin-0 country","FCLASS_US":null,"FCLASS_FR":null,"FCLASS_RU":null,"FCLASS_ES":null,"FCLASS_CN":null,"FCLASS_TW":null,"FCLASS_IN":null,"FCLASS_NP":null,"FCLASS_PK":null,"FCLASS_DE":null,"FCLASS_GB":null,"FCLASS_BR":null,"FCLASS_IL":null,"FCLASS_PS":null,"FCLASS_SA":null,"FCLASS_EG":null,"FCLASS_MA":null,"FCLASS_PT":null,"FCLASS_AR":null,"FCLASS_JP":null,"FCLASS_KO":null,"FCLASS_VN":null,"FCLASS_TR":null,"FCLASS_ID":null,"FCLASS_PL":null,"FCLASS_GR":null,"FCLASS_IT":null,"FCLASS_NL":null,"FCLASS_SE":null,"FCLASS_BD":null,"FCLASS_UA":null},"bbox":[23.88698,3.509172,35.298007,12.248008],"geometry":{"type":"Polygon","coordinates":[[[30.833852,3.509172],[29.9535,4.173699],[29.715995,4.600805],[29.159078,4.389267],[28.696678,4.455077],[28.428994,4.287155],[27.979977,4.408413],[27.374226,5.233944],[27.213409,5.550953],[26.465909,5.946717],[26.213418,6.546603],[25.796648,6.979316],[25.124131,7.500085],[25.114932,7.825104],[24.567369,8.229188],[23.88698,8.61973],[24.194068,8.728696],[24.537415,8.917538],[24.794926,9.810241],[25.069604,10.27376],[25.790633,10.411099],[25.962307,10.136421],[26.477328,9.55273],[26.752006,9.466893],[27.112521,9.638567],[27.833551,9.604232],[27.97089,9.398224],[28.966597,9.398224],[29.000932,9.604232],[29.515953,9.793074],[29.618957,10.084919],[29.996639,10.290927],[30.837841,9.707237],[31.352862,9.810241],[31.850716,10.531271],[32.400072,11.080626],[32.314235,11.681484],[32.073892,11.97333],[32.67475,12.024832],[32.743419,12.248008],[33.206938,12.179338],[33.086766,11.441141],[33.206938,10.720112],[33.721959,10.325262],[33.842131,9.981915],[33.824963,9.484061],[33.963393,9.464285],[33.97498,8.68456],[33.8255,8.37916],[33.2948,8.35458],[32.95418,7.78497],[33.56829,7.71334],[34.0751,7.22595],[34.25032,6.82607],[34.70702,6.59422],[35.298007,5.506],[34.620196,4.847123],[34.005,4.249885],[33.39,3.79],[32.68642,3.79232],[31.88145,3.55827],[31.24556,3.7819],[30.833852,3.509172]]]}}],"bbox":[-180,-90,180,83.64513]} diff --git a/gui/src-tauri/.gitignore b/gui/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/gui/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/gui/src-tauri/Cargo.toml b/gui/src-tauri/Cargo.toml new file mode 100644 index 0000000..a97f8f8 --- /dev/null +++ b/gui/src-tauri/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "flightplanner-gui" +version = "0.1.0" +description = "Flight Planner desktop GUI (Tauri)" +authors = ["you"] +edition = "2021" + +[lib] +# The `_lib` suffix keeps the lib name distinct from the bin on Windows. +# See https://github.com/rust-lang/cargo/issues/8519 +name = "gui_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" +serde = { workspace = true } +serde_json = { workspace = true } +flightplanner-core = { workspace = true } +flightplanner-rad = { path = "../../crates/rad" } diff --git a/gui/src-tauri/build.rs b/gui/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/gui/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/gui/src-tauri/capabilities/default.json b/gui/src-tauri/capabilities/default.json new file mode 100644 index 0000000..a0e21a4 --- /dev/null +++ b/gui/src-tauri/capabilities/default.json @@ -0,0 +1,16 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "opener:default", + "core:window:allow-minimize", + "core:window:allow-maximize", + "core:window:allow-unmaximize", + "core:window:allow-toggle-maximize", + "core:window:allow-close", + "core:window:allow-start-dragging" + ] +} diff --git a/gui/src-tauri/icons/128x128.png b/gui/src-tauri/icons/128x128.png new file mode 100644 index 0000000..6be5e50 Binary files /dev/null and b/gui/src-tauri/icons/128x128.png differ diff --git a/gui/src-tauri/icons/128x128@2x.png b/gui/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..e81bece Binary files /dev/null and b/gui/src-tauri/icons/128x128@2x.png differ diff --git a/gui/src-tauri/icons/32x32.png b/gui/src-tauri/icons/32x32.png new file mode 100644 index 0000000..a437dd5 Binary files /dev/null and b/gui/src-tauri/icons/32x32.png differ diff --git a/gui/src-tauri/icons/Square107x107Logo.png b/gui/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..0ca4f27 Binary files /dev/null and b/gui/src-tauri/icons/Square107x107Logo.png differ diff --git a/gui/src-tauri/icons/Square142x142Logo.png b/gui/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..b81f820 Binary files /dev/null and b/gui/src-tauri/icons/Square142x142Logo.png differ diff --git a/gui/src-tauri/icons/Square150x150Logo.png b/gui/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..624c7bf Binary files /dev/null and b/gui/src-tauri/icons/Square150x150Logo.png differ diff --git a/gui/src-tauri/icons/Square284x284Logo.png b/gui/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..c021d2b Binary files /dev/null and b/gui/src-tauri/icons/Square284x284Logo.png differ diff --git a/gui/src-tauri/icons/Square30x30Logo.png b/gui/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..6219700 Binary files /dev/null and b/gui/src-tauri/icons/Square30x30Logo.png differ diff --git a/gui/src-tauri/icons/Square310x310Logo.png b/gui/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..f9bc048 Binary files /dev/null and b/gui/src-tauri/icons/Square310x310Logo.png differ diff --git a/gui/src-tauri/icons/Square44x44Logo.png b/gui/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..d5fbfb2 Binary files /dev/null and b/gui/src-tauri/icons/Square44x44Logo.png differ diff --git a/gui/src-tauri/icons/Square71x71Logo.png b/gui/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..63440d7 Binary files /dev/null and b/gui/src-tauri/icons/Square71x71Logo.png differ diff --git a/gui/src-tauri/icons/Square89x89Logo.png b/gui/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..f3f705a Binary files /dev/null and b/gui/src-tauri/icons/Square89x89Logo.png differ diff --git a/gui/src-tauri/icons/StoreLogo.png b/gui/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..4556388 Binary files /dev/null and b/gui/src-tauri/icons/StoreLogo.png differ diff --git a/gui/src-tauri/icons/icon.icns b/gui/src-tauri/icons/icon.icns new file mode 100644 index 0000000..12a5bce Binary files /dev/null and b/gui/src-tauri/icons/icon.icns differ diff --git a/gui/src-tauri/icons/icon.ico b/gui/src-tauri/icons/icon.ico new file mode 100644 index 0000000..b3636e4 Binary files /dev/null and b/gui/src-tauri/icons/icon.ico differ diff --git a/gui/src-tauri/icons/icon.png b/gui/src-tauri/icons/icon.png new file mode 100644 index 0000000..e1cd261 Binary files /dev/null and b/gui/src-tauri/icons/icon.png differ diff --git a/gui/src-tauri/src/lib.rs b/gui/src-tauri/src/lib.rs new file mode 100644 index 0000000..2bfb716 --- /dev/null +++ b/gui/src-tauri/src/lib.rs @@ -0,0 +1,388 @@ +//! Tauri backend for the Flight Planner GUI. +//! +//! The `plan` command just delegates to the shared engine in `core::api`, so the +//! local (in-process) path runs the exact same code as the custom HTTP server. + +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; + +use flightplanner_core::api::{self, CachedRouteDto, PlanRequest, PlanResult}; +use flightplanner_core::error::CoreError; +use flightplanner_core::rad::RadData; +use flightplanner_core::routing::discover::{DiscoverResult, IfpsErr, IfpsValidator, IfpsVerdict}; +use tauri::{Emitter, State}; + +/// The RAD loaded once at startup (None if the file isn't present). +struct RadState(Option>); + +/// Run route + optional fuel plan locally. Errors are stringified for the UI. +#[tauri::command] +fn plan(req: PlanRequest, rad: State) -> Result { + api::plan(&req, rad.0.as_deref()).map_err(|e| e.to_string()) +} + +/// Authoritative IFPS validator backed by the IFPUV scraper (`validate.mjs`). +/// Emits a `discover-progress` event before each ~25 s round-trip so the UI can +/// show what's being checked. +struct NodeIfps { + dir: String, + app: Option, + step: AtomicUsize, +} + +impl IfpsValidator for NodeIfps { + fn validate(&self, adep: &str, ades: &str, route: &str, fl: i32) -> Result { + let step = self.step.fetch_add(1, Ordering::Relaxed) + 1; + if let Some(app) = &self.app { + let _ = app.emit( + "discover-progress", + serde_json::json!({ + "step": step, + "adep": adep, "ades": ades, "route": route, "fl": fl, + }), + ); + } + let payload = serde_json::json!({ + "adep": adep, "ades": ades, "route": route, "level": format!("F{:03}", fl), + }); + let out = std::process::Command::new("node") + .arg("validate.mjs") + .arg(payload.to_string()) + .current_dir(&self.dir) + .output()?; // io::Error → CoreError::Io + let stdout = String::from_utf8_lossy(&out.stdout); + let line = stdout + .lines() + .rev() + .find(|l| l.trim_start().starts_with('{')) + .ok_or_else(|| { + CoreError::Other(format!( + "IFPUV validator produced no result. stderr: {}", + String::from_utf8_lossy(&out.stderr).trim() + )) + })?; + #[derive(serde::Deserialize)] + struct V { + accepted: Option, + #[serde(default)] + errors: Vec, + } + let v: V = serde_json::from_str(line)?; // serde error → CoreError::Json + Ok(IfpsVerdict { accepted: v.accepted.unwrap_or(false), errors: v.errors }) + } +} + +/// Generate an IFPS-valid route via the oracle loop (live IFPUV, ~1–3 min the +/// first time), store it, and return the discovery result. Runs off-thread. +#[tauri::command] +async fn generate_validated( + app: tauri::AppHandle, + req: PlanRequest, + rad: State<'_, RadState>, +) -> Result { + let rad = rad.0.clone(); + let dir = std::env::var("FP_IFPUV_DIR") + .unwrap_or_else(|_| r"C:\Users\Alexandre\flightplanner\tools\ifpuv".to_string()); + tauri::async_runtime::spawn_blocking(move || { + let validator = NodeIfps { dir, app: Some(app), step: AtomicUsize::new(0) }; + api::discover_route(&req, rad.as_deref(), &validator).map_err(|e| e.to_string()) + }) + .await + .map_err(|e| e.to_string())? +} + +/// Stored routes for a city pair from our own route database (local file). +#[tauri::command] +fn recent_routes(db_path: String, dep: String, dest: String) -> Result, String> { + api::recent_routes(&db_path, &dep, &dest, 10).map_err(|e| e.to_string()) +} + +/// Total number of stored routes. +#[tauri::command] +fn route_db_count(db_path: String) -> Result { + api::route_db_count(&db_path).map_err(|e| e.to_string()) +} + +/// Run a Playwright IFPUV script (`script`) with the JSON `payload` and return +/// its single JSON result line. Round-trips the public Eurocontrol validator. +fn run_ifpuv(script: &str, payload: serde_json::Value) -> Result { + let dir = std::env::var("FP_IFPUV_DIR") + .unwrap_or_else(|_| r"C:\Users\Alexandre\flightplanner\tools\ifpuv".to_string()); + let out = std::process::Command::new("node") + .arg(script) + .arg(payload.to_string()) + .current_dir(&dir) + .output() + .map_err(|e| format!("cannot launch Node.js validator: {e}"))?; + let stdout = String::from_utf8_lossy(&out.stdout); + let line = stdout + .lines() + .rev() + .find(|l| l.trim_start().starts_with('{')) + .ok_or_else(|| { + format!("validator produced no result. stderr: {}", String::from_utf8_lossy(&out.stderr).trim()) + })?; + serde_json::from_str::(line).map_err(|e| e.to_string()) +} + +/// Authoritative IFPS validation: builds an ICAO FPL from `payload` and submits +/// it to the public Eurocontrol IFPUV. Returns `{ accepted, errors:[{code,msg}], raw, fpl }`. +/// Network round-trip, ~20–30 s (guest GWT app load). +#[tauri::command] +async fn ifps_validate(payload: serde_json::Value) -> Result { + tauri::async_runtime::spawn_blocking(move || run_ifpuv("validate.mjs", payload)) + .await + .map_err(|e| e.to_string())? +} + +/// Oracle-driven IFPS auto-correction: validates and mechanically fixes the +/// tractable errors (RAD level caps, unknown designators) against the IFPUV, +/// looping until accepted. Returns `{ accepted, level, route, iterations, log, errors }`. +#[tauri::command] +async fn ifps_autofix(payload: serde_json::Value) -> Result { + tauri::async_runtime::spawn_blocking(move || run_ifpuv("autofix.mjs", payload)) + .await + .map_err(|e| e.to_string())? +} + +/// Load the RAD workbook once (env `FP_RAD`, else the project default). +fn load_rad() -> Option { + let path = std::env::var("FP_RAD") + .unwrap_or_else(|_| r"C:\Users\Alexandre\flightplanner\rad\RAD_current.xlsx".to_string()); + if !std::path::Path::new(&path).exists() { + eprintln!("RAD: file not found ({path}) — RAD checks disabled"); + return None; + } + match flightplanner_rad::parse(&path) { + Ok(mut rad) => { + let (f, o, c) = rad.dct_counts(); + // Official EUROCONTROL FRA points (separate file) for the FRA-points router. + let fra_path = std::env::var("FP_FRA_POINTS") + .unwrap_or_else(|_| r"C:\Users\Alexandre\flightplanner\rad\fra-points.xlsx".to_string()); + rad.fra_points = flightplanner_rad::parse_fra_points(&fra_path).unwrap_or_default(); + eprintln!( + "RAD loaded: {} areas, {} DCT ({f} forbidden / {o} conditional / {c} compulsory), {} level caps, {} FRA points", + rad.areas.len(), + rad.dct.len(), + rad.level_caps.len(), + rad.fra_points.len(), + ); + Some(rad) + } + Err(e) => { + eprintln!("RAD: parse failed ({e}) — RAD checks disabled"); + None + } + } +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .manage(RadState(load_rad().map(Arc::new))) + .invoke_handler(tauri::generate_handler![plan, recent_routes, route_db_count, ifps_validate, ifps_autofix, generate_validated]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} + +#[cfg(test)] +mod tests { + use super::*; + + /// End-to-end smoke test of the shared `plan` engine against the real DB. + /// Skips (passes) when the DB isn't present so the test stays portable. + #[test] + fn plan_command_end_to_end() { + let db = "C:\\Users\\Alexandre\\flightplanner\\real.db"; + let dir = "C:\\Users\\Alexandre\\flightplanner\\data\\aircraft"; + if !std::path::Path::new(db).exists() { + return; + } + // Load the RAD so the FRA graph router is exercised (as in the real app). + let rad = load_rad(); + let res = api::plan( + &PlanRequest { + from: "LFPG".into(), + to: "EGLL".into(), + db_path: db.into(), + aircraft: Some("A320".into()), + aircraft_dir: dir.into(), + cifp_dir: Some("C:\\Users\\Alexandre\\flightplanner\\navdata\\CIFP".into()), + cruise_fl: Some(360), + alternate: None, + payload_kg: Some(16_000.0), + }, + rad.as_ref(), + ) + .expect("plan should succeed"); + + eprintln!("ROUTE: {}", res.route_string); + assert!(!res.legs.is_empty(), "route should have legs"); + assert!(res.route_string.starts_with("LFPG"), "{}", res.route_string); + assert!(res.ofp.contains("OPERATIONAL FLIGHT PLAN"), "OFP present"); + let fuel = res.fuel.expect("A320 ⇒ fuel plan"); + assert!(fuel.block_fuel_kg > fuel.trip_fuel_kg, "block > trip"); + let mass = fuel.mass.expect("OpenAP ⇒ mass breakdown"); + assert!(mass.takeoff_kg > mass.landing_kg, "TOW > LDW"); + let last = res.legs.last().unwrap(); + assert!((last.cum_dist_nm - res.total_nm).abs() < 1.0, "cum dist ends at total"); + } + + /// Plan several European pairs at once (RAD loaded once) and print each + /// route + the enroute item-15 (fixes joined by DCT) ready for the IFPUV + /// oracle. Run: `cargo test -p flightplanner-gui plan_pairs -- --nocapture`. + #[test] + fn plan_pairs() { + let db = "C:\\Users\\Alexandre\\flightplanner\\real.db"; + let dir = "C:\\Users\\Alexandre\\flightplanner\\data\\aircraft"; + let cifp = "C:\\Users\\Alexandre\\flightplanner\\navdata\\CIFP"; + if !std::path::Path::new(db).exists() { + return; + } + let rad = load_rad(); + let pairs_env = std::env::var("FP_TEST_PAIRS") + .unwrap_or_else(|_| "LFPG-EGLL,EGLL-LFPG,LFPG-EDDF,EHAM-LSZH,LFPG-LEMD,EDDM-LEBL".into()); + let pairs: Vec<(String, String)> = pairs_env + .split(',') + .filter_map(|p| p.split_once('-').map(|(a, b)| (a.trim().to_uppercase(), b.trim().to_uppercase()))) + .collect(); + for (from, to) in &pairs { + let (from, to) = (from.as_str(), to.as_str()); + let res = api::plan( + &PlanRequest { + from: from.into(), + to: to.into(), + db_path: db.into(), + aircraft: Some("A320".into()), + aircraft_dir: dir.into(), + cifp_dir: Some(cifp.into()), + cruise_fl: Some(360), + alternate: None, + payload_kg: Some(16_000.0), + }, + rad.as_ref(), + ); + match res { + Ok(r) => { + // item 15 = enroute fix chain (each leg's `to` except the destination). + let n = r.legs.len(); + let item15: Vec = + r.legs.iter().take(n.saturating_sub(1)).map(|l| l.to.clone()).collect(); + eprintln!("PAIR {from}->{to}\n ROUTE : {}\n ITEM15: {}", r.route_string, item15.join(" DCT ")); + } + Err(e) => eprintln!("PAIR {from}->{to} ERROR: {e}"), + } + } + } + + /// Batch coverage: run discovery over several European pairs and report the + /// no-error rate + which error codes block the failures. Ignored (very slow, + /// many live IFPUV round-trips). Pairs via env `FP_BATCH_PAIRS` (comma-sep + /// `LFPG-EGLL,...`). Run: `cargo test -p flightplanner-gui batch_coverage -- --ignored --nocapture`. + #[test] + #[ignore = "live IFPUV batch, many minutes"] + fn batch_coverage() { + let db = "C:\\Users\\Alexandre\\flightplanner\\real.db"; + let dir = "C:\\Users\\Alexandre\\flightplanner\\data\\aircraft"; + let cifp = "C:\\Users\\Alexandre\\flightplanner\\navdata\\CIFP"; + if !std::path::Path::new(db).exists() { + return; + } + let rad = load_rad(); + let ifdir = std::env::var("FP_IFPUV_DIR") + .unwrap_or_else(|_| "C:\\Users\\Alexandre\\flightplanner\\tools\\ifpuv".to_string()); + let validator = NodeIfps { dir: ifdir, app: None, step: std::sync::atomic::AtomicUsize::new(0) }; + let pairs_env = std::env::var("FP_BATCH_PAIRS").unwrap_or_else(|_| { + "LFPG-EGLL,LFPG-LFMN,LFPG-EDDF,EHAM-LSZH,LEMD-LEBL,EDDM-LEBL".into() + }); + let pairs: Vec<(String, String)> = pairs_env + .split(',') + .filter_map(|p| p.split_once('-').map(|(a, b)| (a.trim().to_uppercase(), b.trim().to_uppercase()))) + .collect(); + + let mut ok = 0usize; + let mut hist: std::collections::HashMap = std::collections::HashMap::new(); + for (from, to) in &pairs { + let req = PlanRequest { + from: from.clone(), + to: to.clone(), + db_path: db.into(), + aircraft: Some("A320".into()), + aircraft_dir: dir.into(), + cifp_dir: Some(cifp.into()), + cruise_fl: Some(360), + alternate: None, + payload_kg: Some(16_000.0), + }; + match api::discover_route(&req, rad.as_ref(), &validator) { + Ok(r) => { + let codes: Vec<&str> = r.errors.iter().map(|e| e.code.as_str()).collect(); + eprintln!( + "BATCH {from}->{to}: {} F{:03} iters={} errs={} [{}]", + if r.accepted { "OK " } else { "FAIL" }, + r.fl, + r.iterations, + r.errors.len(), + codes.join(",") + ); + if r.accepted { + ok += 1; + } + for e in &r.errors { + *hist.entry(e.code.clone()).or_default() += 1; + } + } + Err(e) => eprintln!("BATCH {from}->{to}: ERROR {e}"), + } + } + let mut codes: Vec<(String, usize)> = hist.into_iter().collect(); + codes.sort_by(|a, b| b.1.cmp(&a.1)); + eprintln!("BATCH COVERAGE: {ok}/{} no-error ({:.0}%)", pairs.len(), 100.0 * ok as f64 / pairs.len().max(1) as f64); + eprintln!("BATCH blocking codes: {codes:?}"); + } + + /// Live end-to-end: run the oracle discovery loop against the real IFPUV. + /// Ignored by default (network + several ~25 s round-trips). Run with: + /// `cargo test -p flightplanner-gui discover_e2e -- --ignored --nocapture`. + #[test] + #[ignore = "live IFPUV round-trips (minutes) + network"] + fn discover_e2e() { + let db = "C:\\Users\\Alexandre\\flightplanner\\real.db"; + let dir = "C:\\Users\\Alexandre\\flightplanner\\data\\aircraft"; + let cifp = "C:\\Users\\Alexandre\\flightplanner\\navdata\\CIFP"; + if !std::path::Path::new(db).exists() { + return; + } + let rad = load_rad(); + let ifdir = std::env::var("FP_IFPUV_DIR") + .unwrap_or_else(|_| "C:\\Users\\Alexandre\\flightplanner\\tools\\ifpuv".to_string()); + let validator = NodeIfps { dir: ifdir, app: None, step: std::sync::atomic::AtomicUsize::new(0) }; + let pairs_env = std::env::var("FP_TEST_PAIRS").unwrap_or_else(|_| "LFPG-EGLL,LFPG-LFMN".into()); + let pairs: Vec<(String, String)> = pairs_env + .split(',') + .filter_map(|p| p.split_once('-').map(|(a, b)| (a.trim().to_uppercase(), b.trim().to_uppercase()))) + .collect(); + for (from, to) in &pairs { + let (from, to) = (from.as_str(), to.as_str()); + let req = PlanRequest { + from: from.into(), + to: to.into(), + db_path: db.into(), + aircraft: Some("A320".into()), + aircraft_dir: dir.into(), + cifp_dir: Some(cifp.into()), + cruise_fl: Some(360), + alternate: None, + payload_kg: Some(16_000.0), + }; + match api::discover_route(&req, rad.as_ref(), &validator) { + Ok(r) => eprintln!( + "== {from}->{to} accepted={} fl={} nm={:.0}\n route : {}\n item15: {}\n log:\n {}", + r.accepted, r.fl, r.total_nm, r.route_string, r.item15, r.log.join("\n ") + ), + Err(e) => eprintln!("== {from}->{to} ERROR: {e}"), + } + } + } +} diff --git a/gui/src-tauri/src/main.rs b/gui/src-tauri/src/main.rs new file mode 100644 index 0000000..6894a82 --- /dev/null +++ b/gui/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + gui_lib::run() +} diff --git a/gui/src-tauri/tauri.conf.json b/gui/src-tauri/tauri.conf.json new file mode 100644 index 0000000..b3f466c --- /dev/null +++ b/gui/src-tauri/tauri.conf.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "Flight Planner", + "version": "0.1.0", + "identifier": "com.flightplanner.app", + "build": { + "beforeDevCommand": "npm run dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "npm run build", + "frontendDist": "../dist" + }, + "app": { + "windows": [ + { + "title": "Flight Planner", + "width": 1180, + "height": 820, + "minWidth": 900, + "minHeight": 640, + "decorations": false + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/gui/src/App.css b/gui/src/App.css new file mode 100644 index 0000000..fecb9fc --- /dev/null +++ b/gui/src/App.css @@ -0,0 +1,218 @@ +/* ── Modern dark dispatch dashboard — one deliberate design system ─────────── */ +:root { + --bg: #0b0e14; + --panel: #11151d; + --panel-2: #161b25; + --elev: #1b2230; + --border: #232b39; + --border-soft: #1a212c; + --text: #e6edf3; + --muted: #8a97a8; + --faint: #5b6675; + --accent: #4c8dff; + --accent-2: #2f6bd6; + --accent-weak: #14233d; + --good: #40c463; + --warn: #ff5c5c; + --amber: #f0a92b; + --radius: 8px; + --radius-sm: 6px; + --mono: "Cascadia Mono", "JetBrains Mono", Consolas, monospace; + font-family: "Segoe UI Variable", "Segoe UI", Inter, system-ui, sans-serif; + font-size: 13px; + color: var(--text); + color-scheme: dark; +} +* { box-sizing: border-box; } +html, body, #root { margin: 0; height: 100%; } +body { background: var(--bg); overflow: hidden; } +::-webkit-scrollbar { width: 10px; height: 10px; } +::-webkit-scrollbar-thumb { background: #263041; border-radius: 6px; border: 2px solid var(--bg); } +::-webkit-scrollbar-thumb:hover { background: #33405600; background: #334056; } + +.app { height: 100vh; width: 100vw; display: flex; flex-direction: column; } + +/* Title bar (borderless window) */ +.titlebar { + height: 40px; flex: 0 0 40px; display: flex; align-items: center; justify-content: space-between; + padding: 0 8px 0 14px; background: var(--panel); border-bottom: 1px solid var(--border); + user-select: none; +} +.tb-left { display: flex; align-items: center; gap: 10px; font-weight: 600; } +.logo { color: var(--accent); font-size: 15px; } +.tb-flight { color: var(--muted); font-weight: 500; font-family: var(--mono); font-size: 12px; } +.win-controls { display: flex; gap: 2px; } +.win-controls button { + width: 34px; height: 28px; border: none; background: transparent; color: var(--muted); + border-radius: var(--radius-sm); cursor: pointer; font-size: 13px; display: grid; place-items: center; +} +.win-controls button:hover { background: var(--elev); color: var(--text); } +.win-controls button.close:hover { background: #b3202a; color: #fff; } + +/* Body */ +.body { flex: 1; display: grid; grid-template-columns: 320px 1fr; min-height: 0; } +.sidebar { background: var(--panel); border-right: 1px solid var(--border); overflow-y: auto; display: flex; flex-direction: column; } +.main { display: flex; flex-direction: column; min-height: 0; } + +/* Sidebar header (primary inputs + action) */ +.side-head { padding: 14px; border-bottom: 1px solid var(--border-soft); display: flex; flex-direction: column; gap: 10px; } +.flightid { display: flex; align-items: center; gap: 8px; } +.flightid input { text-align: center; font-family: var(--mono); font-size: 15px; letter-spacing: 1px; font-weight: 600; } +.flightid .arrow { color: var(--faint); } +.row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } +.row3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; } + +/* Sections */ +.sections { padding: 6px 14px 16px; display: flex; flex-direction: column; } +.section { padding: 12px 0; border-bottom: 1px solid var(--border-soft); } +.section:last-child { border-bottom: none; } +.section-title { + font-size: 11px; text-transform: uppercase; letter-spacing: 0.7px; color: var(--muted); + margin: 0 0 10px; display: flex; align-items: center; gap: 7px; +} +.section-title::before { content: ""; width: 3px; height: 12px; background: var(--accent); border-radius: 2px; } + +/* Fields */ +.field { display: flex; flex-direction: column; gap: 4px; min-width: 0; } +.field + .field, .row2 + .field, .field + .row2, .row2 + .row2, .row3 + .field, .field + .row3 { margin-top: 8px; } +.field label { font-size: 11px; color: var(--muted); } +input, select { + width: 100%; height: 30px; padding: 0 9px; background: var(--panel-2); color: var(--text); + border: 1px solid var(--border); border-radius: var(--radius-sm); outline: none; font-family: inherit; font-size: 13px; + transition: border-color .12s, box-shadow .12s; +} +input:focus, select:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-weak); } +input::placeholder { color: var(--faint); } +select { appearance: none; background-image: url("data:image/svg+xml;utf8,"); background-repeat: no-repeat; background-position: right 9px center; padding-right: 26px; } + +/* Buttons */ +.btn { height: 32px; padding: 0 14px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--elev); color: var(--text); cursor: pointer; font: inherit; font-weight: 500; display: inline-flex; align-items: center; gap: 7px; } +.btn:hover { border-color: #33405a; background: #1f2735; } +.btn:disabled { opacity: .45; cursor: default; } +.btn-primary { border: none; background: linear-gradient(180deg, var(--accent), var(--accent-2)); color: #fff; font-weight: 600; width: 100%; height: 36px; justify-content: center; } +.btn-primary:hover { filter: brightness(1.07); } +.btn-primary:disabled { filter: none; opacity: .6; } +.err { color: var(--warn); font-size: 12px; } + +/* KPI strip */ +.kpis { display: flex; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--border); background: var(--panel); overflow-x: auto; } +.kpi { min-width: 96px; background: var(--panel-2); border: 1px solid var(--border); border-radius: var(--radius); padding: 8px 12px; } +.kpi .k { font-size: 10px; text-transform: uppercase; letter-spacing: .6px; color: var(--muted); } +.kpi .v { font-size: 18px; font-weight: 700; margin-top: 2px; font-family: var(--mono); } +.kpi .s { font-size: 11px; color: var(--faint); } +.kpi.warn .v { color: var(--warn); } + +/* Map */ +.map { flex: 1.5; min-height: 220px; position: relative; } +.maproot { width: 100%; height: 100%; } +.map .hint { position: absolute; top: 12px; left: 12px; z-index: 1; background: rgba(11,14,20,.75); border: 1px solid var(--border); padding: 5px 10px; border-radius: var(--radius-sm); color: var(--muted); font-size: 12px; pointer-events: none; } +.maplibregl-ctrl-group { background: var(--panel) !important; border: 1px solid var(--border) !important; box-shadow: none !important; } +.maplibregl-ctrl-group button + button { border-top: 1px solid var(--border) !important; } +.maplibregl-ctrl-group button span { filter: invert(1) brightness(1.4); } + +/* Dock */ +.dock { flex: 1; min-height: 0; display: flex; flex-direction: column; background: var(--panel); border-top: 1px solid var(--border); } +.tabs { display: flex; gap: 2px; padding: 6px 10px 0; border-bottom: 1px solid var(--border); } +.tab { padding: 8px 14px; border: none; background: transparent; color: var(--muted); cursor: pointer; font: inherit; font-size: 12.5px; border-bottom: 2px solid transparent; margin-bottom: -1px; } +.tab:hover { color: var(--text); } +.tab.on { color: var(--text); border-bottom-color: var(--accent); font-weight: 600; } +.dock-body { flex: 1; overflow: auto; padding: 14px; } +.empty { color: var(--muted); text-align: center; padding: 40px 20px; } + +/* Route string */ +.route-str { font-family: var(--mono); font-size: 12.5px; line-height: 1.7; color: #cfe0ff; background: var(--panel-2); border: 1px solid var(--border); border-radius: var(--radius); padding: 10px 12px; word-break: break-word; margin-bottom: 12px; } +.route-meta { color: var(--muted); font-size: 12px; margin-top: 6px; } + +/* Tables */ +.tbl { width: 100%; border-collapse: collapse; font-size: 12.5px; } +.tbl thead th { position: sticky; top: 0; background: var(--panel-2); text-align: left; padding: 8px 12px; color: var(--muted); font-weight: 600; font-size: 11px; text-transform: uppercase; letter-spacing: .5px; border-bottom: 1px solid var(--border); } +.tbl td { padding: 7px 12px; border-bottom: 1px solid var(--border-soft); } +.tbl tbody tr:hover { background: var(--panel-2); } +.tbl .mono { font-family: var(--mono); } +.tbl .num { text-align: right; font-family: var(--mono); } +.tbl .via { color: var(--accent); font-weight: 600; } +.card { background: var(--panel-2); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; } +.cardtitle { font-size: 11px; text-transform: uppercase; letter-spacing: .6px; color: var(--muted); padding: 10px 12px; border-bottom: 1px solid var(--border); } +.grid3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; align-items: start; } +.kvrow { display: flex; justify-content: space-between; padding: 6px 12px; border-bottom: 1px solid var(--border-soft); } +.kvrow:last-child { border-bottom: none; } +.kvrow.total { border-top: 1px solid var(--border); font-weight: 700; } +.kvrow .val { font-family: var(--mono); } +.ofp-pre { font-family: var(--mono); font-size: 11.5px; white-space: pre; overflow-x: auto; margin: 0; color: #cdd9e5; } +.badge-warn { color: var(--warn); font-size: 11px; margin-left: 6px; } + +/* Status bar */ +.status { height: 26px; flex: 0 0 26px; display: flex; align-items: center; gap: 18px; padding: 0 14px; background: var(--panel); border-top: 1px solid var(--border); color: var(--muted); font-size: 11.5px; } +.status .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--good); display: inline-block; margin-right: 6px; } +.status .sp { flex: 1; } + +/* ── Ribbon (PFPX-style disposition, modern skin) ─────────────────────────── */ +.ribbon-tabs { display: flex; gap: 2px; padding: 4px 10px 0; background: var(--panel); } +.ribbon-tab { padding: 6px 16px; border: none; background: transparent; color: var(--muted); cursor: pointer; font: inherit; font-size: 12.5px; border-radius: 6px 6px 0 0; } +.ribbon-tab:hover { color: var(--text); background: var(--panel-2); } +.ribbon-tab.on { color: var(--text); background: var(--elev); font-weight: 600; } +.ribbon { display: flex; align-items: stretch; gap: 0; padding: 8px 10px; background: var(--elev); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); overflow-x: auto; } +.rgroup { display: flex; flex-direction: column; align-items: center; padding: 0 10px; gap: 4px; } +.rgroup-btns { display: flex; flex-wrap: wrap; gap: 3px; justify-content: center; max-width: 190px; } +.rgroup-cap { font-size: 10px; color: var(--faint); } +.rbtn { display: inline-flex; align-items: center; gap: 5px; height: 26px; padding: 0 8px; background: var(--panel-2); border: 1px solid var(--border); border-radius: 6px; color: var(--text); font: inherit; font-size: 11.5px; cursor: pointer; white-space: nowrap; } +.rbtn:hover { border-color: #33405a; background: #1f2735; } +.rbtn:disabled { opacity: .4; cursor: default; } +.rbtn.accent { border-color: var(--accent-2); background: var(--accent-weak); color: #dce9ff; } +.rbtn .g { color: var(--accent); font-size: 12px; } +.rbtn.on { border-color: var(--accent); color: #dce9ff; background: var(--accent-weak); } +.rsep { width: 1px; background: var(--border); margin: 2px 6px; } + +/* Menubar (tiny top toolbar) */ +.menubar { height: 30px; flex: 0 0 30px; display: flex; align-items: center; gap: 4px; padding: 0 10px; background: var(--panel); border-bottom: 1px solid var(--border-soft); } +.iconbtn { width: 26px; height: 22px; border: 1px solid transparent; background: transparent; color: var(--muted); border-radius: 5px; cursor: pointer; display: grid; place-items: center; font-size: 13px; } +.iconbtn:hover { background: var(--elev); color: var(--text); border-color: var(--border); } + +/* Flight info bar */ +.flightbar { display: flex; align-items: center; gap: 10px; padding: 8px 14px; background: var(--panel); border-bottom: 1px solid var(--border); flex-wrap: wrap; } +.flightbar .tag { font-family: var(--mono); font-weight: 700; } +.flightbar .apt { color: var(--muted); } +.flightbar .apt b { color: var(--text); font-family: var(--mono); } +.flightbar input { width: 74px; text-align: center; font-family: var(--mono); font-weight: 600; } +.flightbar .sp { flex: 1; } + +/* Alternates mini table */ +.alt-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 6px; } +.alt-table th { text-align: left; color: var(--muted); font-weight: 600; font-size: 10.5px; text-transform: uppercase; padding: 3px 6px; border-bottom: 1px solid var(--border); } +.alt-table td { padding: 2px 4px; } +.alt-table input, .alt-table select { height: 26px; font-size: 12px; } + +/* Map area (right) */ +.maparea { flex: 1; display: flex; flex-direction: column; min-height: 0; } +.map-toolbar { display: flex; align-items: center; gap: 3px; padding: 5px 8px; background: var(--panel); border-bottom: 1px solid var(--border); } +.map-tabs { display: flex; gap: 2px; padding: 4px 8px; background: var(--panel); border-top: 1px solid var(--border); } +.map-tab { padding: 5px 12px; border: none; background: transparent; color: var(--muted); cursor: pointer; font: inherit; font-size: 12px; border-radius: 5px; } +.map-tab:hover { color: var(--text); } +.map-tab.on { color: #dce9ff; background: var(--accent-weak); } + +/* Bottom output dock (full width) */ +.output { flex: 0 0 var(--dockh, 210px); display: flex; flex-direction: column; background: var(--panel); border-top: 1px solid var(--border); min-height: 0; } + +/* Settings modal */ +.overlay { position: fixed; inset: 0; background: rgba(2,4,8,.6); display: grid; place-items: center; z-index: 50; } +.modal { width: 760px; max-width: 92vw; height: 520px; max-height: 88vh; background: var(--panel); border: 1px solid var(--border); border-radius: 12px; box-shadow: 0 24px 60px rgba(0,0,0,.5); display: flex; flex-direction: column; overflow: hidden; } +.modal-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--border); font-weight: 600; } +.modal-main { flex: 1; display: grid; grid-template-columns: 190px 1fr; min-height: 0; } +.modal-cats { border-right: 1px solid var(--border); padding: 8px; overflow-y: auto; display: flex; flex-direction: column; gap: 2px; } +.modal-cat { text-align: left; padding: 8px 12px; border: none; background: transparent; color: var(--muted); border-radius: 6px; cursor: pointer; font: inherit; } +.modal-cat:hover { background: var(--panel-2); color: var(--text); } +.modal-cat.on { background: var(--accent-weak); color: #dce9ff; } +.modal-body { padding: 16px 20px; overflow-y: auto; } +.modal-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--border); } +.set-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 10px 0; border-bottom: 1px solid var(--border-soft); } +.set-row .lbl { font-size: 13px; } +.set-row .desc { font-size: 11px; color: var(--muted); margin-top: 2px; } +.set-row .ctl { flex: 0 0 auto; } +.set-row select, .set-row input[type="text"], .set-row input[type="number"] { width: 180px; } +.switch { width: 40px; height: 22px; border-radius: 12px; background: var(--border); border: none; cursor: pointer; position: relative; transition: background .15s; } +.switch.on { background: var(--accent); } +.switch::after { content: ""; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 50%; background: #fff; transition: transform .15s; } +.switch.on::after { transform: translateX(18px); } +.section-sub { font-size: 11px; text-transform: uppercase; letter-spacing: .6px; color: var(--faint); margin: 14px 0 4px; } + +@keyframes spin { to { transform: rotate(360deg); } } diff --git a/gui/src/App.tsx b/gui/src/App.tsx new file mode 100644 index 0000000..9fd0ea9 --- /dev/null +++ b/gui/src/App.tsx @@ -0,0 +1,756 @@ +import { useState, useRef, useEffect, type ReactNode } from "react"; +import { invoke } from "@tauri-apps/api/core"; +import { listen } from "@tauri-apps/api/event"; +import { getCurrentWindow } from "@tauri-apps/api/window"; +import * as maplibregl from "maplibre-gl"; + +const appWindow = getCurrentWindow(); + +// ── Result DTOs ──────────────────────────────────────────────────────────── +interface Phase { dist_nm: number; time_min: number; fuel_kg: number } +interface Mass { payload_kg: number; zfw_kg: number; takeoff_kg: number; landing_kg: number; over_mtow: boolean; over_mlw: boolean } +interface Fuel { + aircraft: string; cruise_fl: number; climb: Phase; cruise: Phase; descent: Phase; + trip_fuel_kg: number; trip_time_min: number; taxi_kg: number; contingency_kg: number; + alternate_kg: number; final_reserve_kg: number; block_fuel_kg: number; mass: Mass | null; +} +interface Leg { from: string; via: string; to: string; dist_nm: number; cum_dist_nm: number; time_min: number | null; cum_time_min: number | null; fuel_kg: number | null; cum_fuel_kg: number | null } +interface Point { ident: string; lat: number; lon: number } +interface ProcTrack { name: string; kind: string; points: Point[] } +interface Ifps { accepted: boolean; errors: string[]; warnings: string[] } +interface IfpsErr { code: string; msg: string } +interface IfpsCheck { accepted: boolean | null; errors: IfpsErr[]; raw?: string; fpl?: string; error?: string | null } +interface IfpsFix { accepted: boolean; level: string | null; route: string | null; iterations: number; log: string[]; errors: IfpsErr[]; error?: string | null } +interface Discover { accepted: boolean; route_string: string; item15: string; fl: number; total_nm: number; errors: IfpsErr[]; iterations: number; log: string[]; error?: string | null } +interface CachedRoute { dep: string; dest: string; cruise_fl: number; route_string: string; dist_nm: number; ifps_ok: boolean; source: string; generated_at: string } +interface PlanResult { route_string: string; via_airways: boolean; total_nm: number; cruise_fl: number | null; legs: Leg[]; fuel: Fuel | null; geometry: Point[]; procedures: ProcTrack[]; ofp: string; ifps: Ifps } + +const DEFAULT_DB = "C:\\Users\\Alexandre\\flightplanner\\real.db"; +const DEFAULT_AIRCRAFT_DIR = "C:\\Users\\Alexandre\\flightplanner\\data\\aircraft"; +const DEFAULT_CIFP = "C:\\Users\\Alexandre\\flightplanner\\navdata\\CIFP"; +const kg = (n: number) => Math.round(n).toLocaleString("en-US"); +const nm = (n: number) => `${Math.round(n)}`; +const hm = (min: number) => `${Math.floor(Math.round(min) / 60)}:${String(Math.round(min) % 60).padStart(2, "0")}`; +const flText = (fl: number | null) => (fl != null ? `FL${String(fl).padStart(3, "0")}` : "—"); + +// ── Dark offline world map with a glowing route ──────────────────────────── +const C = { sea: "#0b0e14", land: "#161d29", border: "#263143", route: "#4c8dff", label: "#cdd9e5", labelBg: "rgba(11,14,20,.82)" }; +function RouteMap({ points, procedures }: { points: Point[]; procedures: ProcTrack[] }) { + const container = useRef(null); + const map = useRef(null); + const markers = useRef([]); + const [ready, setReady] = useState(false); + useEffect(() => { + if (!container.current || map.current) return; + const style: maplibregl.StyleSpecification = { version: 8, sources: {}, layers: [{ id: "bg", type: "background", paint: { "background-color": C.sea } }] }; + const m = new maplibregl.Map({ container: container.current, style, center: [5, 46], zoom: 3, attributionControl: false }); + m.addControl(new maplibregl.NavigationControl({ showCompass: false }), "top-right"); + m.on("load", async () => { + try { + const gj = await (await fetch("/world.geojson")).json(); + m.addSource("world", { type: "geojson", data: gj }); + m.addLayer({ id: "land", type: "fill", source: "world", paint: { "fill-color": C.land } }); + m.addLayer({ id: "border", type: "line", source: "world", paint: { "line-color": C.border, "line-width": 0.7 } }); + } catch { /* offline */ } + setReady(true); + }); + map.current = m; + return () => { m.remove(); map.current = null; }; + }, []); + useEffect(() => { + const m = map.current; + if (!m || !ready) return; + const coords = points.map((p) => [p.lon, p.lat] as [number, number]); + const line = { type: "Feature" as const, properties: {}, geometry: { type: "LineString" as const, coordinates: coords } }; + const pts = { type: "FeatureCollection" as const, features: points.map((p) => ({ type: "Feature" as const, properties: {}, geometry: { type: "Point" as const, coordinates: [p.lon, p.lat] as [number, number] } })) }; + const src = m.getSource("route") as maplibregl.GeoJSONSource | undefined; + if (src) { src.setData(line); (m.getSource("wpts") as maplibregl.GeoJSONSource).setData(pts); } + else { + m.addSource("route", { type: "geojson", data: line }); + m.addLayer({ id: "route-glow", type: "line", source: "route", paint: { "line-color": C.route, "line-width": 9, "line-blur": 9, "line-opacity": 0.35 }, layout: { "line-cap": "round", "line-join": "round" } }); + m.addLayer({ id: "route-line", type: "line", source: "route", paint: { "line-color": C.route, "line-width": 2.4 }, layout: { "line-cap": "round", "line-join": "round" } }); + m.addSource("wpts", { type: "geojson", data: pts }); + m.addLayer({ id: "wpts-dot", type: "circle", source: "wpts", paint: { "circle-radius": 3.4, "circle-color": C.sea, "circle-stroke-color": C.route, "circle-stroke-width": 1.6 } }); + } + markers.current.forEach((mk) => mk.remove()); + markers.current = points.map((p) => { + const el = document.createElement("div"); + el.textContent = p.ident; + el.style.cssText = `font:600 10px/1 'Segoe UI',sans-serif;color:${C.label};background:${C.labelBg};padding:1px 4px;border-radius:3px;white-space:nowrap;transform:translateY(-9px);`; + return new maplibregl.Marker({ element: el, anchor: "bottom" }).setLngLat([p.lon, p.lat]).addTo(m); + }); + // SID/STAR procedure tracks (amber, dashed). + const procFc = { type: "FeatureCollection" as const, features: procedures.map((pr) => ({ type: "Feature" as const, properties: {}, geometry: { type: "LineString" as const, coordinates: pr.points.map((p) => [p.lon, p.lat] as [number, number]) } })) }; + const procDots = { type: "FeatureCollection" as const, features: procedures.flatMap((pr) => pr.points.map((p) => ({ type: "Feature" as const, properties: {}, geometry: { type: "Point" as const, coordinates: [p.lon, p.lat] as [number, number] } }))) }; + const procSrc = m.getSource("proc") as maplibregl.GeoJSONSource | undefined; + if (procSrc) { procSrc.setData(procFc); (m.getSource("proc-pts") as maplibregl.GeoJSONSource).setData(procDots); } + else { + m.addSource("proc", { type: "geojson", data: procFc }); + m.addLayer({ id: "proc-line", type: "line", source: "proc", paint: { "line-color": "#f0a92b", "line-width": 2, "line-dasharray": [2, 1.6] }, layout: { "line-cap": "round", "line-join": "round" } }); + m.addSource("proc-pts", { type: "geojson", data: procDots }); + m.addLayer({ id: "proc-dot", type: "circle", source: "proc-pts", paint: { "circle-radius": 2.2, "circle-color": "#f0a92b" } }); + } + if (coords.length > 0) { const b = new maplibregl.LngLatBounds(coords[0], coords[0]); coords.forEach((co) => b.extend(co)); procedures.forEach((pr) => pr.points.forEach((p) => b.extend([p.lon, p.lat]))); m.fitBounds(b, { padding: 70, maxZoom: 7, duration: 700 }); } + }, [points, procedures, ready]); + return
; +} + +// ── Small building blocks ────────────────────────────────────────────────── +function Field(props: { label: string; children: ReactNode }) { return
{props.children}
; } +function RB(props: { g: string; label: string; onClick?: () => void; disabled?: boolean; on?: boolean; accent?: boolean }) { + return ; +} +function Grp(props: { cap: string; children: ReactNode }) { return
{props.children}
{props.cap}
; } +function Sw(props: { on: boolean; onClick: () => void }) { return
+
+
{SET_CATS.map((c) => )}
+
+ {cat === "Mode" && (<> +
Operating mode
+ + + + {mode === "career" ? ( +
+ Career — manage a virtual airline: operator/ICAO callsign, a fleet of aircraft with individual registrations, and scheduled flights. Company data can live on the shared server (multi-tenant, for VAs). Fleet & company management is being built. +
+ ) : ( +
+ Free Flight — plan any city pair on demand, generate the OFP, no persistent company. Switch to Career to manage a fleet and airline. +
+ )} + )} + {cat === "Backend" && (<> +
Compute backend
+ + + + setUrl(e.target.value)} disabled={backend !== "server"} /> + +
+ + {testStatus} +
+
+
Server mode calls POST /plan on the URL above. Run it with flightplanner-server (env FP_DB, FP_BIND). The engine (routing/perf) is identical to local.
+ )} + {cat === "General" && (<> + t("autosave")} /> + t("checkUpdates")} /> + t("confirmExit")} /> + t("sounds")} /> +
Startup
+ + + )} + {cat === "Units" && (<> + + + + + + + )} + {cat === "Weather" && (<> + t("dlWeather")} /> + t("windUplink")} /> + t("turbulence")} /> + t("notams")} /> + + + )} + {cat === "Navigation data" && (<> + t("autoAirac")} /> + t("validateIfps")} /> + t("prefRoutes")} /> + + + )} + {cat === "Simulator export" && (<> + {}} /> + {}} /> + {}} /> + + )} + {cat === "Fuel policy" && (<> + + + + + t("tankering")} /> + t("etops")} /> + t("redispatch")} /> + )} + {cat === "Map" && (<> + t("airways")} /> + t("fixes")} /> + t("firs")} /> + t("tracks")} /> + t("terrain")} /> + + )} + {cat === "About" && (<> +
Flight Planner
+
Offline flight planning · Rust core + OpenAP performance · Navigraph AIRAC 2608
+
Version
0.1.0 (dev)
+
Engine
Routing A* · WGS84 geodesic · OpenAP fuel model
+ )} +
+
+
+ + + ); +} + +export default function App() { + // real (wired) inputs + const [from, setFrom] = useState("LFPG"); + const [to, setTo] = useState("EGLL"); + const [type, setType] = useState("A320"); + const [cruiseFl, setCruiseFl] = useState(""); + const [alternate, setAlternate] = useState("EGKK"); + const [adults, setAdults] = useState("150"); + const [children, setChildren] = useState("8"); + const [infants, setInfants] = useState("2"); + const [cargo, setCargo] = useState("2000"); + const [dbPath] = useState(DEFAULT_DB); + const [aircraftDir] = useState(DEFAULT_AIRCRAFT_DIR); + + const [result, setResult] = useState(null); + const [error, setError] = useState(""); + const [loading, setLoading] = useState(false); + const [ifpsCheck, setIfpsCheck] = useState(null); + const [ifpsLoading, setIfpsLoading] = useState(false); + const [ifpsFix, setIfpsFix] = useState(null); + const [fixLoading, setFixLoading] = useState(false); + const [discover, setDiscover] = useState(null); + const [discoverLoading, setDiscoverLoading] = useState(false); + const [dbRoutes, setDbRoutes] = useState([]); + const [progress, setProgress] = useState<{ step: number; route: string; fl: number } | null>(null); + useEffect(() => { + const un = listen<{ step: number; route: string; fl: number }>("discover-progress", (e) => setProgress(e.payload)); + return () => { un.then((f) => f()); }; + }, []); + const [ribbonTab, setRibbonTab] = useState("Flight"); + const [mapTab, setMapTab] = useState("map"); + const [outTab, setOutTab] = useState("navlog"); + const [settings, setSettings] = useState(false); + const [payloadPreset, setPayloadPreset] = useState("min"); + const [clock, setClock] = useState(""); + const [backend, setBackend] = useState(() => localStorage.getItem("fp_backend") || "local"); + const [mode, setMode] = useState(() => localStorage.getItem("fp_mode") || "freeflight"); + const [serverUrl, setServerUrl] = useState(() => localStorage.getItem("fp_server_url") || "http://127.0.0.1:8787"); + const [routeCount, setRouteCount] = useState(null); + useEffect(() => { localStorage.setItem("fp_backend", backend); }, [backend]); + useEffect(() => { localStorage.setItem("fp_mode", mode); }, [mode]); + useEffect(() => { localStorage.setItem("fp_server_url", serverUrl); }, [serverUrl]); + + async function refreshCount() { + try { + if (backend === "server") { + const s = await fetch(serverUrl.replace(/\/$/, "") + "/stats").then((r) => r.json()); + setRouteCount(s.routes); + } else { + setRouteCount(await invoke("route_db_count", { dbPath })); + } + } catch { setRouteCount(null); } + } + + // Stored routes for the current city pair (our own IFPS route DB). + async function refreshDbRoutes() { + const dep = from.trim().toUpperCase(); + const dest = to.trim().toUpperCase(); + if (!dep || !dest) { setDbRoutes([]); return; } + try { + if (backend === "server") { + const url = serverUrl.replace(/\/$/, "") + `/routes?dep=${dep}&dest=${dest}`; + setDbRoutes(await fetch(url).then((r) => r.json())); + } else { + setDbRoutes(await invoke("recent_routes", { dbPath, dep, dest })); + } + } catch { setDbRoutes([]); } + } + useEffect(() => { refreshCount(); }, [backend]); + + useEffect(() => { + const tick = () => setClock(new Date().toUTCString().slice(17, 22)); + tick(); const id = setInterval(tick, 30000); return () => clearInterval(id); + }, []); + + async function compute() { + setError(""); + if (!from.trim() || !to.trim()) { setError("Departure and destination are required."); return; } + setLoading(true); + try { + const pax = Number(adults || 0) * 100 + Number(children || 0) * 50 + Number(infants || 0) * 15; + const pl = pax + Number(cargo || 0); + const req = { from: from.trim(), to: to.trim(), db_path: dbPath, aircraft: type || null, aircraft_dir: aircraftDir, cifp_dir: DEFAULT_CIFP, cruise_fl: cruiseFl.trim() === "" ? null : Number(cruiseFl), alternate: alternate.trim() || null, payload_kg: pl > 0 ? pl : null }; + if (backend === "server") { + const res = await fetch(serverUrl.replace(/\/$/, "") + "/plan", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(req) }); + if (!res.ok) throw new Error(await res.text()); + setResult(await res.json()); + } else { + setResult(await invoke("plan", { req })); + } + setOutTab("navlog"); + setIfpsCheck(null); + setIfpsFix(null); + setDiscover(null); + refreshCount(); refreshDbRoutes(); + } catch (e) { setError(typeof e === "string" ? e : String(e)); setResult(null); } + finally { setLoading(false); } + } + function reset() { setResult(null); setError(""); setIfpsCheck(null); setIfpsFix(null); setDiscover(null); setDbRoutes([]); } + + // Build the IFPUV payload from the current plan (item 15 = route without ADEP/ADES). + function ifpsPayload() { + if (!result) return null; + const toks = result.route_string.trim().split(/\s+/); + const mid = toks.slice(1, -1); + // Drop leading SID / trailing STAR *designators* (e.g. OPAL6A, OCK1Z) — IFPS + // item 15 lists fixes, and derives the procedure from the runway + first/last point. + const isProc = (t: string) => /^[A-Z]{2,5}\d[A-Z]$/.test(t); + while (mid.length && isProc(mid[0])) mid.shift(); + while (mid.length && isProc(mid[mid.length - 1])) mid.pop(); + const route = mid.join(" ") || "DCT"; + const fl = result.cruise_fl ?? (cruiseFl.trim() ? Number(cruiseFl) : 350); + return { + adep: from.trim().toUpperCase(), + ades: to.trim().toUpperCase(), + route, + actype: (type || "A320").toUpperCase(), + level: `F${String(fl).padStart(3, "0")}`, + }; + } + + // Authoritative IFPS validation via the Eurocontrol IFPUV (Playwright scraper). + async function validateIfps() { + const payload = ifpsPayload(); + if (!payload) return; + setIfpsLoading(true); + try { + setIfpsCheck(await invoke("ifps_validate", { payload })); + } catch (e) { setIfpsCheck({ accepted: null, errors: [], error: typeof e === "string" ? e : String(e) }); } + finally { setIfpsLoading(false); } + } + + // Oracle-driven auto-correction (RAD level caps, unknown designators). + async function autofixIfps() { + const payload = ifpsPayload(); + if (!payload) return; + setFixLoading(true); + setIfpsFix(null); + try { + setIfpsFix(await invoke("ifps_autofix", { payload })); + } catch (e) { setIfpsFix({ accepted: false, level: null, route: null, iterations: 0, log: [], errors: [], error: typeof e === "string" ? e : String(e) }); } + finally { setFixLoading(false); } + } + + // Oracle-in-the-loop: generate a candidate, validate + repair against the live + // IFPUV until IFPS-accepted, and store it in the route DB (slow first time). + async function generateValidated() { + if (!from.trim() || !to.trim()) { setError("Departure and destination are required."); return; } + setDiscoverLoading(true); + setDiscover(null); + setProgress(null); + try { + const pax = Number(adults || 0) * 100 + Number(children || 0) * 50 + Number(infants || 0) * 15; + const pl = pax + Number(cargo || 0); + const req = { from: from.trim(), to: to.trim(), db_path: dbPath, aircraft: type || null, aircraft_dir: aircraftDir, cifp_dir: DEFAULT_CIFP, cruise_fl: cruiseFl.trim() === "" ? null : Number(cruiseFl), alternate: alternate.trim() || null, payload_kg: pl > 0 ? pl : null }; + setDiscover(await invoke("generate_validated", { req })); + refreshCount(); refreshDbRoutes(); + } catch (e) { setDiscover({ accepted: false, route_string: "", item15: "", fl: 0, total_nm: 0, errors: [], iterations: 0, log: [], error: typeof e === "string" ? e : String(e) }); } + finally { setDiscoverLoading(false); } + } + + const f = result?.fuel ?? null; + + return ( +
+ {settings ? setSettings(false)} backend={backend} setBackend={setBackend} url={serverUrl} setUrl={setServerUrl} mode={mode} setMode={setMode} /> : null} + + {/* Title bar */} +
+
Flight Planner{result ? `— AFR1234 · ${from.toUpperCase()}–${to.toUpperCase()}` : ""}
+
+ + + +
+
+ + {/* Tiny toolbar */} +
+ + + +
+ + +
+ +
+ + {/* Ribbon tabs */} +
+ {["Schedule", "Flight", "Traffic", "Browser"].map((tb) => ( + + ))} +
+ + {/* Ribbon */} +
+ + + + + + +
+ +
+ + setPayloadPreset("none")} /> + setPayloadPreset("min")} /> + setPayloadPreset("max")} /> + setPayloadPreset("rnd")} /> + +
+ +
+ +
+ +
+ +
+ + {/* Flight info bar */} +
+ AFR1234 + · F-GKXA · + setFrom(e.target.value.toUpperCase())} /> + {from.toUpperCase()} + + setTo(e.target.value.toUpperCase())} /> + {to.toUpperCase()} + + {error ? ⚠ {error} : null} + + {result ? ( + discover?.accepted || ifpsCheck?.accepted || ifpsFix?.accepted + ? IFPS ✓ Eurocontrol + : (ifpsCheck && !ifpsCheck.accepted && !ifpsCheck.error) + ? IFPS ✗ Eurocontrol + : IFPS draft + ) : null} + {result ? {flText(result.cruise_fl)} · {result.legs.length} legs · {nm(result.total_nm)} nm{f ? ` · ${hm(f.trip_time_min)} · ${kg(f.block_fuel_kg)} kg` : ""} : null} +
+ + {/* Body: left setup + right map */} +
+ + + {/* Right: map area */} +
+
+ + + +
+ + + + + +
+ {result ? `${result.geometry.length} waypoints` : "no route"} +
+
+ + {!result && mapTab === "map" ?
Compute a flight to plot the route.
: null} + {mapTab !== "map" ? ( +
+ {mapTab === "wx" ? "Weather & NOTAMs — winds aloft (GFS GRIB), METAR/TAF, SIGWX. Coming next." : + mapTab === "tracks" ? "Track Messages — NAT / PACOTS oceanic tracks. Coming next." : + "Scratchpad — free notes for this flight."} +
+ ) : null} +
+
+ {[["map", "World Map"], ["wx", "Weather & NOTAMs"], ["tracks", "Track Messages"], ["scratch", "Scratchpad"]].map(([id, lb]) => ( + + ))} +
+
+
+ + {/* Bottom output dock */} +
+
+ {[["navlog", "Nav Log"], ["fuel", "Fuel & Load"], ["ofp", "OFP"], ["ifps", "IFPS"]].map(([id, lb]) => ( + + ))} +
+
+ {!result ? ( +
No active flight — set a route and press Compute Flight.
+ ) : outTab === "navlog" ? ( +
+ + {f ? (<>) : null} + + {result.legs.map((l, i) => ( + + {f ? (<>) : null} + + ))} + +
FromViaToDistCumETETimeFuelUsed
{l.from}{l.via}{l.to}{Math.round(l.dist_nm)}{Math.round(l.cum_dist_nm)}{l.time_min != null ? hm(l.time_min) : "—"}{l.cum_time_min != null ? hm(l.cum_time_min) : "—"}{l.fuel_kg != null ? Math.round(l.fuel_kg) : "—"}{l.cum_fuel_kg != null ? kg(l.cum_fuel_kg) : "—"}
+
+ ) : outTab === "fuel" ? ( + !f ?
Select an aircraft to compute fuel and weights.
: ( +
+
Phases
+ {([["Climb", f.climb], ["Cruise", f.cruise], ["Descent", f.descent]] as [string, Phase][]).map(([n2, p]) => ())} +
PhaseDistTimeFuel
{n2}{Math.round(p.dist_nm)}{hm(p.time_min)}{kg(p.fuel_kg)}
+
Fuel
+
Taxi{kg(f.taxi_kg)}
+
Trip{kg(f.trip_fuel_kg)}
+
Contingency{kg(f.contingency_kg)}
+
Alternate{kg(f.alternate_kg)}
+
Final reserve{kg(f.final_reserve_kg)}
+
Block{kg(f.block_fuel_kg)}
+
+ {f.mass ? (
Weights
+
Payload{kg(f.mass.payload_kg)}
+
Zero-fuel{kg(f.mass.zfw_kg)}
+
Take-off{f.mass.over_mtow ? > MTOW : null}{kg(f.mass.takeoff_kg)}
+
Landing{f.mass.over_mlw ? > MLW : null}{kg(f.mass.landing_kg)}
+
) : null} +
+ ) + ) : outTab === "ofp" ? ( +
{result.ofp}
+ ) : ( +
+ {/* Our own route DB for this pair (IFPS-validated routes are reused). */} +
+
+ Route DB — {from.toUpperCase()}→{to.toUpperCase()} ({dbRoutes.length}) +
+ {dbRoutes.length === 0 ? ( +
No stored routes yet — Generate & Validate to add one.
+ ) : ( + dbRoutes.slice(0, 6).map((r, i) => ( +
+ + {r.ifps_ok ? "IFPS ✓" : "unvalidated"} + + {r.source.split(" ")[0]} + FL{String(r.cruise_fl).padStart(3, "0")} + {r.route_string} +
+ )) + )} +
+ {/* Authoritative Eurocontrol IFPS validation (live IFPUV). */} +
+ + + + Live IFPUV round-trip (~25 s) +
+ {discoverLoading ? ( +
+
+ + Discovering an IFPS-valid route (real Eurocontrol check, ~25 s per step; cached after)… +
+ {progress ? ( +
+ Step {progress.step} · checking @ FL{String(progress.fl).padStart(3, "0")}
+ {progress.route} +
+ ) : null} +
+ ) : null} + {discover ? ( +
+ {discover.error ? ( +
Generator error: {discover.error}
+ ) : (<> +
+ {discover.accepted + ? `✓ IFPS-valid route found — FL${String(discover.fl).padStart(3, "0")} · ${Math.round(discover.total_nm)} nm · saved to route DB` + : `⚠ Best route found is not IFPS-accepted yet (${discover.iterations} iteration${discover.iterations > 1 ? "s" : ""})`} +
+ {discover.route_string ?
{discover.route_string}
: null} + {discover.log.map((l, i) =>
{l}
)} + {!discover.accepted && discover.errors.length ? ( +
{discover.errors.map((e, i) =>
{e.code} {e.msg}
)}
+ ) : null} + )} +
+ ) : null} + {ifpsLoading ?
Submitting FPL to the public Eurocontrol validator…
: null} + {fixLoading ?
Iterating with the Eurocontrol validator (level caps, designators)…
: null} + {ifpsFix ? ( +
+ {ifpsFix.error ? ( +
Auto-fix error: {ifpsFix.error}
+ ) : (<> +
+ {ifpsFix.accepted + ? `✓ Auto-corrected — IFPS ACCEPTED at ${ifpsFix.level} (${ifpsFix.iterations} iteration${ifpsFix.iterations > 1 ? "s" : ""})` + : `⚠ Could not fully auto-correct (${ifpsFix.iterations} iteration${ifpsFix.iterations > 1 ? "s" : ""})`} +
+ {ifpsFix.accepted && ifpsFix.route ? ( +
Route: {from.toUpperCase()} {ifpsFix.route} {to.toUpperCase()} · {ifpsFix.level}
+ ) : null} + {ifpsFix.log.map((l, i) =>
{l}
)} + {!ifpsFix.accepted && ifpsFix.errors.length ? ( +
{ifpsFix.errors.map((e, i) =>
{e.code} {e.msg}
)}
+ ) : null} + )} +
+ ) : null} + {ifpsCheck ? ( +
+ {ifpsCheck.error ? ( +
Validator error: {ifpsCheck.error}
+ ) : (<> +
+ {ifpsCheck.accepted ? "✓ IFPS ACCEPTED — Eurocontrol (authoritative)" : `✗ IFPS REJECTED — Eurocontrol — ${ifpsCheck.errors.length} error(s)`} +
+ {ifpsCheck.errors.map((e, i) => ( +
+ {e.code} {e.msg} +
+ ))} + {ifpsCheck.accepted ?
NO ERRORS — the flight plan is IFPS-valid.
: null} + {ifpsCheck.fpl ?
{ifpsCheck.fpl}
: null} + )} +
+ ) : null} + +
Offline pre-check
+
+ {result.ifps.accepted ? "IFPS ✓ Accepted (offline pre-check)" : `IFPS ✗ Rejected — ${result.ifps.errors.length} error(s)`} +
+
Best-effort offline structural pre-check — not an authoritative Eurocontrol IFPS validation.
+ {result.ifps.errors.length > 0 ? (<> +
Errors
+ {result.ifps.errors.map((e, i) =>
✗ {e}
)} + ) : null} + {result.ifps.warnings.length > 0 ? (<> +
Warnings
+ {result.ifps.warnings.map((w, i) =>
! {w}
)} + ) : null} + {result.ifps.errors.length === 0 && result.ifps.warnings.length === 0 ?
No structural issues found.
: null} +
+ )} +
+
+ + {/* Status bar */} +
+ Ready + Nav: AIRAC 2608 + WX: Online + Tracks: Online + {result ? `${from.toUpperCase()}–${to.toUpperCase()} · ${nm(result.total_nm)} nm` : "No flight"} + + Route DB: {routeCount ?? "—"} + Mode: {mode === "career" ? "Career" : "Free Flight"} + Backend: {backend === "server" ? "Server" : "Local"} + Perf: OpenAP + {clock} UTC +
+
+ ); +} diff --git a/gui/src/assets/react.svg b/gui/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/gui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gui/src/main.tsx b/gui/src/main.tsx new file mode 100644 index 0000000..3abb9d3 --- /dev/null +++ b/gui/src/main.tsx @@ -0,0 +1,11 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import "maplibre-gl/dist/maplibre-gl.css"; +import App from "./App"; +import "./App.css"; + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + , +); diff --git a/gui/src/vite-env.d.ts b/gui/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/gui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/gui/tsconfig.json b/gui/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/gui/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/gui/tsconfig.node.json b/gui/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/gui/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/gui/vite.config.ts b/gui/vite.config.ts new file mode 100644 index 0000000..f848ae8 --- /dev/null +++ b/gui/vite.config.ts @@ -0,0 +1,40 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// @ts-expect-error process is a nodejs global +const host = process.env.TAURI_DEV_HOST; + +// https://vite.dev/config/ +export default defineConfig(async () => ({ + plugins: [react()], + + // Keep MapLibre out of Vite's dep pre-bundling: its web worker breaks when the + // optimizer re-bundles mid-session ("maplibre-gl-worker.mjs does not exist"), + // which silently drops all GeoJSON layers (land + route). Excluding it makes + // the worker resolve reliably in `tauri dev`. + optimizeDeps: { + exclude: ["maplibre-gl"], + }, + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent Vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: host || false, + hmr: host + ? { + protocol: "ws", + host, + port: 1421, + } + : undefined, + watch: { + // 3. tell Vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +})); diff --git a/rad/RAD_current.xlsx b/rad/RAD_current.xlsx new file mode 100644 index 0000000..264d11c Binary files /dev/null and b/rad/RAD_current.xlsx differ diff --git a/rad/fra-points.xlsx b/rad/fra-points.xlsx new file mode 100644 index 0000000..334bbd4 Binary files /dev/null and b/rad/fra-points.xlsx differ diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..73cb934 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "stable" +components = ["rustfmt", "clippy"] diff --git a/tools/ifpuv/autofix.mjs b/tools/ifpuv/autofix.mjs new file mode 100644 index 0000000..84bb14e --- /dev/null +++ b/tools/ifpuv/autofix.mjs @@ -0,0 +1,161 @@ +// Oracle-driven IFPS auto-correction against the public Eurocontrol IFPUV. +// +// Given a route, repeatedly validate and mechanically fix the tractable error +// classes until the plan is IFPS-ACCEPTED (or no further fix applies): +// * ROUTE130 UNKNOWN DESIGNATOR X -> drop token X from item 15 +// * PROF204/205 forbidden FL band -> move the cruise level into the +// allowed window (RAD level capping) +// One browser session is reused across iterations (fast loop). +// +// Usage: +// node autofix.mjs '{"adep":"LFPG","ades":"EGLL","route":"OPALE DCT KESAX DCT DIMAL DCT ALESO","level":"F360"}' +// Prints one JSON line: { accepted, level, route, iterations, log, errors }. +import { chromium } from "playwright"; + +const URL = "https://www.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/"; +const ROUTE_SEL = + '[id="FREE_TEXT_EDITOR.FLIGHT_DATA_AREA.GENERAL_DATA_ENTRY.INTRODUCE_FLIGHT_PLAN_FIELD"]'; +const VALIDATE_SEL = '[id="FREE_TEXT_EDITOR.FLIGHT_DATA_AREA.VALIDATE_ACTION_LABEL"]'; +const MAX_ITERS = 8; + +function tomorrowDOF() { + const d = new Date(Date.now() + 24 * 3600 * 1000); + const p = (n) => String(n).padStart(2, "0"); + return `${String(d.getUTCFullYear()).slice(2)}${p(d.getUTCMonth() + 1)}${p(d.getUTCDate())}`; +} + +function buildFpl(o, route, flNum) { + const type = o.actype || "A320"; + const level = `F${String(flNum).padStart(3, "0")}`; + return ( + `(FPL-TEST01-IS\n` + + `-${type}/${o.wtc || "M"}-${o.equip || "SDE1E2E3FGHIRWY/LB1"}\n` + + `-${o.adep}${o.eobt || "1200"}\n` + + `-${o.speed || "N0450"}${level} ${route.trim()}\n` + + `-${o.ades}${o.eet || "0040"}\n` + + `-PBN/${o.pbn || "A1B1C1D1O1S2"} REG/${o.reg || "FGKXA"} DOF/${o.dof || tomorrowDOF()})` + ); +} + +const HOUSEKEEPING = /^(EFPM(51|234|168|166)|PROF191)$/; +function parseErrors(body) { + const start = body.indexOf("Validation Results"); + const region = start >= 0 ? body.slice(start) : body; + const re = /\b([A-Z]{2,6}\d{1,4}):\s*([^\n\t]+)/g; + const errors = []; + let m; + while ((m = re.exec(region))) { + if (!HOUSEKEEPING.test(m[1])) errors.push({ code: m[1], msg: m[2].trim() }); + } + return errors; +} + +// Extract the forbidden FL band(s) from a PROF204/205 message. `Fa..Fb`: +// a==0 -> forbidden below b (a floor); b>=600 -> forbidden above a (a ceiling). +function bandOf(msg) { + const m = msg.match(/F(\d{1,3})\.\.F(\d{3})/); + if (!m) return null; + const lo = +m[1], hi = +m[2]; + if (lo === 0) return { floor: hi }; // forbidden 0..hi => must fly above hi + return { ceiling: lo }; // Fa..F999 ceiling, or narrow hole Fa..Fb → fly below a +} + +// Decide the next fix from the current error set. Returns { route?, fl?, note } or null. +function planFix(errors, route, fl) { + // 1) unknown designators -> strip the offending token + const unknown = errors + .filter((e) => e.code === "ROUTE130" && /UNKNOWN DESIGNATOR/i.test(e.msg)) + .map((e) => e.msg.match(/UNKNOWN DESIGNATOR\s+(\S+)/i)?.[1]) + .filter(Boolean); + if (unknown.length) { + const drop = new Set(unknown); + const toks = route.split(/\s+/).filter((t) => !drop.has(t)); + // collapse dangling DCT left by removal + const cleaned = toks.filter((t, i) => !(t === "DCT" && (i === 0 || i === toks.length - 1 || toks[i - 1] === "DCT"))); + return { route: cleaned.join(" "), note: `drop unknown designator(s): ${[...drop].join(", ")}` }; + } + // 2) FL band restrictions -> move into the allowed window + let ceiling = Infinity, floor = 0, sawBand = false; + for (const e of errors) { + if (e.code !== "PROF204" && e.code !== "PROF205") continue; + const b = bandOf(e.msg); + if (!b) continue; + sawBand = true; + if (b.ceiling != null) ceiling = Math.min(ceiling, b.ceiling); + if (b.floor != null) floor = Math.max(floor, b.floor); + } + // Lower the level whenever the current FL violates a RAD ceiling — even if + // other (non-level) errors remain; clearing the band errors is strict progress + // and the loop stops afterwards if nothing else is fixable. + if (sawBand && ceiling !== Infinity && fl >= ceiling) { + const target = Math.floor((ceiling - 5) / 10) * 10; // highest 10s FL below the cap + if (target > floor && target !== fl && target >= 60) { + return { fl: target, note: `RAD level cap ${ceiling} -> retry at F${String(target).padStart(3, "0")}` }; + } + } + return null; +} + +// ── run ──────────────────────────────────────────────────────────────────── +const o = JSON.parse(process.argv[2] || '{"adep":"LFPG","ades":"EGLL","route":"OPALE DCT KESAX DCT DIMAL DCT ALESO","level":"F360"}'); +let route = o.route.trim(); +let fl = parseInt(String(o.level || "F350").replace(/\D/g, ""), 10) || 350; + +const b = await chromium.launch({ headless: true }); +const ctx = await b.newContext({ viewport: { width: 1400, height: 950 } }); +const page = await ctx.newPage(); +const out = { accepted: false, level: null, route: null, iterations: 0, log: [], errors: [], error: null }; +try { + await page.goto(URL, { waitUntil: "domcontentloaded", timeout: 60000 }); + await page.waitForTimeout(8000); + const popupP = ctx.waitForEvent("page", { timeout: 15000 }).catch(() => null); + await page.getByText("Free Text Editor", { exact: false }).first().click({ timeout: 15000 }); + const ed = (await popupP) || page; + await ed.waitForSelector(ROUTE_SEL, { timeout: 20000 }); + + const submit = async (fpl) => { + await ed.locator(ROUTE_SEL).fill(fpl); + await ed.locator(VALIDATE_SEL).click({ timeout: 15000 }); + await ed.waitForTimeout(6000); + return parseErrors(await ed.locator("body").innerText()); + }; + + // Monotonic auto-correction: only *keep* a change if it strictly reduces the + // error count. A fix that makes things worse (e.g. lowering FL into a low-level + // TMA full of DCT restrictions) is reverted, and we report the best state seen. + // The result is never worse than the input. + const fl3 = (n) => `F${String(n).padStart(3, "0")}`; + let best = null; // { route, fl, errors } + let curRoute = route; + let curFl = fl; + for (let i = 1; i <= MAX_ITERS; i++) { + out.iterations = i; + const errors = await submit(buildFpl(o, curRoute, curFl)); + if (errors.length === 0) { + best = { route: curRoute, fl: curFl, errors: [] }; + out.log.push(`iter ${i}: ${fl3(curFl)} "${curRoute}" -> ACCEPTED`); + break; + } + if (best !== null && errors.length >= best.errors.length) { + // The last applied fix didn't help — revert to the best and stop. + out.log.push(`iter ${i}: ${fl3(curFl)} -> ${errors.length} err (not better than ${best.errors.length}) — reverting`); + break; + } + best = { route: curRoute, fl: curFl, errors }; + const fix = planFix(errors, curRoute, curFl); + out.log.push(`iter ${i}: ${fl3(curFl)} -> ${errors.length} err [${errors.map((e) => e.code).join(",")}]${fix ? " | fix: " + fix.note : " | no auto-fix"}`); + if (!fix) break; + if (fix.route != null) curRoute = fix.route; + if (fix.fl != null) curFl = fix.fl; + } + best = best || { route: curRoute, fl: curFl, errors: out.errors }; + out.accepted = best.errors.length === 0; + out.level = fl3(best.fl); + out.route = best.route; + out.errors = best.errors; +} catch (e) { + out.error = e.message; +} finally { + await b.close(); +} +console.log(JSON.stringify(out)); diff --git a/tools/ifpuv/editor.png b/tools/ifpuv/editor.png new file mode 100644 index 0000000..2f844d5 Binary files /dev/null and b/tools/ifpuv/editor.png differ diff --git a/tools/ifpuv/explore.mjs b/tools/ifpuv/explore.mjs new file mode 100644 index 0000000..10a3bd1 --- /dev/null +++ b/tools/ifpuv/explore.mjs @@ -0,0 +1,38 @@ +// Explore the public Eurocontrol IFPUV page to find the route input / validate +// button / result area. Run: node explore.mjs +import { chromium } from "playwright"; + +const URL = "https://www.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/"; + +const b = await chromium.launch({ headless: true }); +const ctx = await b.newContext({ viewport: { width: 1600, height: 1000 } }); +const page = await ctx.newPage(); +try { + await page.goto(URL, { waitUntil: "domcontentloaded", timeout: 60000 }); + await page.waitForTimeout(9000); // let the GWT app render + console.log("TITLE:", await page.title()); + console.log("URL :", page.url()); + + const dump = await page.$$eval( + "input, textarea, button, a, span, div[role], [class*='gwt'], [class*='Button']", + (nodes) => + nodes + .map((n) => ({ + tag: n.tagName, + type: n.getAttribute("type") || "", + id: n.id || "", + cls: (n.className && typeof n.className === "string" ? n.className : "").slice(0, 40), + text: (n.innerText || n.value || "").trim().slice(0, 50), + })) + .filter((e) => e.text && e.text.length > 1) + .slice(0, 120), + ); + console.log(JSON.stringify(dump, null, 0)); + + await page.screenshot({ path: "ifpuv.png", fullPage: true }); + console.log("screenshot -> ifpuv.png"); +} catch (e) { + console.error("ERR:", e.message); +} finally { + await b.close(); +} diff --git a/tools/ifpuv/explore2.mjs b/tools/ifpuv/explore2.mjs new file mode 100644 index 0000000..8989857 --- /dev/null +++ b/tools/ifpuv/explore2.mjs @@ -0,0 +1,44 @@ +// Open the IFPUV "Free Text Editor" from the public NOP portal and dump its form. +import { chromium } from "playwright"; + +const URL = "https://www.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/"; +const b = await chromium.launch({ headless: true }); +const ctx = await b.newContext({ viewport: { width: 1500, height: 950 } }); +const page = await ctx.newPage(); +try { + await page.goto(URL, { waitUntil: "domcontentloaded", timeout: 60000 }); + await page.waitForTimeout(8000); + + // Click the "Free Text Editor" link; it may open a popup. + const popupP = ctx.waitForEvent("page", { timeout: 15000 }).catch(() => null); + await page.getByText("Free Text Editor", { exact: false }).first().click({ timeout: 15000 }); + const popup = await popupP; + const target = popup || page; + await target.waitForTimeout(9000); + await target.bringToFront?.(); + + console.log("EDITOR TITLE:", await target.title()); + console.log("EDITOR URL :", target.url()); + + const dump = await target.$$eval( + "textarea, input, button, [role=button], .gwt-Button, span", + (nodes) => + nodes + .map((n) => ({ + tag: n.tagName, + type: n.getAttribute("type") || "", + id: n.id || "", + cls: (typeof n.className === "string" ? n.className : "").slice(0, 45), + text: (n.innerText || n.value || n.placeholder || "").trim().slice(0, 45), + })) + .filter((e) => e.tag === "TEXTAREA" || e.tag === "INPUT" || (e.text && e.text.length > 1)) + .slice(0, 80), + ); + console.log(JSON.stringify(dump, null, 0)); + await target.screenshot({ path: "editor.png", fullPage: true }); + console.log("screenshot -> editor.png"); +} catch (e) { + console.error("ERR:", e.message); +} finally { + await b.close(); +} diff --git a/tools/ifpuv/ifpuv.png b/tools/ifpuv/ifpuv.png new file mode 100644 index 0000000..f6d7295 Binary files /dev/null and b/tools/ifpuv/ifpuv.png differ diff --git a/tools/ifpuv/package-lock.json b/tools/ifpuv/package-lock.json new file mode 100644 index 0000000..23e9888 --- /dev/null +++ b/tools/ifpuv/package-lock.json @@ -0,0 +1,59 @@ +{ + "name": "ifpuv-scraper", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ifpuv-scraper", + "version": "0.1.0", + "dependencies": { + "playwright": "^1.48.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.62.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + } + } +} diff --git a/tools/ifpuv/package.json b/tools/ifpuv/package.json new file mode 100644 index 0000000..9de2980 --- /dev/null +++ b/tools/ifpuv/package.json @@ -0,0 +1,9 @@ +{ + "name": "ifpuv-scraper", + "private": true, + "version": "0.1.0", + "type": "module", + "dependencies": { + "playwright": "^1.48.0" + } +} diff --git a/tools/ifpuv/result.png b/tools/ifpuv/result.png new file mode 100644 index 0000000..1fe6f40 Binary files /dev/null and b/tools/ifpuv/result.png differ diff --git a/tools/ifpuv/validate-server.mjs b/tools/ifpuv/validate-server.mjs new file mode 100644 index 0000000..4936b7f --- /dev/null +++ b/tools/ifpuv/validate-server.mjs @@ -0,0 +1,84 @@ +// Persistent IFPUV validator: keeps ONE browser + the Free Text Editor open and +// validates on demand. This drops each validation from ~25 s (relaunch + GWT +// load) to ~5-6 s (just refill + revalidate). +// +// Protocol (line-delimited JSON on stdin/stdout): +// stdout `{"ready":true}` — editor loaded, send requests +// stdin `{"adep","ades","route","level"[,"speed","actype"]}` — a validation +// stdout `{"accepted":bool,"errors":[{code,msg}]}` — its result +// stdin `QUIT` — close and exit +import { chromium } from "playwright"; +import readline from "node:readline"; + +const URL = "https://www.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/"; +const ROUTE_SEL = + '[id="FREE_TEXT_EDITOR.FLIGHT_DATA_AREA.GENERAL_DATA_ENTRY.INTRODUCE_FLIGHT_PLAN_FIELD"]'; +const VALIDATE_SEL = '[id="FREE_TEXT_EDITOR.FLIGHT_DATA_AREA.VALIDATE_ACTION_LABEL"]'; + +function tomorrowDOF() { + const d = new Date(Date.now() + 24 * 3600 * 1000); + const p = (n) => String(n).padStart(2, "0"); + return `${String(d.getUTCFullYear()).slice(2)}${p(d.getUTCMonth() + 1)}${p(d.getUTCDate())}`; +} + +function buildFpl(o) { + const type = o.actype || "A320"; + const level = o.level || "F350"; + return ( + `(FPL-TEST01-IS\n` + + `-${type}/${o.wtc || "M"}-${o.equip || "SDE1E2E3FGHIRWY/LB1"}\n` + + `-${o.adep}${o.eobt || "1200"}\n` + + `-${o.speed || "N0450"}${level} ${String(o.route).trim()}\n` + + `-${o.ades}${o.eet || "0040"}\n` + + `-PBN/${o.pbn || "A1B1C1D1O1S2"} REG/${o.reg || "FGKXA"} DOF/${o.dof || tomorrowDOF()})` + ); +} + +// Filing-form artifacts (REG/EOBD/EET), not route faults. +const HOUSEKEEPING = /^(EFPM(51|234|168|166)|PROF191)$/; +function parseErrors(body) { + const start = body.indexOf("Validation Results"); + const region = start >= 0 ? body.slice(start) : body; + const re = /\b([A-Z]{2,6}\d{1,4}):\s*([^\n\t]+)/g; + const errors = []; + let m; + while ((m = re.exec(region))) { + if (!HOUSEKEEPING.test(m[1])) errors.push({ code: m[1], msg: m[2].trim() }); + } + return errors; +} + +const b = await chromium.launch({ headless: true }); +const ctx = await b.newContext({ viewport: { width: 1400, height: 950 } }); +const page = await ctx.newPage(); +await page.goto(URL, { waitUntil: "domcontentloaded", timeout: 60000 }); +await page.waitForTimeout(8000); +const popupP = ctx.waitForEvent("page", { timeout: 15000 }).catch(() => null); +await page.getByText("Free Text Editor", { exact: false }).first().click({ timeout: 15000 }); +const ed = (await popupP) || page; +await ed.waitForSelector(ROUTE_SEL, { timeout: 20000 }); + +async function submit(payload) { + await ed.locator(ROUTE_SEL).fill(buildFpl(payload)); + await ed.locator(VALIDATE_SEL).click({ timeout: 15000 }); + await ed.waitForTimeout(5000); + const errors = parseErrors(await ed.locator("body").innerText()); + return { accepted: errors.length === 0, errors }; +} + +process.stdout.write(JSON.stringify({ ready: true }) + "\n"); + +const rl = readline.createInterface({ input: process.stdin }); +for await (const line of rl) { + const t = line.trim(); + if (!t) continue; + if (t === "QUIT") break; + try { + const res = await submit(JSON.parse(t)); + process.stdout.write(JSON.stringify(res) + "\n"); + } catch (e) { + process.stdout.write(JSON.stringify({ accepted: false, errors: [], error: e.message }) + "\n"); + } +} +await b.close(); +process.exit(0); diff --git a/tools/ifpuv/validate.mjs b/tools/ifpuv/validate.mjs new file mode 100644 index 0000000..a77eb67 --- /dev/null +++ b/tools/ifpuv/validate.mjs @@ -0,0 +1,96 @@ +// Validate a flight plan against the public Eurocontrol IFPUV (guest access). +// +// Usage: +// node validate.mjs '{"adep":"LFPG","ades":"EGLL","route":"OPALE DCT KESAX DCT DIMAL DCT ALESO","actype":"A320","level":"F360","speed":"N0450"}' +// node validate.mjs --raw "(FPL-...-...)" +// +// Prints one JSON line: { accepted, errors:[{code,msg}], warnings:[...], raw }. +import { chromium } from "playwright"; + +const URL = "https://www.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/"; +const ROUTE_SEL = + '[id="FREE_TEXT_EDITOR.FLIGHT_DATA_AREA.GENERAL_DATA_ENTRY.INTRODUCE_FLIGHT_PLAN_FIELD"]'; +const VALIDATE_SEL = '[id="FREE_TEXT_EDITOR.FLIGHT_DATA_AREA.VALIDATE_ACTION_LABEL"]'; + +// --- build the ICAO FPL free-text ----------------------------------------- +function tomorrowDOF() { + const d = new Date(Date.now() + 24 * 3600 * 1000); + const p = (n) => String(n).padStart(2, "0"); + return `${String(d.getUTCFullYear()).slice(2)}${p(d.getUTCMonth() + 1)}${p(d.getUTCDate())}`; +} + +function buildFpl(o) { + const cs = o.callsign || o.reg?.replace("-", "") || "TEST01"; + const type = o.actype || "A320"; + const wtc = o.wtc || "M"; + const equip = o.equip || "SDE1E2E3FGHIRWY/LB1"; + const reg = o.reg || "FGKXA"; + const pbn = o.pbn || "A1B1C1D1O1S2"; + const eet = o.eet || "0040"; + const altn = o.altn ? ` ${o.altn}` : ""; + const item15 = `${o.speed || "N0450"}${o.level || "F360"} ${o.route.trim()}`; + return ( + `(FPL-${cs}-IS\n` + + `-${type}/${wtc}-${equip}\n` + + `-${o.adep}${o.eobt || "1200"}\n` + + `-${item15}\n` + + `-${o.ades}${eet}${altn}\n` + + `-PBN/${pbn} REG/${reg} DOF/${o.dof || tomorrowDOF()})` + ); +} + +// --- parse the "Validation Results" text ---------------------------------- +function parseResults(body) { + const start = body.indexOf("Validation Results"); + const region = start >= 0 ? body.slice(start) : body; + const codeRe = /\b([A-Z]{2,6}\d{1,4}):\s*([^\n\t]+)/g; + const all = []; + let m; + while ((m = codeRe.exec(region))) all.push({ code: m[1], msg: m[2].trim() }); + // Filing-form artifacts (REG/EOBD/EET fields we'd fill correctly in a real + // filing), not route faults. PROF191 = our fixed EET differs from the calc. + const housekeeping = /^(EFPM(51|234|168|166)|PROF191)$/; + const errors = all.filter((e) => !housekeeping.test(e.code)); + return { errors, all }; +} + +// --- run ------------------------------------------------------------------- +const args = process.argv.slice(2); +let fpl; +if (args[0] === "--raw") { + fpl = args.slice(1).join(" "); +} else { + const payload = JSON.parse(args[0] || '{"adep":"LFPG","ades":"EGLL","route":"OPALE DCT KESAX DCT DIMAL DCT ALESO"}'); + fpl = buildFpl(payload); +} + +const b = await chromium.launch({ headless: true }); +const ctx = await b.newContext({ viewport: { width: 1400, height: 950 } }); +const page = await ctx.newPage(); +const out = { accepted: null, errors: [], raw: "", fpl, error: null }; +try { + await page.goto(URL, { waitUntil: "domcontentloaded", timeout: 60000 }); + await page.waitForTimeout(8000); + + const popupP = ctx.waitForEvent("page", { timeout: 15000 }).catch(() => null); + await page.getByText("Free Text Editor", { exact: false }).first().click({ timeout: 15000 }); + const ed = (await popupP) || page; + await ed.waitForSelector(ROUTE_SEL, { timeout: 20000 }); + + await ed.locator(ROUTE_SEL).fill(fpl); + await ed.locator(VALIDATE_SEL).click({ timeout: 15000 }); + await ed.waitForTimeout(7000); + + const body = await ed.locator("body").innerText(); + const { errors, all } = parseResults(body); + out.errors = errors; + out.accepted = errors.length === 0; + const s = body.indexOf("Validated ICAO FPL"); + out.raw = (s >= 0 ? body.slice(s) : body).replace(/\n{3,}/g, "\n").trim().slice(0, 2500); + await ed.screenshot({ path: "result.png", fullPage: true }); +} catch (e) { + out.error = e.message; +} finally { + await b.close(); +} +console.log(JSON.stringify(out));