1# -*- coding: utf-8 -*-
2
3import re
4from numbers import Integral
5from collections import namedtuple
6
7__all__ = ["countries"]
8
9try:
10    basestring
11except NameError:
12    basestring = str
13
14Country = namedtuple('Country',
15                     'name alpha2 alpha3 numeric apolitical_name')
16
17_records = [
18    Country(u"Afghanistan", "AF", "AFG", "004", u"Afghanistan"),
19    Country(u"Åland Islands", "AX", "ALA", "248", u"Åland Islands"),
20    Country(u"Albania", "AL", "ALB", "008", u"Albania"),
21    Country(u"Algeria", "DZ", "DZA", "012", u"Algeria"),
22    Country(u"American Samoa", "AS", "ASM", "016", u"American Samoa"),
23    Country(u"Andorra", "AD", "AND", "020", u"Andorra"),
24    Country(u"Angola", "AO", "AGO", "024", u"Angola"),
25    Country(u"Anguilla", "AI", "AIA", "660", u"Anguilla"),
26    Country(u"Antarctica", "AQ", "ATA", "010", u"Antarctica"),
27    Country(u"Antigua and Barbuda", "AG", "ATG", "028",
28            u"Antigua and Barbuda"),
29    Country(u"Argentina", "AR", "ARG", "032", u"Argentina"),
30    Country(u"Armenia", "AM", "ARM", "051", u"Armenia"),
31    Country(u"Aruba", "AW", "ABW", "533", u"Aruba"),
32    Country(u"Australia", "AU", "AUS", "036", u"Australia"),
33    Country(u"Austria", "AT", "AUT", "040", u"Austria"),
34    Country(u"Azerbaijan", "AZ", "AZE", "031", u"Azerbaijan"),
35    Country(u"Bahamas", "BS", "BHS", "044", u"Bahamas"),
36    Country(u"Bahrain", "BH", "BHR", "048", u"Bahrain"),
37    Country(u"Bangladesh", "BD", "BGD", "050", u"Bangladesh"),
38    Country(u"Barbados", "BB", "BRB", "052", u"Barbados"),
39    Country(u"Belarus", "BY", "BLR", "112", u"Belarus"),
40    Country(u"Belgium", "BE", "BEL", "056", u"Belgium"),
41    Country(u"Belize", "BZ", "BLZ", "084", u"Belize"),
42    Country(u"Benin", "BJ", "BEN", "204", u"Benin"),
43    Country(u"Bermuda", "BM", "BMU", "060", u"Bermuda"),
44    Country(u"Bhutan", "BT", "BTN", "064", u"Bhutan"),
45    Country(u"Bolivia, Plurinational State of", "BO", "BOL", "068",
46            u"Bolivia, Plurinational State of"),
47    Country(u"Bonaire, Sint Eustatius and Saba", "BQ", "BES", "535",
48            u"Bonaire, Sint Eustatius and Saba"),
49    Country(u"Bosnia and Herzegovina", "BA", "BIH", "070",
50            u"Bosnia and Herzegovina"),
51    Country(u"Botswana", "BW", "BWA", "072", u"Botswana"),
52    Country(u"Bouvet Island", "BV", "BVT", "074", u"Bouvet Island"),
53    Country(u"Brazil", "BR", "BRA", "076", u"Brazil"),
54    Country(u"British Indian Ocean Territory", "IO", "IOT", "086",
55            u"British Indian Ocean Territory"),
56    Country(u"Brunei Darussalam", "BN", "BRN", "096",
57            u"Brunei Darussalam"),
58    Country(u"Bulgaria", "BG", "BGR", "100", u"Bulgaria"),
59    Country(u"Burkina Faso", "BF", "BFA", "854", u"Burkina Faso"),
60    Country(u"Burundi", "BI", "BDI", "108", u"Burundi"),
61    Country(u"Cambodia", "KH", "KHM", "116", u"Cambodia"),
62    Country(u"Cameroon", "CM", "CMR", "120", u"Cameroon"),
63    Country(u"Canada", "CA", "CAN", "124", u"Canada"),
64    Country(u"Cabo Verde", "CV", "CPV", "132", u"Cabo Verde"),
65    Country(u"Cayman Islands", "KY", "CYM", "136", u"Cayman Islands"),
66    Country(u"Central African Republic", "CF", "CAF", "140",
67            u"Central African Republic"),
68    Country(u"Chad", "TD", "TCD", "148", u"Chad"),
69    Country(u"Chile", "CL", "CHL", "152", u"Chile"),
70    Country(u"China", "CN", "CHN", "156", u"China"),
71    Country(u"Christmas Island", "CX", "CXR", "162", u"Christmas Island"),
72    Country(u"Cocos (Keeling) Islands", "CC", "CCK", "166",
73            u"Cocos (Keeling) Islands"),
74    Country(u"Colombia", "CO", "COL", "170", u"Colombia"),
75    Country(u"Comoros", "KM", "COM", "174", u"Comoros"),
76    Country(u"Congo", "CG", "COG", "178", u"Congo"),
77    Country(u"Congo, Democratic Republic of the", "CD", "COD", "180",
78            u"Congo, Democratic Republic of the"),
79    Country(u"Cook Islands", "CK", "COK", "184", u"Cook Islands"),
80    Country(u"Costa Rica", "CR", "CRI", "188", u"Costa Rica"),
81    Country(u"Côte d'Ivoire", "CI", "CIV", "384", u"Côte d'Ivoire"),
82    Country(u"Croatia", "HR", "HRV", "191", u"Croatia"),
83    Country(u"Cuba", "CU", "CUB", "192", u"Cuba"),
84    Country(u"Curaçao", "CW", "CUW", "531", u"Curaçao"),
85    Country(u"Cyprus", "CY", "CYP", "196", u"Cyprus"),
86    Country(u"Czechia", "CZ", "CZE", "203", u"Czechia"),
87    Country(u"Denmark", "DK", "DNK", "208", u"Denmark"),
88    Country(u"Djibouti", "DJ", "DJI", "262", u"Djibouti"),
89    Country(u"Dominica", "DM", "DMA", "212", u"Dominica"),
90    Country(u"Dominican Republic", "DO", "DOM", "214", u"Dominican Republic"),
91    Country(u"Ecuador", "EC", "ECU", "218", u"Ecuador"),
92    Country(u"Egypt", "EG", "EGY", "818", u"Egypt"),
93    Country(u"El Salvador", "SV", "SLV", "222", u"El Salvador"),
94    Country(u"Equatorial Guinea", "GQ", "GNQ", "226", u"Equatorial Guinea"),
95    Country(u"Eritrea", "ER", "ERI", "232", u"Eritrea"),
96    Country(u"Estonia", "EE", "EST", "233", u"Estonia"),
97    Country(u"Ethiopia", "ET", "ETH", "231", u"Ethiopia"),
98    Country(u"Falkland Islands (Malvinas)", "FK", "FLK", "238",
99            u"Falkland Islands (Malvinas)"),
100    Country(u"Faroe Islands", "FO", "FRO", "234", u"Faroe Islands"),
101    Country(u"Fiji", "FJ", "FJI", "242", u"Fiji"),
102    Country(u"Finland", "FI", "FIN", "246", u"Finland"),
103    Country(u"France", "FR", "FRA", "250", u"France"),
104    Country(u"French Guiana", "GF", "GUF", "254", u"French Guiana"),
105    Country(u"French Polynesia", "PF", "PYF", "258", u"French Polynesia"),
106    Country(u"French Southern Territories", "TF", "ATF", "260",
107            u"French Southern Territories"),
108    Country(u"Gabon", "GA", "GAB", "266", u"Gabon"),
109    Country(u"Gambia", "GM", "GMB", "270", u"Gambia"),
110    Country(u"Georgia", "GE", "GEO", "268", u"Georgia"),
111    Country(u"Germany", "DE", "DEU", "276", u"Germany"),
112    Country(u"Ghana", "GH", "GHA", "288", u"Ghana"),
113    Country(u"Gibraltar", "GI", "GIB", "292", u"Gibraltar"),
114    Country(u"Greece", "GR", "GRC", "300", u"Greece"),
115    Country(u"Greenland", "GL", "GRL", "304", u"Greenland"),
116    Country(u"Grenada", "GD", "GRD", "308", u"Grenada"),
117    Country(u"Guadeloupe", "GP", "GLP", "312", u"Guadeloupe"),
118    Country(u"Guam", "GU", "GUM", "316", u"Guam"),
119    Country(u"Guatemala", "GT", "GTM", "320", u"Guatemala"),
120    Country(u"Guernsey", "GG", "GGY", "831", u"Guernsey"),
121    Country(u"Guinea", "GN", "GIN", "324", u"Guinea"),
122    Country(u"Guinea-Bissau", "GW", "GNB", "624", u"Guinea-Bissau"),
123    Country(u"Guyana", "GY", "GUY", "328", u"Guyana"),
124    Country(u"Haiti", "HT", "HTI", "332", u"Haiti"),
125    Country(u"Heard Island and McDonald Islands", "HM", "HMD", "334",
126            u"Heard Island and McDonald Islands"),
127    Country(u"Holy See", "VA", "VAT", "336", u"Holy See"),
128    Country(u"Honduras", "HN", "HND", "340", u"Honduras"),
129    Country(u"Hong Kong", "HK", "HKG", "344", u"Hong Kong"),
130    Country(u"Hungary", "HU", "HUN", "348", u"Hungary"),
131    Country(u"Iceland", "IS", "ISL", "352", u"Iceland"),
132    Country(u"India", "IN", "IND", "356", u"India"),
133    Country(u"Indonesia", "ID", "IDN", "360", u"Indonesia"),
134    Country(u"Iran, Islamic Republic of", "IR", "IRN", "364",
135            u"Iran, Islamic Republic of"),
136    Country(u"Iraq", "IQ", "IRQ", "368", u"Iraq"),
137    Country(u"Ireland", "IE", "IRL", "372", u"Ireland"),
138    Country(u"Isle of Man", "IM", "IMN", "833", u"Isle of Man"),
139    Country(u"Israel", "IL", "ISR", "376", u"Israel"),
140    Country(u"Italy", "IT", "ITA", "380", u"Italy"),
141    Country(u"Jamaica", "JM", "JAM", "388", u"Jamaica"),
142    Country(u"Japan", "JP", "JPN", "392", u"Japan"),
143    Country(u"Jersey", "JE", "JEY", "832", u"Jersey"),
144    Country(u"Jordan", "JO", "JOR", "400", u"Jordan"),
145    Country(u"Kazakhstan", "KZ", "KAZ", "398", u"Kazakhstan"),
146    Country(u"Kenya", "KE", "KEN", "404", u"Kenya"),
147    Country(u"Kiribati", "KI", "KIR", "296", u"Kiribati"),
148    Country(u"Korea, Democratic People's Republic of", "KP", "PRK", "408",
149            u"Korea, Democratic People's Republic of"),
150    Country(u"Korea, Republic of", "KR", "KOR", "410", u"Korea, Republic of"),
151    Country(u"Kosovo", "XK", "XKX", "983", u"Kosovo"),
152    Country(u"Kuwait", "KW", "KWT", "414", u"Kuwait"),
153    Country(u"Kyrgyzstan", "KG", "KGZ", "417", u"Kyrgyzstan"),
154    Country(u"Lao People's Democratic Republic", "LA", "LAO", "418",
155            u"Lao People's Democratic Republic"),
156    Country(u"Latvia", "LV", "LVA", "428", u"Latvia"),
157    Country(u"Lebanon", "LB", "LBN", "422", u"Lebanon"),
158    Country(u"Lesotho", "LS", "LSO", "426", u"Lesotho"),
159    Country(u"Liberia", "LR", "LBR", "430", u"Liberia"),
160    Country(u"Libya", "LY", "LBY", "434", u"Libya"),
161    Country(u"Liechtenstein", "LI", "LIE", "438", u"Liechtenstein"),
162    Country(u"Lithuania", "LT", "LTU", "440", u"Lithuania"),
163    Country(u"Luxembourg", "LU", "LUX", "442", u"Luxembourg"),
164    Country(u"Macao", "MO", "MAC", "446", u"Macao"),
165    Country(u"North Macedonia", "MK", "MKD", "807", u"North Macedonia"),
166    Country(u"Madagascar", "MG", "MDG", "450", u"Madagascar"),
167    Country(u"Malawi", "MW", "MWI", "454", u"Malawi"),
168    Country(u"Malaysia", "MY", "MYS", "458", u"Malaysia"),
169    Country(u"Maldives", "MV", "MDV", "462", u"Maldives"),
170    Country(u"Mali", "ML", "MLI", "466", u"Mali"),
171    Country(u"Malta", "MT", "MLT", "470", u"Malta"),
172    Country(u"Marshall Islands", "MH", "MHL", "584", u"Marshall Islands"),
173    Country(u"Martinique", "MQ", "MTQ", "474", u"Martinique"),
174    Country(u"Mauritania", "MR", "MRT", "478", u"Mauritania"),
175    Country(u"Mauritius", "MU", "MUS", "480", u"Mauritius"),
176    Country(u"Mayotte", "YT", "MYT", "175", u"Mayotte"),
177    Country(u"Mexico", "MX", "MEX", "484", u"Mexico"),
178    Country(u"Micronesia, Federated States of", "FM", "FSM", "583",
179            u"Micronesia, Federated States of"),
180    Country(u"Moldova, Republic of", "MD", "MDA", "498",
181            u"Moldova, Republic of"),
182    Country(u"Monaco", "MC", "MCO", "492", u"Monaco"),
183    Country(u"Mongolia", "MN", "MNG", "496", u"Mongolia"),
184    Country(u"Montenegro", "ME", "MNE", "499", u"Montenegro"),
185    Country(u"Montserrat", "MS", "MSR", "500", u"Montserrat"),
186    Country(u"Morocco", "MA", "MAR", "504", u"Morocco"),
187    Country(u"Mozambique", "MZ", "MOZ", "508", u"Mozambique"),
188    Country(u"Myanmar", "MM", "MMR", "104", u"Myanmar"),
189    Country(u"Namibia", "NA", "NAM", "516", u"Namibia"),
190    Country(u"Nauru", "NR", "NRU", "520", u"Nauru"),
191    Country(u"Nepal", "NP", "NPL", "524", u"Nepal"),
192    Country(u"Netherlands", "NL", "NLD", "528", u"Netherlands"),
193    Country(u"New Caledonia", "NC", "NCL", "540", u"New Caledonia"),
194    Country(u"New Zealand", "NZ", "NZL", "554", u"New Zealand"),
195    Country(u"Nicaragua", "NI", "NIC", "558", u"Nicaragua"),
196    Country(u"Niger", "NE", "NER", "562", u"Niger"),
197    Country(u"Nigeria", "NG", "NGA", "566", u"Nigeria"),
198    Country(u"Niue", "NU", "NIU", "570", u"Niue"),
199    Country(u"Norfolk Island", "NF", "NFK", "574", u"Norfolk Island"),
200    Country(u"Northern Mariana Islands", "MP", "MNP", "580",
201            u"Northern Mariana Islands"),
202    Country(u"Norway", "NO", "NOR", "578", u"Norway"),
203    Country(u"Oman", "OM", "OMN", "512", u"Oman"),
204    Country(u"Pakistan", "PK", "PAK", "586", u"Pakistan"),
205    Country(u"Palau", "PW", "PLW", "585", u"Palau"),
206    Country(u"Palestine, State of", "PS", "PSE", "275",
207            u"Palestine"),
208    Country(u"Panama", "PA", "PAN", "591", u"Panama"),
209    Country(u"Papua New Guinea", "PG", "PNG", "598",
210            u"Papua New Guinea"),
211    Country(u"Paraguay", "PY", "PRY", "600", u"Paraguay"),
212    Country(u"Peru", "PE", "PER", "604", u"Peru"),
213    Country(u"Philippines", "PH", "PHL", "608", u"Philippines"),
214    Country(u"Pitcairn", "PN", "PCN", "612", u"Pitcairn"),
215    Country(u"Poland", "PL", "POL", "616", u"Poland"),
216    Country(u"Portugal", "PT", "PRT", "620", u"Portugal"),
217    Country(u"Puerto Rico", "PR", "PRI", "630", u"Puerto Rico"),
218    Country(u"Qatar", "QA", "QAT", "634", u"Qatar"),
219    Country(u"Réunion", "RE", "REU", "638", u"Réunion"),
220    Country(u"Romania", "RO", "ROU", "642", u"Romania"),
221    Country(u"Russian Federation", "RU", "RUS", "643",
222            u"Russian Federation"),
223    Country(u"Rwanda", "RW", "RWA", "646", u"Rwanda"),
224    Country(u"Saint Barthélemy", "BL", "BLM", "652",
225            u"Saint Barthélemy"),
226    Country(u"Saint Helena, Ascension and Tristan da Cunha",
227            "SH", "SHN", "654",
228            u"Saint Helena, Ascension and Tristan da Cunha"),
229    Country(u"Saint Kitts and Nevis", "KN", "KNA", "659",
230            u"Saint Kitts and Nevis"),
231    Country(u"Saint Lucia", "LC", "LCA", "662", u"Saint Lucia"),
232    Country(u"Saint Martin (French part)", "MF", "MAF", "663",
233            u"Saint Martin (French part)"),
234    Country(u"Saint Pierre and Miquelon", "PM", "SPM", "666",
235            u"Saint Pierre and Miquelon"),
236    Country(u"Saint Vincent and the Grenadines", "VC", "VCT", "670",
237            u"Saint Vincent and the Grenadines"),
238    Country(u"Samoa", "WS", "WSM", "882", u"Samoa"),
239    Country(u"San Marino", "SM", "SMR", "674", u"San Marino"),
240    Country(u"Sao Tome and Principe", "ST", "STP", "678",
241            u"Sao Tome and Principe"),
242    Country(u"Saudi Arabia", "SA", "SAU", "682", u"Saudi Arabia"),
243    Country(u"Senegal", "SN", "SEN", "686", u"Senegal"),
244    Country(u"Serbia", "RS", "SRB", "688", u"Serbia"),
245    Country(u"Seychelles", "SC", "SYC", "690", u"Seychelles"),
246    Country(u"Sierra Leone", "SL", "SLE", "694", u"Sierra Leone"),
247    Country(u"Singapore", "SG", "SGP", "702", u"Singapore"),
248    Country(u"Sint Maarten (Dutch part)", "SX", "SXM", "534",
249            u"Sint Maarten (Dutch part)"),
250    Country(u"Slovakia", "SK", "SVK", "703", u"Slovakia"),
251    Country(u"Slovenia", "SI", "SVN", "705", u"Slovenia"),
252    Country(u"Solomon Islands", "SB", "SLB", "090", u"Solomon Islands"),
253    Country(u"Somalia", "SO", "SOM", "706", u"Somalia"),
254    Country(u"South Africa", "ZA", "ZAF", "710", u"South Africa"),
255    Country(u"South Georgia and the South Sandwich Islands",
256            "GS", "SGS", "239",
257            u"South Georgia and the South Sandwich Islands",),
258    Country(u"South Sudan", "SS", "SSD", "728", u"South Sudan"),
259    Country(u"Spain", "ES", "ESP", "724", u"Spain"),
260    Country(u"Sri Lanka", "LK", "LKA", "144", u"Sri Lanka"),
261    Country(u"Sudan", "SD", "SDN", "729", u"Sudan"),
262    Country(u"Suriname", "SR", "SUR", "740", u"Suriname"),
263    Country(u"Svalbard and Jan Mayen", "SJ", "SJM", "744",
264            u"Svalbard and Jan Mayen"),
265    Country(u"Eswatini", "SZ", "SWZ", "748", u"Eswatini"),
266    Country(u"Sweden", "SE", "SWE", "752", u"Sweden"),
267    Country(u"Switzerland", "CH", "CHE", "756", u"Switzerland"),
268    Country(u"Syrian Arab Republic", "SY", "SYR", "760",
269            u"Syrian Arab Republic"),
270    Country(u"Taiwan, Province of China", "TW", "TWN", "158",
271            u"Taiwan"),
272    Country(u"Tajikistan", "TJ", "TJK", "762", u"Tajikistan"),
273    Country(u"Tanzania, United Republic of", "TZ", "TZA", "834",
274            u"Tanzania, United Republic of"),
275    Country(u"Thailand", "TH", "THA", "764", u"Thailand"),
276    Country(u"Timor-Leste", "TL", "TLS", "626", u"Timor-Leste"),
277    Country(u"Togo", "TG", "TGO", "768", u"Togo"),
278    Country(u"Tokelau", "TK", "TKL", "772", u"Tokelau"),
279    Country(u"Tonga", "TO", "TON", "776", u"Tonga"),
280    Country(u"Trinidad and Tobago", "TT", "TTO", "780",
281            u"Trinidad and Tobago"),
282    Country(u"Tunisia", "TN", "TUN", "788", u"Tunisia"),
283    Country(u"Turkey", "TR", "TUR", "792", u"Turkey"),
284    Country(u"Turkmenistan", "TM", "TKM", "795", u"Turkmenistan"),
285    Country(u"Turks and Caicos Islands", "TC", "TCA", "796",
286            u"Turks and Caicos Islands"),
287    Country(u"Tuvalu", "TV", "TUV", "798", u"Tuvalu"),
288    Country(u"Uganda", "UG", "UGA", "800", u"Uganda"),
289    Country(u"Ukraine", "UA", "UKR", "804", u"Ukraine"),
290    Country(u"United Arab Emirates", "AE", "ARE", "784",
291            u"United Arab Emirates"),
292    Country(u"United Kingdom of Great Britain and Northern Ireland",
293            "GB", "GBR", "826",
294            u"United Kingdom of Great Britain and Northern Ireland"),
295    Country(u"United States of America", "US", "USA", "840",
296            u"United States of America"),
297    Country(u"United States Minor Outlying Islands", "UM", "UMI", "581",
298            u"United States Minor Outlying Islands"),
299    Country(u"Uruguay", "UY", "URY", "858", u"Uruguay"),
300    Country(u"Uzbekistan", "UZ", "UZB", "860", u"Uzbekistan"),
301    Country(u"Vanuatu", "VU", "VUT", "548", u"Vanuatu"),
302    Country(u"Venezuela, Bolivarian Republic of", "VE", "VEN", "862",
303            u"Venezuela, Bolivarian Republic of"),
304    Country(u"Viet Nam", "VN", "VNM", "704", u"Viet Nam"),
305    Country(u"Virgin Islands, British", "VG", "VGB", "092",
306            u"Virgin Islands, British"),
307    Country(u"Virgin Islands, U.S.", "VI", "VIR", "850",
308            u"Virgin Islands, U.S."),
309    Country(u"Wallis and Futuna", "WF", "WLF", "876", u"Wallis and Futuna"),
310    Country(u"Western Sahara", "EH", "ESH", "732", u"Western Sahara"),
311    Country(u"Yemen", "YE", "YEM", "887", u"Yemen"),
312    Country(u"Zambia", "ZM", "ZMB", "894", u"Zambia"),
313    Country(u"Zimbabwe", "ZW", "ZWE", "716", u"Zimbabwe")]
314
315
316def _build_index(idx):
317    return dict((r[idx].upper(), r) for r in _records)
318
319
320# Internal country indexes
321_by_alpha2 = _build_index(1)
322_by_alpha3 = _build_index(2)
323_by_numeric = _build_index(3)
324_by_name = _build_index(0)
325_by_apolitical_name = _build_index(4)
326
327
328# Documented accessors for the country indexes
329countries_by_alpha2 = _by_alpha2
330countries_by_alpha3 = _by_alpha3
331countries_by_numeric = _by_numeric
332countries_by_name = _by_name
333countries_by_apolitical_name = _by_apolitical_name
334
335
336NOT_FOUND = object()
337
338
339class _CountryLookup(object):
340
341    def get(self, key, default=NOT_FOUND):
342        if isinstance(key, Integral):
343            r = _by_numeric.get("%03d" % key, default)
344        elif isinstance(key, basestring):
345            k = key.upper()
346            if len(k) == 2:
347                r = _by_alpha2.get(k, default)
348            elif len(k) == 3 and re.match(r"[0-9]{3}", k) and k != "000":
349                r = _by_numeric.get(k, default)
350            elif len(k) == 3:
351                r = _by_alpha3.get(k, default)
352            elif k in _by_name:
353                r = _by_name.get(k, default)
354            else:
355                r = _by_apolitical_name.get(k, default)
356        else:
357            r = default
358
359        if r == NOT_FOUND:
360            raise KeyError(key)
361
362        return r
363
364    __getitem__ = get
365
366    def __len__(self):
367        return len(_records)
368
369    def __iter__(self):
370        return iter(_records)
371
372    def __contains__(self, item):
373        try:
374            self.get(item)
375            return True
376        except KeyError:
377            return False
378
379
380countries = _CountryLookup()
381