// src/geo/countries.ts var COUNTRIES = [ { code: "AU", name: "\u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u044F", nameEn: "Australia" }, { code: "AT", name: "\u0410\u0432\u0441\u0442\u0440\u0438\u044F", nameEn: "Austria" }, { code: "AZ", name: "\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043D", nameEn: "Azerbaijan" }, { code: "AL", name: "\u0410\u043B\u0431\u0430\u043D\u0438\u044F", nameEn: "Albania" }, { code: "DZ", name: "\u0410\u043B\u0436\u0438\u0440", nameEn: "Algeria" }, { code: "AO", name: "\u0410\u043D\u0433\u043E\u043B\u0430", nameEn: "Angola" }, { code: "AR", name: "\u0410\u0440\u0433\u0435\u043D\u0442\u0438\u043D\u0430", nameEn: "Argentina" }, { code: "AM", name: "\u0410\u0440\u043C\u0435\u043D\u0438\u044F", nameEn: "Armenia" }, { code: "AF", name: "\u0410\u0444\u0433\u0430\u043D\u0438\u0441\u0442\u0430\u043D", nameEn: "Afghanistan" }, { code: "BE", name: "\u0411\u0435\u043B\u044C\u0433\u0438\u044F", nameEn: "Belgium" }, { code: "BG", name: "\u0411\u043E\u043B\u0433\u0430\u0440\u0438\u044F", nameEn: "Bulgaria" }, { code: "BO", name: "\u0411\u043E\u043B\u0438\u0432\u0438\u044F", nameEn: "Bolivia" }, { code: "BA", name: "\u0411\u043E\u0441\u043D\u0438\u044F \u0438 \u0413\u0435\u0440\u0446\u0435\u0433\u043E\u0432\u0438\u043D\u0430", nameEn: "Bosnia and Herzegovina" }, { code: "BR", name: "\u0411\u0440\u0430\u0437\u0438\u043B\u0438\u044F", nameEn: "Brazil" }, { code: "GB", name: "\u0412\u0435\u043B\u0438\u043A\u043E\u0431\u0440\u0438\u0442\u0430\u043D\u0438\u044F", nameEn: "United Kingdom" }, { code: "HU", name: "\u0412\u0435\u043D\u0433\u0440\u0438\u044F", nameEn: "Hungary" }, { code: "VE", name: "\u0412\u0435\u043D\u0435\u0441\u0443\u044D\u043B\u0430", nameEn: "Venezuela" }, { code: "VN", name: "\u0412\u044C\u0435\u0442\u043D\u0430\u043C", nameEn: "Vietnam" }, { code: "GA", name: "\u0413\u0430\u0431\u043E\u043D", nameEn: "Gabon" }, { code: "HT", name: "\u0413\u0430\u0438\u0442\u0438", nameEn: "Haiti" }, { code: "GY", name: "\u0413\u0430\u0439\u0430\u043D\u0430", nameEn: "Guyana" }, { code: "GM", name: "\u0413\u0430\u043C\u0431\u0438\u044F", nameEn: "Gambia" }, { code: "GH", name: "\u0413\u0430\u043D\u0430", nameEn: "Ghana" }, { code: "GT", name: "\u0413\u0432\u0430\u0442\u0435\u043C\u0430\u043B\u0430", nameEn: "Guatemala" }, { code: "GN", name: "\u0413\u0432\u0438\u043D\u0435\u044F", nameEn: "Guinea" }, { code: "DE", name: "\u0413\u0435\u0440\u043C\u0430\u043D\u0438\u044F", nameEn: "Germany" }, { code: "HN", name: "\u0413\u043E\u043D\u0434\u0443\u0440\u0430\u0441", nameEn: "Honduras" }, { code: "GR", name: "\u0413\u0440\u0435\u0446\u0438\u044F", nameEn: "Greece" }, { code: "GE", name: "\u0413\u0440\u0443\u0437\u0438\u044F", nameEn: "Georgia" }, { code: "DK", name: "\u0414\u0430\u043D\u0438\u044F", nameEn: "Denmark" }, { code: "CD", name: "\u0414\u0420 \u041A\u043E\u043D\u0433\u043E", nameEn: "DR Congo" }, { code: "EG", name: "\u0415\u0433\u0438\u043F\u0435\u0442", nameEn: "Egypt" }, { code: "ZM", name: "\u0417\u0430\u043C\u0431\u0438\u044F", nameEn: "Zambia" }, { code: "ZW", name: "\u0417\u0438\u043C\u0431\u0430\u0431\u0432\u0435", nameEn: "Zimbabwe" }, { code: "IL", name: "\u0418\u0437\u0440\u0430\u0438\u043B\u044C", nameEn: "Israel" }, { code: "IN", name: "\u0418\u043D\u0434\u0438\u044F", nameEn: "India" }, { code: "ID", name: "\u0418\u043D\u0434\u043E\u043D\u0435\u0437\u0438\u044F", nameEn: "Indonesia" }, { code: "JO", name: "\u0418\u043E\u0440\u0434\u0430\u043D\u0438\u044F", nameEn: "Jordan" }, { code: "IQ", name: "\u0418\u0440\u0430\u043A", nameEn: "Iraq" }, { code: "IR", name: "\u0418\u0440\u0430\u043D", nameEn: "Iran" }, { code: "IE", name: "\u0418\u0440\u043B\u0430\u043D\u0434\u0438\u044F", nameEn: "Ireland" }, { code: "IS", name: "\u0418\u0441\u043B\u0430\u043D\u0434\u0438\u044F", nameEn: "Iceland" }, { code: "ES", name: "\u0418\u0441\u043F\u0430\u043D\u0438\u044F", nameEn: "Spain" }, { code: "IT", name: "\u0418\u0442\u0430\u043B\u0438\u044F", nameEn: "Italy" }, { code: "YE", name: "\u0419\u0435\u043C\u0435\u043D", nameEn: "Yemen" }, { code: "KZ", name: "\u041A\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043D", nameEn: "Kazakhstan" }, { code: "KH", name: "\u041A\u0430\u043C\u0431\u043E\u0434\u0436\u0430", nameEn: "Cambodia" }, { code: "CM", name: "\u041A\u0430\u043C\u0435\u0440\u0443\u043D", nameEn: "Cameroon" }, { code: "CA", name: "\u041A\u0430\u043D\u0430\u0434\u0430", nameEn: "Canada" }, { code: "QA", name: "\u041A\u0430\u0442\u0430\u0440", nameEn: "Qatar" }, { code: "KE", name: "\u041A\u0435\u043D\u0438\u044F", nameEn: "Kenya" }, { code: "CY", name: "\u041A\u0438\u043F\u0440", nameEn: "Cyprus" }, { code: "KG", name: "\u041A\u0438\u0440\u0433\u0438\u0437\u0438\u044F", nameEn: "Kyrgyzstan" }, { code: "CN", name: "\u041A\u0438\u0442\u0430\u0439", nameEn: "China" }, { code: "CO", name: "\u041A\u043E\u043B\u0443\u043C\u0431\u0438\u044F", nameEn: "Colombia" }, { code: "CG", name: "\u041A\u043E\u043D\u0433\u043E", nameEn: "Congo" }, { code: "KR", name: "\u042E\u0436\u043D\u0430\u044F \u041A\u043E\u0440\u0435\u044F", nameEn: "South Korea" }, { code: "KP", name: "\u0421\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u041A\u043E\u0440\u0435\u044F", nameEn: "North Korea" }, { code: "XK", name: "\u041A\u043E\u0441\u043E\u0432\u043E", nameEn: "Kosovo" }, { code: "CR", name: "\u041A\u043E\u0441\u0442\u0430-\u0420\u0438\u043A\u0430", nameEn: "Costa Rica" }, { code: "CI", name: "\u041A\u043E\u0442-\u0434'\u0418\u0432\u0443\u0430\u0440", nameEn: "C\xF4te d'Ivoire" }, { code: "CU", name: "\u041A\u0443\u0431\u0430", nameEn: "Cuba" }, { code: "KW", name: "\u041A\u0443\u0432\u0435\u0439\u0442", nameEn: "Kuwait" }, { code: "LA", name: "\u041B\u0430\u043E\u0441", nameEn: "Laos" }, { code: "LV", name: "\u041B\u0430\u0442\u0432\u0438\u044F", nameEn: "Latvia" }, { code: "LR", name: "\u041B\u0438\u0431\u0435\u0440\u0438\u044F", nameEn: "Liberia" }, { code: "LB", name: "\u041B\u0438\u0432\u0430\u043D", nameEn: "Lebanon" }, { code: "LY", name: "\u041B\u0438\u0432\u0438\u044F", nameEn: "Libya" }, { code: "LT", name: "\u041B\u0438\u0442\u0432\u0430", nameEn: "Lithuania" }, { code: "LI", name: "\u041B\u0438\u0445\u0442\u0435\u043D\u0448\u0442\u0435\u0439\u043D", nameEn: "Liechtenstein" }, { code: "LU", name: "\u041B\u044E\u043A\u0441\u0435\u043C\u0431\u0443\u0440\u0433", nameEn: "Luxembourg" }, { code: "MU", name: "\u041C\u0430\u0432\u0440\u0438\u043A\u0438\u0439", nameEn: "Mauritius" }, { code: "MR", name: "\u041C\u0430\u0432\u0440\u0438\u0442\u0430\u043D\u0438\u044F", nameEn: "Mauritania" }, { code: "MG", name: "\u041C\u0430\u0434\u0430\u0433\u0430\u0441\u043A\u0430\u0440", nameEn: "Madagascar" }, { code: "MO", name: "\u041C\u0430\u043A\u0430\u043E", nameEn: "Macao" }, { code: "MW", name: "\u041C\u0430\u043B\u0430\u0432\u0438", nameEn: "Malawi" }, { code: "MY", name: "\u041C\u0430\u043B\u0430\u0439\u0437\u0438\u044F", nameEn: "Malaysia" }, { code: "ML", name: "\u041C\u0430\u043B\u0438", nameEn: "Mali" }, { code: "MT", name: "\u041C\u0430\u043B\u044C\u0442\u0430", nameEn: "Malta" }, { code: "MA", name: "\u041C\u0430\u0440\u043E\u043A\u043A\u043E", nameEn: "Morocco" }, { code: "MX", name: "\u041C\u0435\u043A\u0441\u0438\u043A\u0430", nameEn: "Mexico" }, { code: "MZ", name: "\u041C\u043E\u0437\u0430\u043C\u0431\u0438\u043A", nameEn: "Mozambique" }, { code: "MD", name: "\u041C\u043E\u043B\u0434\u0430\u0432\u0438\u044F", nameEn: "Moldova" }, { code: "MC", name: "\u041C\u043E\u043D\u0430\u043A\u043E", nameEn: "Monaco" }, { code: "MN", name: "\u041C\u043E\u043D\u0433\u043E\u043B\u0438\u044F", nameEn: "Mongolia" }, { code: "MM", name: "\u041C\u044C\u044F\u043D\u043C\u0430", nameEn: "Myanmar" }, { code: "NA", name: "\u041D\u0430\u043C\u0438\u0431\u0438\u044F", nameEn: "Namibia" }, { code: "NP", name: "\u041D\u0435\u043F\u0430\u043B", nameEn: "Nepal" }, { code: "NE", name: "\u041D\u0438\u0433\u0435\u0440", nameEn: "Niger" }, { code: "NG", name: "\u041D\u0438\u0433\u0435\u0440\u0438\u044F", nameEn: "Nigeria" }, { code: "NL", name: "\u041D\u0438\u0434\u0435\u0440\u043B\u0430\u043D\u0434\u044B", nameEn: "Netherlands" }, { code: "NI", name: "\u041D\u0438\u043A\u0430\u0440\u0430\u0433\u0443\u0430", nameEn: "Nicaragua" }, { code: "NZ", name: "\u041D\u043E\u0432\u0430\u044F \u0417\u0435\u043B\u0430\u043D\u0434\u0438\u044F", nameEn: "New Zealand" }, { code: "NO", name: "\u041D\u043E\u0440\u0432\u0435\u0433\u0438\u044F", nameEn: "Norway" }, { code: "AE", name: "\u041E\u0410\u042D", nameEn: "United Arab Emirates" }, { code: "OM", name: "\u041E\u043C\u0430\u043D", nameEn: "Oman" }, { code: "PK", name: "\u041F\u0430\u043A\u0438\u0441\u0442\u0430\u043D", nameEn: "Pakistan" }, { code: "PA", name: "\u041F\u0430\u043D\u0430\u043C\u0430", nameEn: "Panama" }, { code: "PG", name: "\u041F\u0430\u043F\u0443\u0430 \u2014 \u041D\u043E\u0432\u0430\u044F \u0413\u0432\u0438\u043D\u0435\u044F", nameEn: "Papua New Guinea" }, { code: "PY", name: "\u041F\u0430\u0440\u0430\u0433\u0432\u0430\u0439", nameEn: "Paraguay" }, { code: "PE", name: "\u041F\u0435\u0440\u0443", nameEn: "Peru" }, { code: "PL", name: "\u041F\u043E\u043B\u044C\u0448\u0430", nameEn: "Poland" }, { code: "PT", name: "\u041F\u043E\u0440\u0442\u0443\u0433\u0430\u043B\u0438\u044F", nameEn: "Portugal" }, { code: "RU", name: "\u0420\u043E\u0441\u0441\u0438\u044F", nameEn: "Russia" }, { code: "RW", name: "\u0420\u0443\u0430\u043D\u0434\u0430", nameEn: "Rwanda" }, { code: "RO", name: "\u0420\u0443\u043C\u044B\u043D\u0438\u044F", nameEn: "Romania" }, { code: "SV", name: "\u0421\u0430\u043B\u044C\u0432\u0430\u0434\u043E\u0440", nameEn: "El Salvador" }, { code: "SA", name: "\u0421\u0430\u0443\u0434\u043E\u0432\u0441\u043A\u0430\u044F \u0410\u0440\u0430\u0432\u0438\u044F", nameEn: "Saudi Arabia" }, { code: "MK", name: "\u0421\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0438\u044F", nameEn: "North Macedonia" }, { code: "SC", name: "\u0421\u0435\u0439\u0448\u0435\u043B\u044B", nameEn: "Seychelles" }, { code: "SN", name: "\u0421\u0435\u043D\u0435\u0433\u0430\u043B", nameEn: "Senegal" }, { code: "RS", name: "\u0421\u0435\u0440\u0431\u0438\u044F", nameEn: "Serbia" }, { code: "SG", name: "\u0421\u0438\u043D\u0433\u0430\u043F\u0443\u0440", nameEn: "Singapore" }, { code: "SK", name: "\u0421\u043B\u043E\u0432\u0430\u043A\u0438\u044F", nameEn: "Slovakia" }, { code: "SI", name: "\u0421\u043B\u043E\u0432\u0435\u043D\u0438\u044F", nameEn: "Slovenia" }, { code: "SO", name: "\u0421\u043E\u043C\u0430\u043B\u0438", nameEn: "Somalia" }, { code: "SD", name: "\u0421\u0443\u0434\u0430\u043D", nameEn: "Sudan" }, { code: "US", name: "\u0421\u0428\u0410", nameEn: "United States" }, { code: "TJ", name: "\u0422\u0430\u0434\u0436\u0438\u043A\u0438\u0441\u0442\u0430\u043D", nameEn: "Tajikistan" }, { code: "TH", name: "\u0422\u0430\u0438\u043B\u0430\u043D\u0434", nameEn: "Thailand" }, { code: "TZ", name: "\u0422\u0430\u043D\u0437\u0430\u043D\u0438\u044F", nameEn: "Tanzania" }, { code: "TG", name: "\u0422\u043E\u0433\u043E", nameEn: "Togo" }, { code: "TT", name: "\u0422\u0440\u0438\u043D\u0438\u0434\u0430\u0434 \u0438 \u0422\u043E\u0431\u0430\u0433\u043E", nameEn: "Trinidad and Tobago" }, { code: "TV", name: "\u0422\u0443\u0432\u0430\u043B\u0443", nameEn: "Tuvalu" }, { code: "TN", name: "\u0422\u0443\u043D\u0438\u0441", nameEn: "Tunisia" }, { code: "TM", name: "\u0422\u0443\u0440\u043A\u043C\u0435\u043D\u0438\u044F", nameEn: "Turkmenistan" }, { code: "TR", name: "\u0422\u0443\u0440\u0446\u0438\u044F", nameEn: "Turkey" }, { code: "UG", name: "\u0423\u0433\u0430\u043D\u0434\u0430", nameEn: "Uganda" }, { code: "UZ", name: "\u0423\u0437\u0431\u0435\u043A\u0438\u0441\u0442\u0430\u043D", nameEn: "Uzbekistan" }, { code: "UA", name: "\u0423\u043A\u0440\u0430\u0438\u043D\u0430", nameEn: "Ukraine" }, { code: "UY", name: "\u0423\u0440\u0443\u0433\u0432\u0430\u0439", nameEn: "Uruguay" }, { code: "FJ", name: "\u0424\u0438\u0434\u0436\u0438", nameEn: "Fiji" }, { code: "PH", name: "\u0424\u0438\u043B\u0438\u043F\u043F\u0438\u043D\u044B", nameEn: "Philippines" }, { code: "FI", name: "\u0424\u0438\u043D\u043B\u044F\u043D\u0434\u0438\u044F", nameEn: "Finland" }, { code: "FR", name: "\u0424\u0440\u0430\u043D\u0446\u0438\u044F", nameEn: "France" }, { code: "HR", name: "\u0425\u043E\u0440\u0432\u0430\u0442\u0438\u044F", nameEn: "Croatia" }, { code: "TD", name: "\u0427\u0430\u0434", nameEn: "Chad" }, { code: "ME", name: "\u0427\u0435\u0440\u043D\u043E\u0433\u043E\u0440\u0438\u044F", nameEn: "Montenegro" }, { code: "CZ", name: "\u0427\u0435\u0445\u0438\u044F", nameEn: "Czechia" }, { code: "CL", name: "\u0427\u0438\u043B\u0438", nameEn: "Chile" }, { code: "CH", name: "\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0438\u044F", nameEn: "Switzerland" }, { code: "SE", name: "\u0428\u0432\u0435\u0446\u0438\u044F", nameEn: "Sweden" }, { code: "LK", name: "\u0428\u0440\u0438-\u041B\u0430\u043D\u043A\u0430", nameEn: "Sri Lanka" }, { code: "EC", name: "\u042D\u043A\u0432\u0430\u0434\u043E\u0440", nameEn: "Ecuador" }, { code: "GQ", name: "\u042D\u043A\u0432\u0430\u0442\u043E\u0440\u0438\u0430\u043B\u044C\u043D\u0430\u044F \u0413\u0432\u0438\u043D\u0435\u044F", nameEn: "Equatorial Guinea" }, { code: "ER", name: "\u042D\u0440\u0438\u0442\u0440\u0435\u044F", nameEn: "Eritrea" }, { code: "EE", name: "\u042D\u0441\u0442\u043E\u043D\u0438\u044F", nameEn: "Estonia" }, { code: "ET", name: "\u042D\u0444\u0438\u043E\u043F\u0438\u044F", nameEn: "Ethiopia" }, { code: "ZA", name: "\u042E\u0410\u0420", nameEn: "South Africa" }, { code: "JM", name: "\u042F\u043C\u0430\u0439\u043A\u0430", nameEn: "Jamaica" }, { code: "JP", name: "\u042F\u043F\u043E\u043D\u0438\u044F", nameEn: "Japan" } ]; var COUNTRY_BY_CODE = Object.fromEntries( COUNTRIES.map((c) => [c.code, c]) ); var COUNTRY_BY_NAME_RU = Object.fromEntries( COUNTRIES.map((c) => [c.name.toLowerCase(), c]) ); // src/geo/cities.ts var CITIES = [ // Россия { countryCode: "RU", name: "\u041C\u043E\u0441\u043A\u0432\u0430", nameEn: "Moscow" }, { countryCode: "RU", name: "\u0421\u0430\u043D\u043A\u0442-\u041F\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433", nameEn: "Saint Petersburg" }, { countryCode: "RU", name: "\u041D\u043E\u0432\u043E\u0441\u0438\u0431\u0438\u0440\u0441\u043A", nameEn: "Novosibirsk" }, { countryCode: "RU", name: "\u0415\u043A\u0430\u0442\u0435\u0440\u0438\u043D\u0431\u0443\u0440\u0433", nameEn: "Yekaterinburg" }, { countryCode: "RU", name: "\u041A\u0430\u0437\u0430\u043D\u044C", nameEn: "Kazan" }, { countryCode: "RU", name: "\u041D\u0438\u0436\u043D\u0438\u0439 \u041D\u043E\u0432\u0433\u043E\u0440\u043E\u0434", nameEn: "Nizhny Novgorod" }, { countryCode: "RU", name: "\u0421\u0430\u043C\u0430\u0440\u0430", nameEn: "Samara" }, { countryCode: "RU", name: "\u0420\u043E\u0441\u0442\u043E\u0432-\u043D\u0430-\u0414\u043E\u043D\u0443", nameEn: "Rostov-on-Don" }, { countryCode: "RU", name: "\u0423\u0444\u0430", nameEn: "Ufa" }, { countryCode: "RU", name: "\u041A\u0440\u0430\u0441\u043D\u043E\u0434\u0430\u0440", nameEn: "Krasnodar" }, { countryCode: "RU", name: "\u0421\u043E\u0447\u0438", nameEn: "Sochi" }, { countryCode: "RU", name: "\u0412\u043B\u0430\u0434\u0438\u0432\u043E\u0441\u0442\u043E\u043A", nameEn: "Vladivostok" }, { countryCode: "RU", name: "\u0418\u0440\u043A\u0443\u0442\u0441\u043A", nameEn: "Irkutsk" }, { countryCode: "RU", name: "\u0425\u0430\u0431\u0430\u0440\u043E\u0432\u0441\u043A", nameEn: "Khabarovsk" }, { countryCode: "RU", name: "\u0422\u044E\u043C\u0435\u043D\u044C", nameEn: "Tyumen" }, // Нидерланды { countryCode: "NL", name: "\u0410\u043C\u0441\u0442\u0435\u0440\u0434\u0430\u043C", nameEn: "Amsterdam" }, { countryCode: "NL", name: "\u0420\u043E\u0442\u0442\u0435\u0440\u0434\u0430\u043C", nameEn: "Rotterdam" }, { countryCode: "NL", name: "\u0413\u0430\u0430\u0433\u0430", nameEn: "The Hague" }, // Германия { countryCode: "DE", name: "\u0424\u0440\u0430\u043D\u043A\u0444\u0443\u0440\u0442", nameEn: "Frankfurt" }, { countryCode: "DE", name: "\u0411\u0435\u0440\u043B\u0438\u043D", nameEn: "Berlin" }, { countryCode: "DE", name: "\u041C\u044E\u043D\u0445\u0435\u043D", nameEn: "Munich" }, { countryCode: "DE", name: "\u0413\u0430\u043C\u0431\u0443\u0440\u0433", nameEn: "Hamburg" }, { countryCode: "DE", name: "\u041A\u0451\u043B\u044C\u043D", nameEn: "Cologne" }, { countryCode: "DE", name: "\u0414\u044E\u0441\u0441\u0435\u043B\u044C\u0434\u043E\u0440\u0444", nameEn: "D\xFCsseldorf" }, { countryCode: "DE", name: "\u0428\u0442\u0443\u0442\u0433\u0430\u0440\u0442", nameEn: "Stuttgart" }, // Финляндия { countryCode: "FI", name: "\u0425\u0435\u043B\u044C\u0441\u0438\u043D\u043A\u0438", nameEn: "Helsinki" }, { countryCode: "FI", name: "\u042D\u0441\u043F\u043E\u043E", nameEn: "Espoo" }, { countryCode: "FI", name: "\u0422\u0430\u043C\u043F\u0435\u0440\u0435", nameEn: "Tampere" }, // Швеция { countryCode: "SE", name: "\u0421\u0442\u043E\u043A\u0433\u043E\u043B\u044C\u043C", nameEn: "Stockholm" }, { countryCode: "SE", name: "\u0413\u0451\u0442\u0435\u0431\u043E\u0440\u0433", nameEn: "Gothenburg" }, { countryCode: "SE", name: "\u041C\u0430\u043B\u044C\u043C\u0451", nameEn: "Malm\xF6" }, // Норвегия { countryCode: "NO", name: "\u041E\u0441\u043B\u043E", nameEn: "Oslo" }, { countryCode: "NO", name: "\u0411\u0435\u0440\u0433\u0435\u043D", nameEn: "Bergen" }, // Дания { countryCode: "DK", name: "\u041A\u043E\u043F\u0435\u043D\u0433\u0430\u0433\u0435\u043D", nameEn: "Copenhagen" }, { countryCode: "DK", name: "\u041E\u0440\u0445\u0443\u0441", nameEn: "Aarhus" }, // Великобритания { countryCode: "GB", name: "\u041B\u043E\u043D\u0434\u043E\u043D", nameEn: "London" }, { countryCode: "GB", name: "\u041C\u0430\u043D\u0447\u0435\u0441\u0442\u0435\u0440", nameEn: "Manchester" }, { countryCode: "GB", name: "\u0413\u043B\u0430\u0437\u0433\u043E", nameEn: "Glasgow" }, { countryCode: "GB", name: "\u041A\u0430\u0440\u0434\u0438\u0444\u0444", nameEn: "Cardiff" }, // Франция { countryCode: "FR", name: "\u041F\u0430\u0440\u0438\u0436", nameEn: "Paris" }, { countryCode: "FR", name: "\u041C\u0430\u0440\u0441\u0435\u043B\u044C", nameEn: "Marseille" }, { countryCode: "FR", name: "\u041B\u0438\u043E\u043D", nameEn: "Lyon" }, { countryCode: "FR", name: "\u0421\u0442\u0440\u0430\u0441\u0431\u0443\u0440\u0433", nameEn: "Strasbourg" }, // Испания { countryCode: "ES", name: "\u041C\u0430\u0434\u0440\u0438\u0434", nameEn: "Madrid" }, { countryCode: "ES", name: "\u0411\u0430\u0440\u0441\u0435\u043B\u043E\u043D\u0430", nameEn: "Barcelona" }, { countryCode: "ES", name: "\u0412\u0430\u043B\u0435\u043D\u0441\u0438\u044F", nameEn: "Valencia" }, // Италия { countryCode: "IT", name: "\u0420\u0438\u043C", nameEn: "Rome" }, { countryCode: "IT", name: "\u041C\u0438\u043B\u0430\u043D", nameEn: "Milan" }, { countryCode: "IT", name: "\u0422\u0443\u0440\u0438\u043D", nameEn: "Turin" }, // Чехия { countryCode: "CZ", name: "\u041F\u0440\u0430\u0433\u0430", nameEn: "Prague" }, { countryCode: "CZ", name: "\u0411\u0440\u043D\u043E", nameEn: "Brno" }, // Польша { countryCode: "PL", name: "\u0412\u0430\u0440\u0448\u0430\u0432\u0430", nameEn: "Warsaw" }, { countryCode: "PL", name: "\u041A\u0440\u0430\u043A\u043E\u0432", nameEn: "Krak\xF3w" }, { countryCode: "PL", name: "\u0412\u0440\u043E\u0446\u043B\u0430\u0432", nameEn: "Wroc\u0142aw" }, { countryCode: "PL", name: "\u0413\u0434\u0430\u043D\u044C\u0441\u043A", nameEn: "Gda\u0144sk" }, // Швейцария { countryCode: "CH", name: "\u0426\u044E\u0440\u0438\u0445", nameEn: "Zurich" }, { countryCode: "CH", name: "\u0416\u0435\u043D\u0435\u0432\u0430", nameEn: "Geneva" }, { countryCode: "CH", name: "\u0411\u0430\u0437\u0435\u043B\u044C", nameEn: "Basel" }, // Бельгия { countryCode: "BE", name: "\u0411\u0440\u044E\u0441\u0441\u0435\u043B\u044C", nameEn: "Brussels" }, { countryCode: "BE", name: "\u0410\u043D\u0442\u0432\u0435\u0440\u043F\u0435\u043D", nameEn: "Antwerp" }, // Австрия { countryCode: "AT", name: "\u0412\u0435\u043D\u0430", nameEn: "Vienna" }, { countryCode: "AT", name: "\u0413\u0440\u0430\u0446", nameEn: "Graz" }, // Латвия { countryCode: "LV", name: "\u0420\u0438\u0433\u0430", nameEn: "Riga" }, // Литва { countryCode: "LT", name: "\u0412\u0438\u043B\u044C\u043D\u044E\u0441", nameEn: "Vilnius" }, { countryCode: "LT", name: "\u041A\u0430\u0443\u043D\u0430\u0441", nameEn: "Kaunas" }, // Эстония { countryCode: "EE", name: "\u0422\u0430\u043B\u043B\u0438\u043D", nameEn: "Tallinn" }, // Украина { countryCode: "UA", name: "\u041A\u0438\u0435\u0432", nameEn: "Kyiv" }, { countryCode: "UA", name: "\u0425\u0430\u0440\u044C\u043A\u043E\u0432", nameEn: "Kharkiv" }, { countryCode: "UA", name: "\u041E\u0434\u0435\u0441\u0441\u0430", nameEn: "Odesa" }, { countryCode: "UA", name: "\u041B\u044C\u0432\u043E\u0432", nameEn: "Lviv" }, // Казахстан { countryCode: "KZ", name: "\u0410\u043B\u043C\u0430\u0442\u044B", nameEn: "Almaty" }, { countryCode: "KZ", name: "\u0410\u0441\u0442\u0430\u043D\u0430", nameEn: "Astana" }, // Беларусь { countryCode: "BY", name: "\u041C\u0438\u043D\u0441\u043A", nameEn: "Minsk" }, // США { countryCode: "US", name: "\u041D\u044C\u044E-\u0419\u043E\u0440\u043A", nameEn: "New York" }, { countryCode: "US", name: "\u041B\u043E\u0441-\u0410\u043D\u0434\u0436\u0435\u043B\u0435\u0441", nameEn: "Los Angeles" }, { countryCode: "US", name: "\u0427\u0438\u043A\u0430\u0433\u043E", nameEn: "Chicago" }, { countryCode: "US", name: "\u0425\u044C\u044E\u0441\u0442\u043E\u043D", nameEn: "Houston" }, { countryCode: "US", name: "\u0414\u0430\u043B\u043B\u0430\u0441", nameEn: "Dallas" }, { countryCode: "US", name: "\u041C\u0430\u0439\u0430\u043C\u0438", nameEn: "Miami" }, { countryCode: "US", name: "\u0421\u0438\u044D\u0442\u043B", nameEn: "Seattle" }, { countryCode: "US", name: "\u0421\u0430\u043D-\u0424\u0440\u0430\u043D\u0446\u0438\u0441\u043A\u043E", nameEn: "San Francisco" }, { countryCode: "US", name: "\u0412\u0430\u0448\u0438\u043D\u0433\u0442\u043E\u043D", nameEn: "Washington" }, { countryCode: "US", name: "\u0410\u0442\u043B\u0430\u043D\u0442\u0430", nameEn: "Atlanta" }, { countryCode: "US", name: "\u0414\u0435\u043D\u0432\u0435\u0440", nameEn: "Denver" }, // Канада { countryCode: "CA", name: "\u0422\u043E\u0440\u043E\u043D\u0442\u043E", nameEn: "Toronto" }, { countryCode: "CA", name: "\u041C\u043E\u043D\u0440\u0435\u0430\u043B\u044C", nameEn: "Montreal" }, { countryCode: "CA", name: "\u0412\u0430\u043D\u043A\u0443\u0432\u0435\u0440", nameEn: "Vancouver" }, // Сингапур { countryCode: "SG", name: "\u0421\u0438\u043D\u0433\u0430\u043F\u0443\u0440", nameEn: "Singapore" }, // Япония { countryCode: "JP", name: "\u0422\u043E\u043A\u0438\u043E", nameEn: "Tokyo" }, { countryCode: "JP", name: "\u041E\u0441\u0430\u043A\u0430", nameEn: "Osaka" }, // Южная Корея { countryCode: "KR", name: "\u0421\u0435\u0443\u043B", nameEn: "Seoul" }, // Китай { countryCode: "CN", name: "\u041F\u0435\u043A\u0438\u043D", nameEn: "Beijing" }, { countryCode: "CN", name: "\u0428\u0430\u043D\u0445\u0430\u0439", nameEn: "Shanghai" }, { countryCode: "CN", name: "\u0413\u0443\u0430\u043D\u0447\u0436\u043E\u0443", nameEn: "Guangzhou" }, { countryCode: "CN", name: "\u0428\u044D\u043D\u044C\u0447\u0436\u044D\u043D\u044C", nameEn: "Shenzhen" }, { countryCode: "CN", name: "\u0413\u043E\u043D\u043A\u043E\u043D\u0433", nameEn: "Hong Kong" }, // Индия { countryCode: "IN", name: "\u041C\u0443\u043C\u0431\u0430\u0438", nameEn: "Mumbai" }, { countryCode: "IN", name: "\u0414\u0435\u043B\u0438", nameEn: "Delhi" }, { countryCode: "IN", name: "\u0411\u0430\u043D\u0433\u0430\u043B\u043E\u0440", nameEn: "Bangalore" }, { countryCode: "IN", name: "\u0427\u0435\u043D\u043D\u0430\u0438", nameEn: "Chennai" }, // ОАЭ { countryCode: "AE", name: "\u0414\u0443\u0431\u0430\u0439", nameEn: "Dubai" }, { countryCode: "AE", name: "\u0410\u0431\u0443-\u0414\u0430\u0431\u0438", nameEn: "Abu Dhabi" }, // Турция { countryCode: "TR", name: "\u0421\u0442\u0430\u043C\u0431\u0443\u043B", nameEn: "Istanbul" }, { countryCode: "TR", name: "\u0410\u043D\u043A\u0430\u0440\u0430", nameEn: "Ankara" }, { countryCode: "TR", name: "\u0418\u0437\u043C\u0438\u0440", nameEn: "Izmir" }, // Бразилия { countryCode: "BR", name: "\u0421\u0430\u043D-\u041F\u0430\u0443\u043B\u0443", nameEn: "S\xE3o Paulo" }, { countryCode: "BR", name: "\u0420\u0438\u043E-\u0434\u0435-\u0416\u0430\u043D\u0435\u0439\u0440\u043E", nameEn: "Rio de Janeiro" }, // Австралия { countryCode: "AU", name: "\u0421\u0438\u0434\u043D\u0435\u0439", nameEn: "Sydney" }, { countryCode: "AU", name: "\u041C\u0435\u043B\u044C\u0431\u0443\u0440\u043D", nameEn: "Melbourne" }, // Болгария { countryCode: "BG", name: "\u0421\u043E\u0444\u0438\u044F", nameEn: "Sofia" }, // Румыния { countryCode: "RO", name: "\u0411\u0443\u0445\u0430\u0440\u0435\u0441\u0442", nameEn: "Bucharest" }, // Венгрия { countryCode: "HU", name: "\u0411\u0443\u0434\u0430\u043F\u0435\u0448\u0442", nameEn: "Budapest" }, // Греция { countryCode: "GR", name: "\u0410\u0444\u0438\u043D\u044B", nameEn: "Athens" }, // Португалия { countryCode: "PT", name: "\u041B\u0438\u0441\u0441\u0430\u0431\u043E\u043D", nameEn: "Lisbon" }, // Ирландия { countryCode: "IE", name: "\u0414\u0443\u0431\u043B\u0438\u043D", nameEn: "Dublin" }, // Израиль { countryCode: "IL", name: "\u0422\u0435\u043B\u044C-\u0410\u0432\u0438\u0432", nameEn: "Tel Aviv" } ]; var CITY_BY_NAME_RU = Object.fromEntries( CITIES.map((c) => [c.name.toLowerCase(), c]) ); function resolveCityRef(cityName) { return CITY_BY_NAME_RU[cityName.trim().toLowerCase()]; } function resolveCountryForCity(cityName) { const city = resolveCityRef(cityName); return city ? COUNTRY_BY_CODE[city.countryCode] : void 0; } function cityMatchesCountry(cityName, countryName, rows) { const countryCode = COUNTRY_BY_NAME_RU[countryName.trim().toLowerCase()]?.code; if (!countryCode) return true; const catalog = resolveCityRef(cityName); if (catalog) return catalog.countryCode === countryCode; return (rows ?? []).some( (row) => row.city?.trim().toLowerCase() === cityName.trim().toLowerCase() && COUNTRY_BY_NAME_RU[(row.country || "").trim().toLowerCase()]?.code === countryCode ); } function buildCityOptions(rows, countryName, options) { const includeCatalog = options?.includeCatalog ?? true; const names = /* @__PURE__ */ new Set(); const countryCode = countryName?.trim() ? COUNTRY_BY_NAME_RU[countryName.trim().toLowerCase()]?.code : void 0; const belongsToCountry = (city, rowCountry) => { if (!countryCode) return true; const catalog = resolveCityRef(city); if (catalog) return catalog.countryCode === countryCode; if (rowCountry?.trim()) { return COUNTRY_BY_NAME_RU[rowCountry.trim().toLowerCase()]?.code === countryCode; } return false; }; for (const row of rows ?? []) { const city = (row.city || "").trim(); if (!city) continue; if (belongsToCountry(city, row.country ?? void 0)) { names.add(city); } } if (includeCatalog) { for (const { name } of listCities(countryCode)) { names.add(name); } } return [...names].sort((a, b) => a.localeCompare(b, "ru")).map((name) => ({ value: name, label: name })); } function resolveCountryForCityFromRows(cityName, rows) { const trimmed = cityName.trim(); if (!trimmed) return void 0; const fromCatalog = resolveCountryForCity(trimmed); if (fromCatalog) return fromCatalog.name; const row = (rows ?? []).find( (r) => r.city?.trim().toLowerCase() === trimmed.toLowerCase() && r.country?.trim() ); return row?.country?.trim(); } function listCities(countryCode) { return CITIES.filter((c) => !countryCode || c.countryCode === countryCode).map((c) => ({ ...c, country: COUNTRY_BY_CODE[c.countryCode] })); } function countriesWithCities() { const codes = new Set(CITIES.map((c) => c.countryCode)); return COUNTRIES.filter((c) => codes.has(c.code)); } // src/geo/loc-codes.ts var CANONICAL_LOC_CODES = { \u043C\u043E\u0441\u043A\u0432\u0430: "msk", \u0444\u0440\u0430\u043D\u043A\u0444\u0443\u0440\u0442: "fra", \u0430\u043C\u0441\u0442\u0435\u0440\u0434\u0430\u043C: "ams", \u0445\u0435\u043B\u044C\u0441\u0438\u043D\u043A\u0438: "hel", \u043F\u0430\u0440\u0438\u0436: "par", "\u0441\u0430\u043D\u043A\u0442-\u043F\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433": "led", \u0431\u0435\u0440\u043B\u0438\u043D: "ber", \u043C\u044E\u043D\u0445\u0435\u043D: "muc", \u043B\u043E\u043D\u0434\u043E\u043D: "lon", "\u043D\u044C\u044E-\u0439\u043E\u0440\u043A": "nyc", \u0442\u043E\u043A\u0438\u043E: "tyo", \u0441\u0438\u043D\u0433\u0430\u043F\u0443\u0440: "sin", \u0434\u0443\u0431\u0430\u0439: "dxb", \u0432\u0430\u0440\u0448\u0430\u0432\u0430: "waw", \u043F\u0440\u0430\u0433\u0430: "prg", \u0432\u0435\u043D\u0430: "vie", \u0440\u0438\u0433\u0430: "rix", \u0442\u0430\u043B\u043B\u0438\u043D: "tll", \u043C\u0438\u043D\u0441\u043A: "msq", \u043A\u0438\u0435\u0432: "iev", \u0441\u0442\u043E\u043A\u0433\u043E\u043B\u044C\u043C: "arn", \u043E\u0441\u043B\u043E: "osl", \u043A\u043E\u043F\u0435\u043D\u0433\u0430\u0433\u0435\u043D: "cph", \u0446\u044E\u0440\u0438\u0445: "zrh", \u0431\u0440\u044E\u0441\u0441\u0435\u043B\u044C: "bru", \u043C\u0430\u0434\u0440\u0438\u0434: "mad", \u0431\u0430\u0440\u0441\u0435\u043B\u043E\u043D\u0430: "bcn", \u043C\u0438\u043B\u0430\u043D: "mxp", \u0440\u0438\u043C: "rom" }; function locCodeForCity(city, usedCodes) { const known = CANONICAL_LOC_CODES[city.name.trim().toLowerCase()]; if (known && !usedCodes.has(known)) return known; if (known) { } const base = city.nameEn.toLowerCase().replace(/[^a-z]/g, ""); if (!base) { return `${city.countryCode.toLowerCase()}${usedCodes.size}`; } for (let len = 3; len <= Math.max(3, base.length); len++) { const candidate = base.slice(0, len); if (!usedCodes.has(candidate)) return candidate; } let i = 2; while (usedCodes.has(`${base.slice(0, 2)}${i}`)) i += 1; return `${base.slice(0, 2)}${i}`; } function catalogCitiesWithLocCodes() { const used = /* @__PURE__ */ new Set(); const ordered = [...CITIES].sort((a, b) => { const ak = CANONICAL_LOC_CODES[a.name.toLowerCase()] ? 0 : 1; const bk = CANONICAL_LOC_CODES[b.name.toLowerCase()] ? 0 : 1; return ak - bk; }); return ordered.map((city) => { const locCode = locCodeForCity(city, used); used.add(locCode); return { ...city, locCode }; }); } export { COUNTRIES, COUNTRY_BY_CODE, COUNTRY_BY_NAME_RU, CITIES, CITY_BY_NAME_RU, resolveCityRef, resolveCountryForCity, cityMatchesCountry, buildCityOptions, resolveCountryForCityFromRows, listCities, countriesWithCities, CANONICAL_LOC_CODES, locCodeForCity, catalogCitiesWithLocCodes };