diff --git a/Cargo.lock b/Cargo.lock
index ebe5dd0..5b9f93d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2009,6 +2009,40 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "rust-embed"
+version = "8.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a"
+dependencies = [
+ "rust-embed-impl",
+ "rust-embed-utils",
+ "walkdir",
+]
+
+[[package]]
+name = "rust-embed-impl"
+version = "8.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "rust-embed-utils",
+ "syn 2.0.106",
+ "walkdir",
+]
+
+[[package]]
+name = "rust-embed-utils"
+version = "8.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594"
+dependencies = [
+ "sha2",
+ "walkdir",
+]
+
[[package]]
name = "rust_decimal"
version = "1.38.0"
@@ -2027,7 +2061,7 @@ dependencies = [
[[package]]
name = "rust_rest_api"
-version = "0.1.4"
+version = "0.1.5"
dependencies = [
"axum",
"chrono",
@@ -2035,6 +2069,8 @@ dependencies = [
"dotenvy",
"http",
"migration",
+ "once_cell",
+ "rust-embed",
"sea-orm",
"serde",
"serde_json",
@@ -2106,6 +2142,15 @@ version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+[[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 = "scopeguard"
version = "1.2.0"
@@ -3079,6 +3124,16 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+[[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 = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
@@ -3201,6 +3256,15 @@ dependencies = [
"wasite",
]
+[[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.1",
+]
+
[[package]]
name = "windows-core"
version = "0.62.1"
diff --git a/Cargo.toml b/Cargo.toml
index c1566d6..0493286 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "rust_rest_api"
-version = "0.1.4"
+version = "0.1.5"
edition = "2024"
license = "MIT"
authors = ["Habibi-Dev"]
@@ -20,6 +20,8 @@ serde = { version = "1.0.228", features = ["derive"] }
chrono = "0.4.42"
chrono-tz = "0.10.4"
sea-orm = { version = "1.1.16", features = ["sqlx-sqlite", "runtime-tokio-rustls"] }
+once_cell = "1.21.3"
+rust-embed = "8.7.2"
[dependencies.migration]
path = "./migration"
\ No newline at end of file
diff --git a/data/countries.json b/data/countries.json
new file mode 100644
index 0000000..d8053c2
--- /dev/null
+++ b/data/countries.json
@@ -0,0 +1,2558 @@
+{
+ "AF": {
+ "code": "AF",
+ "name": "Afghanistan",
+ "currency": "AFN",
+ "language": [
+ "ps",
+ "fa"
+ ],
+ "flag": "🇦🇫",
+ "flag_svg": "af.svg"
+ },
+ "AX": {
+ "code": "AX",
+ "name": "Aland Islands",
+ "currency": "EUR",
+ "language": [
+ "sv"
+ ],
+ "flag": "🇦🇽",
+ "flag_svg": "ax.svg"
+ },
+ "AL": {
+ "code": "AL",
+ "name": "Albania",
+ "currency": "ALL",
+ "language": [
+ "sq"
+ ],
+ "flag": "🇦🇱",
+ "flag_svg": "al.svg"
+ },
+ "DZ": {
+ "code": "DZ",
+ "name": "Algeria",
+ "currency": "DZD",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇩🇿",
+ "flag_svg": "dz.svg"
+ },
+ "AS": {
+ "code": "AS",
+ "name": "American Samoa",
+ "currency": "USD",
+ "language": [
+ "en",
+ "sm"
+ ],
+ "flag": "🇦🇸",
+ "flag_svg": "as.svg"
+ },
+ "AD": {
+ "code": "AD",
+ "name": "Andorra",
+ "currency": "EUR",
+ "language": [
+ "ca"
+ ],
+ "flag": "🇦🇩",
+ "flag_svg": "ad.svg"
+ },
+ "AO": {
+ "code": "AO",
+ "name": "Angola",
+ "currency": "AOA",
+ "language": [
+ "pt"
+ ],
+ "flag": "🇦🇴",
+ "flag_svg": "ao.svg"
+ },
+ "AI": {
+ "code": "AI",
+ "name": "Anguilla",
+ "currency": "XCD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇦🇮",
+ "flag_svg": "ai.svg"
+ },
+ "AQ": {
+ "code": "AQ",
+ "name": "Antarctica",
+ "currency": null,
+ "language": [],
+ "flag": "🇦🇶",
+ "flag_svg": "aq.svg"
+ },
+ "AG": {
+ "code": "AG",
+ "name": "Antigua And Barbuda",
+ "currency": "XCD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇦🇬",
+ "flag_svg": "ag.svg"
+ },
+ "AR": {
+ "code": "AR",
+ "name": "Argentina",
+ "currency": "ARS",
+ "language": [
+ "es"
+ ],
+ "flag": "🇦🇷",
+ "flag_svg": "ar.svg"
+ },
+ "AM": {
+ "code": "AM",
+ "name": "Armenia",
+ "currency": "AMD",
+ "language": [
+ "hy"
+ ],
+ "flag": "🇦🇲",
+ "flag_svg": "am.svg"
+ },
+ "AW": {
+ "code": "AW",
+ "name": "Aruba",
+ "currency": "AWG",
+ "language": [
+ "nl",
+ "pap"
+ ],
+ "flag": "🇦🇼",
+ "flag_svg": "aw.svg"
+ },
+ "AU": {
+ "code": "AU",
+ "name": "Australia",
+ "currency": "AUD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇦🇺",
+ "flag_svg": "au.svg"
+ },
+ "AT": {
+ "code": "AT",
+ "name": "Austria",
+ "currency": "EUR",
+ "language": [
+ "de"
+ ],
+ "flag": "🇦🇹",
+ "flag_svg": "at.svg"
+ },
+ "AZ": {
+ "code": "AZ",
+ "name": "Azerbaijan",
+ "currency": "AZN",
+ "language": [
+ "az"
+ ],
+ "flag": "🇦🇿",
+ "flag_svg": "az.svg"
+ },
+ "BS": {
+ "code": "BS",
+ "name": "Bahamas",
+ "currency": "BSD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇧🇸",
+ "flag_svg": "bs.svg"
+ },
+ "BH": {
+ "code": "BH",
+ "name": "Bahrain",
+ "currency": "BHD",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇧🇭",
+ "flag_svg": "bh.svg"
+ },
+ "BD": {
+ "code": "BD",
+ "name": "Bangladesh",
+ "currency": "BDT",
+ "language": [
+ "bn"
+ ],
+ "flag": "🇧🇩",
+ "flag_svg": "bd.svg"
+ },
+ "BB": {
+ "code": "BB",
+ "name": "Barbados",
+ "currency": "BBD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇧🇧",
+ "flag_svg": "bb.svg"
+ },
+ "BY": {
+ "code": "BY",
+ "name": "Belarus",
+ "currency": "BYN",
+ "language": [
+ "be",
+ "ru"
+ ],
+ "flag": "🇧🇾",
+ "flag_svg": "by.svg"
+ },
+ "BE": {
+ "code": "BE",
+ "name": "Belgium",
+ "currency": "EUR",
+ "language": [
+ "nl",
+ "fr",
+ "de"
+ ],
+ "flag": "🇧🇪",
+ "flag_svg": "be.svg"
+ },
+ "BZ": {
+ "code": "BZ",
+ "name": "Belize",
+ "currency": "BZD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇧🇿",
+ "flag_svg": "bz.svg"
+ },
+ "BJ": {
+ "code": "BJ",
+ "name": "Benin",
+ "currency": "XOF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇧🇯",
+ "flag_svg": "bj.svg"
+ },
+ "BM": {
+ "code": "BM",
+ "name": "Bermuda",
+ "currency": "BMD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇧🇲",
+ "flag_svg": "bm.svg"
+ },
+ "BT": {
+ "code": "BT",
+ "name": "Bhutan",
+ "currency": "BTN",
+ "language": [
+ "dz"
+ ],
+ "flag": "🇧🇹",
+ "flag_svg": "bt.svg"
+ },
+ "BO": {
+ "code": "BO",
+ "name": "Bolivia",
+ "currency": "BOB",
+ "language": [
+ "es",
+ "qu",
+ "ay"
+ ],
+ "flag": "🇧🇴",
+ "flag_svg": "bo.svg"
+ },
+ "BA": {
+ "code": "BA",
+ "name": "Bosnia And Herzegovina",
+ "currency": "BAM",
+ "language": [
+ "bs",
+ "hr",
+ "sr"
+ ],
+ "flag": "🇧🇦",
+ "flag_svg": "ba.svg"
+ },
+ "BW": {
+ "code": "BW",
+ "name": "Botswana",
+ "currency": "BWP",
+ "language": [
+ "en",
+ "tn"
+ ],
+ "flag": "🇧🇼",
+ "flag_svg": "bw.svg"
+ },
+ "BV": {
+ "code": "BV",
+ "name": "Bouvet Island",
+ "currency": "NOK",
+ "language": [],
+ "flag": "🇧🇻",
+ "flag_svg": "bv.svg"
+ },
+ "BR": {
+ "code": "BR",
+ "name": "Brazil",
+ "currency": "BRL",
+ "language": [
+ "pt"
+ ],
+ "flag": "🇧🇷",
+ "flag_svg": "br.svg"
+ },
+ "IO": {
+ "code": "IO",
+ "name": "British Indian Ocean Territory",
+ "currency": "USD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇮🇴",
+ "flag_svg": "io.svg"
+ },
+ "BN": {
+ "code": "BN",
+ "name": "Brunei Darussalam",
+ "currency": "BND",
+ "language": [
+ "ms"
+ ],
+ "flag": "🇧🇳",
+ "flag_svg": "bn.svg"
+ },
+ "BG": {
+ "code": "BG",
+ "name": "Bulgaria",
+ "currency": "BGN",
+ "language": [
+ "bg"
+ ],
+ "flag": "🇧🇬",
+ "flag_svg": "bg.svg"
+ },
+ "BF": {
+ "code": "BF",
+ "name": "Burkina Faso",
+ "currency": "XOF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇧🇫",
+ "flag_svg": "bf.svg"
+ },
+ "BI": {
+ "code": "BI",
+ "name": "Burundi",
+ "currency": "BIF",
+ "language": [
+ "rn",
+ "fr"
+ ],
+ "flag": "🇧🇮",
+ "flag_svg": "bi.svg"
+ },
+ "KH": {
+ "code": "KH",
+ "name": "Cambodia",
+ "currency": "KHR",
+ "language": [
+ "km"
+ ],
+ "flag": "🇰🇭",
+ "flag_svg": "kh.svg"
+ },
+ "CM": {
+ "code": "CM",
+ "name": "Cameroon",
+ "currency": "XAF",
+ "language": [
+ "fr",
+ "en"
+ ],
+ "flag": "🇨🇲",
+ "flag_svg": "cm.svg"
+ },
+ "CA": {
+ "code": "CA",
+ "name": "Canada",
+ "currency": "CAD",
+ "language": [
+ "en",
+ "fr"
+ ],
+ "flag": "🇨🇦",
+ "flag_svg": "ca.svg"
+ },
+ "CV": {
+ "code": "CV",
+ "name": "Cape Verde",
+ "currency": "CVE",
+ "language": [
+ "pt"
+ ],
+ "flag": "🇨🇻",
+ "flag_svg": "cv.svg"
+ },
+ "KY": {
+ "code": "KY",
+ "name": "Cayman Islands",
+ "currency": "KYD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇰🇾",
+ "flag_svg": "ky.svg"
+ },
+ "CF": {
+ "code": "CF",
+ "name": "Central African Republic",
+ "currency": "XAF",
+ "language": [
+ "fr",
+ "sg"
+ ],
+ "flag": "🇨🇫",
+ "flag_svg": "cf.svg"
+ },
+ "TD": {
+ "code": "TD",
+ "name": "Chad",
+ "currency": "XAF",
+ "language": [
+ "fr",
+ "ar"
+ ],
+ "flag": "🇹🇩",
+ "flag_svg": "td.svg"
+ },
+ "CL": {
+ "code": "CL",
+ "name": "Chile",
+ "currency": "CLP",
+ "language": [
+ "es"
+ ],
+ "flag": "🇨🇱",
+ "flag_svg": "cl.svg"
+ },
+ "CN": {
+ "code": "CN",
+ "name": "China",
+ "currency": "CNY",
+ "language": [
+ "zh"
+ ],
+ "flag": "🇨🇳",
+ "flag_svg": "cn.svg"
+ },
+ "CX": {
+ "code": "CX",
+ "name": "Christmas Island",
+ "currency": "AUD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇨🇽",
+ "flag_svg": "cx.svg"
+ },
+ "CC": {
+ "code": "CC",
+ "name": "Cocos (Keeling) Islands",
+ "currency": "AUD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇨🇨",
+ "flag_svg": "cc.svg"
+ },
+ "CO": {
+ "code": "CO",
+ "name": "Colombia",
+ "currency": "COP",
+ "language": [
+ "es"
+ ],
+ "flag": "🇨🇴",
+ "flag_svg": "co.svg"
+ },
+ "KM": {
+ "code": "KM",
+ "name": "Comoros",
+ "currency": "KMF",
+ "language": [
+ "ar",
+ "fr"
+ ],
+ "flag": "🇰🇲",
+ "flag_svg": "km.svg"
+ },
+ "CG": {
+ "code": "CG",
+ "name": "Congo",
+ "currency": "XAF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇨🇬",
+ "flag_svg": "cg.svg"
+ },
+ "CD": {
+ "code": "CD",
+ "name": "Congo, Democratic Republic",
+ "currency": "CDF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇨🇩",
+ "flag_svg": "cd.svg"
+ },
+ "CK": {
+ "code": "CK",
+ "name": "Cook Islands",
+ "currency": "NZD",
+ "language": [
+ "en",
+ "mi"
+ ],
+ "flag": "🇨🇰",
+ "flag_svg": "ck.svg"
+ },
+ "CR": {
+ "code": "CR",
+ "name": "Costa Rica",
+ "currency": "CRC",
+ "language": [
+ "es"
+ ],
+ "flag": "🇨🇷",
+ "flag_svg": "cr.svg"
+ },
+ "CI": {
+ "code": "CI",
+ "name": "Cote D\"Ivoire",
+ "currency": "XOF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇨🇮",
+ "flag_svg": "ci.svg"
+ },
+ "HR": {
+ "code": "HR",
+ "name": "Croatia",
+ "currency": "EUR",
+ "language": [
+ "hr"
+ ],
+ "flag": "🇭🇷",
+ "flag_svg": "hr.svg"
+ },
+ "CU": {
+ "code": "CU",
+ "name": "Cuba",
+ "currency": "CUP",
+ "language": [
+ "es"
+ ],
+ "flag": "🇨🇺",
+ "flag_svg": "cu.svg"
+ },
+ "CY": {
+ "code": "CY",
+ "name": "Cyprus",
+ "currency": "EUR",
+ "language": [
+ "el",
+ "tr"
+ ],
+ "flag": "🇨🇾",
+ "flag_svg": "cy.svg"
+ },
+ "CZ": {
+ "code": "CZ",
+ "name": "Czech Republic",
+ "currency": "CZK",
+ "language": [
+ "cs"
+ ],
+ "flag": "🇨🇿",
+ "flag_svg": "cz.svg"
+ },
+ "DK": {
+ "code": "DK",
+ "name": "Denmark",
+ "currency": "DKK",
+ "language": [
+ "da"
+ ],
+ "flag": "🇩🇰",
+ "flag_svg": "dk.svg"
+ },
+ "DJ": {
+ "code": "DJ",
+ "name": "Djibouti",
+ "currency": "DJF",
+ "language": [
+ "fr",
+ "ar",
+ "so"
+ ],
+ "flag": "🇩🇯",
+ "flag_svg": "dj.svg"
+ },
+ "DM": {
+ "code": "DM",
+ "name": "Dominica",
+ "currency": "XCD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇩🇲",
+ "flag_svg": "dm.svg"
+ },
+ "DO": {
+ "code": "DO",
+ "name": "Dominican Republic",
+ "currency": "DOP",
+ "language": [
+ "es"
+ ],
+ "flag": "🇩🇴",
+ "flag_svg": "do.svg"
+ },
+ "EC": {
+ "code": "EC",
+ "name": "Ecuador",
+ "currency": "USD",
+ "language": [
+ "es",
+ "qu"
+ ],
+ "flag": "🇪🇨",
+ "flag_svg": "ec.svg"
+ },
+ "EG": {
+ "code": "EG",
+ "name": "Egypt",
+ "currency": "EGP",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇪🇬",
+ "flag_svg": "eg.svg"
+ },
+ "SV": {
+ "code": "SV",
+ "name": "El Salvador",
+ "currency": "USD",
+ "language": [
+ "es"
+ ],
+ "flag": "🇸🇻",
+ "flag_svg": "sv.svg"
+ },
+ "GQ": {
+ "code": "GQ",
+ "name": "Equatorial Guinea",
+ "currency": "XAF",
+ "language": [
+ "es",
+ "fr"
+ ],
+ "flag": "🇬🇶",
+ "flag_svg": "gq.svg"
+ },
+ "ER": {
+ "code": "ER",
+ "name": "Eritrea",
+ "currency": "ERN",
+ "language": [
+ "ti",
+ "ar"
+ ],
+ "flag": "🇪🇷",
+ "flag_svg": "er.svg"
+ },
+ "EE": {
+ "code": "EE",
+ "name": "Estonia",
+ "currency": "EUR",
+ "language": [
+ "et"
+ ],
+ "flag": "🇪🇪",
+ "flag_svg": "ee.svg"
+ },
+ "ET": {
+ "code": "ET",
+ "name": "Ethiopia",
+ "currency": "ETB",
+ "language": [
+ "am"
+ ],
+ "flag": "🇪🇹",
+ "flag_svg": "et.svg"
+ },
+ "FK": {
+ "code": "FK",
+ "name": "Falkland Islands (Malvinas)",
+ "currency": "FKP",
+ "language": [
+ "en"
+ ],
+ "flag": "🇫🇰",
+ "flag_svg": "fk.svg"
+ },
+ "FO": {
+ "code": "FO",
+ "name": "Faroe Islands",
+ "currency": "DKK",
+ "language": [
+ "fo"
+ ],
+ "flag": "🇫🇴",
+ "flag_svg": "fo.svg"
+ },
+ "FJ": {
+ "code": "FJ",
+ "name": "Fiji",
+ "currency": "FJD",
+ "language": [
+ "en",
+ "fj",
+ "hi"
+ ],
+ "flag": "🇫🇯",
+ "flag_svg": "fj.svg"
+ },
+ "FI": {
+ "code": "FI",
+ "name": "Finland",
+ "currency": "EUR",
+ "language": [
+ "fi",
+ "sv"
+ ],
+ "flag": "🇫🇮",
+ "flag_svg": "fi.svg"
+ },
+ "FR": {
+ "code": "FR",
+ "name": "France",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇫🇷",
+ "flag_svg": "fr.svg"
+ },
+ "GF": {
+ "code": "GF",
+ "name": "French Guiana",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇬🇫",
+ "flag_svg": "gf.svg"
+ },
+ "PF": {
+ "code": "PF",
+ "name": "French Polynesia",
+ "currency": "XPF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇵🇫",
+ "flag_svg": "pf.svg"
+ },
+ "TF": {
+ "code": "TF",
+ "name": "French Southern Territories",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇹🇫",
+ "flag_svg": "tf.svg"
+ },
+ "GA": {
+ "code": "GA",
+ "name": "Gabon",
+ "currency": "XAF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇬🇦",
+ "flag_svg": "ga.svg"
+ },
+ "GM": {
+ "code": "GM",
+ "name": "Gambia",
+ "currency": "GMD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇬🇲",
+ "flag_svg": "gm.svg"
+ },
+ "GE": {
+ "code": "GE",
+ "name": "Georgia",
+ "currency": "GEL",
+ "language": [
+ "ka"
+ ],
+ "flag": "🇬🇪",
+ "flag_svg": "ge.svg"
+ },
+ "DE": {
+ "code": "DE",
+ "name": "Germany",
+ "currency": "EUR",
+ "language": [
+ "de"
+ ],
+ "flag": "🇩🇪",
+ "flag_svg": "de.svg"
+ },
+ "GH": {
+ "code": "GH",
+ "name": "Ghana",
+ "currency": "GHS",
+ "language": [
+ "en"
+ ],
+ "flag": "🇬🇭",
+ "flag_svg": "gh.svg"
+ },
+ "GI": {
+ "code": "GI",
+ "name": "Gibraltar",
+ "currency": "GIP",
+ "language": [
+ "en"
+ ],
+ "flag": "🇬🇮",
+ "flag_svg": "gi.svg"
+ },
+ "GR": {
+ "code": "GR",
+ "name": "Greece",
+ "currency": "EUR",
+ "language": [
+ "el"
+ ],
+ "flag": "🇬🇷",
+ "flag_svg": "gr.svg"
+ },
+ "GL": {
+ "code": "GL",
+ "name": "Greenland",
+ "currency": "DKK",
+ "language": [
+ "kl",
+ "da"
+ ],
+ "flag": "🇬🇱",
+ "flag_svg": "gl.svg"
+ },
+ "GD": {
+ "code": "GD",
+ "name": "Grenada",
+ "currency": "XCD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇬🇩",
+ "flag_svg": "gd.svg"
+ },
+ "GP": {
+ "code": "GP",
+ "name": "Guadeloupe",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇬🇵",
+ "flag_svg": "gp.svg"
+ },
+ "GU": {
+ "code": "GU",
+ "name": "Guam",
+ "currency": "USD",
+ "language": [
+ "en",
+ "ch"
+ ],
+ "flag": "🇬🇺",
+ "flag_svg": "gu.svg"
+ },
+ "GT": {
+ "code": "GT",
+ "name": "Guatemala",
+ "currency": "GTQ",
+ "language": [
+ "es"
+ ],
+ "flag": "🇬🇹",
+ "flag_svg": "gt.svg"
+ },
+ "GG": {
+ "code": "GG",
+ "name": "Guernsey",
+ "currency": "GBP",
+ "language": [
+ "en"
+ ],
+ "flag": "🇬🇬",
+ "flag_svg": "gg.svg"
+ },
+ "GN": {
+ "code": "GN",
+ "name": "Guinea",
+ "currency": "GNF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇬🇳",
+ "flag_svg": "gn.svg"
+ },
+ "GW": {
+ "code": "GW",
+ "name": "Guinea-Bissau",
+ "currency": "XOF",
+ "language": [
+ "pt"
+ ],
+ "flag": "🇬🇼",
+ "flag_svg": "gw.svg"
+ },
+ "GY": {
+ "code": "GY",
+ "name": "Guyana",
+ "currency": "GYD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇬🇾",
+ "flag_svg": "gy.svg"
+ },
+ "HT": {
+ "code": "HT",
+ "name": "Haiti",
+ "currency": "HTG",
+ "language": [
+ "ht",
+ "fr"
+ ],
+ "flag": "🇭🇹",
+ "flag_svg": "ht.svg"
+ },
+ "HM": {
+ "code": "HM",
+ "name": "Heard Island & Mcdonald Islands",
+ "currency": "AUD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇭🇲",
+ "flag_svg": "hm.svg"
+ },
+ "VA": {
+ "code": "VA",
+ "name": "Holy See (Vatican City State)",
+ "currency": "EUR",
+ "language": [
+ "it",
+ "la"
+ ],
+ "flag": "🇻🇦",
+ "flag_svg": "va.svg"
+ },
+ "HN": {
+ "code": "HN",
+ "name": "Honduras",
+ "currency": "HNL",
+ "language": [
+ "es"
+ ],
+ "flag": "🇭🇳",
+ "flag_svg": "hn.svg"
+ },
+ "HK": {
+ "code": "HK",
+ "name": "Hong Kong",
+ "currency": "HKD",
+ "language": [
+ "zh",
+ "en"
+ ],
+ "flag": "🇭🇰",
+ "flag_svg": "hk.svg"
+ },
+ "HU": {
+ "code": "HU",
+ "name": "Hungary",
+ "currency": "HUF",
+ "language": [
+ "hu"
+ ],
+ "flag": "🇭🇺",
+ "flag_svg": "hu.svg"
+ },
+ "IS": {
+ "code": "IS",
+ "name": "Iceland",
+ "currency": "ISK",
+ "language": [
+ "is"
+ ],
+ "flag": "🇮🇸",
+ "flag_svg": "is.svg"
+ },
+ "IN": {
+ "code": "IN",
+ "name": "India",
+ "currency": "INR",
+ "language": [
+ "hi",
+ "en"
+ ],
+ "flag": "🇮🇳",
+ "flag_svg": "in.svg"
+ },
+ "ID": {
+ "code": "ID",
+ "name": "Indonesia",
+ "currency": "IDR",
+ "language": [
+ "id"
+ ],
+ "flag": "🇮🇩",
+ "flag_svg": "id.svg"
+ },
+ "IR": {
+ "code": "IR",
+ "name": "Iran, Islamic Republic Of",
+ "currency": "IRR",
+ "language": [
+ "fa"
+ ],
+ "flag": "🇮🇷",
+ "flag_svg": "ir.svg"
+ },
+ "IQ": {
+ "code": "IQ",
+ "name": "Iraq",
+ "currency": "IQD",
+ "language": [
+ "ar",
+ "ku"
+ ],
+ "flag": "🇮🇶",
+ "flag_svg": "iq.svg"
+ },
+ "IE": {
+ "code": "IE",
+ "name": "Ireland",
+ "currency": "EUR",
+ "language": [
+ "en",
+ "ga"
+ ],
+ "flag": "🇮🇪",
+ "flag_svg": "ie.svg"
+ },
+ "IM": {
+ "code": "IM",
+ "name": "Isle Of Man",
+ "currency": "GBP",
+ "language": [
+ "en"
+ ],
+ "flag": "🇮🇲",
+ "flag_svg": "im.svg"
+ },
+ "IL": {
+ "code": "IL",
+ "name": "Israel",
+ "currency": "ILS",
+ "language": [
+ "he",
+ "ar"
+ ],
+ "flag": "🇮🇱",
+ "flag_svg": "il.svg"
+ },
+ "IT": {
+ "code": "IT",
+ "name": "Italy",
+ "currency": "EUR",
+ "language": [
+ "it"
+ ],
+ "flag": "🇮🇹",
+ "flag_svg": "it.svg"
+ },
+ "JM": {
+ "code": "JM",
+ "name": "Jamaica",
+ "currency": "JMD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇯🇲",
+ "flag_svg": "jm.svg"
+ },
+ "JP": {
+ "code": "JP",
+ "name": "Japan",
+ "currency": "JPY",
+ "language": [
+ "ja"
+ ],
+ "flag": "🇯🇵",
+ "flag_svg": "jp.svg"
+ },
+ "JE": {
+ "code": "JE",
+ "name": "Jersey",
+ "currency": "GBP",
+ "language": [
+ "en"
+ ],
+ "flag": "🇯🇪",
+ "flag_svg": "je.svg"
+ },
+ "JO": {
+ "code": "JO",
+ "name": "Jordan",
+ "currency": "JOD",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇯🇴",
+ "flag_svg": "jo.svg"
+ },
+ "KZ": {
+ "code": "KZ",
+ "name": "Kazakhstan",
+ "currency": "KZT",
+ "language": [
+ "kk",
+ "ru"
+ ],
+ "flag": "🇰🇿",
+ "flag_svg": "kz.svg"
+ },
+ "KE": {
+ "code": "KE",
+ "name": "Kenya",
+ "currency": "KES",
+ "language": [
+ "sw",
+ "en"
+ ],
+ "flag": "🇰🇪",
+ "flag_svg": "ke.svg"
+ },
+ "KI": {
+ "code": "KI",
+ "name": "Kiribati",
+ "currency": "AUD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇰🇮",
+ "flag_svg": "ki.svg"
+ },
+ "KR": {
+ "code": "KR",
+ "name": "Korea",
+ "currency": "KRW",
+ "language": [
+ "ko"
+ ],
+ "flag": "🇰🇷",
+ "flag_svg": "kr.svg"
+ },
+ "KP": {
+ "code": "KP",
+ "name": "North Korea",
+ "currency": "KPW",
+ "language": [
+ "ko"
+ ],
+ "flag": "🇰🇵",
+ "flag_svg": "kp.svg"
+ },
+ "KW": {
+ "code": "KW",
+ "name": "Kuwait",
+ "currency": "KWD",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇰🇼",
+ "flag_svg": "kw.svg"
+ },
+ "KG": {
+ "code": "KG",
+ "name": "Kyrgyzstan",
+ "currency": "KGS",
+ "language": [
+ "ky",
+ "ru"
+ ],
+ "flag": "🇰🇬",
+ "flag_svg": "kg.svg"
+ },
+ "LA": {
+ "code": "LA",
+ "name": "Lao People\"s Democratic Republic",
+ "currency": "LAK",
+ "language": [
+ "lo"
+ ],
+ "flag": "🇱🇦",
+ "flag_svg": "la.svg"
+ },
+ "LV": {
+ "code": "LV",
+ "name": "Latvia",
+ "currency": "EUR",
+ "language": [
+ "lv"
+ ],
+ "flag": "🇱🇻",
+ "flag_svg": "lv.svg"
+ },
+ "LB": {
+ "code": "LB",
+ "name": "Lebanon",
+ "currency": "LBP",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇱🇧",
+ "flag_svg": "lb.svg"
+ },
+ "LS": {
+ "code": "LS",
+ "name": "Lesotho",
+ "currency": "LSL",
+ "language": [
+ "st",
+ "en"
+ ],
+ "flag": "🇱🇸",
+ "flag_svg": "ls.svg"
+ },
+ "LR": {
+ "code": "LR",
+ "name": "Liberia",
+ "currency": "LRD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇱🇷",
+ "flag_svg": "lr.svg"
+ },
+ "LY": {
+ "code": "LY",
+ "name": "Libyan Arab Jamahiriya",
+ "currency": "LYD",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇱🇾",
+ "flag_svg": "ly.svg"
+ },
+ "LI": {
+ "code": "LI",
+ "name": "Liechtenstein",
+ "currency": "CHF",
+ "language": [
+ "de"
+ ],
+ "flag": "🇱🇮",
+ "flag_svg": "li.svg"
+ },
+ "LT": {
+ "code": "LT",
+ "name": "Lithuania",
+ "currency": "EUR",
+ "language": [
+ "lt"
+ ],
+ "flag": "🇱🇹",
+ "flag_svg": "lt.svg"
+ },
+ "LU": {
+ "code": "LU",
+ "name": "Luxembourg",
+ "currency": "EUR",
+ "language": [
+ "lb",
+ "fr",
+ "de"
+ ],
+ "flag": "🇱🇺",
+ "flag_svg": "lu.svg"
+ },
+ "MO": {
+ "code": "MO",
+ "name": "Macao",
+ "currency": "MOP",
+ "language": [
+ "zh",
+ "pt"
+ ],
+ "flag": "🇲🇴",
+ "flag_svg": "mo.svg"
+ },
+ "MK": {
+ "code": "MK",
+ "name": "Macedonia",
+ "currency": "MKD",
+ "language": [
+ "mk"
+ ],
+ "flag": "🇲🇰",
+ "flag_svg": "mk.svg"
+ },
+ "MG": {
+ "code": "MG",
+ "name": "Madagascar",
+ "currency": "MGA",
+ "language": [
+ "mg",
+ "fr"
+ ],
+ "flag": "🇲🇬",
+ "flag_svg": "mg.svg"
+ },
+ "MW": {
+ "code": "MW",
+ "name": "Malawi",
+ "currency": "MWK",
+ "language": [
+ "en",
+ "ny"
+ ],
+ "flag": "🇲🇼",
+ "flag_svg": "mw.svg"
+ },
+ "MY": {
+ "code": "MY",
+ "name": "Malaysia",
+ "currency": "MYR",
+ "language": [
+ "ms"
+ ],
+ "flag": "🇲🇾",
+ "flag_svg": "my.svg"
+ },
+ "MV": {
+ "code": "MV",
+ "name": "Maldives",
+ "currency": "MVR",
+ "language": [
+ "dv"
+ ],
+ "flag": "🇲🇻",
+ "flag_svg": "mv.svg"
+ },
+ "ML": {
+ "code": "ML",
+ "name": "Mali",
+ "currency": "XOF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇲🇱",
+ "flag_svg": "ml.svg"
+ },
+ "MT": {
+ "code": "MT",
+ "name": "Malta",
+ "currency": "EUR",
+ "language": [
+ "mt",
+ "en"
+ ],
+ "flag": "🇲🇹",
+ "flag_svg": "mt.svg"
+ },
+ "MH": {
+ "code": "MH",
+ "name": "Marshall Islands",
+ "currency": "USD",
+ "language": [
+ "mh",
+ "en"
+ ],
+ "flag": "🇲🇭",
+ "flag_svg": "mh.svg"
+ },
+ "MQ": {
+ "code": "MQ",
+ "name": "Martinique",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇲🇶",
+ "flag_svg": "mq.svg"
+ },
+ "MR": {
+ "code": "MR",
+ "name": "Mauritania",
+ "currency": "MRU",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇲🇷",
+ "flag_svg": "mr.svg"
+ },
+ "MU": {
+ "code": "MU",
+ "name": "Mauritius",
+ "currency": "MUR",
+ "language": [
+ "en",
+ "fr",
+ "mfe"
+ ],
+ "flag": "🇲🇺",
+ "flag_svg": "mu.svg"
+ },
+ "YT": {
+ "code": "YT",
+ "name": "Mayotte",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇾🇹",
+ "flag_svg": "yt.svg"
+ },
+ "MX": {
+ "code": "MX",
+ "name": "Mexico",
+ "currency": "MXN",
+ "language": [
+ "es"
+ ],
+ "flag": "🇲🇽",
+ "flag_svg": "mx.svg"
+ },
+ "FM": {
+ "code": "FM",
+ "name": "Micronesia, Federated States Of",
+ "currency": "USD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇫🇲",
+ "flag_svg": "fm.svg"
+ },
+ "MD": {
+ "code": "MD",
+ "name": "Moldova",
+ "currency": "MDL",
+ "language": [
+ "ro"
+ ],
+ "flag": "🇲🇩",
+ "flag_svg": "md.svg"
+ },
+ "MC": {
+ "code": "MC",
+ "name": "Monaco",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇲🇨",
+ "flag_svg": "mc.svg"
+ },
+ "MN": {
+ "code": "MN",
+ "name": "Mongolia",
+ "currency": "MNT",
+ "language": [
+ "mn"
+ ],
+ "flag": "🇲🇳",
+ "flag_svg": "mn.svg"
+ },
+ "ME": {
+ "code": "ME",
+ "name": "Montenegro",
+ "currency": "EUR",
+ "language": [
+ "srp",
+ "sr",
+ "me"
+ ],
+ "flag": "🇲🇪",
+ "flag_svg": "me.svg"
+ },
+ "MS": {
+ "code": "MS",
+ "name": "Montserrat",
+ "currency": "XCD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇲🇸",
+ "flag_svg": "ms.svg"
+ },
+ "MA": {
+ "code": "MA",
+ "name": "Morocco",
+ "currency": "MAD",
+ "language": [
+ "ar",
+ "fr",
+ "ber"
+ ],
+ "flag": "🇲🇦",
+ "flag_svg": "ma.svg"
+ },
+ "MZ": {
+ "code": "MZ",
+ "name": "Mozambique",
+ "currency": "MZN",
+ "language": [
+ "pt"
+ ],
+ "flag": "🇲🇿",
+ "flag_svg": "mz.svg"
+ },
+ "MM": {
+ "code": "MM",
+ "name": "Myanmar",
+ "currency": "MMK",
+ "language": [
+ "my"
+ ],
+ "flag": "🇲🇲",
+ "flag_svg": "mm.svg"
+ },
+ "NA": {
+ "code": "NA",
+ "name": "Namibia",
+ "currency": "NAD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇳🇦",
+ "flag_svg": "na.svg"
+ },
+ "NR": {
+ "code": "NR",
+ "name": "Nauru",
+ "currency": "AUD",
+ "language": [
+ "na",
+ "en"
+ ],
+ "flag": "🇳🇷",
+ "flag_svg": "nr.svg"
+ },
+ "NP": {
+ "code": "NP",
+ "name": "Nepal",
+ "currency": "NPR",
+ "language": [
+ "ne"
+ ],
+ "flag": "🇳🇵",
+ "flag_svg": "np.svg"
+ },
+ "NL": {
+ "code": "NL",
+ "name": "Netherlands",
+ "currency": "EUR",
+ "language": [
+ "nl"
+ ],
+ "flag": "🇳🇱",
+ "flag_svg": "nl.svg"
+ },
+ "AN": {
+ "code": "AN",
+ "name": "Netherlands Antilles",
+ "currency": "ANG",
+ "language": [
+ "nl",
+ "pap"
+ ],
+ "flag": "🇦🇳",
+ "flag_svg": "an.svg"
+ },
+ "NC": {
+ "code": "NC",
+ "name": "New Caledonia",
+ "currency": "XPF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇳🇨",
+ "flag_svg": "nc.svg"
+ },
+ "NZ": {
+ "code": "NZ",
+ "name": "New Zealand",
+ "currency": "NZD",
+ "language": [
+ "en",
+ "mi"
+ ],
+ "flag": "🇳🇿",
+ "flag_svg": "nz.svg"
+ },
+ "NI": {
+ "code": "NI",
+ "name": "Nicaragua",
+ "currency": "NIO",
+ "language": [
+ "es"
+ ],
+ "flag": "🇳🇮",
+ "flag_svg": "ni.svg"
+ },
+ "NE": {
+ "code": "NE",
+ "name": "Niger",
+ "currency": "XOF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇳🇪",
+ "flag_svg": "ne.svg"
+ },
+ "NG": {
+ "code": "NG",
+ "name": "Nigeria",
+ "currency": "NGN",
+ "language": [
+ "en"
+ ],
+ "flag": "🇳🇬",
+ "flag_svg": "ng.svg"
+ },
+ "NU": {
+ "code": "NU",
+ "name": "Niue",
+ "currency": "NZD",
+ "language": [
+ "en",
+ "niu"
+ ],
+ "flag": "🇳🇺",
+ "flag_svg": "nu.svg"
+ },
+ "NF": {
+ "code": "NF",
+ "name": "Norfolk Island",
+ "currency": "AUD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇳🇫",
+ "flag_svg": "nf.svg"
+ },
+ "MP": {
+ "code": "MP",
+ "name": "Northern Mariana Islands",
+ "currency": "USD",
+ "language": [
+ "en",
+ "ch"
+ ],
+ "flag": "🇲🇵",
+ "flag_svg": "mp.svg"
+ },
+ "NO": {
+ "code": "NO",
+ "name": "Norway",
+ "currency": "NOK",
+ "language": [
+ "nb",
+ "nn"
+ ],
+ "flag": "🇳🇴",
+ "flag_svg": "no.svg"
+ },
+ "OM": {
+ "code": "OM",
+ "name": "Oman",
+ "currency": "OMR",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇴🇲",
+ "flag_svg": "om.svg"
+ },
+ "PK": {
+ "code": "PK",
+ "name": "Pakistan",
+ "currency": "PKR",
+ "language": [
+ "ur",
+ "en"
+ ],
+ "flag": "🇵🇰",
+ "flag_svg": "pk.svg"
+ },
+ "PW": {
+ "code": "PW",
+ "name": "Palau",
+ "currency": "USD",
+ "language": [
+ "en",
+ "pau"
+ ],
+ "flag": "🇵🇼",
+ "flag_svg": "pw.svg"
+ },
+ "PS": {
+ "code": "PS",
+ "name": "Palestinian Territory, Occupied",
+ "currency": "ILS",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇵🇸",
+ "flag_svg": "ps.svg"
+ },
+ "PA": {
+ "code": "PA",
+ "name": "Panama",
+ "currency": "PAB",
+ "language": [
+ "es"
+ ],
+ "flag": "🇵🇦",
+ "flag_svg": "pa.svg"
+ },
+ "PG": {
+ "code": "PG",
+ "name": "Papua New Guinea",
+ "currency": "PGK",
+ "language": [
+ "en",
+ "tpi",
+ "ho"
+ ],
+ "flag": "🇵🇬",
+ "flag_svg": "pg.svg"
+ },
+ "PY": {
+ "code": "PY",
+ "name": "Paraguay",
+ "currency": "PYG",
+ "language": [
+ "es",
+ "gn"
+ ],
+ "flag": "🇵🇾",
+ "flag_svg": "py.svg"
+ },
+ "PE": {
+ "code": "PE",
+ "name": "Peru",
+ "currency": "PEN",
+ "language": [
+ "es",
+ "qu",
+ "ay"
+ ],
+ "flag": "🇵🇪",
+ "flag_svg": "pe.svg"
+ },
+ "PH": {
+ "code": "PH",
+ "name": "Philippines",
+ "currency": "PHP",
+ "language": [
+ "fil",
+ "en"
+ ],
+ "flag": "🇵🇭",
+ "flag_svg": "ph.svg"
+ },
+ "PN": {
+ "code": "PN",
+ "name": "Pitcairn",
+ "currency": "NZD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇵🇳",
+ "flag_svg": "pn.svg"
+ },
+ "PL": {
+ "code": "PL",
+ "name": "Poland",
+ "currency": "PLN",
+ "language": [
+ "pl"
+ ],
+ "flag": "🇵🇱",
+ "flag_svg": "pl.svg"
+ },
+ "PT": {
+ "code": "PT",
+ "name": "Portugal",
+ "currency": "EUR",
+ "language": [
+ "pt"
+ ],
+ "flag": "🇵🇹",
+ "flag_svg": "pt.svg"
+ },
+ "PR": {
+ "code": "PR",
+ "name": "Puerto Rico",
+ "currency": "USD",
+ "language": [
+ "es",
+ "en"
+ ],
+ "flag": "🇵🇷",
+ "flag_svg": "pr.svg"
+ },
+ "QA": {
+ "code": "QA",
+ "name": "Qatar",
+ "currency": "QAR",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇶🇦",
+ "flag_svg": "qa.svg"
+ },
+ "RE": {
+ "code": "RE",
+ "name": "Reunion",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇷🇪",
+ "flag_svg": "re.svg"
+ },
+ "RO": {
+ "code": "RO",
+ "name": "Romania",
+ "currency": "RON",
+ "language": [
+ "ro"
+ ],
+ "flag": "🇷🇴",
+ "flag_svg": "ro.svg"
+ },
+ "RU": {
+ "code": "RU",
+ "name": "Russian Federation",
+ "currency": "RUB",
+ "language": [
+ "ru"
+ ],
+ "flag": "🇷🇺",
+ "flag_svg": "ru.svg"
+ },
+ "RW": {
+ "code": "RW",
+ "name": "Rwanda",
+ "currency": "RWF",
+ "language": [
+ "rw",
+ "fr",
+ "en"
+ ],
+ "flag": "🇷🇼",
+ "flag_svg": "rw.svg"
+ },
+ "BL": {
+ "code": "BL",
+ "name": "Saint Barthelemy",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇧🇱",
+ "flag_svg": "bl.svg"
+ },
+ "SH": {
+ "code": "SH",
+ "name": "Saint Helena",
+ "currency": "SHP",
+ "language": [
+ "en"
+ ],
+ "flag": "🇸🇭",
+ "flag_svg": "sh.svg"
+ },
+ "KN": {
+ "code": "KN",
+ "name": "Saint Kitts And Nevis",
+ "currency": "XCD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇰🇳",
+ "flag_svg": "kn.svg"
+ },
+ "LC": {
+ "code": "LC",
+ "name": "Saint Lucia",
+ "currency": "XCD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇱🇨",
+ "flag_svg": "lc.svg"
+ },
+ "MF": {
+ "code": "MF",
+ "name": "Saint Martin",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇲🇫",
+ "flag_svg": "mf.svg"
+ },
+ "PM": {
+ "code": "PM",
+ "name": "Saint Pierre And Miquelon",
+ "currency": "EUR",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇵🇲",
+ "flag_svg": "pm.svg"
+ },
+ "VC": {
+ "code": "VC",
+ "name": "Saint Vincent And Grenadines",
+ "currency": "XCD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇻🇨",
+ "flag_svg": "vc.svg"
+ },
+ "WS": {
+ "code": "WS",
+ "name": "Samoa",
+ "currency": "WST",
+ "language": [
+ "sm",
+ "en"
+ ],
+ "flag": "🇼🇸",
+ "flag_svg": "ws.svg"
+ },
+ "SM": {
+ "code": "SM",
+ "name": "San Marino",
+ "currency": "EUR",
+ "language": [
+ "it"
+ ],
+ "flag": "🇸🇲",
+ "flag_svg": "sm.svg"
+ },
+ "ST": {
+ "code": "ST",
+ "name": "Sao Tome And Principe",
+ "currency": "STN",
+ "language": [
+ "pt"
+ ],
+ "flag": "🇸🇹",
+ "flag_svg": "st.svg"
+ },
+ "SA": {
+ "code": "SA",
+ "name": "Saudi Arabia",
+ "currency": "SAR",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇸🇦",
+ "flag_svg": "sa.svg"
+ },
+ "SN": {
+ "code": "SN",
+ "name": "Senegal",
+ "currency": "XOF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇸🇳",
+ "flag_svg": "sn.svg"
+ },
+ "RS": {
+ "code": "RS",
+ "name": "Serbia",
+ "currency": "RSD",
+ "language": [
+ "sr"
+ ],
+ "flag": "🇷🇸",
+ "flag_svg": "rs.svg"
+ },
+ "SC": {
+ "code": "SC",
+ "name": "Seychelles",
+ "currency": "SCR",
+ "language": [
+ "fr",
+ "en",
+ "crs"
+ ],
+ "flag": "🇸🇨",
+ "flag_svg": "sc.svg"
+ },
+ "SL": {
+ "code": "SL",
+ "name": "Sierra Leone",
+ "currency": "SLL",
+ "language": [
+ "en"
+ ],
+ "flag": "🇸🇱",
+ "flag_svg": "sl.svg"
+ },
+ "SG": {
+ "code": "SG",
+ "name": "Singapore",
+ "currency": "SGD",
+ "language": [
+ "en",
+ "ms",
+ "zh",
+ "ta"
+ ],
+ "flag": "🇸🇬",
+ "flag_svg": "sg.svg"
+ },
+ "SK": {
+ "code": "SK",
+ "name": "Slovakia",
+ "currency": "EUR",
+ "language": [
+ "sk"
+ ],
+ "flag": "🇸🇰",
+ "flag_svg": "sk.svg"
+ },
+ "SI": {
+ "code": "SI",
+ "name": "Slovenia",
+ "currency": "EUR",
+ "language": [
+ "sl"
+ ],
+ "flag": "🇸🇮",
+ "flag_svg": "si.svg"
+ },
+ "SB": {
+ "code": "SB",
+ "name": "Solomon Islands",
+ "currency": "SBD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇸🇧",
+ "flag_svg": "sb.svg"
+ },
+ "SO": {
+ "code": "SO",
+ "name": "Somalia",
+ "currency": "SOS",
+ "language": [
+ "so"
+ ],
+ "flag": "🇸🇴",
+ "flag_svg": "so.svg"
+ },
+ "ZA": {
+ "code": "ZA",
+ "name": "South Africa",
+ "currency": "ZAR",
+ "language": [
+ "en",
+ "zu",
+ "xh",
+ "af",
+ "nso",
+ "st",
+ "tn",
+ "ts",
+ "ss",
+ "ve",
+ "nr"
+ ],
+ "flag": "🇿🇦",
+ "flag_svg": "za.svg"
+ },
+ "GS": {
+ "code": "GS",
+ "name": "South Georgia And Sandwich Isl.",
+ "currency": "GBP",
+ "language": [
+ "en"
+ ],
+ "flag": "🇬🇸",
+ "flag_svg": "gs.svg"
+ },
+ "ES": {
+ "code": "ES",
+ "name": "Spain",
+ "currency": "EUR",
+ "language": [
+ "es"
+ ],
+ "flag": "🇪🇸",
+ "flag_svg": "es.svg"
+ },
+ "LK": {
+ "code": "LK",
+ "name": "Sri Lanka",
+ "currency": "LKR",
+ "language": [
+ "si",
+ "ta"
+ ],
+ "flag": "🇱🇰",
+ "flag_svg": "lk.svg"
+ },
+ "SD": {
+ "code": "SD",
+ "name": "Sudan",
+ "currency": "SDG",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇸🇩",
+ "flag_svg": "sd.svg"
+ },
+ "SR": {
+ "code": "SR",
+ "name": "Suriname",
+ "currency": "SRD",
+ "language": [
+ "nl"
+ ],
+ "flag": "🇸🇷",
+ "flag_svg": "sr.svg"
+ },
+ "SJ": {
+ "code": "SJ",
+ "name": "Svalbard And Jan Mayen",
+ "currency": "NOK",
+ "language": [
+ "no"
+ ],
+ "flag": "🇸🇯",
+ "flag_svg": "sj.svg"
+ },
+ "SZ": {
+ "code": "SZ",
+ "name": "Swaziland",
+ "currency": "SZL",
+ "language": [
+ "en",
+ "ss"
+ ],
+ "flag": "🇸🇿",
+ "flag_svg": "sz.svg"
+ },
+ "SE": {
+ "code": "SE",
+ "name": "Sweden",
+ "currency": "SEK",
+ "language": [
+ "sv"
+ ],
+ "flag": "🇸🇪",
+ "flag_svg": "se.svg"
+ },
+ "CH": {
+ "code": "CH",
+ "name": "Switzerland",
+ "currency": "CHF",
+ "language": [
+ "de",
+ "fr",
+ "it",
+ "rm"
+ ],
+ "flag": "🇨🇭",
+ "flag_svg": "ch.svg"
+ },
+ "SY": {
+ "code": "SY",
+ "name": "Syrian Arab Republic",
+ "currency": "SYP",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇸🇾",
+ "flag_svg": "sy.svg"
+ },
+ "TW": {
+ "code": "TW",
+ "name": "Taiwan",
+ "currency": "TWD",
+ "language": [
+ "zh"
+ ],
+ "flag": "🇹🇼",
+ "flag_svg": "tw.svg"
+ },
+ "TJ": {
+ "code": "TJ",
+ "name": "Tajikistan",
+ "currency": "TJS",
+ "language": [
+ "tg"
+ ],
+ "flag": "🇹🇯",
+ "flag_svg": "tj.svg"
+ },
+ "TZ": {
+ "code": "TZ",
+ "name": "Tanzania",
+ "currency": "TZS",
+ "language": [
+ "sw",
+ "en"
+ ],
+ "flag": "🇹🇿",
+ "flag_svg": "tz.svg"
+ },
+ "TH": {
+ "code": "TH",
+ "name": "Thailand",
+ "currency": "THB",
+ "language": [
+ "th"
+ ],
+ "flag": "🇹🇭",
+ "flag_svg": "th.svg"
+ },
+ "TL": {
+ "code": "TL",
+ "name": "Timor-Leste",
+ "currency": "USD",
+ "language": [
+ "pt",
+ "tet"
+ ],
+ "flag": "🇹🇱",
+ "flag_svg": "tl.svg"
+ },
+ "TG": {
+ "code": "TG",
+ "name": "Togo",
+ "currency": "XOF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇹🇬",
+ "flag_svg": "tg.svg"
+ },
+ "TK": {
+ "code": "TK",
+ "name": "Tokelau",
+ "currency": "NZD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇹🇰",
+ "flag_svg": "tk.svg"
+ },
+ "TO": {
+ "code": "TO",
+ "name": "Tonga",
+ "currency": "TOP",
+ "language": [
+ "to",
+ "en"
+ ],
+ "flag": "🇹🇴",
+ "flag_svg": "to.svg"
+ },
+ "TT": {
+ "code": "TT",
+ "name": "Trinidad And Tobago",
+ "currency": "TTD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇹🇹",
+ "flag_svg": "tt.svg"
+ },
+ "TN": {
+ "code": "TN",
+ "name": "Tunisia",
+ "currency": "TND",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇹🇳",
+ "flag_svg": "tn.svg"
+ },
+ "TR": {
+ "code": "TR",
+ "name": "Turkey",
+ "currency": "TRY",
+ "language": [
+ "tr"
+ ],
+ "flag": "🇹🇷",
+ "flag_svg": "tr.svg"
+ },
+ "TM": {
+ "code": "TM",
+ "name": "Turkmenistan",
+ "currency": "TMT",
+ "language": [
+ "tk"
+ ],
+ "flag": "🇹🇲",
+ "flag_svg": "tm.svg"
+ },
+ "TC": {
+ "code": "TC",
+ "name": "Turks And Caicos Islands",
+ "currency": "USD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇹🇨",
+ "flag_svg": "tc.svg"
+ },
+ "TV": {
+ "code": "TV",
+ "name": "Tuvalu",
+ "currency": "AUD",
+ "language": [
+ "tvl",
+ "en"
+ ],
+ "flag": "🇹🇻",
+ "flag_svg": "tv.svg"
+ },
+ "UG": {
+ "code": "UG",
+ "name": "Uganda",
+ "currency": "UGX",
+ "language": [
+ "en",
+ "sw"
+ ],
+ "flag": "🇺🇬",
+ "flag_svg": "ug.svg"
+ },
+ "UA": {
+ "code": "UA",
+ "name": "Ukraine",
+ "currency": "UAH",
+ "language": [
+ "uk"
+ ],
+ "flag": "🇺🇦",
+ "flag_svg": "ua.svg"
+ },
+ "AE": {
+ "code": "AE",
+ "name": "United Arab Emirates",
+ "currency": "AED",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇦🇪",
+ "flag_svg": "ae.svg"
+ },
+ "GB": {
+ "code": "GB",
+ "name": "United Kingdom",
+ "currency": "GBP",
+ "language": [
+ "en"
+ ],
+ "flag": "🇬🇧",
+ "flag_svg": "gb.svg"
+ },
+ "US": {
+ "code": "US",
+ "name": "United States",
+ "currency": "USD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇺🇸",
+ "flag_svg": "us.svg"
+ },
+ "UM": {
+ "code": "UM",
+ "name": "United States Outlying Islands",
+ "currency": "USD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇺🇲",
+ "flag_svg": "um.svg"
+ },
+ "UY": {
+ "code": "UY",
+ "name": "Uruguay",
+ "currency": "UYU",
+ "language": [
+ "es"
+ ],
+ "flag": "🇺🇾",
+ "flag_svg": "uy.svg"
+ },
+ "UZ": {
+ "code": "UZ",
+ "name": "Uzbekistan",
+ "currency": "UZS",
+ "language": [
+ "uz"
+ ],
+ "flag": "🇺🇿",
+ "flag_svg": "uz.svg"
+ },
+ "VU": {
+ "code": "VU",
+ "name": "Vanuatu",
+ "currency": "VUV",
+ "language": [
+ "bi",
+ "en",
+ "fr"
+ ],
+ "flag": "🇻🇺",
+ "flag_svg": "vu.svg"
+ },
+ "VE": {
+ "code": "VE",
+ "name": "Venezuela",
+ "currency": "VES",
+ "language": [
+ "es"
+ ],
+ "flag": "🇻🇪",
+ "flag_svg": "ve.svg"
+ },
+ "VN": {
+ "code": "VN",
+ "name": "Vietnam",
+ "currency": "VND",
+ "language": [
+ "vi"
+ ],
+ "flag": "🇻🇳",
+ "flag_svg": "vn.svg"
+ },
+ "VG": {
+ "code": "VG",
+ "name": "Virgin Islands, British",
+ "currency": "USD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇻🇬",
+ "flag_svg": "vg.svg"
+ },
+ "VI": {
+ "code": "VI",
+ "name": "Virgin Islands, U.S.",
+ "currency": "USD",
+ "language": [
+ "en"
+ ],
+ "flag": "🇻🇮",
+ "flag_svg": "vi.svg"
+ },
+ "WF": {
+ "code": "WF",
+ "name": "Wallis And Futuna",
+ "currency": "XPF",
+ "language": [
+ "fr"
+ ],
+ "flag": "🇼🇫",
+ "flag_svg": "wf.svg"
+ },
+ "EH": {
+ "code": "EH",
+ "name": "Western Sahara",
+ "currency": "MAD",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇪🇭",
+ "flag_svg": "eh.svg"
+ },
+ "YE": {
+ "code": "YE",
+ "name": "Yemen",
+ "currency": "YER",
+ "language": [
+ "ar"
+ ],
+ "flag": "🇾🇪",
+ "flag_svg": "ye.svg"
+ },
+ "ZM": {
+ "code": "ZM",
+ "name": "Zambia",
+ "currency": "ZMW",
+ "language": [
+ "en"
+ ],
+ "flag": "🇿🇲",
+ "flag_svg": "zm.svg"
+ },
+ "ZW": {
+ "code": "ZW",
+ "name": "Zimbabwe",
+ "currency": "ZWL",
+ "language": [
+ "en",
+ "sn",
+ "nd"
+ ],
+ "flag": "🇿🇼",
+ "flag_svg": "zw.svg"
+ }
+}
\ No newline at end of file
diff --git a/data/countries_min.json b/data/countries_min.json
new file mode 100644
index 0000000..02ce257
--- /dev/null
+++ b/data/countries_min.json
@@ -0,0 +1,986 @@
+{
+ "AF": {
+ "code": "AF",
+ "name": "Afghanistan"
+ },
+ "AX": {
+ "code": "AX",
+ "name": "Aland Islands"
+ },
+ "AL": {
+ "code": "AL",
+ "name": "Albania"
+ },
+ "DZ": {
+ "code": "DZ",
+ "name": "Algeria"
+ },
+ "AS": {
+ "code": "AS",
+ "name": "American Samoa"
+ },
+ "AD": {
+ "code": "AD",
+ "name": "Andorra"
+ },
+ "AO": {
+ "code": "AO",
+ "name": "Angola"
+ },
+ "AI": {
+ "code": "AI",
+ "name": "Anguilla"
+ },
+ "AQ": {
+ "code": "AQ",
+ "name": "Antarctica"
+ },
+ "AG": {
+ "code": "AG",
+ "name": "Antigua And Barbuda"
+ },
+ "AR": {
+ "code": "AR",
+ "name": "Argentina"
+ },
+ "AM": {
+ "code": "AM",
+ "name": "Armenia"
+ },
+ "AW": {
+ "code": "AW",
+ "name": "Aruba"
+ },
+ "AU": {
+ "code": "AU",
+ "name": "Australia"
+ },
+ "AT": {
+ "code": "AT",
+ "name": "Austria"
+ },
+ "AZ": {
+ "code": "AZ",
+ "name": "Azerbaijan"
+ },
+ "BS": {
+ "code": "BS",
+ "name": "Bahamas"
+ },
+ "BH": {
+ "code": "BH",
+ "name": "Bahrain"
+ },
+ "BD": {
+ "code": "BD",
+ "name": "Bangladesh"
+ },
+ "BB": {
+ "code": "BB",
+ "name": "Barbados"
+ },
+ "BY": {
+ "code": "BY",
+ "name": "Belarus"
+ },
+ "BE": {
+ "code": "BE",
+ "name": "Belgium"
+ },
+ "BZ": {
+ "code": "BZ",
+ "name": "Belize"
+ },
+ "BJ": {
+ "code": "BJ",
+ "name": "Benin"
+ },
+ "BM": {
+ "code": "BM",
+ "name": "Bermuda"
+ },
+ "BT": {
+ "code": "BT",
+ "name": "Bhutan"
+ },
+ "BO": {
+ "code": "BO",
+ "name": "Bolivia"
+ },
+ "BA": {
+ "code": "BA",
+ "name": "Bosnia And Herzegovina"
+ },
+ "BW": {
+ "code": "BW",
+ "name": "Botswana"
+ },
+ "BV": {
+ "code": "BV",
+ "name": "Bouvet Island"
+ },
+ "BR": {
+ "code": "BR",
+ "name": "Brazil"
+ },
+ "IO": {
+ "code": "IO",
+ "name": "British Indian Ocean Territory"
+ },
+ "BN": {
+ "code": "BN",
+ "name": "Brunei Darussalam"
+ },
+ "BG": {
+ "code": "BG",
+ "name": "Bulgaria"
+ },
+ "BF": {
+ "code": "BF",
+ "name": "Burkina Faso"
+ },
+ "BI": {
+ "code": "BI",
+ "name": "Burundi"
+ },
+ "KH": {
+ "code": "KH",
+ "name": "Cambodia"
+ },
+ "CM": {
+ "code": "CM",
+ "name": "Cameroon"
+ },
+ "CA": {
+ "code": "CA",
+ "name": "Canada"
+ },
+ "CV": {
+ "code": "CV",
+ "name": "Cape Verde"
+ },
+ "KY": {
+ "code": "KY",
+ "name": "Cayman Islands"
+ },
+ "CF": {
+ "code": "CF",
+ "name": "Central African Republic"
+ },
+ "TD": {
+ "code": "TD",
+ "name": "Chad"
+ },
+ "CL": {
+ "code": "CL",
+ "name": "Chile"
+ },
+ "CN": {
+ "code": "CN",
+ "name": "China"
+ },
+ "CX": {
+ "code": "CX",
+ "name": "Christmas Island"
+ },
+ "CC": {
+ "code": "CC",
+ "name": "Cocos (Keeling) Islands"
+ },
+ "CO": {
+ "code": "CO",
+ "name": "Colombia"
+ },
+ "KM": {
+ "code": "KM",
+ "name": "Comoros"
+ },
+ "CG": {
+ "code": "CG",
+ "name": "Congo"
+ },
+ "CD": {
+ "code": "CD",
+ "name": "Congo, Democratic Republic"
+ },
+ "CK": {
+ "code": "CK",
+ "name": "Cook Islands"
+ },
+ "CR": {
+ "code": "CR",
+ "name": "Costa Rica"
+ },
+ "CI": {
+ "code": "CI",
+ "name": "Cote D\"Ivoire"
+ },
+ "HR": {
+ "code": "HR",
+ "name": "Croatia"
+ },
+ "CU": {
+ "code": "CU",
+ "name": "Cuba"
+ },
+ "CY": {
+ "code": "CY",
+ "name": "Cyprus"
+ },
+ "CZ": {
+ "code": "CZ",
+ "name": "Czech Republic"
+ },
+ "DK": {
+ "code": "DK",
+ "name": "Denmark"
+ },
+ "DJ": {
+ "code": "DJ",
+ "name": "Djibouti"
+ },
+ "DM": {
+ "code": "DM",
+ "name": "Dominica"
+ },
+ "DO": {
+ "code": "DO",
+ "name": "Dominican Republic"
+ },
+ "EC": {
+ "code": "EC",
+ "name": "Ecuador"
+ },
+ "EG": {
+ "code": "EG",
+ "name": "Egypt"
+ },
+ "SV": {
+ "code": "SV",
+ "name": "El Salvador"
+ },
+ "GQ": {
+ "code": "GQ",
+ "name": "Equatorial Guinea"
+ },
+ "ER": {
+ "code": "ER",
+ "name": "Eritrea"
+ },
+ "EE": {
+ "code": "EE",
+ "name": "Estonia"
+ },
+ "ET": {
+ "code": "ET",
+ "name": "Ethiopia"
+ },
+ "FK": {
+ "code": "FK",
+ "name": "Falkland Islands (Malvinas)"
+ },
+ "FO": {
+ "code": "FO",
+ "name": "Faroe Islands"
+ },
+ "FJ": {
+ "code": "FJ",
+ "name": "Fiji"
+ },
+ "FI": {
+ "code": "FI",
+ "name": "Finland"
+ },
+ "FR": {
+ "code": "FR",
+ "name": "France"
+ },
+ "GF": {
+ "code": "GF",
+ "name": "French Guiana"
+ },
+ "PF": {
+ "code": "PF",
+ "name": "French Polynesia"
+ },
+ "TF": {
+ "code": "TF",
+ "name": "French Southern Territories"
+ },
+ "GA": {
+ "code": "GA",
+ "name": "Gabon"
+ },
+ "GM": {
+ "code": "GM",
+ "name": "Gambia"
+ },
+ "GE": {
+ "code": "GE",
+ "name": "Georgia"
+ },
+ "DE": {
+ "code": "DE",
+ "name": "Germany"
+ },
+ "GH": {
+ "code": "GH",
+ "name": "Ghana"
+ },
+ "GI": {
+ "code": "GI",
+ "name": "Gibraltar"
+ },
+ "GR": {
+ "code": "GR",
+ "name": "Greece"
+ },
+ "GL": {
+ "code": "GL",
+ "name": "Greenland"
+ },
+ "GD": {
+ "code": "GD",
+ "name": "Grenada"
+ },
+ "GP": {
+ "code": "GP",
+ "name": "Guadeloupe"
+ },
+ "GU": {
+ "code": "GU",
+ "name": "Guam"
+ },
+ "GT": {
+ "code": "GT",
+ "name": "Guatemala"
+ },
+ "GG": {
+ "code": "GG",
+ "name": "Guernsey"
+ },
+ "GN": {
+ "code": "GN",
+ "name": "Guinea"
+ },
+ "GW": {
+ "code": "GW",
+ "name": "Guinea-Bissau"
+ },
+ "GY": {
+ "code": "GY",
+ "name": "Guyana"
+ },
+ "HT": {
+ "code": "HT",
+ "name": "Haiti"
+ },
+ "HM": {
+ "code": "HM",
+ "name": "Heard Island & Mcdonald Islands"
+ },
+ "VA": {
+ "code": "VA",
+ "name": "Holy See (Vatican City State)"
+ },
+ "HN": {
+ "code": "HN",
+ "name": "Honduras"
+ },
+ "HK": {
+ "code": "HK",
+ "name": "Hong Kong"
+ },
+ "HU": {
+ "code": "HU",
+ "name": "Hungary"
+ },
+ "IS": {
+ "code": "IS",
+ "name": "Iceland"
+ },
+ "IN": {
+ "code": "IN",
+ "name": "India"
+ },
+ "ID": {
+ "code": "ID",
+ "name": "Indonesia"
+ },
+ "IR": {
+ "code": "IR",
+ "name": "Iran, Islamic Republic Of"
+ },
+ "IQ": {
+ "code": "IQ",
+ "name": "Iraq"
+ },
+ "IE": {
+ "code": "IE",
+ "name": "Ireland"
+ },
+ "IM": {
+ "code": "IM",
+ "name": "Isle Of Man"
+ },
+ "IL": {
+ "code": "IL",
+ "name": "Israel"
+ },
+ "IT": {
+ "code": "IT",
+ "name": "Italy"
+ },
+ "JM": {
+ "code": "JM",
+ "name": "Jamaica"
+ },
+ "JP": {
+ "code": "JP",
+ "name": "Japan"
+ },
+ "JE": {
+ "code": "JE",
+ "name": "Jersey"
+ },
+ "JO": {
+ "code": "JO",
+ "name": "Jordan"
+ },
+ "KZ": {
+ "code": "KZ",
+ "name": "Kazakhstan"
+ },
+ "KE": {
+ "code": "KE",
+ "name": "Kenya"
+ },
+ "KI": {
+ "code": "KI",
+ "name": "Kiribati"
+ },
+ "KR": {
+ "code": "KR",
+ "name": "Korea"
+ },
+ "KP": {
+ "code": "KP",
+ "name": "North Korea"
+ },
+ "KW": {
+ "code": "KW",
+ "name": "Kuwait"
+ },
+ "KG": {
+ "code": "KG",
+ "name": "Kyrgyzstan"
+ },
+ "LA": {
+ "code": "LA",
+ "name": "Lao People\"s Democratic Republic"
+ },
+ "LV": {
+ "code": "LV",
+ "name": "Latvia"
+ },
+ "LB": {
+ "code": "LB",
+ "name": "Lebanon"
+ },
+ "LS": {
+ "code": "LS",
+ "name": "Lesotho"
+ },
+ "LR": {
+ "code": "LR",
+ "name": "Liberia"
+ },
+ "LY": {
+ "code": "LY",
+ "name": "Libyan Arab Jamahiriya"
+ },
+ "LI": {
+ "code": "LI",
+ "name": "Liechtenstein"
+ },
+ "LT": {
+ "code": "LT",
+ "name": "Lithuania"
+ },
+ "LU": {
+ "code": "LU",
+ "name": "Luxembourg"
+ },
+ "MO": {
+ "code": "MO",
+ "name": "Macao"
+ },
+ "MK": {
+ "code": "MK",
+ "name": "Macedonia"
+ },
+ "MG": {
+ "code": "MG",
+ "name": "Madagascar"
+ },
+ "MW": {
+ "code": "MW",
+ "name": "Malawi"
+ },
+ "MY": {
+ "code": "MY",
+ "name": "Malaysia"
+ },
+ "MV": {
+ "code": "MV",
+ "name": "Maldives"
+ },
+ "ML": {
+ "code": "ML",
+ "name": "Mali"
+ },
+ "MT": {
+ "code": "MT",
+ "name": "Malta"
+ },
+ "MH": {
+ "code": "MH",
+ "name": "Marshall Islands"
+ },
+ "MQ": {
+ "code": "MQ",
+ "name": "Martinique"
+ },
+ "MR": {
+ "code": "MR",
+ "name": "Mauritania"
+ },
+ "MU": {
+ "code": "MU",
+ "name": "Mauritius"
+ },
+ "YT": {
+ "code": "YT",
+ "name": "Mayotte"
+ },
+ "MX": {
+ "code": "MX",
+ "name": "Mexico"
+ },
+ "FM": {
+ "code": "FM",
+ "name": "Micronesia, Federated States Of"
+ },
+ "MD": {
+ "code": "MD",
+ "name": "Moldova"
+ },
+ "MC": {
+ "code": "MC",
+ "name": "Monaco"
+ },
+ "MN": {
+ "code": "MN",
+ "name": "Mongolia"
+ },
+ "ME": {
+ "code": "ME",
+ "name": "Montenegro"
+ },
+ "MS": {
+ "code": "MS",
+ "name": "Montserrat"
+ },
+ "MA": {
+ "code": "MA",
+ "name": "Morocco"
+ },
+ "MZ": {
+ "code": "MZ",
+ "name": "Mozambique"
+ },
+ "MM": {
+ "code": "MM",
+ "name": "Myanmar"
+ },
+ "NA": {
+ "code": "NA",
+ "name": "Namibia"
+ },
+ "NR": {
+ "code": "NR",
+ "name": "Nauru"
+ },
+ "NP": {
+ "code": "NP",
+ "name": "Nepal"
+ },
+ "NL": {
+ "code": "NL",
+ "name": "Netherlands"
+ },
+ "AN": {
+ "code": "AN",
+ "name": "Netherlands Antilles"
+ },
+ "NC": {
+ "code": "NC",
+ "name": "New Caledonia"
+ },
+ "NZ": {
+ "code": "NZ",
+ "name": "New Zealand"
+ },
+ "NI": {
+ "code": "NI",
+ "name": "Nicaragua"
+ },
+ "NE": {
+ "code": "NE",
+ "name": "Niger"
+ },
+ "NG": {
+ "code": "NG",
+ "name": "Nigeria"
+ },
+ "NU": {
+ "code": "NU",
+ "name": "Niue"
+ },
+ "NF": {
+ "code": "NF",
+ "name": "Norfolk Island"
+ },
+ "MP": {
+ "code": "MP",
+ "name": "Northern Mariana Islands"
+ },
+ "NO": {
+ "code": "NO",
+ "name": "Norway"
+ },
+ "OM": {
+ "code": "OM",
+ "name": "Oman"
+ },
+ "PK": {
+ "code": "PK",
+ "name": "Pakistan"
+ },
+ "PW": {
+ "code": "PW",
+ "name": "Palau"
+ },
+ "PS": {
+ "code": "PS",
+ "name": "Palestinian Territory, Occupied"
+ },
+ "PA": {
+ "code": "PA",
+ "name": "Panama"
+ },
+ "PG": {
+ "code": "PG",
+ "name": "Papua New Guinea"
+ },
+ "PY": {
+ "code": "PY",
+ "name": "Paraguay"
+ },
+ "PE": {
+ "code": "PE",
+ "name": "Peru"
+ },
+ "PH": {
+ "code": "PH",
+ "name": "Philippines"
+ },
+ "PN": {
+ "code": "PN",
+ "name": "Pitcairn"
+ },
+ "PL": {
+ "code": "PL",
+ "name": "Poland"
+ },
+ "PT": {
+ "code": "PT",
+ "name": "Portugal"
+ },
+ "PR": {
+ "code": "PR",
+ "name": "Puerto Rico"
+ },
+ "QA": {
+ "code": "QA",
+ "name": "Qatar"
+ },
+ "RE": {
+ "code": "RE",
+ "name": "Reunion"
+ },
+ "RO": {
+ "code": "RO",
+ "name": "Romania"
+ },
+ "RU": {
+ "code": "RU",
+ "name": "Russian Federation"
+ },
+ "RW": {
+ "code": "RW",
+ "name": "Rwanda"
+ },
+ "BL": {
+ "code": "BL",
+ "name": "Saint Barthelemy"
+ },
+ "SH": {
+ "code": "SH",
+ "name": "Saint Helena"
+ },
+ "KN": {
+ "code": "KN",
+ "name": "Saint Kitts And Nevis"
+ },
+ "LC": {
+ "code": "LC",
+ "name": "Saint Lucia"
+ },
+ "MF": {
+ "code": "MF",
+ "name": "Saint Martin"
+ },
+ "PM": {
+ "code": "PM",
+ "name": "Saint Pierre And Miquelon"
+ },
+ "VC": {
+ "code": "VC",
+ "name": "Saint Vincent And Grenadines"
+ },
+ "WS": {
+ "code": "WS",
+ "name": "Samoa"
+ },
+ "SM": {
+ "code": "SM",
+ "name": "San Marino"
+ },
+ "ST": {
+ "code": "ST",
+ "name": "Sao Tome And Principe"
+ },
+ "SA": {
+ "code": "SA",
+ "name": "Saudi Arabia"
+ },
+ "SN": {
+ "code": "SN",
+ "name": "Senegal"
+ },
+ "RS": {
+ "code": "RS",
+ "name": "Serbia"
+ },
+ "SC": {
+ "code": "SC",
+ "name": "Seychelles"
+ },
+ "SL": {
+ "code": "SL",
+ "name": "Sierra Leone"
+ },
+ "SG": {
+ "code": "SG",
+ "name": "Singapore"
+ },
+ "SK": {
+ "code": "SK",
+ "name": "Slovakia"
+ },
+ "SI": {
+ "code": "SI",
+ "name": "Slovenia"
+ },
+ "SB": {
+ "code": "SB",
+ "name": "Solomon Islands"
+ },
+ "SO": {
+ "code": "SO",
+ "name": "Somalia"
+ },
+ "ZA": {
+ "code": "ZA",
+ "name": "South Africa"
+ },
+ "GS": {
+ "code": "GS",
+ "name": "South Georgia And Sandwich Isl."
+ },
+ "ES": {
+ "code": "ES",
+ "name": "Spain"
+ },
+ "LK": {
+ "code": "LK",
+ "name": "Sri Lanka"
+ },
+ "SD": {
+ "code": "SD",
+ "name": "Sudan"
+ },
+ "SR": {
+ "code": "SR",
+ "name": "Suriname"
+ },
+ "SJ": {
+ "code": "SJ",
+ "name": "Svalbard And Jan Mayen"
+ },
+ "SZ": {
+ "code": "SZ",
+ "name": "Swaziland"
+ },
+ "SE": {
+ "code": "SE",
+ "name": "Sweden"
+ },
+ "CH": {
+ "code": "CH",
+ "name": "Switzerland"
+ },
+ "SY": {
+ "code": "SY",
+ "name": "Syrian Arab Republic"
+ },
+ "TW": {
+ "code": "TW",
+ "name": "Taiwan"
+ },
+ "TJ": {
+ "code": "TJ",
+ "name": "Tajikistan"
+ },
+ "TZ": {
+ "code": "TZ",
+ "name": "Tanzania"
+ },
+ "TH": {
+ "code": "TH",
+ "name": "Thailand"
+ },
+ "TL": {
+ "code": "TL",
+ "name": "Timor-Leste"
+ },
+ "TG": {
+ "code": "TG",
+ "name": "Togo"
+ },
+ "TK": {
+ "code": "TK",
+ "name": "Tokelau"
+ },
+ "TO": {
+ "code": "TO",
+ "name": "Tonga"
+ },
+ "TT": {
+ "code": "TT",
+ "name": "Trinidad And Tobago"
+ },
+ "TN": {
+ "code": "TN",
+ "name": "Tunisia"
+ },
+ "TR": {
+ "code": "TR",
+ "name": "Turkey"
+ },
+ "TM": {
+ "code": "TM",
+ "name": "Turkmenistan"
+ },
+ "TC": {
+ "code": "TC",
+ "name": "Turks And Caicos Islands"
+ },
+ "TV": {
+ "code": "TV",
+ "name": "Tuvalu"
+ },
+ "UG": {
+ "code": "UG",
+ "name": "Uganda"
+ },
+ "UA": {
+ "code": "UA",
+ "name": "Ukraine"
+ },
+ "AE": {
+ "code": "AE",
+ "name": "United Arab Emirates"
+ },
+ "GB": {
+ "code": "GB",
+ "name": "United Kingdom"
+ },
+ "US": {
+ "code": "US",
+ "name": "United States"
+ },
+ "UM": {
+ "code": "UM",
+ "name": "United States Outlying Islands"
+ },
+ "UY": {
+ "code": "UY",
+ "name": "Uruguay"
+ },
+ "UZ": {
+ "code": "UZ",
+ "name": "Uzbekistan"
+ },
+ "VU": {
+ "code": "VU",
+ "name": "Vanuatu"
+ },
+ "VE": {
+ "code": "VE",
+ "name": "Venezuela"
+ },
+ "VN": {
+ "code": "VN",
+ "name": "Vietnam"
+ },
+ "VG": {
+ "code": "VG",
+ "name": "Virgin Islands, British"
+ },
+ "VI": {
+ "code": "VI",
+ "name": "Virgin Islands, U.S."
+ },
+ "WF": {
+ "code": "WF",
+ "name": "Wallis And Futuna"
+ },
+ "EH": {
+ "code": "EH",
+ "name": "Western Sahara"
+ },
+ "YE": {
+ "code": "YE",
+ "name": "Yemen"
+ },
+ "ZM": {
+ "code": "ZM",
+ "name": "Zambia"
+ },
+ "ZW": {
+ "code": "ZW",
+ "name": "Zimbabwe"
+ }
+}
diff --git a/data/flags/ad.svg b/data/flags/ad.svg
new file mode 100644
index 0000000..655fc8a
--- /dev/null
+++ b/data/flags/ad.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ae.svg b/data/flags/ae.svg
new file mode 100644
index 0000000..92be1eb
--- /dev/null
+++ b/data/flags/ae.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/af.svg b/data/flags/af.svg
new file mode 100644
index 0000000..d9e49f9
--- /dev/null
+++ b/data/flags/af.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ag.svg b/data/flags/ag.svg
new file mode 100644
index 0000000..f60599e
--- /dev/null
+++ b/data/flags/ag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ai.svg b/data/flags/ai.svg
new file mode 100644
index 0000000..429ce3b
--- /dev/null
+++ b/data/flags/ai.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/al.svg b/data/flags/al.svg
new file mode 100644
index 0000000..f8d5550
--- /dev/null
+++ b/data/flags/al.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/am.svg b/data/flags/am.svg
new file mode 100644
index 0000000..1e74af0
--- /dev/null
+++ b/data/flags/am.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ao.svg b/data/flags/ao.svg
new file mode 100644
index 0000000..6384b44
--- /dev/null
+++ b/data/flags/ao.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/aq.svg b/data/flags/aq.svg
new file mode 100644
index 0000000..cef722d
--- /dev/null
+++ b/data/flags/aq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ar.svg b/data/flags/ar.svg
new file mode 100644
index 0000000..db54af5
--- /dev/null
+++ b/data/flags/ar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/as.svg b/data/flags/as.svg
new file mode 100644
index 0000000..4d66615
--- /dev/null
+++ b/data/flags/as.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/at.svg b/data/flags/at.svg
new file mode 100644
index 0000000..1229a26
--- /dev/null
+++ b/data/flags/at.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/au.svg b/data/flags/au.svg
new file mode 100644
index 0000000..38a47de
--- /dev/null
+++ b/data/flags/au.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/aw.svg b/data/flags/aw.svg
new file mode 100644
index 0000000..a80f4e7
--- /dev/null
+++ b/data/flags/aw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ax.svg b/data/flags/ax.svg
new file mode 100644
index 0000000..3af6b6e
--- /dev/null
+++ b/data/flags/ax.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/az.svg b/data/flags/az.svg
new file mode 100644
index 0000000..f88d080
--- /dev/null
+++ b/data/flags/az.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ba.svg b/data/flags/ba.svg
new file mode 100644
index 0000000..177c78d
--- /dev/null
+++ b/data/flags/ba.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bb.svg b/data/flags/bb.svg
new file mode 100644
index 0000000..820297a
--- /dev/null
+++ b/data/flags/bb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bd.svg b/data/flags/bd.svg
new file mode 100644
index 0000000..8cf230b
--- /dev/null
+++ b/data/flags/bd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/be.svg b/data/flags/be.svg
new file mode 100644
index 0000000..107b639
--- /dev/null
+++ b/data/flags/be.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bf.svg b/data/flags/bf.svg
new file mode 100644
index 0000000..3a649ae
--- /dev/null
+++ b/data/flags/bf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bg.svg b/data/flags/bg.svg
new file mode 100644
index 0000000..541c9e5
--- /dev/null
+++ b/data/flags/bg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bh.svg b/data/flags/bh.svg
new file mode 100644
index 0000000..5ec7560
--- /dev/null
+++ b/data/flags/bh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bi.svg b/data/flags/bi.svg
new file mode 100644
index 0000000..2b796ab
--- /dev/null
+++ b/data/flags/bi.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bj.svg b/data/flags/bj.svg
new file mode 100644
index 0000000..b8d1bd2
--- /dev/null
+++ b/data/flags/bj.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bl.svg b/data/flags/bl.svg
new file mode 100644
index 0000000..64cc17f
--- /dev/null
+++ b/data/flags/bl.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bm.svg b/data/flags/bm.svg
new file mode 100644
index 0000000..1059eae
--- /dev/null
+++ b/data/flags/bm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bn.svg b/data/flags/bn.svg
new file mode 100644
index 0000000..98ce7f8
--- /dev/null
+++ b/data/flags/bn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bo.svg b/data/flags/bo.svg
new file mode 100644
index 0000000..3bf24b0
--- /dev/null
+++ b/data/flags/bo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/br.svg b/data/flags/br.svg
new file mode 100644
index 0000000..203e64d
--- /dev/null
+++ b/data/flags/br.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bs.svg b/data/flags/bs.svg
new file mode 100644
index 0000000..852306a
--- /dev/null
+++ b/data/flags/bs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bt.svg b/data/flags/bt.svg
new file mode 100644
index 0000000..16045d0
--- /dev/null
+++ b/data/flags/bt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bv.svg b/data/flags/bv.svg
new file mode 100644
index 0000000..ebb8fbd
--- /dev/null
+++ b/data/flags/bv.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bw.svg b/data/flags/bw.svg
new file mode 100644
index 0000000..4c60233
--- /dev/null
+++ b/data/flags/bw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/by.svg b/data/flags/by.svg
new file mode 100644
index 0000000..b5afd5b
--- /dev/null
+++ b/data/flags/by.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/bz.svg b/data/flags/bz.svg
new file mode 100644
index 0000000..0f53853
--- /dev/null
+++ b/data/flags/bz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ca.svg b/data/flags/ca.svg
new file mode 100644
index 0000000..154cb19
--- /dev/null
+++ b/data/flags/ca.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cc.svg b/data/flags/cc.svg
new file mode 100644
index 0000000..0e35450
--- /dev/null
+++ b/data/flags/cc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cd.svg b/data/flags/cd.svg
new file mode 100644
index 0000000..5892af0
--- /dev/null
+++ b/data/flags/cd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cf.svg b/data/flags/cf.svg
new file mode 100644
index 0000000..e23b567
--- /dev/null
+++ b/data/flags/cf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cg.svg b/data/flags/cg.svg
new file mode 100644
index 0000000..c383ee8
--- /dev/null
+++ b/data/flags/cg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ch.svg b/data/flags/ch.svg
new file mode 100644
index 0000000..f7833a5
--- /dev/null
+++ b/data/flags/ch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ci.svg b/data/flags/ci.svg
new file mode 100644
index 0000000..4448319
--- /dev/null
+++ b/data/flags/ci.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ck.svg b/data/flags/ck.svg
new file mode 100644
index 0000000..237aa87
--- /dev/null
+++ b/data/flags/ck.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cl.svg b/data/flags/cl.svg
new file mode 100644
index 0000000..1cbed43
--- /dev/null
+++ b/data/flags/cl.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cm.svg b/data/flags/cm.svg
new file mode 100644
index 0000000..04a5c7f
--- /dev/null
+++ b/data/flags/cm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cn.svg b/data/flags/cn.svg
new file mode 100644
index 0000000..3227c3d
--- /dev/null
+++ b/data/flags/cn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/co.svg b/data/flags/co.svg
new file mode 100644
index 0000000..2f3901d
--- /dev/null
+++ b/data/flags/co.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cr.svg b/data/flags/cr.svg
new file mode 100644
index 0000000..d0b9fb1
--- /dev/null
+++ b/data/flags/cr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cu.svg b/data/flags/cu.svg
new file mode 100644
index 0000000..6777e9c
--- /dev/null
+++ b/data/flags/cu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cv.svg b/data/flags/cv.svg
new file mode 100644
index 0000000..0fd3001
--- /dev/null
+++ b/data/flags/cv.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cx.svg b/data/flags/cx.svg
new file mode 100644
index 0000000..8c79df8
--- /dev/null
+++ b/data/flags/cx.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cy.svg b/data/flags/cy.svg
new file mode 100644
index 0000000..c81cc8f
--- /dev/null
+++ b/data/flags/cy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/cz.svg b/data/flags/cz.svg
new file mode 100644
index 0000000..3915399
--- /dev/null
+++ b/data/flags/cz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/de.svg b/data/flags/de.svg
new file mode 100644
index 0000000..60e5efc
--- /dev/null
+++ b/data/flags/de.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/dj.svg b/data/flags/dj.svg
new file mode 100644
index 0000000..6b96f37
--- /dev/null
+++ b/data/flags/dj.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/dk.svg b/data/flags/dk.svg
new file mode 100644
index 0000000..1ecf992
--- /dev/null
+++ b/data/flags/dk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/dm.svg b/data/flags/dm.svg
new file mode 100644
index 0000000..b11ebe5
--- /dev/null
+++ b/data/flags/dm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/do.svg b/data/flags/do.svg
new file mode 100644
index 0000000..3ed50b6
--- /dev/null
+++ b/data/flags/do.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/dz.svg b/data/flags/dz.svg
new file mode 100644
index 0000000..2b23ca4
--- /dev/null
+++ b/data/flags/dz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ec.svg b/data/flags/ec.svg
new file mode 100644
index 0000000..61979d7
--- /dev/null
+++ b/data/flags/ec.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ee.svg b/data/flags/ee.svg
new file mode 100644
index 0000000..2b64555
--- /dev/null
+++ b/data/flags/ee.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/eg.svg b/data/flags/eg.svg
new file mode 100644
index 0000000..95fdd19
--- /dev/null
+++ b/data/flags/eg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/eh.svg b/data/flags/eh.svg
new file mode 100644
index 0000000..de9ede4
--- /dev/null
+++ b/data/flags/eh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/er.svg b/data/flags/er.svg
new file mode 100644
index 0000000..8cb5783
--- /dev/null
+++ b/data/flags/er.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/es.svg b/data/flags/es.svg
new file mode 100644
index 0000000..8e6e4c2
--- /dev/null
+++ b/data/flags/es.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/et.svg b/data/flags/et.svg
new file mode 100644
index 0000000..53e79aa
--- /dev/null
+++ b/data/flags/et.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/fi.svg b/data/flags/fi.svg
new file mode 100644
index 0000000..cc3510e
--- /dev/null
+++ b/data/flags/fi.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/fj.svg b/data/flags/fj.svg
new file mode 100644
index 0000000..6eebe60
--- /dev/null
+++ b/data/flags/fj.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/fk.svg b/data/flags/fk.svg
new file mode 100644
index 0000000..08209e8
--- /dev/null
+++ b/data/flags/fk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/fm.svg b/data/flags/fm.svg
new file mode 100644
index 0000000..09532fa
--- /dev/null
+++ b/data/flags/fm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/fo.svg b/data/flags/fo.svg
new file mode 100644
index 0000000..1e962c5
--- /dev/null
+++ b/data/flags/fo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/fr.svg b/data/flags/fr.svg
new file mode 100644
index 0000000..6eb0e18
--- /dev/null
+++ b/data/flags/fr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ga.svg b/data/flags/ga.svg
new file mode 100644
index 0000000..3fd1d25
--- /dev/null
+++ b/data/flags/ga.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gb.svg b/data/flags/gb.svg
new file mode 100644
index 0000000..82b1fad
--- /dev/null
+++ b/data/flags/gb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gd.svg b/data/flags/gd.svg
new file mode 100644
index 0000000..bc51894
--- /dev/null
+++ b/data/flags/gd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ge.svg b/data/flags/ge.svg
new file mode 100644
index 0000000..7e0459b
--- /dev/null
+++ b/data/flags/ge.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gf.svg b/data/flags/gf.svg
new file mode 100644
index 0000000..cbe2c8c
--- /dev/null
+++ b/data/flags/gf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gg.svg b/data/flags/gg.svg
new file mode 100644
index 0000000..9e482a9
--- /dev/null
+++ b/data/flags/gg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gh.svg b/data/flags/gh.svg
new file mode 100644
index 0000000..fae8956
--- /dev/null
+++ b/data/flags/gh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gi.svg b/data/flags/gi.svg
new file mode 100644
index 0000000..400c8d0
--- /dev/null
+++ b/data/flags/gi.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gl.svg b/data/flags/gl.svg
new file mode 100644
index 0000000..2e355e8
--- /dev/null
+++ b/data/flags/gl.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gm.svg b/data/flags/gm.svg
new file mode 100644
index 0000000..5949185
--- /dev/null
+++ b/data/flags/gm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gn.svg b/data/flags/gn.svg
new file mode 100644
index 0000000..9967a7b
--- /dev/null
+++ b/data/flags/gn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gp.svg b/data/flags/gp.svg
new file mode 100644
index 0000000..250d60b
--- /dev/null
+++ b/data/flags/gp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gq.svg b/data/flags/gq.svg
new file mode 100644
index 0000000..459b5a1
--- /dev/null
+++ b/data/flags/gq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gr.svg b/data/flags/gr.svg
new file mode 100644
index 0000000..e3a582c
--- /dev/null
+++ b/data/flags/gr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gs.svg b/data/flags/gs.svg
new file mode 100644
index 0000000..56e473d
--- /dev/null
+++ b/data/flags/gs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gt.svg b/data/flags/gt.svg
new file mode 100644
index 0000000..b784b27
--- /dev/null
+++ b/data/flags/gt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gu.svg b/data/flags/gu.svg
new file mode 100644
index 0000000..ca41e91
--- /dev/null
+++ b/data/flags/gu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gw.svg b/data/flags/gw.svg
new file mode 100644
index 0000000..808b89c
--- /dev/null
+++ b/data/flags/gw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/gy.svg b/data/flags/gy.svg
new file mode 100644
index 0000000..d48e314
--- /dev/null
+++ b/data/flags/gy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/hk.svg b/data/flags/hk.svg
new file mode 100644
index 0000000..c4287fd
--- /dev/null
+++ b/data/flags/hk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/hm.svg b/data/flags/hm.svg
new file mode 100644
index 0000000..f6e4097
--- /dev/null
+++ b/data/flags/hm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/hn.svg b/data/flags/hn.svg
new file mode 100644
index 0000000..3ddeb2c
--- /dev/null
+++ b/data/flags/hn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/hr.svg b/data/flags/hr.svg
new file mode 100644
index 0000000..ad24ab9
--- /dev/null
+++ b/data/flags/hr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ht.svg b/data/flags/ht.svg
new file mode 100644
index 0000000..b6ca967
--- /dev/null
+++ b/data/flags/ht.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/hu.svg b/data/flags/hu.svg
new file mode 100644
index 0000000..af28885
--- /dev/null
+++ b/data/flags/hu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/id.svg b/data/flags/id.svg
new file mode 100644
index 0000000..08c1098
--- /dev/null
+++ b/data/flags/id.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ie.svg b/data/flags/ie.svg
new file mode 100644
index 0000000..ff76bd8
--- /dev/null
+++ b/data/flags/ie.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/il.svg b/data/flags/il.svg
new file mode 100644
index 0000000..de884ea
--- /dev/null
+++ b/data/flags/il.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/im.svg b/data/flags/im.svg
new file mode 100644
index 0000000..d86c844
--- /dev/null
+++ b/data/flags/im.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/in.svg b/data/flags/in.svg
new file mode 100644
index 0000000..5217928
--- /dev/null
+++ b/data/flags/in.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/io.svg b/data/flags/io.svg
new file mode 100644
index 0000000..1f15f04
--- /dev/null
+++ b/data/flags/io.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/iq.svg b/data/flags/iq.svg
new file mode 100644
index 0000000..2b62c58
--- /dev/null
+++ b/data/flags/iq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ir.svg b/data/flags/ir.svg
new file mode 100644
index 0000000..272eff0
--- /dev/null
+++ b/data/flags/ir.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/is.svg b/data/flags/is.svg
new file mode 100644
index 0000000..c1d7fc3
--- /dev/null
+++ b/data/flags/is.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/it.svg b/data/flags/it.svg
new file mode 100644
index 0000000..5541378
--- /dev/null
+++ b/data/flags/it.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/je.svg b/data/flags/je.svg
new file mode 100644
index 0000000..90e7368
--- /dev/null
+++ b/data/flags/je.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/jm.svg b/data/flags/jm.svg
new file mode 100644
index 0000000..7273742
--- /dev/null
+++ b/data/flags/jm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/jo.svg b/data/flags/jo.svg
new file mode 100644
index 0000000..5a4eccf
--- /dev/null
+++ b/data/flags/jo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/jp.svg b/data/flags/jp.svg
new file mode 100644
index 0000000..0f02949
--- /dev/null
+++ b/data/flags/jp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ke.svg b/data/flags/ke.svg
new file mode 100644
index 0000000..370a13f
--- /dev/null
+++ b/data/flags/ke.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/kg.svg b/data/flags/kg.svg
new file mode 100644
index 0000000..fccd639
--- /dev/null
+++ b/data/flags/kg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/kh.svg b/data/flags/kh.svg
new file mode 100644
index 0000000..828e54a
--- /dev/null
+++ b/data/flags/kh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ki.svg b/data/flags/ki.svg
new file mode 100644
index 0000000..ff58c03
--- /dev/null
+++ b/data/flags/ki.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/km.svg b/data/flags/km.svg
new file mode 100644
index 0000000..88f36bf
--- /dev/null
+++ b/data/flags/km.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/kn.svg b/data/flags/kn.svg
new file mode 100644
index 0000000..8764dd7
--- /dev/null
+++ b/data/flags/kn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/kp.svg b/data/flags/kp.svg
new file mode 100644
index 0000000..42affa7
--- /dev/null
+++ b/data/flags/kp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/kr.svg b/data/flags/kr.svg
new file mode 100644
index 0000000..a44c6e1
--- /dev/null
+++ b/data/flags/kr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/kw.svg b/data/flags/kw.svg
new file mode 100644
index 0000000..b4bffef
--- /dev/null
+++ b/data/flags/kw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ky.svg b/data/flags/ky.svg
new file mode 100644
index 0000000..ad1e433
--- /dev/null
+++ b/data/flags/ky.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/kz.svg b/data/flags/kz.svg
new file mode 100644
index 0000000..96855b0
--- /dev/null
+++ b/data/flags/kz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/la.svg b/data/flags/la.svg
new file mode 100644
index 0000000..0f596b2
--- /dev/null
+++ b/data/flags/la.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/lb.svg b/data/flags/lb.svg
new file mode 100644
index 0000000..f69dfa6
--- /dev/null
+++ b/data/flags/lb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/lc.svg b/data/flags/lc.svg
new file mode 100644
index 0000000..887ad78
--- /dev/null
+++ b/data/flags/lc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/li.svg b/data/flags/li.svg
new file mode 100644
index 0000000..9cd6ae1
--- /dev/null
+++ b/data/flags/li.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/lk.svg b/data/flags/lk.svg
new file mode 100644
index 0000000..33f6e09
--- /dev/null
+++ b/data/flags/lk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/lr.svg b/data/flags/lr.svg
new file mode 100644
index 0000000..660ab03
--- /dev/null
+++ b/data/flags/lr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ls.svg b/data/flags/ls.svg
new file mode 100644
index 0000000..0dc59f9
--- /dev/null
+++ b/data/flags/ls.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/lt.svg b/data/flags/lt.svg
new file mode 100644
index 0000000..90a3ec1
--- /dev/null
+++ b/data/flags/lt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/lu.svg b/data/flags/lu.svg
new file mode 100644
index 0000000..b754681
--- /dev/null
+++ b/data/flags/lu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/lv.svg b/data/flags/lv.svg
new file mode 100644
index 0000000..0037f27
--- /dev/null
+++ b/data/flags/lv.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ly.svg b/data/flags/ly.svg
new file mode 100644
index 0000000..8c9ee58
--- /dev/null
+++ b/data/flags/ly.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ma.svg b/data/flags/ma.svg
new file mode 100644
index 0000000..d6b54a3
--- /dev/null
+++ b/data/flags/ma.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mc.svg b/data/flags/mc.svg
new file mode 100644
index 0000000..395adc5
--- /dev/null
+++ b/data/flags/mc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/md.svg b/data/flags/md.svg
new file mode 100644
index 0000000..6fc8296
--- /dev/null
+++ b/data/flags/md.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/me.svg b/data/flags/me.svg
new file mode 100644
index 0000000..8b3f1ab
--- /dev/null
+++ b/data/flags/me.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mf.svg b/data/flags/mf.svg
new file mode 100644
index 0000000..6eb0e18
--- /dev/null
+++ b/data/flags/mf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mg.svg b/data/flags/mg.svg
new file mode 100644
index 0000000..d83543f
--- /dev/null
+++ b/data/flags/mg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mh.svg b/data/flags/mh.svg
new file mode 100644
index 0000000..4ca4b66
--- /dev/null
+++ b/data/flags/mh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mk.svg b/data/flags/mk.svg
new file mode 100644
index 0000000..e10ed70
--- /dev/null
+++ b/data/flags/mk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ml.svg b/data/flags/ml.svg
new file mode 100644
index 0000000..df345c2
--- /dev/null
+++ b/data/flags/ml.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mm.svg b/data/flags/mm.svg
new file mode 100644
index 0000000..4509bb3
--- /dev/null
+++ b/data/flags/mm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mn.svg b/data/flags/mn.svg
new file mode 100644
index 0000000..f1805f8
--- /dev/null
+++ b/data/flags/mn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mo.svg b/data/flags/mo.svg
new file mode 100644
index 0000000..739c35b
--- /dev/null
+++ b/data/flags/mo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mp.svg b/data/flags/mp.svg
new file mode 100644
index 0000000..645fab7
--- /dev/null
+++ b/data/flags/mp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mq.svg b/data/flags/mq.svg
new file mode 100644
index 0000000..0e5c3ce
--- /dev/null
+++ b/data/flags/mq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mr.svg b/data/flags/mr.svg
new file mode 100644
index 0000000..8c37859
--- /dev/null
+++ b/data/flags/mr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ms.svg b/data/flags/ms.svg
new file mode 100644
index 0000000..0c199ca
--- /dev/null
+++ b/data/flags/ms.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mt.svg b/data/flags/mt.svg
new file mode 100644
index 0000000..a880f1f
--- /dev/null
+++ b/data/flags/mt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mu.svg b/data/flags/mu.svg
new file mode 100644
index 0000000..7b1af9c
--- /dev/null
+++ b/data/flags/mu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mv.svg b/data/flags/mv.svg
new file mode 100644
index 0000000..82f77be
--- /dev/null
+++ b/data/flags/mv.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mw.svg b/data/flags/mw.svg
new file mode 100644
index 0000000..2c80884
--- /dev/null
+++ b/data/flags/mw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mx.svg b/data/flags/mx.svg
new file mode 100644
index 0000000..b82436b
--- /dev/null
+++ b/data/flags/mx.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/my.svg b/data/flags/my.svg
new file mode 100644
index 0000000..bb160fd
--- /dev/null
+++ b/data/flags/my.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/mz.svg b/data/flags/mz.svg
new file mode 100644
index 0000000..29e8856
--- /dev/null
+++ b/data/flags/mz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/na.svg b/data/flags/na.svg
new file mode 100644
index 0000000..472a82e
--- /dev/null
+++ b/data/flags/na.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/nc.svg b/data/flags/nc.svg
new file mode 100644
index 0000000..35a2125
--- /dev/null
+++ b/data/flags/nc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ne.svg b/data/flags/ne.svg
new file mode 100644
index 0000000..3da7314
--- /dev/null
+++ b/data/flags/ne.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/nf.svg b/data/flags/nf.svg
new file mode 100644
index 0000000..959a85b
--- /dev/null
+++ b/data/flags/nf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ng.svg b/data/flags/ng.svg
new file mode 100644
index 0000000..ca4a19f
--- /dev/null
+++ b/data/flags/ng.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ni.svg b/data/flags/ni.svg
new file mode 100644
index 0000000..f1d41a1
--- /dev/null
+++ b/data/flags/ni.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/nl.svg b/data/flags/nl.svg
new file mode 100644
index 0000000..6598c0b
--- /dev/null
+++ b/data/flags/nl.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/no.svg b/data/flags/no.svg
new file mode 100644
index 0000000..ebb8fbd
--- /dev/null
+++ b/data/flags/no.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/np.svg b/data/flags/np.svg
new file mode 100644
index 0000000..ae7b651
--- /dev/null
+++ b/data/flags/np.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/nr.svg b/data/flags/nr.svg
new file mode 100644
index 0000000..22e5bc4
--- /dev/null
+++ b/data/flags/nr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/nu.svg b/data/flags/nu.svg
new file mode 100644
index 0000000..cd34cea
--- /dev/null
+++ b/data/flags/nu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/nz.svg b/data/flags/nz.svg
new file mode 100644
index 0000000..4f6af3c
--- /dev/null
+++ b/data/flags/nz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/om.svg b/data/flags/om.svg
new file mode 100644
index 0000000..9b80e4b
--- /dev/null
+++ b/data/flags/om.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pa.svg b/data/flags/pa.svg
new file mode 100644
index 0000000..c625603
--- /dev/null
+++ b/data/flags/pa.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pe.svg b/data/flags/pe.svg
new file mode 100644
index 0000000..93618a3
--- /dev/null
+++ b/data/flags/pe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pf.svg b/data/flags/pf.svg
new file mode 100644
index 0000000..eb69b3c
--- /dev/null
+++ b/data/flags/pf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pg.svg b/data/flags/pg.svg
new file mode 100644
index 0000000..aa5a7b7
--- /dev/null
+++ b/data/flags/pg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ph.svg b/data/flags/ph.svg
new file mode 100644
index 0000000..be4ac14
--- /dev/null
+++ b/data/flags/ph.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pk.svg b/data/flags/pk.svg
new file mode 100644
index 0000000..91cd2f1
--- /dev/null
+++ b/data/flags/pk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pl.svg b/data/flags/pl.svg
new file mode 100644
index 0000000..4a39bfa
--- /dev/null
+++ b/data/flags/pl.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pm.svg b/data/flags/pm.svg
new file mode 100644
index 0000000..1780f1e
--- /dev/null
+++ b/data/flags/pm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pn.svg b/data/flags/pn.svg
new file mode 100644
index 0000000..35f2a3d
--- /dev/null
+++ b/data/flags/pn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pr.svg b/data/flags/pr.svg
new file mode 100644
index 0000000..5ed5f8a
--- /dev/null
+++ b/data/flags/pr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ps.svg b/data/flags/ps.svg
new file mode 100644
index 0000000..786c8ca
--- /dev/null
+++ b/data/flags/ps.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pt.svg b/data/flags/pt.svg
new file mode 100644
index 0000000..0c610be
--- /dev/null
+++ b/data/flags/pt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/pw.svg b/data/flags/pw.svg
new file mode 100644
index 0000000..7ab6c75
--- /dev/null
+++ b/data/flags/pw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/py.svg b/data/flags/py.svg
new file mode 100644
index 0000000..63f38a7
--- /dev/null
+++ b/data/flags/py.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/qa.svg b/data/flags/qa.svg
new file mode 100644
index 0000000..65b2184
--- /dev/null
+++ b/data/flags/qa.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/re.svg b/data/flags/re.svg
new file mode 100644
index 0000000..7df5606
--- /dev/null
+++ b/data/flags/re.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ro.svg b/data/flags/ro.svg
new file mode 100644
index 0000000..8dc2848
--- /dev/null
+++ b/data/flags/ro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/rs.svg b/data/flags/rs.svg
new file mode 100644
index 0000000..40c9d6d
--- /dev/null
+++ b/data/flags/rs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ru.svg b/data/flags/ru.svg
new file mode 100644
index 0000000..9c0cc49
--- /dev/null
+++ b/data/flags/ru.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/rw.svg b/data/flags/rw.svg
new file mode 100644
index 0000000..d237941
--- /dev/null
+++ b/data/flags/rw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sa.svg b/data/flags/sa.svg
new file mode 100644
index 0000000..5eee1b5
--- /dev/null
+++ b/data/flags/sa.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sb.svg b/data/flags/sb.svg
new file mode 100644
index 0000000..e4bb3ff
--- /dev/null
+++ b/data/flags/sb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sc.svg b/data/flags/sc.svg
new file mode 100644
index 0000000..ea40823
--- /dev/null
+++ b/data/flags/sc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sd.svg b/data/flags/sd.svg
new file mode 100644
index 0000000..477877f
--- /dev/null
+++ b/data/flags/sd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/se.svg b/data/flags/se.svg
new file mode 100644
index 0000000..b32a8f9
--- /dev/null
+++ b/data/flags/se.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sg.svg b/data/flags/sg.svg
new file mode 100644
index 0000000..4d4a817
--- /dev/null
+++ b/data/flags/sg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sh.svg b/data/flags/sh.svg
new file mode 100644
index 0000000..d4431b7
--- /dev/null
+++ b/data/flags/sh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/si.svg b/data/flags/si.svg
new file mode 100644
index 0000000..bb23bb3
--- /dev/null
+++ b/data/flags/si.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sj.svg b/data/flags/sj.svg
new file mode 100644
index 0000000..ebb8fbd
--- /dev/null
+++ b/data/flags/sj.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sk.svg b/data/flags/sk.svg
new file mode 100644
index 0000000..2abe6f4
--- /dev/null
+++ b/data/flags/sk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sl.svg b/data/flags/sl.svg
new file mode 100644
index 0000000..ee46023
--- /dev/null
+++ b/data/flags/sl.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sm.svg b/data/flags/sm.svg
new file mode 100644
index 0000000..98fdaf4
--- /dev/null
+++ b/data/flags/sm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sn.svg b/data/flags/sn.svg
new file mode 100644
index 0000000..3860b33
--- /dev/null
+++ b/data/flags/sn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/so.svg b/data/flags/so.svg
new file mode 100644
index 0000000..44ce2fd
--- /dev/null
+++ b/data/flags/so.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sr.svg b/data/flags/sr.svg
new file mode 100644
index 0000000..117d76d
--- /dev/null
+++ b/data/flags/sr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/st.svg b/data/flags/st.svg
new file mode 100644
index 0000000..555952c
--- /dev/null
+++ b/data/flags/st.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sv.svg b/data/flags/sv.svg
new file mode 100644
index 0000000..c81ee73
--- /dev/null
+++ b/data/flags/sv.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sy.svg b/data/flags/sy.svg
new file mode 100644
index 0000000..ca5d90e
--- /dev/null
+++ b/data/flags/sy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/sz.svg b/data/flags/sz.svg
new file mode 100644
index 0000000..25117b2
--- /dev/null
+++ b/data/flags/sz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tc.svg b/data/flags/tc.svg
new file mode 100644
index 0000000..dea5664
--- /dev/null
+++ b/data/flags/tc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/td.svg b/data/flags/td.svg
new file mode 100644
index 0000000..f94d6e5
--- /dev/null
+++ b/data/flags/td.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tf.svg b/data/flags/tf.svg
new file mode 100644
index 0000000..ea39af9
--- /dev/null
+++ b/data/flags/tf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tg.svg b/data/flags/tg.svg
new file mode 100644
index 0000000..27582f1
--- /dev/null
+++ b/data/flags/tg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/th.svg b/data/flags/th.svg
new file mode 100644
index 0000000..3f22b44
--- /dev/null
+++ b/data/flags/th.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tj.svg b/data/flags/tj.svg
new file mode 100644
index 0000000..ec4e481
--- /dev/null
+++ b/data/flags/tj.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tk.svg b/data/flags/tk.svg
new file mode 100644
index 0000000..16aa66a
--- /dev/null
+++ b/data/flags/tk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tl.svg b/data/flags/tl.svg
new file mode 100644
index 0000000..1d6bb56
--- /dev/null
+++ b/data/flags/tl.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tm.svg b/data/flags/tm.svg
new file mode 100644
index 0000000..f49a647
--- /dev/null
+++ b/data/flags/tm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tn.svg b/data/flags/tn.svg
new file mode 100644
index 0000000..482b55a
--- /dev/null
+++ b/data/flags/tn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/to.svg b/data/flags/to.svg
new file mode 100644
index 0000000..62cfb73
--- /dev/null
+++ b/data/flags/to.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tr.svg b/data/flags/tr.svg
new file mode 100644
index 0000000..5b046e6
--- /dev/null
+++ b/data/flags/tr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tt.svg b/data/flags/tt.svg
new file mode 100644
index 0000000..7479d1b
--- /dev/null
+++ b/data/flags/tt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tv.svg b/data/flags/tv.svg
new file mode 100644
index 0000000..b3f9308
--- /dev/null
+++ b/data/flags/tv.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tw.svg b/data/flags/tw.svg
new file mode 100644
index 0000000..500d0f3
--- /dev/null
+++ b/data/flags/tw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/tz.svg b/data/flags/tz.svg
new file mode 100644
index 0000000..5cbeb7a
--- /dev/null
+++ b/data/flags/tz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ua.svg b/data/flags/ua.svg
new file mode 100644
index 0000000..4d09b7c
--- /dev/null
+++ b/data/flags/ua.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ug.svg b/data/flags/ug.svg
new file mode 100644
index 0000000..463d425
--- /dev/null
+++ b/data/flags/ug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/um.svg b/data/flags/um.svg
new file mode 100644
index 0000000..9735dfa
--- /dev/null
+++ b/data/flags/um.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/us.svg b/data/flags/us.svg
new file mode 100644
index 0000000..9735dfa
--- /dev/null
+++ b/data/flags/us.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/uy.svg b/data/flags/uy.svg
new file mode 100644
index 0000000..9f5b3d6
--- /dev/null
+++ b/data/flags/uy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/uz.svg b/data/flags/uz.svg
new file mode 100644
index 0000000..379ab12
--- /dev/null
+++ b/data/flags/uz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/va.svg b/data/flags/va.svg
new file mode 100644
index 0000000..9101c9f
--- /dev/null
+++ b/data/flags/va.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/vc.svg b/data/flags/vc.svg
new file mode 100644
index 0000000..f3892d7
--- /dev/null
+++ b/data/flags/vc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ve.svg b/data/flags/ve.svg
new file mode 100644
index 0000000..912a069
--- /dev/null
+++ b/data/flags/ve.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/vg.svg b/data/flags/vg.svg
new file mode 100644
index 0000000..6d51bf8
--- /dev/null
+++ b/data/flags/vg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/vi.svg b/data/flags/vi.svg
new file mode 100644
index 0000000..606b364
--- /dev/null
+++ b/data/flags/vi.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/vn.svg b/data/flags/vn.svg
new file mode 100644
index 0000000..691cd96
--- /dev/null
+++ b/data/flags/vn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/vu.svg b/data/flags/vu.svg
new file mode 100644
index 0000000..5e1cb1a
--- /dev/null
+++ b/data/flags/vu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/wf.svg b/data/flags/wf.svg
new file mode 100644
index 0000000..5b7479d
--- /dev/null
+++ b/data/flags/wf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ws.svg b/data/flags/ws.svg
new file mode 100644
index 0000000..d7d19c2
--- /dev/null
+++ b/data/flags/ws.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/ye.svg b/data/flags/ye.svg
new file mode 100644
index 0000000..c32376c
--- /dev/null
+++ b/data/flags/ye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/yt.svg b/data/flags/yt.svg
new file mode 100644
index 0000000..67c9622
--- /dev/null
+++ b/data/flags/yt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/za.svg b/data/flags/za.svg
new file mode 100644
index 0000000..a00b44a
--- /dev/null
+++ b/data/flags/za.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/zm.svg b/data/flags/zm.svg
new file mode 100644
index 0000000..65cc2dd
--- /dev/null
+++ b/data/flags/zm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/flags/zw.svg b/data/flags/zw.svg
new file mode 100644
index 0000000..92f8e25
--- /dev/null
+++ b/data/flags/zw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/middleware/visit_event.rs b/src/middleware/visit_event.rs
index a19e07a..cbd5c00 100644
--- a/src/middleware/visit_event.rs
+++ b/src/middleware/visit_event.rs
@@ -10,7 +10,8 @@ pub async fn visit_event(
let res = next.run(req).await;
- if res.status().is_success() {
+ let has_flag = !uri.to_lowercase().starts_with("/api/v1/flags/");
+ if res.status().is_success() && has_flag {
_state.stats_cache.increment(uri).await;
}
diff --git a/src/services/country/country_list.rs b/src/services/country/country_list.rs
new file mode 100644
index 0000000..272b16f
--- /dev/null
+++ b/src/services/country/country_list.rs
@@ -0,0 +1,60 @@
+use crate::core::response::ApiResponse;
+use crate::utility::url;
+use axum::Json;
+use once_cell::sync::Lazy;
+use serde::{Deserialize, Serialize};
+use std::collections::HashMap;
+
+#[derive(Debug, Deserialize, Serialize)]
+struct Country {
+ code: String,
+ name: String,
+}
+
+#[derive(Debug, Deserialize, Serialize)]
+struct CountryFull {
+ code: String,
+ name: String,
+ currency: Option,
+ language: Vec,
+ flag: String,
+ flag_svg: String,
+}
+
+// Embedded JSON as static &str
+static COUNTRIES_JSON: &str = include_str!(concat!(
+ env!("CARGO_MANIFEST_DIR"),
+ "/data/countries_min.json"
+));
+
+static COUNTRIES_FULL_JSON: &str =
+ include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/data/countries.json"));
+
+// Parse once and cache as HashMap
+static COUNTRIES: Lazy> = Lazy::new(|| {
+ serde_json::from_str(COUNTRIES_JSON).expect("Invalid countries_enriched.json format")
+});
+
+static COUNTRIES_FULL: Lazy> = Lazy::new(|| {
+ let mut map: HashMap =
+ serde_json::from_str(COUNTRIES_FULL_JSON).expect("Invalid countries_enriched.json format");
+
+ for c in map.values_mut() {
+ // Fix the relative flag name → full URL
+ if !c.flag_svg.starts_with("http") {
+ c.flag_svg = format!("{}{}", url("/api/v1/flags/"), c.flag_svg);
+ }
+ }
+
+ map
+});
+
+pub async fn response_country_list() -> Json> {
+ let payload = serde_json::to_value(&*COUNTRIES).unwrap_or(serde_json::Value::Null);
+ Json(ApiResponse::success(payload))
+}
+
+pub async fn response_country_full_list() -> Json> {
+ let payload = serde_json::to_value(&*COUNTRIES_FULL).unwrap_or(serde_json::Value::Null);
+ Json(ApiResponse::success(payload))
+}
diff --git a/src/services/country/flag.rs b/src/services/country/flag.rs
new file mode 100644
index 0000000..550594d
--- /dev/null
+++ b/src/services/country/flag.rs
@@ -0,0 +1,24 @@
+use axum::{
+ extract::Path,
+ http::{StatusCode, header},
+ response::{IntoResponse, Response},
+};
+use rust_embed::RustEmbed;
+
+#[derive(RustEmbed)]
+#[folder = "data/flags/"]
+struct Flags;
+
+pub(crate) async fn get_flag(Path(code): Path) -> Response {
+ let file: String = code.to_lowercase();
+
+ if let Some(f) = Flags::get(&file) {
+ let headers = [
+ (header::CONTENT_TYPE, "image/svg+xml"),
+ (header::CACHE_CONTROL, "public, max-age=31536000, immutable"),
+ ];
+ (StatusCode::OK, headers, f.data.into_owned()).into_response()
+ } else {
+ StatusCode::NOT_FOUND.into_response()
+ }
+}
diff --git a/src/services/country/mod.rs b/src/services/country/mod.rs
new file mode 100644
index 0000000..b8fab99
--- /dev/null
+++ b/src/services/country/mod.rs
@@ -0,0 +1,12 @@
+mod country_list;
+pub(crate) mod flag;
+
+use crate::services::country::country_list::{response_country_full_list, response_country_list};
+use axum::routing::{MethodRouter, get};
+
+pub fn routers_list() -> Vec<(&'static str, MethodRouter)> {
+ Vec::from([
+ ("/", get(response_country_list)),
+ ("/full", get(response_country_full_list)),
+ ])
+}
diff --git a/src/services/health/response.rs b/src/services/health/response.rs
index dc8fffe..7df78f9 100644
--- a/src/services/health/response.rs
+++ b/src/services/health/response.rs
@@ -42,11 +42,13 @@ pub async fn health_check() -> api_response::Json
async fn collect_endpoint_stats(state: &AppState) -> EndpointStats {
let total = state.stats_cache.total_hits().await;
- let (health, time, tehran, ip) = tokio::join!(
+ let (health, time, tehran, ip, country, country_full) = tokio::join!(
state.stats_cache.get("/health"),
state.stats_cache.get("/api/v1/time"),
state.stats_cache.get("/api/v1/time/asia/tehran"),
state.stats_cache.get("/api/v1/ip"),
+ state.stats_cache.get("/api/v1/country"),
+ state.stats_cache.get("/api/v1/country/full"),
);
EndpointStats {
@@ -55,6 +57,8 @@ async fn collect_endpoint_stats(state: &AppState) -> EndpointStats {
time,
tehran,
ip,
+ country,
+ country_full,
}
}
@@ -76,7 +80,9 @@ fn build_api_info(stats: EndpointStats) -> serde_json::Value {
"/health": stats.health,
"/time": stats.time,
"/time/asia/tehran": stats.tehran,
- "/ip": stats.ip
+ "/ip": stats.ip,
+ "/country": stats.country,
+ "/country/full": stats.country_full
}
},
"privacy": "We log minimal request metadata for abuse prevention and aggregate analytics.",
@@ -90,21 +96,31 @@ fn build_api_info(stats: EndpointStats) -> serde_json::Value {
fn build_endpoints_list() -> serde_json::Value {
json!([
- {
- "path": "/time",
- "desc": "UTC",
- "example": url("/api/v1/time")
- },
- {
- "path": "/time/{tz}",
- "desc": "Asia/Tehran",
- "example": url("/api/v1/time/asia/tehran")
- },
- {
- "path": "/ip",
- "desc": "Your public IP",
- "example": url("/api/v1/ip")
- }
+ {
+ "path": "/time",
+ "desc": "Get the current UTC time ⏰",
+ "example": url("/api/v1/time")
+ },
+ {
+ "path": "/time/{tz}",
+ "desc": "Localized time for any timezone 🌐",
+ "example": url("/api/v1/time/asia/tehran")
+ },
+ {
+ "path": "/ip",
+ "desc": "Discover your public IP address 🌍",
+ "example": url("/api/v1/ip")
+ },
+ {
+ "path": "/country",
+ "desc": "Explore countries",
+ "example": url("/api/v1/country")
+ },
+ {
+ "path": "/country/full",
+ "desc": "Explore countries, currencies, languages & flags 🗺️",
+ "example": url("/api/v1/country/full")
+ }
])
}
@@ -114,4 +130,6 @@ struct EndpointStats {
time: Option,
tehran: Option,
ip: Option,
+ country: Option,
+ country_full: Option,
}
diff --git a/src/services/mod.rs b/src/services/mod.rs
index 7ab2589..3073f94 100644
--- a/src/services/mod.rs
+++ b/src/services/mod.rs
@@ -1,4 +1,5 @@
pub mod cache;
+mod country;
mod health;
mod ip;
pub mod jobs;
diff --git a/src/services/routes.rs b/src/services/routes.rs
index 29d70a6..4ae83ff 100644
--- a/src/services/routes.rs
+++ b/src/services/routes.rs
@@ -1,6 +1,6 @@
use crate::middleware::visit_event;
-use crate::services::{AppState, health, ip, time};
-use axum::routing::MethodRouter;
+use crate::services::{AppState, country, health, ip, time};
+use axum::routing::{MethodRouter, get};
use axum::{Router, middleware};
pub struct Routes;
@@ -8,7 +8,9 @@ impl Routes {
pub fn routes(app_state: AppState) -> Router {
let api = Router::new()
.nest("/time", Self::generate(time::routers_list()))
- .nest("/ip", Self::generate(ip::routers_list()));
+ .nest("/ip", Self::generate(ip::routers_list()))
+ .nest("/country", Self::generate(country::routers_list()))
+ .route("/flags/{code}", get(country::flag::get_flag));
Router::new()
.merge(health::routers(app_state.clone()))