MDL-23720 importing latest PEAR GeoIP module
authorPetr Skoda <skodak@moodle.org>
Mon, 9 Aug 2010 13:10:33 +0000 (13:10 +0000)
committerPetr Skoda <skodak@moodle.org>
Mon, 9 Aug 2010 13:10:33 +0000 (13:10 +0000)
iplookup/index.php
lib/geoip/ChangeLog.htm [deleted file]
lib/geoip/README.htm [deleted file]
lib/geoip/geoip.inc [deleted file]
lib/geoip/geoipcity.inc [deleted file]
lib/geoip/geoipregionvars.php [deleted file]
lib/geoip/readme_moodle.txt [deleted file]
lib/pear/Net/GeoIP.php [new file with mode: 0644]
lib/pear/Net/GeoIP/DMA.php [new file with mode: 0644]
lib/pear/Net/GeoIP/Location.php [new file with mode: 0644]
lib/thirdpartylibs.xml

index 1c5848f..dd94b61 100644 (file)
@@ -26,7 +26,7 @@
 
 require('../config.php');
 require_once($CFG->libdir.'/filelib.php');
-require_once($CFG->libdir.'/geoip/geoipcity.inc');
+require_once('Net/GeoIP.php');
 
 require_login();
 
@@ -64,9 +64,9 @@ if ($user) {
 }
 
 if (!empty($CFG->geoipfile) and file_exists($CFG->geoipfile)) {
-    $gi = geoip_open($CFG->geoipfile, GEOIP_STANDARD);
-    $location = geoip_record_by_addr($gi, $ip);
-    geoip_close($gi);
+    $geoip = Net_GeoIP::getInstance($CFG->geoipfile, Net_GeoIP::STANDARD);
+    $location = $geoip->lookupLocation($ip);
+    $geoip->close();
 
     if (empty($location)) {
         print_error('iplookupfailed', 'error', '', $ip);
diff --git a/lib/geoip/ChangeLog.htm b/lib/geoip/ChangeLog.htm
deleted file mode 100644 (file)
index 632a2b3..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-    * Workaround php's broken usage of mb_substr instead of substr with
-    mbstring.func_overload and mbstring.internal_encoding ( Boris Zentner )
-    * Change Turkey's continent code from AS to EU ( Boris Zentner )
-    * Update FIPS codes 20090723 ( Boris Zentner )
-1.8 2009-04-02
-    * Add continent_code to the city record. See: sample_city.php  ( Boris Zentner )
-    * Update FIPS codes 20090401 ( Boris Zentner )
-    * Fixed spelling of Kazakhstan, was Kazakstan
-    * Fix TN FIPS codes and add two new TH79 and TH80 ( Boris Zentner )
-    * Fix geoip_country_code_by_addr when used with a city database for unknown or private records ( cpw )
-    * Update timezone.php
-    * Sync geoipregionvars.php with fips codes from Jan, 14th 2009 ( Boris Zentner )
-    * use metro_code in sample_city.php ( Boris Zentner )  
-    * replace the depreciated dma_code field with metro_code ( Boris Zentner )
-    * remove wrong but unreferenced Singapur SG fips regions codes ( Boris Zentner )  
-    * update regions ( geoipregionvars.php ) ( Boris Zentner )
-    * Die when the database file is not found or readable ( Boris Zentner ) 
-
-1.7 2008-1-8
-    * Added BL/Saint Barthelemy, MF/Saint Martin (ISO-3166-1 additions)
-    * fixed bug with newlines in Country Name
-    * replaced $s_array[size] with $s_array['size'] (Daniel Horchner)
-    * Fix bug where PHP API didn't work with new edition of GeoIP ISP
-
-1.6 2007-1-10
-    * Added AX/Aland Islands, GG/Guernsey, IM/Isle of Man, JE/Jersey (ISO-3166-1 changes)
-    * Replaced CS/Serbia and Montenegro with RS/Serbia, removed ZR/Zaire, added ME/Montenegro
-    * geoip_country_(code|name)_by_addr now work against Geo(IP|Lite) City (Frank Mather)
-    * Added code to lookup zoneinfo timezone given country and region (Frank Mather)
-    * TP/East Timor changed to TL/Timor-Leste, reflecting changes in ISO-3166
-
-1.5 2005-11-1
-    * Added Shared Memory support for GeoIP City (Frank Mather)
-    * Replaced Yugoslavia with Serbia and Montenegro
-    * Removed global declaration for $GEOIP_COUNTRY_CODE_TO_NUMBER, $GEOIP_COUNTRY_CODES,
-        and $GEOIP_COUNTRY_CODES3 
-
-1.4 2005-01-13   Andrew Hill, Awarez Ltd. (http://www.awarez.net)
- *              Formatted file according to PEAR library standards.
- *              Moved $GEOIP_COUNTRY_CODE_TO_NUMBER, $GEOIP_COUNTRY_CODES,
- *                  $GEOIP_COUNTRY_CODES3 and $GEOIP_COUNTRY_NAMES into the
- *                  GeoIP class, so that library will still work even when
- *                  not included in the $GLOBAL context.
-
-    * Updated geoip_country_code_by_addr to work with PHP5 (Eric of Host Ultra)
-    * Replaced bit operators (| and &) with logical operators (|| and &&)
-    * Defined GEOIP_ISP_EDITION
-
-1.3 2004-8-4
-    * Changed license from GPL to LGPL so code can be included in PEAR
-    * added global definitions to prevent undefined variables error when including from function (C├ędric Dufour)
-    * Updated country names
-    * Added support for GeoIP City, version 1 with DMA and Area codes
-
-1.2 2003-10-28
-    * Added support for Shared Memory (Jason Priebe)
-    * Added support for Distributed queries
-    * Added support for GeoIP Region, version 1
-    * Added Anonymous Proxy and Satellite Provider code/labels
-    * Changed Taiwan, Province of China to Taiwan
-
-1.1 2003-01-15
-    * Added support for GeoIP Region and GeoIP City
-
-1.0 2002-11-21
-        * Initial checkin to CVS
\ No newline at end of file
diff --git a/lib/geoip/README.htm b/lib/geoip/README.htm
deleted file mode 100644 (file)
index 8456d2b..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-Requirements
-
-None (only the 'GeoIP.dat' file is needed).  To download a free GeoIP Standard Country
-database, go to
-http://maxmind.com/download/geoip/database/
-
-Install
-
-Just place the 'geoip.inc' file somewhere according to the 'include_path' directive of
-your 'php.ini' file, or just place it in the same directory as your PHP scripts.
-
-Usage
-
-Gets country name by hostname :
-
-include("geoip.inc");
-
-$gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);
-
-echo geoip_country_code_by_addr($gi, "24.24.24.24") . "\t" .
-     geoip_country_name_by_addr($gi, "24.24.24.24") . "\n";
-echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" .
-     geoip_country_name_by_addr($gi, "80.24.24.24") . "\n";
-
-geoip_close($gi);
-
-Memory Caching:
-To enable memory caching, pass GEOIP_SHARED_MEMORY or
-GEOIP_MEMORY_CACHE to the second argument of geoip_open
-
-For GEOIP_SHARED_MEMORY, requires php >= 4.0.4,
-and --enable-shmop passed at configure time, see
-http://us2.php.net/manual/en/ref.shmop.php
-In addition, you should call geoip_load_shared_mem
-before calling geoip_open.  See sample_city.php for an
-example of shared memory caching.
-
-Working with PHP5.
-geoip_country_code_by_addr should work
-with PHP.  For help with the other
-routines, please contact support@maxmind.com
-
-Thanks to Jim Winstead.
diff --git a/lib/geoip/geoip.inc b/lib/geoip/geoip.inc
deleted file mode 100644 (file)
index 70948dc..0000000
+++ /dev/null
@@ -1,542 +0,0 @@
-<?php
-
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
-/* geoip.inc
- *
- * Copyright (C) 2007 MaxMind LLC
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-define("GEOIP_COUNTRY_BEGIN", 16776960);
-define("GEOIP_STATE_BEGIN_REV0", 16700000);
-define("GEOIP_STATE_BEGIN_REV1", 16000000);
-define("GEOIP_STANDARD", 0);
-define("GEOIP_MEMORY_CACHE", 1);
-define("GEOIP_SHARED_MEMORY", 2);
-define("STRUCTURE_INFO_MAX_SIZE", 20);
-define("DATABASE_INFO_MAX_SIZE", 100);
-define("GEOIP_COUNTRY_EDITION", 106);
-define("GEOIP_PROXY_EDITION", 8);
-define("GEOIP_ASNUM_EDITION", 9);
-define("GEOIP_NETSPEED_EDITION", 10);
-define("GEOIP_REGION_EDITION_REV0", 112);
-define("GEOIP_REGION_EDITION_REV1", 3);
-define("GEOIP_CITY_EDITION_REV0", 111);
-define("GEOIP_CITY_EDITION_REV1", 2);
-define("GEOIP_ORG_EDITION", 110);
-define("GEOIP_ISP_EDITION", 4);
-define("SEGMENT_RECORD_LENGTH", 3);
-define("STANDARD_RECORD_LENGTH", 3);
-define("ORG_RECORD_LENGTH", 4);
-define("MAX_RECORD_LENGTH", 4);
-define("MAX_ORG_RECORD_LENGTH", 300);
-define("GEOIP_SHM_KEY", 0x4f415401);
-define("US_OFFSET", 1);
-define("CANADA_OFFSET", 677);
-define("WORLD_OFFSET", 1353);
-define("FIPS_RANGE", 360);
-define("GEOIP_UNKNOWN_SPEED", 0);
-define("GEOIP_DIALUP_SPEED", 1);
-define("GEOIP_CABLEDSL_SPEED", 2);
-define("GEOIP_CORPORATE_SPEED", 3);
-
-class GeoIP {
-    var $flags;
-    var $filehandle;
-    var $memory_buffer;
-    var $databaseType;
-    var $databaseSegments;
-    var $record_length;
-    var $shmid;
-    var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
-"" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5, 
-"AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "AN" => 10, "AO" => 11, 
-"AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17, 
-"AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23, 
-"BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29, 
-"BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35, 
-"BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41, 
-"CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47, 
-"CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53, 
-"CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59, 
-"DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65, 
-"ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71, 
-"FM" => 72, "FO" => 73, "FR" => 74, "FX" => 75, "GA" => 76, "GB" => 77,
-"GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83, 
-"GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89, 
-"GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95, 
-"HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101, 
-"IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107, 
-"IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113, 
-"KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119, 
-"KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125, 
-"LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131, 
-"LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137, 
-"MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143, 
-"MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149, 
-"MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
-"NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161, 
-"NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167, 
-"PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173, 
-"PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179, 
-"PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185, 
-"RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191, 
-"SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197, 
-"SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203, 
-"SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209, 
-"TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215, 
-"TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221, 
-"UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227, 
-"VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
-"VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239, 
-"ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245, 
-"O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251,
-"MF" => 252
-);
-    var $GEOIP_COUNTRY_CODES = array(
-"", "AP", "EU", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AQ",
-"AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH",
-"BI", "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA",
-"CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU",
-"CV", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG",
-"EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "FX", "GA", "GB",
-"GD", "GE", "GF", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT",
-"GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN",
-"IO", "IQ", "IR", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM",
-"KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS",
-"LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK", "ML", "MM", "MN",
-"MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA",
-"NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA",
-"PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY",
-"QA", "RE", "RO", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI",
-"SJ", "SK", "SL", "SM", "SN", "SO", "SR", "ST", "SV", "SY", "SZ", "TC", "TD",
-"TF", "TG", "TH", "TJ", "TK", "TM", "TN", "TO", "TL", "TR", "TT", "TV", "TW",
-"TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN",
-"VU", "WF", "WS", "YE", "YT", "RS", "ZA", "ZM", "ME", "ZW", "A1", "A2", "O1",
-"AX", "GG", "IM", "JE", "BL", "MF"
-);
-    var $GEOIP_COUNTRY_CODES3 = array(
-"","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","AQ","ARG",
-"ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI",
-"BEN","BMU","BRN","BOL","BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC",
-"COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV",
-"CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH",
-"ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD",
-"GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM","GUM",
-"GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IO",
-"IRQ","IRN","ISL","ITA","JAM","JOR","JPN","KEN","KGZ","KHM","KIR","COM","KNA",
-"PRK","KOR","KWT","CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
-"LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI","MMR","MNG","MAC",
-"MNP","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL",
-"NER","NFK","NGA","NIC","NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER",
-"PYF","PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW","PRY","QAT",
-"REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN","SWE","SGP","SHN","SVN","SJM",
-"SVK","SLE","SMR","SEN","SOM","SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF",
-"TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA",
-"UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT",
-"WLF","WSM","YEM","YT","SRB","ZAF","ZMB","MNE","ZWE","A1","A2","O1",
-"ALA","GGY","IMN","JEY","BLM","MAF"
-    );
-    var $GEOIP_COUNTRY_NAMES = array(
-"", "Asia/Pacific Region", "Europe", "Andorra", "United Arab Emirates",
-"Afghanistan", "Antigua and Barbuda", "Anguilla", "Albania", "Armenia",
-"Netherlands Antilles", "Angola", "Antarctica", "Argentina", "American Samoa",
-"Austria", "Australia", "Aruba", "Azerbaijan", "Bosnia and Herzegovina",
-"Barbados", "Bangladesh", "Belgium", "Burkina Faso", "Bulgaria", "Bahrain",
-"Burundi", "Benin", "Bermuda", "Brunei Darussalam", "Bolivia", "Brazil",
-"Bahamas", "Bhutan", "Bouvet Island", "Botswana", "Belarus", "Belize",
-"Canada", "Cocos (Keeling) Islands", "Congo, The Democratic Republic of the",
-"Central African Republic", "Congo", "Switzerland", "Cote D'Ivoire", "Cook Islands",
-"Chile", "Cameroon", "China", "Colombia", "Costa Rica", "Cuba", "Cape Verde",
-"Christmas Island", "Cyprus", "Czech Republic", "Germany", "Djibouti",
-"Denmark", "Dominica", "Dominican Republic", "Algeria", "Ecuador", "Estonia",
-"Egypt", "Western Sahara", "Eritrea", "Spain", "Ethiopia", "Finland", "Fiji",
-"Falkland Islands (Malvinas)", "Micronesia, Federated States of", "Faroe Islands",
-"France", "France, Metropolitan", "Gabon", "United Kingdom",
-"Grenada", "Georgia", "French Guiana", "Ghana", "Gibraltar", "Greenland",
-"Gambia", "Guinea", "Guadeloupe", "Equatorial Guinea", "Greece", "South Georgia and the South Sandwich Islands",
-"Guatemala", "Guam", "Guinea-Bissau",
-"Guyana", "Hong Kong", "Heard Island and McDonald Islands", "Honduras",
-"Croatia", "Haiti", "Hungary", "Indonesia", "Ireland", "Israel", "India",
-"British Indian Ocean Territory", "Iraq", "Iran, Islamic Republic of",
-"Iceland", "Italy", "Jamaica", "Jordan", "Japan", "Kenya", "Kyrgyzstan",
-"Cambodia", "Kiribati", "Comoros", "Saint Kitts and Nevis", "Korea, Democratic People's Republic of",
-"Korea, Republic of", "Kuwait", "Cayman Islands",
-"Kazakhstan", "Lao People's Democratic Republic", "Lebanon", "Saint Lucia",
-"Liechtenstein", "Sri Lanka", "Liberia", "Lesotho", "Lithuania", "Luxembourg",
-"Latvia", "Libyan Arab Jamahiriya", "Morocco", "Monaco", "Moldova, Republic of",
-"Madagascar", "Marshall Islands", "Macedonia",
-"Mali", "Myanmar", "Mongolia", "Macau", "Northern Mariana Islands",
-"Martinique", "Mauritania", "Montserrat", "Malta", "Mauritius", "Maldives",
-"Malawi", "Mexico", "Malaysia", "Mozambique", "Namibia", "New Caledonia",
-"Niger", "Norfolk Island", "Nigeria", "Nicaragua", "Netherlands", "Norway",
-"Nepal", "Nauru", "Niue", "New Zealand", "Oman", "Panama", "Peru", "French Polynesia",
-"Papua New Guinea", "Philippines", "Pakistan", "Poland", "Saint Pierre and Miquelon",
-"Pitcairn Islands", "Puerto Rico", "Palestinian Territory",
-"Portugal", "Palau", "Paraguay", "Qatar", "Reunion", "Romania",
-"Russian Federation", "Rwanda", "Saudi Arabia", "Solomon Islands",
-"Seychelles", "Sudan", "Sweden", "Singapore", "Saint Helena", "Slovenia",
-"Svalbard and Jan Mayen", "Slovakia", "Sierra Leone", "San Marino", "Senegal",
-"Somalia", "Suriname", "Sao Tome and Principe", "El Salvador", "Syrian Arab Republic",
-"Swaziland", "Turks and Caicos Islands", "Chad", "French Southern Territories",
-"Togo", "Thailand", "Tajikistan", "Tokelau", "Turkmenistan",
-"Tunisia", "Tonga", "Timor-Leste", "Turkey", "Trinidad and Tobago", "Tuvalu",
-"Taiwan", "Tanzania, United Republic of", "Ukraine",
-"Uganda", "United States Minor Outlying Islands", "United States", "Uruguay",
-"Uzbekistan", "Holy See (Vatican City State)", "Saint Vincent and the Grenadines",
-"Venezuela", "Virgin Islands, British", "Virgin Islands, U.S.",
-"Vietnam", "Vanuatu", "Wallis and Futuna", "Samoa", "Yemen", "Mayotte",
-"Serbia", "South Africa", "Zambia", "Montenegro", "Zimbabwe",
-"Anonymous Proxy","Satellite Provider","Other",
-"Aland Islands","Guernsey","Isle of Man","Jersey","Saint Barthelemy","Saint Martin"
-);
-
-    var $GEOIP_CONTINENT_CODES = array(
-"--", "AS", "EU", "EU", "AS", "AS", "SA", "SA", "EU", "AS",
-"SA", "AF", "AN", "SA", "OC", "EU", "OC", "SA", "AS", "EU",
-"SA", "AS", "EU", "AF", "EU", "AS", "AF", "AF", "SA", "AS",
-"SA", "SA", "SA", "AS", "AF", "AF", "EU", "SA", "NA", "AS",
-"AF", "AF", "AF", "EU", "AF", "OC", "SA", "AF", "AS", "SA",
-"SA", "SA", "AF", "AS", "AS", "EU", "EU", "AF", "EU", "SA",
-"SA", "AF", "SA", "EU", "AF", "AF", "AF", "EU", "AF", "EU",
-"OC", "SA", "OC", "EU", "EU", "EU", "AF", "EU", "SA", "AS",
-"SA", "AF", "EU", "SA", "AF", "AF", "SA", "AF", "EU", "SA",
-"SA", "OC", "AF", "SA", "AS", "AF", "SA", "EU", "SA", "EU",
-"AS", "EU", "AS", "AS", "AS", "AS", "AS", "EU", "EU", "SA",
-"AS", "AS", "AF", "AS", "AS", "OC", "AF", "SA", "AS", "AS",
-"AS", "SA", "AS", "AS", "AS", "SA", "EU", "AS", "AF", "AF",
-"EU", "EU", "EU", "AF", "AF", "EU", "EU", "AF", "OC", "EU",
-"AF", "AS", "AS", "AS", "OC", "SA", "AF", "SA", "EU", "AF",
-"AS", "AF", "NA", "AS", "AF", "AF", "OC", "AF", "OC", "AF",
-"SA", "EU", "EU", "AS", "OC", "OC", "OC", "AS", "SA", "SA",
-"OC", "OC", "AS", "AS", "EU", "SA", "OC", "SA", "AS", "EU",
-"OC", "SA", "AS", "AF", "EU", "AS", "AF", "AS", "OC", "AF",
-"AF", "EU", "AS", "AF", "EU", "EU", "EU", "AF", "EU", "AF",
-"AF", "SA", "AF", "SA", "AS", "AF", "SA", "AF", "AF", "AF",
-"AS", "AS", "OC", "AS", "AF", "OC", "AS", "EU", "SA", "OC",
-"AS", "AF", "EU", "AF", "OC", "NA", "SA", "AS", "EU", "SA",
-"SA", "SA", "SA", "AS", "OC", "OC", "OC", "AS", "AF", "EU",
-"AF", "AF", "EU", "AF", "--", "--", "--", "EU", "EU", "EU",
-"EU", "SA", "SA" );
-    
-}
-function geoip_load_shared_mem ($file) {
-
-  $fp = fopen($file, "rb");
-  if (!$fp) {
-    print "error opening $file: $php_errormsg\n";
-    exit;
-  }
-  $s_array = fstat($fp);
-  $size = $s_array['size'];
-  if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) {
-    shmop_delete ($shmid);
-    shmop_close ($shmid);
-  }
-  $shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size);
-  shmop_write ($shmid, fread($fp, $size), 0);
-  shmop_close ($shmid);
-}
-
-function _setup_segments($gi){
-  $gi->databaseType = GEOIP_COUNTRY_EDITION;
-  $gi->record_length = STANDARD_RECORD_LENGTH;
-  if ($gi->flags & GEOIP_SHARED_MEMORY) {
-    $offset = @shmop_size ($gi->shmid) - 3;
-    for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
-        $delim = @shmop_read ($gi->shmid, $offset, 3);
-        $offset += 3;
-        if ($delim == (chr(255).chr(255).chr(255))) {
-            $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
-            $offset++;
-
-            if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
-                $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
-            } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
-                $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
-        } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
-                     ($gi->databaseType == GEOIP_CITY_EDITION_REV1) 
-                    || ($gi->databaseType == GEOIP_ORG_EDITION)
-            || ($gi->databaseType == GEOIP_ISP_EDITION)
-            || ($gi->databaseType == GEOIP_ASNUM_EDITION)){
-                $gi->databaseSegments = 0;
-                $buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
-                for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
-                    $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
-                }
-                if (($gi->databaseType == GEOIP_ORG_EDITION)||
-            ($gi->databaseType == GEOIP_ISP_EDITION)) {
-                    $gi->record_length = ORG_RECORD_LENGTH;
-                }
-            }
-            break;
-        } else {
-            $offset -= 4;
-        }
-    }
-    if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
-        ($gi->databaseType == GEOIP_PROXY_EDITION)||
-        ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
-        $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
-    }
-  } else {
-    $filepos = ftell($gi->filehandle);
-    fseek($gi->filehandle, -3, SEEK_END);
-    for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
-        $delim = fread($gi->filehandle,3);
-        if ($delim == (chr(255).chr(255).chr(255))){
-        $gi->databaseType = ord(fread($gi->filehandle,1));
-        if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
-            $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
-        }
-        else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
-        $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
-                }  else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0) ||
-                 ($gi->databaseType == GEOIP_CITY_EDITION_REV1) || 
-                 ($gi->databaseType == GEOIP_ORG_EDITION) || 
-         ($gi->databaseType == GEOIP_ISP_EDITION) || 
-                 ($gi->databaseType == GEOIP_ASNUM_EDITION)){
-            $gi->databaseSegments = 0;
-            $buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
-            for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
-            $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
-            }
-        if ($gi->databaseType == GEOIP_ORG_EDITION ||
-        $gi->databaseType == GEOIP_ISP_EDITION) {
-        $gi->record_length = ORG_RECORD_LENGTH;
-            }
-        }
-        break;
-        } else {
-        fseek($gi->filehandle, -4, SEEK_CUR);
-        }
-    }
-    if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
-        ($gi->databaseType == GEOIP_PROXY_EDITION)||
-        ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
-         $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
-    }
-    fseek($gi->filehandle,$filepos,SEEK_SET);
-  }
-  return $gi;
-}
-
-function geoip_open($filename, $flags) {
-  $gi = new GeoIP;
-  $gi->flags = $flags;
-  if ($gi->flags & GEOIP_SHARED_MEMORY) {
-    $gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
-    } else {
-    $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
-    if ($gi->flags & GEOIP_MEMORY_CACHE) {
-        $s_array = fstat($gi->filehandle);
-        $gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
-    }
-  }
-
-  $gi = _setup_segments($gi);
-  return $gi;
-}
-
-function geoip_close($gi) {
-  if ($gi->flags & GEOIP_SHARED_MEMORY) {
-    return true;
-  }
-
-  return fclose($gi->filehandle);
-}
-
-function geoip_country_id_by_name($gi, $name) {
-  $addr = gethostbyname($name);
-  if (!$addr || $addr == $name) {
-    return false;
-  }
-  return geoip_country_id_by_addr($gi, $addr);
-}
-
-function geoip_country_code_by_name($gi, $name) {
-  $country_id = geoip_country_id_by_name($gi,$name);
-  if ($country_id !== false) {
-        return $gi->GEOIP_COUNTRY_CODES[$country_id];
-  }
-  return false;
-}
-
-function geoip_country_name_by_name($gi, $name) {
-  $country_id = geoip_country_id_by_name($gi,$name);
-  if ($country_id !== false) {
-        return $gi->GEOIP_COUNTRY_NAMES[$country_id];
-  }
-  return false;
-}
-
-function geoip_country_id_by_addr($gi, $addr) {
-  $ipnum = ip2long($addr);
-  return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
-}
-
-function geoip_country_code_by_addr($gi, $addr) {
-  if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
-    $record = geoip_record_by_addr($gi,$addr);
-    if ( $record !== false ) {
-      return $record->country_code;
-    }
-  } else {
-    $country_id = geoip_country_id_by_addr($gi,$addr);
-    if ($country_id !== false) {
-      return $gi->GEOIP_COUNTRY_CODES[$country_id];
-    }
-  }
-  return false;
-}
-
-function geoip_country_name_by_addr($gi, $addr) {
-  if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
-    $record = geoip_record_by_addr($gi,$addr);
-    return $record->country_name;
-  } else {
-    $country_id = geoip_country_id_by_addr($gi,$addr);
-    if ($country_id !== false) {
-      return $gi->GEOIP_COUNTRY_NAMES[$country_id];
-    }
-  }
-  return false;
-}
-
-function _geoip_seek_country($gi, $ipnum) {
-  $offset = 0;
-  for ($depth = 31; $depth >= 0; --$depth) {
-    if ($gi->flags & GEOIP_MEMORY_CACHE) {
-      // workaround php's broken substr, strpos, etc handling with
-      // mbstring.func_overload and mbstring.internal_encoding
-      $enc = mb_internal_encoding();
-       mb_internal_encoding('ISO-8859-1'); 
-
-      $buf = substr($gi->memory_buffer,
-                            2 * $gi->record_length * $offset,
-                            2 * $gi->record_length);
-
-      mb_internal_encoding($enc);
-    } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
-      $buf = @shmop_read ($gi->shmid, 
-                            2 * $gi->record_length * $offset,
-                            2 * $gi->record_length );
-        } else {
-      fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
-        or die("fseek failed");
-      $buf = fread($gi->filehandle, 2 * $gi->record_length);
-    }
-    $x = array(0,0);
-    for ($i = 0; $i < 2; ++$i) {
-      for ($j = 0; $j < $gi->record_length; ++$j) {
-        $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
-      }
-    }
-    if ($ipnum & (1 << $depth)) {
-      if ($x[1] >= $gi->databaseSegments) {
-        return $x[1];
-      }
-      $offset = $x[1];
-        } else {
-      if ($x[0] >= $gi->databaseSegments) {
-        return $x[0];
-      }
-      $offset = $x[0];
-    }
-  }
-  trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
-  return false;
-}
-
-function _get_org($gi,$ipnum){
-  $seek_org = _geoip_seek_country($gi,$ipnum);
-  if ($seek_org == $gi->databaseSegments) {
-    return NULL;
-  }
-  $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
-  if ($gi->flags & GEOIP_SHARED_MEMORY) {
-    $org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
-    } else {
-    fseek($gi->filehandle, $record_pointer, SEEK_SET);
-    $org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH);
-  }
-  // workaround php's broken substr, strpos, etc handling with
-  // mbstring.func_overload and mbstring.internal_encoding
-  $enc = mb_internal_encoding();
-  mb_internal_encoding('ISO-8859-1'); 
-  $org_buf = substr($org_buf, 0, strpos($org_buf, 0));
-  mb_internal_encoding($enc);
-  return $org_buf;
-}
-
-function geoip_org_by_addr ($gi,$addr) {
-  if ($addr == NULL) {
-    return 0;
-  }
-  $ipnum = ip2long($addr);
-  return _get_org($gi, $ipnum);
-}
-
-function _get_region($gi,$ipnum){
-  if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
-    $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0;
-    if ($seek_region >= 1000){
-      $country_code = "US";
-      $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
-    } else {
-            $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
-      $region = "";
-    }
-  return array ($country_code,$region);
-    }  else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
-    $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1;
-    //print $seek_region;
-    if ($seek_region < US_OFFSET){
-      $country_code = "";
-      $region = "";  
-        } else if ($seek_region < CANADA_OFFSET) {
-      $country_code = "US";
-      $region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65);
-        } else if ($seek_region < WORLD_OFFSET) {
-      $country_code = "CA";
-      $region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65);
-    } else {
-            $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
-      $region = "";
-    }
-  return array ($country_code,$region);
-  }
-}
-
-function geoip_region_by_addr ($gi,$addr) {
-  if ($addr == NULL) {
-    return 0;
-  }
-  $ipnum = ip2long($addr);
-  return _get_region($gi, $ipnum);
-}
-
-function getdnsattributes ($l,$ip){
-  $r = new Net_DNS_Resolver();
-  $r->nameservers = array("ws1.maxmind.com");
-  $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
-  $str = is_object($p->answer[0])?$p->answer[0]->string():'';
-  preg_match("#\"(.*)\"#",$str,$regs);
-  $str = $regs[1];
-  return $str;
-}
-
-?>
\ No newline at end of file
diff --git a/lib/geoip/geoipcity.inc b/lib/geoip/geoipcity.inc
deleted file mode 100644 (file)
index 4e7b397..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-<?php
-
-/* geoipcity.inc
- *
- * Copyright (C) 2004 Maxmind LLC
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
- */
-
-/*
- * Changelog:
- *
- * 2005-01-13   Andrew Hill, Awarez Ltd. (http://www.awarez.net)
- *              Formatted file according to PEAR library standards.
- *              Changed inclusion of geoip.inc file to require_once, so that
- *                  this library can be used in the same script as geoip.inc.
- */
-
-define("FULL_RECORD_LENGTH",50);
-
-require_once 'geoip.inc';
-require_once 'geoipregionvars.php';
-
-class geoiprecord {
-  var $country_code;
-  var $country_code3;
-  var $country_name;
-  var $region;
-  var $city;
-  var $postal_code;
-  var $latitude;
-  var $longitude;
-  var $area_code;
-  var $dma_code;   # metro and dma code are the same. use metro_code
-  var $metro_code;
-  var $continent_code;
-}
-
-class geoipdnsrecord {
-  var $country_code;
-  var $country_code3;
-  var $country_name;
-  var $region;
-  var $regionname;
-  var $city;
-  var $postal_code;
-  var $latitude;
-  var $longitude;
-  var $areacode;
-  var $dmacode;
-  var $isp;
-  var $org;
-  var $metrocode;
-}
-
-function getrecordwithdnsservice($str){
-  $record = new geoipdnsrecord;
-  $keyvalue = explode(";",$str);
-  foreach ($keyvalue as $keyvalue2){
-    list($key,$value) = explode("=",$keyvalue2);
-    if ($key == "co"){
-      $record->country_code = $value;
-    }
-    if ($key == "ci"){
-      $record->city = $value;
-    }
-    if ($key == "re"){
-      $record->region = $value;
-    }
-    if ($key == "ac"){
-      $record->areacode = $value;
-    }
-    if ($key == "dm" || $key == "me" ){
-      $record->dmacode   = $value;
-      $record->metrocode = $value;
-    }
-    if ($key == "is"){
-      $record->isp = $value;
-    }
-    if ($key == "or"){
-      $record->org = $value;
-    }
-    if ($key == "zi"){
-      $record->postal_code = $value;
-    }
-    if ($key == "la"){
-      $record->latitude = $value;
-    }
-    if ($key == "lo"){
-      $record->longitude = $value;
-    }
-  }
-  $number = $GLOBALS['GEOIP_COUNTRY_CODE_TO_NUMBER'][$record->country_code];
-  $record->country_code3 = $GLOBALS['GEOIP_COUNTRY_CODES3'][$number];
-  $record->country_name = $GLOBALS['GEOIP_COUNTRY_NAMES'][$number];
-  if ($record->region != "") {
-    if (($record->country_code == "US") || ($record->country_code == "CA")){
-      $record->regionname = $GLOBALS['ISO'][$record->country_code][$record->region];
-    } else {
-      $record->regionname = $GLOBALS['FIPS'][$record->country_code][$record->region];
-    }
-  }
-  return $record;
-}
-
-function _get_record($gi,$ipnum){
-  $seek_country = _geoip_seek_country($gi,$ipnum);
-  if ($seek_country == $gi->databaseSegments) {
-    return NULL;
-  }
-  
-  // workaround php's broken substr, strpos, etc handling with
-  // mbstring.func_overload and mbstring.internal_encoding
-  $enc = mb_internal_encoding();
-  mb_internal_encoding('ISO-8859-1'); 
-
-  $record_pointer = $seek_country + (2 * $gi->record_length - 1) * $gi->databaseSegments;
-  
-  if ($gi->flags & GEOIP_MEMORY_CACHE) {
-    $record_buf = substr($gi->memory_buffer,$record_pointer,FULL_RECORD_LENGTH);
-  } elseif ($gi->flags & GEOIP_SHARED_MEMORY){
-    $record_buf = @shmop_read($gi->shmid,$record_pointer,FULL_RECORD_LENGTH);
-  } else {
-    fseek($gi->filehandle, $record_pointer, SEEK_SET);
-    $record_buf = fread($gi->filehandle,FULL_RECORD_LENGTH);
-  }
-  $record = new geoiprecord;
-  $record_buf_pos = 0;
-  $char = ord(substr($record_buf,$record_buf_pos,1));
-    $record->country_code = $gi->GEOIP_COUNTRY_CODES[$char];
-    $record->country_code3 = $gi->GEOIP_COUNTRY_CODES3[$char];
-    $record->country_name = $gi->GEOIP_COUNTRY_NAMES[$char];
-  $record->continent_code = $gi->GEOIP_CONTINENT_CODES[$char];
-  $record_buf_pos++;
-  $str_length = 0;
-    // Get region
-  $char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
-  while ($char != 0){
-    $str_length++;
-    $char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
-  }
-  if ($str_length > 0){
-    $record->region = substr($record_buf,$record_buf_pos,$str_length);
-  }
-  $record_buf_pos += $str_length + 1;
-  $str_length = 0;
-    // Get city
-  $char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
-  while ($char != 0){
-    $str_length++;
-    $char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
-  }
-  if ($str_length > 0){
-    $record->city = substr($record_buf,$record_buf_pos,$str_length);
-  }
-  $record_buf_pos += $str_length + 1;
-  $str_length = 0;
-    // Get postal code
-  $char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
-  while ($char != 0){
-    $str_length++;
-    $char = ord(substr($record_buf,$record_buf_pos+$str_length,1));
-  }
-  if ($str_length > 0){
-    $record->postal_code = substr($record_buf,$record_buf_pos,$str_length);
-  }
-  $record_buf_pos += $str_length + 1;
-  $str_length = 0;
-    // Get latitude and longitude
-  $latitude = 0;
-  $longitude = 0;
-  for ($j = 0;$j < 3; ++$j){
-    $char = ord(substr($record_buf,$record_buf_pos++,1));
-    $latitude += ($char << ($j * 8));
-  }
-  $record->latitude = ($latitude/10000) - 180;
-  for ($j = 0;$j < 3; ++$j){
-    $char = ord(substr($record_buf,$record_buf_pos++,1));
-    $longitude += ($char << ($j * 8));
-  }
-  $record->longitude = ($longitude/10000) - 180;
-  if (GEOIP_CITY_EDITION_REV1 == $gi->databaseType){
-    $metroarea_combo = 0;
-    if ($record->country_code == "US"){
-      for ($j = 0;$j < 3;++$j){
-        $char = ord(substr($record_buf,$record_buf_pos++,1));
-        $metroarea_combo += ($char << ($j * 8));
-      }
-      $record->metro_code = $record->dma_code = floor($metroarea_combo/1000);
-      $record->area_code = $metroarea_combo%1000;
-    }
-  }
-  mb_internal_encoding($enc);
-  return $record;
-}
-
-function GeoIP_record_by_addr ($gi,$addr){
-  if ($addr == NULL){
-     return 0;
-  }
-  $ipnum = ip2long($addr);
-  return _get_record($gi, $ipnum);
-}
-
-?>
diff --git a/lib/geoip/geoipregionvars.php b/lib/geoip/geoipregionvars.php
deleted file mode 100644 (file)
index 9ae67db..0000000
+++ /dev/null
@@ -1,4456 +0,0 @@
-<?php
-# Copyright 2009 Maxmind LLC All Rights Reserved
-$GEOIP_REGION_NAME = array(
-"AD" => array(
-  "02" => "Canillo",
-  "03" => "Encamp",
-  "04" => "La Massana",
-  "05" => "Ordino",
-  "06" => "Sant Julia de Loria",
-  "07" => "Andorra la Vella",
-  "08" => "Escaldes-Engordany"),
-"AE" => array(
-  "01" => "Abu Dhabi",
-  "02" => "Ajman",
-  "03" => "Dubai",
-  "04" => "Fujairah",
-  "05" => "Ras Al Khaimah",
-  "06" => "Sharjah",
-  "07" => "Umm Al Quwain"),
-"AF" => array(
-  "01" => "Badakhshan",
-  "02" => "Badghis",
-  "03" => "Baghlan",
-  "05" => "Bamian",
-  "06" => "Farah",
-  "07" => "Faryab",
-  "08" => "Ghazni",
-  "09" => "Ghowr",
-  "10" => "Helmand",
-  "11" => "Herat",
-  "13" => "Kabol",
-  "14" => "Kapisa",
-  "15" => "Konar",
-  "16" => "Laghman",
-  "17" => "Lowgar",
-  "18" => "Nangarhar",
-  "19" => "Nimruz",
-  "21" => "Paktia",
-  "22" => "Parvan",
-  "23" => "Kandahar",
-  "24" => "Kondoz",
-  "26" => "Takhar",
-  "27" => "Vardak",
-  "28" => "Zabol",
-  "29" => "Paktika",
-  "30" => "Balkh",
-  "31" => "Jowzjan",
-  "32" => "Samangan",
-  "33" => "Sar-e Pol",
-  "34" => "Konar",
-  "35" => "Laghman",
-  "36" => "Paktia",
-  "37" => "Khowst",
-  "38" => "Nurestan",
-  "39" => "Oruzgan",
-  "40" => "Parvan",
-  "41" => "Daykondi",
-  "42" => "Panjshir"),
-"AG" => array(
-  "01" => "Barbuda",
-  "03" => "Saint George",
-  "04" => "Saint John",
-  "05" => "Saint Mary",
-  "06" => "Saint Paul",
-  "07" => "Saint Peter",
-  "08" => "Saint Philip"),
-"AL" => array(
-  "40" => "Berat",
-  "41" => "Diber",
-  "42" => "Durres",
-  "43" => "Elbasan",
-  "44" => "Fier",
-  "45" => "Gjirokaster",
-  "46" => "Korce",
-  "47" => "Kukes",
-  "48" => "Lezhe",
-  "49" => "Shkoder",
-  "50" => "Tirane",
-  "51" => "Vlore"),
-"AM" => array(
-  "01" => "Aragatsotn",
-  "02" => "Ararat",
-  "03" => "Armavir",
-  "04" => "Geghark'unik'",
-  "05" => "Kotayk'",
-  "06" => "Lorri",
-  "07" => "Shirak",
-  "08" => "Syunik'",
-  "09" => "Tavush",
-  "10" => "Vayots' Dzor",
-  "11" => "Yerevan"),
-"AO" => array(
-  "01" => "Benguela",
-  "02" => "Bie",
-  "03" => "Cabinda",
-  "04" => "Cuando Cubango",
-  "05" => "Cuanza Norte",
-  "06" => "Cuanza Sul",
-  "07" => "Cunene",
-  "08" => "Huambo",
-  "09" => "Huila",
-  "10" => "Luanda",
-  "12" => "Malanje",
-  "13" => "Namibe",
-  "14" => "Moxico",
-  "15" => "Uige",
-  "16" => "Zaire",
-  "17" => "Lunda Norte",
-  "18" => "Lunda Sul",
-  "19" => "Bengo",
-  "20" => "Luanda"),
-"AR" => array(
-  "01" => "Buenos Aires",
-  "02" => "Catamarca",
-  "03" => "Chaco",
-  "04" => "Chubut",
-  "05" => "Cordoba",
-  "06" => "Corrientes",
-  "07" => "Distrito Federal",
-  "08" => "Entre Rios",
-  "09" => "Formosa",
-  "10" => "Jujuy",
-  "11" => "La Pampa",
-  "12" => "La Rioja",
-  "13" => "Mendoza",
-  "14" => "Misiones",
-  "15" => "Neuquen",
-  "16" => "Rio Negro",
-  "17" => "Salta",
-  "18" => "San Juan",
-  "19" => "San Luis",
-  "20" => "Santa Cruz",
-  "21" => "Santa Fe",
-  "22" => "Santiago del Estero",
-  "23" => "Tierra del Fuego",
-  "24" => "Tucuman"),
-"AT" => array(
-  "01" => "Burgenland",
-  "02" => "Karnten",
-  "03" => "Niederosterreich",
-  "04" => "Oberosterreich",
-  "05" => "Salzburg",
-  "06" => "Steiermark",
-  "07" => "Tirol",
-  "08" => "Vorarlberg",
-  "09" => "Wien"),
-"AU" => array(
-  "01" => "Australian Capital Territory",
-  "02" => "New South Wales",
-  "03" => "Northern Territory",
-  "04" => "Queensland",
-  "05" => "South Australia",
-  "06" => "Tasmania",
-  "07" => "Victoria",
-  "08" => "Western Australia"),
-"AZ" => array(
-  "01" => "Abseron",
-  "02" => "Agcabadi",
-  "03" => "Agdam",
-  "04" => "Agdas",
-  "05" => "Agstafa",
-  "06" => "Agsu",
-  "07" => "Ali Bayramli",
-  "08" => "Astara",
-  "09" => "Baki",
-  "10" => "Balakan",
-  "11" => "Barda",
-  "12" => "Beylaqan",
-  "13" => "Bilasuvar",
-  "14" => "Cabrayil",
-  "15" => "Calilabad",
-  "16" => "Daskasan",
-  "17" => "Davaci",
-  "18" => "Fuzuli",
-  "19" => "Gadabay",
-  "20" => "Ganca",
-  "21" => "Goranboy",
-  "22" => "Goycay",
-  "23" => "Haciqabul",
-  "24" => "Imisli",
-  "25" => "Ismayilli",
-  "26" => "Kalbacar",
-  "27" => "Kurdamir",
-  "28" => "Lacin",
-  "29" => "Lankaran",
-  "30" => "Lankaran",
-  "31" => "Lerik",
-  "32" => "Masalli",
-  "33" => "Mingacevir",
-  "34" => "Naftalan",
-  "35" => "Naxcivan",
-  "36" => "Neftcala",
-  "37" => "Oguz",
-  "38" => "Qabala",
-  "39" => "Qax",
-  "40" => "Qazax",
-  "41" => "Qobustan",
-  "42" => "Quba",
-  "43" => "Qubadli",
-  "44" => "Qusar",
-  "45" => "Saatli",
-  "46" => "Sabirabad",
-  "47" => "Saki",
-  "48" => "Saki",
-  "49" => "Salyan",
-  "50" => "Samaxi",
-  "51" => "Samkir",
-  "52" => "Samux",
-  "53" => "Siyazan",
-  "54" => "Sumqayit",
-  "55" => "Susa",
-  "56" => "Susa",
-  "57" => "Tartar",
-  "58" => "Tovuz",
-  "59" => "Ucar",
-  "60" => "Xacmaz",
-  "61" => "Xankandi",
-  "62" => "Xanlar",
-  "63" => "Xizi",
-  "64" => "Xocali",
-  "65" => "Xocavand",
-  "66" => "Yardimli",
-  "67" => "Yevlax",
-  "68" => "Yevlax",
-  "69" => "Zangilan",
-  "70" => "Zaqatala",
-  "71" => "Zardab"),
-"BA" => array(
-  "01" => "Federation of Bosnia and Herzegovina",
-  "02" => "Republika Srpska"),
-"BB" => array(
-  "01" => "Christ Church",
-  "02" => "Saint Andrew",
-  "03" => "Saint George",
-  "04" => "Saint James",
-  "05" => "Saint John",
-  "06" => "Saint Joseph",
-  "07" => "Saint Lucy",
-  "08" => "Saint Michael",
-  "09" => "Saint Peter",
-  "10" => "Saint Philip",
-  "11" => "Saint Thomas"),
-"BD" => array(
-  "01" => "Barisal",
-  "04" => "Bandarban",
-  "05" => "Comilla",
-  "12" => "Mymensingh",
-  "13" => "Noakhali",
-  "15" => "Patuakhali",
-  "22" => "Bagerhat",
-  "23" => "Bhola",
-  "24" => "Bogra",
-  "25" => "Barguna",
-  "26" => "Brahmanbaria",
-  "27" => "Chandpur",
-  "28" => "Chapai Nawabganj",
-  "29" => "Chattagram",
-  "30" => "Chuadanga",
-  "31" => "Cox's Bazar",
-  "32" => "Dhaka",
-  "33" => "Dinajpur",
-  "34" => "Faridpur",
-  "35" => "Feni",
-  "36" => "Gaibandha",
-  "37" => "Gazipur",
-  "38" => "Gopalganj",
-  "39" => "Habiganj",
-  "40" => "Jaipurhat",
-  "41" => "Jamalpur",
-  "42" => "Jessore",
-  "43" => "Jhalakati",
-  "44" => "Jhenaidah",
-  "45" => "Khagrachari",
-  "46" => "Khulna",
-  "47" => "Kishorganj",
-  "48" => "Kurigram",
-  "49" => "Kushtia",
-  "50" => "Laksmipur",
-  "51" => "Lalmonirhat",
-  "52" => "Madaripur",
-  "53" => "Magura",
-  "54" => "Manikganj",
-  "55" => "Meherpur",
-  "56" => "Moulavibazar",
-  "57" => "Munshiganj",
-  "58" => "Naogaon",
-  "59" => "Narail",
-  "60" => "Narayanganj",
-  "61" => "Narsingdi",
-  "62" => "Nator",
-  "63" => "Netrakona",
-  "64" => "Nilphamari",
-  "65" => "Pabna",
-  "66" => "Panchagar",
-  "67" => "Parbattya Chattagram",
-  "68" => "Pirojpur",
-  "69" => "Rajbari",
-  "70" => "Rajshahi",
-  "71" => "Rangpur",
-  "72" => "Satkhira",
-  "73" => "Shariyatpur",
-  "74" => "Sherpur",
-  "75" => "Sirajganj",
-  "76" => "Sunamganj",
-  "77" => "Sylhet",
-  "78" => "Tangail",
-  "79" => "Thakurgaon",
-  "81" => "Dhaka",
-  "82" => "Khulna",
-  "83" => "Rajshahi",
-  "84" => "Chittagong",
-  "85" => "Barisal",
-  "86" => "Sylhet"),
-"BE" => array(
-  "01" => "Antwerpen",
-  "02" => "Brabant",
-  "03" => "Hainaut",
-  "04" => "Liege",
-  "05" => "Limburg",
-  "06" => "Luxembourg",
-  "07" => "Namur",
-  "08" => "Oost-Vlaanderen",
-  "09" => "West-Vlaanderen",
-  "10" => "Brabant Wallon",
-  "11" => "Brussels Hoofdstedelijk Gewest",
-  "12" => "Vlaams-Brabant"),
-"BF" => array(
-  "15" => "Bam",
-  "19" => "Boulkiemde",
-  "20" => "Ganzourgou",
-  "21" => "Gnagna",
-  "28" => "Kouritenga",
-  "33" => "Oudalan",
-  "34" => "Passore",
-  "36" => "Sanguie",
-  "40" => "Soum",
-  "42" => "Tapoa",
-  "44" => "Zoundweogo",
-  "45" => "Bale",
-  "46" => "Banwa",
-  "47" => "Bazega",
-  "48" => "Bougouriba",
-  "49" => "Boulgou",
-  "50" => "Gourma",
-  "51" => "Houet",
-  "52" => "Ioba",
-  "53" => "Kadiogo",
-  "54" => "Kenedougou",
-  "55" => "Komoe",
-  "56" => "Komondjari",
-  "57" => "Kompienga",
-  "58" => "Kossi",
-  "59" => "Koulpelogo",
-  "60" => "Kourweogo",
-  "61" => "Leraba",
-  "62" => "Loroum",
-  "63" => "Mouhoun",
-  "64" => "Namentenga",
-  "65" => "Naouri",
-  "66" => "Nayala",
-  "67" => "Noumbiel",
-  "68" => "Oubritenga",
-  "69" => "Poni",
-  "70" => "Sanmatenga",
-  "71" => "Seno",
-  "72" => "Sissili",
-  "73" => "Sourou",
-  "74" => "Tuy",
-  "75" => "Yagha",
-  "76" => "Yatenga",
-  "77" => "Ziro",
-  "78" => "Zondoma"),
-"BG" => array(
-  "33" => "Mikhaylovgrad",
-  "38" => "Blagoevgrad",
-  "39" => "Burgas",
-  "40" => "Dobrich",
-  "41" => "Gabrovo",
-  "42" => "Grad Sofiya",
-  "43" => "Khaskovo",
-  "44" => "Kurdzhali",
-  "45" => "Kyustendil",
-  "46" => "Lovech",
-  "47" => "Montana",
-  "48" => "Pazardzhik",
-  "49" => "Pernik",
-  "50" => "Pleven",
-  "51" => "Plovdiv",
-  "52" => "Razgrad",
-  "53" => "Ruse",
-  "54" => "Shumen",
-  "55" => "Silistra",
-  "56" => "Sliven",
-  "57" => "Smolyan",
-  "58" => "Sofiya",
-  "59" => "Stara Zagora",
-  "60" => "Turgovishte",
-  "61" => "Varna",
-  "62" => "Veliko Turnovo",
-  "63" => "Vidin",
-  "64" => "Vratsa",
-  "65" => "Yambol"),
-"BH" => array(
-  "01" => "Al Hadd",
-  "02" => "Al Manamah",
-  "03" => "Al Muharraq",
-  "05" => "Jidd Hafs",
-  "06" => "Sitrah",
-  "07" => "Ar Rifa' wa al Mintaqah al Janubiyah",
-  "08" => "Al Mintaqah al Gharbiyah",
-  "09" => "Mintaqat Juzur Hawar",
-  "10" => "Al Mintaqah ash Shamaliyah",
-  "11" => "Al Mintaqah al Wusta",
-  "12" => "Madinat",
-  "13" => "Ar Rifa",
-  "14" => "Madinat Hamad",
-  "15" => "Al Muharraq",
-  "16" => "Al Asimah",
-  "17" => "Al Janubiyah",
-  "18" => "Ash Shamaliyah",
-  "19" => "Al Wusta"),
-"BI" => array(
-  "02" => "Bujumbura",
-  "09" => "Bubanza",
-  "10" => "Bururi",
-  "11" => "Cankuzo",
-  "12" => "Cibitoke",
-  "13" => "Gitega",
-  "14" => "Karuzi",
-  "15" => "Kayanza",
-  "16" => "Kirundo",
-  "17" => "Makamba",
-  "18" => "Muyinga",
-  "19" => "Ngozi",
-  "20" => "Rutana",
-  "21" => "Ruyigi",
-  "22" => "Muramvya",
-  "23" => "Mwaro"),
-"BJ" => array(
-  "01" => "Atakora",
-  "02" => "Atlantique",
-  "03" => "Borgou",
-  "04" => "Mono",
-  "05" => "Oueme",
-  "06" => "Zou",
-  "07" => "Alibori",
-  "08" => "Atakora",
-  "09" => "Atlanyique",
-  "10" => "Borgou",
-  "11" => "Collines",
-  "12" => "Kouffo",
-  "13" => "Donga",
-  "14" => "Littoral",
-  "15" => "Mono",
-  "16" => "Oueme",
-  "17" => "Plateau",
-  "18" => "Zou"),
-"BM" => array(
-  "01" => "Devonshire",
-  "02" => "Hamilton",
-  "03" => "Hamilton",
-  "04" => "Paget",
-  "05" => "Pembroke",
-  "06" => "Saint George",
-  "07" => "Saint George's",
-  "08" => "Sandys",
-  "09" => "Smiths",
-  "10" => "Southampton",
-  "11" => "Warwick"),
-"BN" => array(
-  "07" => "Alibori",
-  "08" => "Belait",
-  "09" => "Brunei and Muara",
-  "10" => "Temburong",
-  "11" => "Collines",
-  "12" => "Kouffo",
-  "13" => "Donga",
-  "14" => "Littoral",
-  "15" => "Tutong",
-  "16" => "Oueme",
-  "17" => "Plateau",
-  "18" => "Zou"),
-"BO" => array(
-  "01" => "Chuquisaca",
-  "02" => "Cochabamba",
-  "03" => "El Beni",
-  "04" => "La Paz",
-  "05" => "Oruro",
-  "06" => "Pando",
-  "07" => "Potosi",
-  "08" => "Santa Cruz",
-  "09" => "Tarija"),
-"BR" => array(
-  "01" => "Acre",
-  "02" => "Alagoas",
-  "03" => "Amapa",
-  "04" => "Amazonas",
-  "05" => "Bahia",
-  "06" => "Ceara",
-  "07" => "Distrito Federal",
-  "08" => "Espirito Santo",
-  "11" => "Mato Grosso do Sul",
-  "13" => "Maranhao",
-  "14" => "Mato Grosso",
-  "15" => "Minas Gerais",
-  "16" => "Para",
-  "17" => "Paraiba",
-  "18" => "Parana",
-  "20" => "Piaui",
-  "21" => "Rio de Janeiro",
-  "22" => "Rio Grande do Norte",
-  "23" => "Rio Grande do Sul",
-  "24" => "Rondonia",
-  "25" => "Roraima",
-  "26" => "Santa Catarina",
-  "27" => "Sao Paulo",
-  "28" => "Sergipe",
-  "29" => "Goias",
-  "30" => "Pernambuco",
-  "31" => "Tocantins"),
-"BS" => array(
-  "05" => "Bimini",
-  "06" => "Cat Island",
-  "10" => "Exuma",
-  "13" => "Inagua",
-  "15" => "Long Island",
-  "16" => "Mayaguana",
-  "18" => "Ragged Island",
-  "22" => "Harbour Island",
-  "23" => "New Providence",
-  "24" => "Acklins and Crooked Islands",
-  "25" => "Freeport",
-  "26" => "Fresh Creek",
-  "27" => "Governor's Harbour",
-  "28" => "Green Turtle Cay",
-  "29" => "High Rock",
-  "30" => "Kemps Bay",
-  "31" => "Marsh Harbour",
-  "32" => "Nichollstown and Berry Islands",
-  "33" => "Rock Sound",
-  "34" => "Sandy Point",
-  "35" => "San Salvador and Rum Cay"),
-"BT" => array(
-  "05" => "Bumthang",
-  "06" => "Chhukha",
-  "07" => "Chirang",
-  "08" => "Daga",
-  "09" => "Geylegphug",
-  "10" => "Ha",
-  "11" => "Lhuntshi",
-  "12" => "Mongar",
-  "13" => "Paro",
-  "14" => "Pemagatsel",
-  "15" => "Punakha",
-  "16" => "Samchi",
-  "17" => "Samdrup",
-  "18" => "Shemgang",
-  "19" => "Tashigang",
-  "20" => "Thimphu",
-  "21" => "Tongsa",
-  "22" => "Wangdi Phodrang"),
-"BW" => array(
-  "01" => "Central",
-  "03" => "Ghanzi",
-  "04" => "Kgalagadi",
-  "05" => "Kgatleng",
-  "06" => "Kweneng",
-  "08" => "North-East",
-  "09" => "South-East",
-  "10" => "Southern",
-  "11" => "North-West"),
-"BY" => array(
-  "01" => "Brestskaya Voblasts'",
-  "02" => "Homyel'skaya Voblasts'",
-  "03" => "Hrodzyenskaya Voblasts'",
-  "04" => "Minsk",
-  "05" => "Minskaya Voblasts'",
-  "06" => "Mahilyowskaya Voblasts'",
-  "07" => "Vitsyebskaya Voblasts'"),
-"BZ" => array(
-  "01" => "Belize",
-  "02" => "Cayo",
-  "03" => "Corozal",
-  "04" => "Orange Walk",
-  "05" => "Stann Creek",
-  "06" => "Toledo"),
-"CA" => array(
-  "AB" => "Alberta",
-  "BC" => "British Columbia",
-  "MB" => "Manitoba",
-  "NB" => "New Brunswick",
-  "NL" => "Newfoundland",
-  "NS" => "Nova Scotia",
-  "NT" => "Northwest Territories",
-  "NU" => "Nunavut",
-  "ON" => "Ontario",
-  "PE" => "Prince Edward Island",
-  "QC" => "Quebec",
-  "SK" => "Saskatchewan",
-  "YT" => "Yukon Territory"),
-"CD" => array(
-  "01" => "Bandundu",
-  "02" => "Equateur",
-  "04" => "Kasai-Oriental",
-  "05" => "Katanga",
-  "06" => "Kinshasa",
-  "07" => "Kivu",
-  "08" => "Bas-Congo",
-  "09" => "Orientale",
-  "10" => "Maniema",
-  "11" => "Nord-Kivu",
-  "12" => "Sud-Kivu",
-  "13" => "Cuvette"),
-"CF" => array(
-  "01" => "Bamingui-Bangoran",
-  "02" => "Basse-Kotto",
-  "03" => "Haute-Kotto",
-  "04" => "Mambere-Kadei",
-  "05" => "Haut-Mbomou",
-  "06" => "Kemo",
-  "07" => "Lobaye",
-  "08" => "Mbomou",
-  "09" => "Nana-Mambere",
-  "11" => "Ouaka",
-  "12" => "Ouham",
-  "13" => "Ouham-Pende",
-  "14" => "Cuvette-Ouest",
-  "15" => "Nana-Grebizi",
-  "16" => "Sangha-Mbaere",
-  "17" => "Ombella-Mpoko",
-  "18" => "Bangui"),
-"CG" => array(
-  "01" => "Bouenza",
-  "03" => "Cuvette",
-  "04" => "Kouilou",
-  "05" => "Lekoumou",
-  "06" => "Likouala",
-  "07" => "Niari",
-  "08" => "Plateaux",
-  "10" => "Sangha",
-  "11" => "Pool",
-  "12" => "Brazzaville"),
-"CH" => array(
-  "01" => "Aargau",
-  "02" => "Ausser-Rhoden",
-  "03" => "Basel-Landschaft",
-  "04" => "Basel-Stadt",
-  "05" => "Bern",
-  "06" => "Fribourg",
-  "07" => "Geneve",
-  "08" => "Glarus",
-  "09" => "Graubunden",
-  "10" => "Inner-Rhoden",
-  "11" => "Luzern",
-  "12" => "Neuchatel",
-  "13" => "Nidwalden",
-  "14" => "Obwalden",
-  "15" => "Sankt Gallen",
-  "16" => "Schaffhausen",
-  "17" => "Schwyz",
-  "18" => "Solothurn",
-  "19" => "Thurgau",
-  "20" => "Ticino",
-  "21" => "Uri",
-  "22" => "Valais",
-  "23" => "Vaud",
-  "24" => "Zug",
-  "25" => "Zurich",
-  "26" => "Jura"),
-"CI" => array(
-  "05" => "Atacama",
-  "06" => "Biobio",
-  "51" => "Sassandra",
-  "61" => "Abidjan",
-  "74" => "Agneby",
-  "75" => "Bafing",
-  "76" => "Bas-Sassandra",
-  "77" => "Denguele",
-  "78" => "Dix-Huit Montagnes",
-  "79" => "Fromager",
-  "80" => "Haut-Sassandra",
-  "81" => "Lacs",
-  "82" => "Lagunes",
-  "83" => "Marahoue",
-  "84" => "Moyen-Cavally",
-  "85" => "Moyen-Comoe",
-  "86" => "N'zi-Comoe",
-  "87" => "Savanes",
-  "88" => "Sud-Bandama",
-  "89" => "Sud-Comoe",
-  "90" => "Vallee du Bandama",
-  "91" => "Worodougou",
-  "92" => "Zanzan"),
-"CL" => array(
-  "01" => "Valparaiso",
-  "02" => "Aisen del General Carlos Ibanez del Campo",
-  "03" => "Antofagasta",
-  "04" => "Araucania",
-  "05" => "Atacama",
-  "06" => "Bio-Bio",
-  "07" => "Coquimbo",
-  "08" => "Libertador General Bernardo O'Higgins",
-  "09" => "Los Lagos",
-  "10" => "Magallanes y de la Antartica Chilena",
-  "11" => "Maule",
-  "12" => "Region Metropolitana",
-  "13" => "Tarapaca"),
-"CM" => array(
-  "04" => "Est",
-  "05" => "Littoral",
-  "07" => "Nord-Ouest",
-  "08" => "Ouest",
-  "09" => "Sud-Ouest",
-  "10" => "Adamaoua",
-  "11" => "Centre",
-  "12" => "Extreme-Nord",
-  "13" => "Nord",
-  "14" => "Sud"),
-"CN" => array(
-  "01" => "Anhui",
-  "02" => "Zhejiang",
-  "03" => "Jiangxi",
-  "04" => "Jiangsu",
-  "05" => "Jilin",
-  "06" => "Qinghai",
-  "07" => "Fujian",
-  "08" => "Heilongjiang",
-  "09" => "Henan",
-  "10" => "Hebei",
-  "11" => "Hunan",
-  "12" => "Hubei",
-  "13" => "Xinjiang",
-  "14" => "Xizang",
-  "15" => "Gansu",
-  "16" => "Guangxi",
-  "18" => "Guizhou",
-  "19" => "Liaoning",
-  "20" => "Nei Mongol",
-  "21" => "Ningxia",
-  "22" => "Beijing",
-  "23" => "Shanghai",
-  "24" => "Shanxi",
-  "25" => "Shandong",
-  "26" => "Shaanxi",
-  "28" => "Tianjin",
-  "29" => "Yunnan",
-  "30" => "Guangdong",
-  "31" => "Hainan",
-  "32" => "Sichuan",
-  "33" => "Chongqing"),
-"CO" => array(
-  "01" => "Amazonas",
-  "02" => "Antioquia",
-  "03" => "Arauca",
-  "04" => "Atlantico",
-  "05" => "Bolivar Department",
-  "06" => "Boyaca Department",
-  "07" => "Caldas Department",
-  "08" => "Caqueta",
-  "09" => "Cauca",
-  "10" => "Cesar",
-  "11" => "Choco",
-  "12" => "Cordoba",
-  "14" => "Guaviare",
-  "15" => "Guainia",
-  "16" => "Huila",
-  "17" => "La Guajira",
-  "18" => "Magdalena Department",
-  "19" => "Meta",
-  "20" => "Narino",
-  "21" => "Norte de Santander",
-  "22" => "Putumayo",
-  "23" => "Quindio",
-  "24" => "Risaralda",
-  "25" => "San Andres y Providencia",
-  "26" => "Santander",
-  "27" => "Sucre",
-  "28" => "Tolima",
-  "29" => "Valle del Cauca",
-  "30" => "Vaupes",
-  "31" => "Vichada",
-  "32" => "Casanare",
-  "33" => "Cundinamarca",
-  "34" => "Distrito Especial",
-  "35" => "Bolivar",
-  "36" => "Boyaca",
-  "37" => "Caldas",
-  "38" => "Magdalena"),
-"CR" => array(
-  "01" => "Alajuela",
-  "02" => "Cartago",
-  "03" => "Guanacaste",
-  "04" => "Heredia",
-  "06" => "Limon",
-  "07" => "Puntarenas",
-  "08" => "San Jose"),
-"CU" => array(
-  "01" => "Pinar del Rio",
-  "02" => "Ciudad de la Habana",
-  "03" => "Matanzas",
-  "04" => "Isla de la Juventud",
-  "05" => "Camaguey",
-  "07" => "Ciego de Avila",
-  "08" => "Cienfuegos",
-  "09" => "Granma",
-  "10" => "Guantanamo",
-  "11" => "La Habana",
-  "12" => "Holguin",
-  "13" => "Las Tunas",
-  "14" => "Sancti Spiritus",
-  "15" => "Santiago de Cuba",
-  "16" => "Villa Clara"),
-"CV" => array(
-  "01" => "Boa Vista",
-  "02" => "Brava",
-  "04" => "Maio",
-  "05" => "Paul",
-  "07" => "Ribeira Grande",
-  "08" => "Sal",
-  "10" => "Sao Nicolau",
-  "11" => "Sao Vicente",
-  "13" => "Mosteiros",
-  "14" => "Praia",
-  "15" => "Santa Catarina",
-  "16" => "Santa Cruz",
-  "17" => "Sao Domingos",
-  "18" => "Sao Filipe",
-  "19" => "Sao Miguel",
-  "20" => "Tarrafal"),
-"CY" => array(
-  "01" => "Famagusta",
-  "02" => "Kyrenia",
-  "03" => "Larnaca",
-  "04" => "Nicosia",
-  "05" => "Limassol",
-  "06" => "Paphos"),
-"CZ" => array(
-  "03" => "Blansko",
-  "04" => "Breclav",
-  "20" => "Hradec Kralove",
-  "21" => "Jablonec nad Nisou",
-  "23" => "Jicin",
-  "24" => "Jihlava",
-  "30" => "Kolin",
-  "33" => "Liberec",
-  "36" => "Melnik",
-  "37" => "Mlada Boleslav",
-  "39" => "Nachod",
-  "41" => "Nymburk",
-  "45" => "Pardubice",
-  "52" => "Hlavni mesto Praha",
-  "61" => "Semily",
-  "70" => "Trutnov",
-  "78" => "Jihomoravsky kraj",
-  "79" => "Jihocesky kraj",
-  "80" => "Vysocina",
-  "81" => "Karlovarsky kraj",
-  "82" => "Kralovehradecky kraj",
-  "83" => "Liberecky kraj",
-  "84" => "Olomoucky kraj",
-  "85" => "Moravskoslezsky kraj",
-  "86" => "Pardubicky kraj",
-  "87" => "Plzensky kraj",
-  "88" => "Stredocesky kraj",
-  "89" => "Ustecky kraj",
-  "90" => "Zlinsky kraj"),
-"DE" => array(
-  "01" => "Baden-Wurttemberg",
-  "02" => "Bayern",
-  "03" => "Bremen",
-  "04" => "Hamburg",
-  "05" => "Hessen",
-  "06" => "Niedersachsen",
-  "07" => "Nordrhein-Westfalen",
-  "08" => "Rheinland-Pfalz",
-  "09" => "Saarland",
-  "10" => "Schleswig-Holstein",
-  "11" => "Brandenburg",
-  "12" => "Mecklenburg-Vorpommern",
-  "13" => "Sachsen",
-  "14" => "Sachsen-Anhalt",
-  "15" => "Thuringen",
-  "16" => "Berlin"),
-"DJ" => array(
-  "01" => "Ali Sabieh",
-  "04" => "Obock",
-  "05" => "Tadjoura",
-  "06" => "Dikhil",
-  "07" => "Djibouti",
-  "08" => "Arta"),
-"DK" => array(
-  "01" => "Arhus",
-  "02" => "Bornholm",
-  "03" => "Frederiksborg",
-  "04" => "Fyn",
-  "05" => "Kobenhavn",
-  "06" => "Staden Kobenhavn",
-  "07" => "Nordjylland",
-  "08" => "Ribe",
-  "09" => "Ringkobing",
-  "10" => "Roskilde",
-  "11" => "Sonderjylland",
-  "12" => "Storstrom",
-  "13" => "Vejle",
-  "14" => "Vestsjalland",
-  "15" => "Viborg",
-  "17" => "Hovedstaden",
-  "18" => "Midtjyllen",
-  "19" => "Nordjylland",
-  "20" => "Sjelland",
-  "21" => "Syddanmark"),
-"DM" => array(
-  "02" => "Saint Andrew",
-  "03" => "Saint David",
-  "04" => "Saint George",
-  "05" => "Saint John",
-  "06" => "Saint Joseph",
-  "07" => "Saint Luke",
-  "08" => "Saint Mark",
-  "09" => "Saint Patrick",
-  "10" => "Saint Paul",
-  "11" => "Saint Peter"),
-"DO" => array(
-  "01" => "Azua",
-  "02" => "Baoruco",
-  "03" => "Barahona",
-  "04" => "Dajabon",
-  "05" => "Distrito Nacional",
-  "06" => "Duarte",
-  "08" => "Espaillat",
-  "09" => "Independencia",
-  "10" => "La Altagracia",
-  "11" => "Elias Pina",
-  "12" => "La Romana",
-  "14" => "Maria Trinidad Sanchez",
-  "15" => "Monte Cristi",
-  "16" => "Pedernales",
-  "17" => "Peravia",
-  "18" => "Puerto Plata",
-  "19" => "Salcedo",
-  "20" => "Samana",
-  "21" => "Sanchez Ramirez",
-  "23" => "San Juan",
-  "24" => "San Pedro De Macoris",
-  "25" => "Santiago",
-  "26" => "Santiago Rodriguez",
-  "27" => "Valverde",
-  "28" => "El Seibo",
-  "29" => "Hato Mayor",
-  "30" => "La Vega",
-  "31" => "Monsenor Nouel",
-  "32" => "Monte Plata",
-  "33" => "San Cristobal",
-  "34" => "Distrito Nacional",
-  "35" => "Peravia",
-  "36" => "San Jose de Ocoa",
-  "37" => "Santo Domingo"),
-"DZ" => array(
-  "01" => "Alger",
-  "03" => "Batna",
-  "04" => "Constantine",
-  "06" => "Medea",
-  "07" => "Mostaganem",
-  "09" => "Oran",
-  "10" => "Saida",
-  "12" => "Setif",
-  "13" => "Tiaret",
-  "14" => "Tizi Ouzou",
-  "15" => "Tlemcen",
-  "18" => "Bejaia",
-  "19" => "Biskra",
-  "20" => "Blida",
-  "21" => "Bouira",
-  "22" => "Djelfa",
-  "23" => "Guelma",
-  "24" => "Jijel",
-  "25" => "Laghouat",
-  "26" => "Mascara",
-  "27" => "M'sila",
-  "29" => "Oum el Bouaghi",
-  "30" => "Sidi Bel Abbes",
-  "31" => "Skikda",
-  "33" => "Tebessa",
-  "34" => "Adrar",
-  "35" => "Ain Defla",
-  "36" => "Ain Temouchent",
-  "37" => "Annaba",
-  "38" => "Bechar",
-  "39" => "Bordj Bou Arreridj",
-  "40" => "Boumerdes",
-  "41" => "Chlef",
-  "42" => "El Bayadh",
-  "43" => "El Oued",
-  "44" => "El Tarf",
-  "45" => "Ghardaia",
-  "46" => "Illizi",
-  "47" => "Khenchela",
-  "48" => "Mila",
-  "49" => "Naama",
-  "50" => "Ouargla",
-  "51" => "Relizane",
-  "52" => "Souk Ahras",
-  "53" => "Tamanghasset",
-  "54" => "Tindouf",
-  "55" => "Tipaza",
-  "56" => "Tissemsilt"),
-"EC" => array(
-  "01" => "Galapagos",
-  "02" => "Azuay",
-  "03" => "Bolivar",
-  "04" => "Canar",
-  "05" => "Carchi",
-  "06" => "Chimborazo",
-  "07" => "Cotopaxi",
-  "08" => "El Oro",
-  "09" => "Esmeraldas",
-  "10" => "Guayas",
-  "11" => "Imbabura",
-  "12" => "Loja",
-  "13" => "Los Rios",
-  "14" => "Manabi",
-  "15" => "Morona-Santiago",
-  "17" => "Pastaza",
-  "18" => "Pichincha",
-  "19" => "Tungurahua",
-  "20" => "Zamora-Chinchipe",
-  "22" => "Sucumbios",
-  "23" => "Napo",
-  "24" => "Orellana"),
-"EE" => array(
-  "01" => "Harjumaa",
-  "02" => "Hiiumaa",
-  "03" => "Ida-Virumaa",
-  "04" => "Jarvamaa",
-  "05" => "Jogevamaa",
-  "06" => "Kohtla-Jarve",
-  "07" => "Laanemaa",
-  "08" => "Laane-Virumaa",
-  "09" => "Narva",
-  "10" => "Parnu",
-  "11" => "Parnumaa",
-  "12" => "Polvamaa",
-  "13" => "Raplamaa",
-  "14" => "Saaremaa",
-  "15" => "Sillamae",
-  "16" => "Tallinn",
-  "17" => "Tartu",
-  "18" => "Tartumaa",
-  "19" => "Valgamaa",
-  "20" => "Viljandimaa",
-  "21" => "Vorumaa"),
-"EG" => array(
-  "01" => "Ad Daqahliyah",
-  "02" => "Al Bahr al Ahmar",
-  "03" => "Al Buhayrah",
-  "04" => "Al Fayyum",
-  "05" => "Al Gharbiyah",
-  "06" => "Al Iskandariyah",
-  "07" => "Al Isma'iliyah",
-  "08" => "Al Jizah",
-  "09" => "Al Minufiyah",
-  "10" => "Al Minya",
-  "11" => "Al Qahirah",
-  "12" => "Al Qalyubiyah",
-  "13" => "Al Wadi al Jadid",
-  "14" => "Ash Sharqiyah",
-  "15" => "As Suways",
-  "16" => "Aswan",
-  "17" => "Asyut",
-  "18" => "Bani Suwayf",
-  "19" => "Bur Sa'id",
-  "20" => "Dumyat",
-  "21" => "Kafr ash Shaykh",
-  "22" => "Matruh",
-  "23" => "Qina",
-  "24" => "Suhaj",
-  "26" => "Janub Sina'",
-  "27" => "Shamal Sina'"),
-"ER" => array(
-  "01" => "Anseba",
-  "02" => "Debub",
-  "03" => "Debubawi K'eyih Bahri",
-  "04" => "Gash Barka",
-  "05" => "Ma'akel",
-  "06" => "Semenawi K'eyih Bahri"),
-"ES" => array(
-  "07" => "Islas Baleares",
-  "27" => "La Rioja",
-  "29" => "Madrid",
-  "31" => "Murcia",
-  "32" => "Navarra",
-  "34" => "Asturias",
-  "39" => "Cantabria",
-  "51" => "Andalucia",
-  "52" => "Aragon",
-  "53" => "Canarias",
-  "54" => "Castilla-La Mancha",
-  "55" => "Castilla y Leon",
-  "56" => "Catalonia",
-  "57" => "Extremadura",
-  "58" => "Galicia",
-  "59" => "Pais Vasco",
-  "60" => "Comunidad Valenciana"),
-"ET" => array(
-  "02" => "Amhara",
-  "07" => "Somali",
-  "08" => "Gambella",
-  "10" => "Addis Abeba",
-  "11" => "Southern",
-  "12" => "Tigray",
-  "13" => "Benishangul",
-  "14" => "Afar",
-  "44" => "Adis Abeba",
-  "45" => "Afar",
-  "46" => "Amara",
-  "47" => "Binshangul Gumuz",
-  "48" => "Dire Dawa",
-  "49" => "Gambela Hizboch",
-  "50" => "Hareri Hizb",
-  "51" => "Oromiya",
-  "52" => "Sumale",
-  "53" => "Tigray",
-  "54" => "YeDebub Biheroch Bihereseboch na Hizboch"),
-"FI" => array(
-  "01" => "Aland",
-  "06" => "Lapland",
-  "08" => "Oulu",
-  "13" => "Southern Finland",
-  "14" => "Eastern Finland",
-  "15" => "Western Finland"),
-"FJ" => array(
-  "01" => "Central",
-  "02" => "Eastern",
-  "03" => "Northern",
-  "04" => "Rotuma",
-  "05" => "Western"),
-"FM" => array(
-  "01" => "Kosrae",
-  "02" => "Pohnpei",
-  "03" => "Chuuk",
-  "04" => "Yap"),
-"FR" => array(
-  "97" => "Aquitaine",
-  "98" => "Auvergne",
-  "99" => "Basse-Normandie",
-  "A1" => "Bourgogne",
-  "A2" => "Bretagne",
-  "A3" => "Centre",
-  "A4" => "Champagne-Ardenne",
-  "A5" => "Corse",
-  "A6" => "Franche-Comte",
-  "A7" => "Haute-Normandie",
-  "A8" => "Ile-de-France",
-  "A9" => "Languedoc-Roussillon",
-  "B1" => "Limousin",
-  "B2" => "Lorraine",
-  "B3" => "Midi-Pyrenees",
-  "B4" => "Nord-Pas-de-Calais",
-  "B5" => "Pays de la Loire",
-  "B6" => "Picardie",
-  "B7" => "Poitou-Charentes",
-  "B8" => "Provence-Alpes-Cote d'Azur",
-  "B9" => "Rhone-Alpes",
-  "C1" => "Alsace"),
-"GA" => array(
-  "01" => "Estuaire",
-  "02" => "Haut-Ogooue",
-  "03" => "Moyen-Ogooue",
-  "04" => "Ngounie",
-  "05" => "Nyanga",
-  "06" => "Ogooue-Ivindo",
-  "07" => "Ogooue-Lolo",
-  "08" => "Ogooue-Maritime",
-  "09" => "Woleu-Ntem"),
-"GB" => array(
-  "01" => "Avon",
-  "03" => "Berkshire",
-  "07" => "Cleveland",
-  "17" => "Greater London",
-  "18" => "Greater Manchester",
-  "20" => "Hereford and Worcester",
-  "22" => "Humberside",
-  "28" => "Merseyside",
-  "37" => "South Yorkshire",
-  "41" => "Tyne and Wear",
-  "43" => "West Midlands",
-  "45" => "West Yorkshire",
-  "79" => "Central",
-  "82" => "Grampian",
-  "84" => "Lothian",
-  "87" => "Strathclyde",
-  "88" => "Tayside",
-  "90" => "Clwyd",
-  "91" => "Dyfed",
-  "92" => "Gwent",
-  "94" => "Mid Glamorgan",
-  "96" => "South Glamorgan",
-  "97" => "West Glamorgan",
-  "A1" => "Barking and Dagenham",
-  "A2" => "Barnet",
-  "A3" => "Barnsley",
-  "A4" => "Bath and North East Somerset",
-  "A5" => "Bedfordshire",
-  "A6" => "Bexley",
-  "A7" => "Birmingham",
-  "A8" => "Blackburn with Darwen",
-  "A9" => "Blackpool",
-  "B1" => "Bolton",
-  "B2" => "Bournemouth",
-  "B3" => "Bracknell Forest",
-  "B4" => "Bradford",
-  "B5" => "Brent",
-  "B6" => "Brighton and Hove",
-  "B7" => "Bristol, City of",
-  "B8" => "Bromley",
-  "B9" => "Buckinghamshire",
-  "C1" => "Bury",
-  "C2" => "Calderdale",
-  "C3" => "Cambridgeshire",
-  "C4" => "Camden",
-  "C5" => "Cheshire",
-  "C6" => "Cornwall",
-  "C7" => "Coventry",
-  "C8" => "Croydon",
-  "C9" => "Cumbria",
-  "D1" => "Darlington",
-  "D2" => "Derby",
-  "D3" => "Derbyshire",
-  "D4" => "Devon",
-  "D5" => "Doncaster",
-  "D6" => "Dorset",
-  "D7" => "Dudley",
-  "D8" => "Durham",
-  "D9" => "Ealing",
-  "E1" => "East Riding of Yorkshire",
-  "E2" => "East Sussex",
-  "E3" => "Enfield",
-  "E4" => "Essex",
-  "E5" => "Gateshead",
-  "E6" => "Gloucestershire",
-  "E7" => "Greenwich",
-  "E8" => "Hackney",
-  "E9" => "Halton",
-  "F1" => "Hammersmith and Fulham",
-  "F2" => "Hampshire",
-  "F3" => "Haringey",
-  "F4" => "Harrow",
-  "F5" => "Hartlepool",
-  "F6" => "Havering",
-  "F7" => "Herefordshire",
-  "F8" => "Hertford",
-  "F9" => "Hillingdon",
-  "G1" => "Hounslow",
-  "G2" => "Isle of Wight",
-  "G3" => "Islington",
-  "G4" => "Kensington and Chelsea",
-  "G5" => "Kent",
-  "G6" => "Kingston upon Hull, City of",
-  "G7" => "Kingston upon Thames",
-  "G8" => "Kirklees",
-  "G9" => "Knowsley",
-  "H1" => "Lambeth",
-  "H2" => "Lancashire",
-  "H3" => "Leeds",
-  "H4" => "Leicester",
-  "H5" => "Leicestershire",
-  "H6" => "Lewisham",
-  "H7" => "Lincolnshire",
-  "H8" => "Liverpool",
-  "H9" => "London, City of",
-  "I1" => "Luton",
-  "I2" => "Manchester",
-  "I3" => "Medway",
-  "I4" => "Merton",
-  "I5" => "Middlesbrough",
-  "I6" => "Milton Keynes",
-  "I7" => "Newcastle upon Tyne",
-  "I8" => "Newham",
-  "I9" => "Norfolk",
-  "J1" => "Northamptonshire",
-  "J2" => "North East Lincolnshire",
-  "J3" => "North Lincolnshire",
-  "J4" => "North Somerset",
-  "J5" => "North Tyneside",
-  "J6" => "Northumberland",
-  "J7" => "North Yorkshire",
-  "J8" => "Nottingham",
-  "J9" => "Nottinghamshire",
-  "K1" => "Oldham",
-  "K2" => "Oxfordshire",
-  "K3" => "Peterborough",
-  "K4" => "Plymouth",
-  "K5" => "Poole",
-  "K6" => "Portsmouth",
-  "K7" => "Reading",
-  "K8" => "Redbridge",
-  "K9" => "Redcar and Cleveland",
-  "L1" => "Richmond upon Thames",
-  "L2" => "Rochdale",
-  "L3" => "Rotherham",
-  "L4" => "Rutland",
-  "L5" => "Salford",
-  "L6" => "Shropshire",
-  "L7" => "Sandwell",
-  "L8" => "Sefton",
-  "L9" => "Sheffield",
-  "M1" => "Slough",
-  "M2" => "Solihull",
-  "M3" => "Somerset",
-  "M4" => "Southampton",
-  "M5" => "Southend-on-Sea",
-  "M6" => "South Gloucestershire",
-  "M7" => "South Tyneside",
-  "M8" => "Southwark",
-  "M9" => "Staffordshire",
-  "N1" => "St. Helens",
-  "N2" => "Stockport",
-  "N3" => "Stockton-on-Tees",
-  "N4" => "Stoke-on-Trent",
-  "N5" => "Suffolk",
-  "N6" => "Sunderland",
-  "N7" => "Surrey",
-  "N8" => "Sutton",
-  "N9" => "Swindon",
-  "O1" => "Tameside",
-  "O2" => "Telford and Wrekin",
-  "O3" => "Thurrock",
-  "O4" => "Torbay",
-  "O5" => "Tower Hamlets",
-  "O6" => "Trafford",
-  "O7" => "Wakefield",
-  "O8" => "Walsall",
-  "O9" => "Waltham Forest",
-  "P1" => "Wandsworth",
-  "P2" => "Warrington",
-  "P3" => "Warwickshire",
-  "P4" => "West Berkshire",
-  "P5" => "Westminster",
-  "P6" => "West Sussex",
-  "P7" => "Wigan",
-  "P8" => "Wiltshire",
-  "P9" => "Windsor and Maidenhead",
-  "Q1" => "Wirral",
-  "Q2" => "Wokingham",
-  "Q3" => "Wolverhampton",
-  "Q4" => "Worcestershire",
-  "Q5" => "York",
-  "Q6" => "Antrim",
-  "Q7" => "Ards",
-  "Q8" => "Armagh",
-  "Q9" => "Ballymena",
-  "R1" => "Ballymoney",
-  "R2" => "Banbridge",
-  "R3" => "Belfast",
-  "R4" => "Carrickfergus",
-  "R5" => "Castlereagh",
-  "R6" => "Coleraine",
-  "R7" => "Cookstown",
-  "R8" => "Craigavon",
-  "R9" => "Down",
-  "S1" => "Dungannon",
-  "S2" => "Fermanagh",
-  "S3" => "Larne",
-  "S4" => "Limavady",
-  "S5" => "Lisburn",
-  "S6" => "Derry",
-  "S7" => "Magherafelt",
-  "S8" => "Moyle",
-  "S9" => "Newry and Mourne",
-  "T1" => "Newtownabbey",
-  "T2" => "North Down",
-  "T3" => "Omagh",
-  "T4" => "Strabane",
-  "T5" => "Aberdeen City",
-  "T6" => "Aberdeenshire",
-  "T7" => "Angus",
-  "T8" => "Argyll and Bute",
-  "T9" => "Scottish Borders, The",
-  "U1" => "Clackmannanshire",
-  "U2" => "Dumfries and Galloway",
-  "U3" => "Dundee City",
-  "U4" => "East Ayrshire",
-  "U5" => "East Dunbartonshire",
-  "U6" => "East Lothian",
-  "U7" => "East Renfrewshire",
-  "U8" => "Edinburgh, City of",
-  "U9" => "Falkirk",
-  "V1" => "Fife",
-  "V2" => "Glasgow City",
-  "V3" => "Highland",
-  "V4" => "Inverclyde",
-  "V5" => "Midlothian",
-  "V6" => "Moray",
-  "V7" => "North Ayrshire",
-  "V8" => "North Lanarkshire",
-  "V9" => "Orkney",
-  "W1" => "Perth and Kinross",
-  "W2" => "Renfrewshire",
-  "W3" => "Shetland Islands",
-  "W4" => "South Ayrshire",
-  "W5" => "South Lanarkshire",
-  "W6" => "Stirling",
-  "W7" => "West Dunbartonshire",
-  "W8" => "Eilean Siar",
-  "W9" => "West Lothian",
-  "X1" => "Isle of Anglesey",
-  "X2" => "Blaenau Gwent",
-  "X3" => "Bridgend",
-  "X4" => "Caerphilly",
-  "X5" => "Cardiff",
-  "X6" => "Ceredigion",
-  "X7" => "Carmarthenshire",
-  "X8" => "Conwy",
-  "X9" => "Denbighshire",
-  "Y1" => "Flintshire",
-  "Y2" => "Gwynedd",
-  "Y3" => "Merthyr Tydfil",
-  "Y4" => "Monmouthshire",
-  "Y5" => "Neath Port Talbot",
-  "Y6" => "Newport",
-  "Y7" => "Pembrokeshire",
-  "Y8" => "Powys",
-  "Y9" => "Rhondda Cynon Taff",
-  "Z1" => "Swansea",
-  "Z2" => "Torfaen",
-  "Z3" => "Vale of Glamorgan, The",
-  "Z4" => "Wrexham"),
-"GD" => array(
-  "01" => "Saint Andrew",
-  "02" => "Saint David",
-  "03" => "Saint George",
-  "04" => "Saint John",
-  "05" => "Saint Mark",
-  "06" => "Saint Patrick"),
-"GE" => array(
-  "01" => "Abashis Raioni",
-  "02" => "Abkhazia",
-  "03" => "Adigenis Raioni",
-  "04" => "Ajaria",
-  "05" => "Akhalgoris Raioni",
-  "06" => "Akhalk'alak'is Raioni",
-  "07" => "Akhalts'ikhis Raioni",
-  "08" => "Akhmetis Raioni",
-  "09" => "Ambrolauris Raioni",
-  "10" => "Aspindzis Raioni",
-  "11" => "Baghdat'is Raioni",
-  "12" => "Bolnisis Raioni",
-  "13" => "Borjomis Raioni",
-  "14" => "Chiat'ura",
-  "15" => "Ch'khorotsqus Raioni",
-  "16" => "Ch'okhatauris Raioni",
-  "17" => "Dedop'listsqaros Raioni",
-  "18" => "Dmanisis Raioni",
-  "19" => "Dushet'is Raioni",
-  "20" => "Gardabanis Raioni",
-  "21" => "Gori",
-  "22" => "Goris Raioni",
-  "23" => "Gurjaanis Raioni",
-  "24" => "Javis Raioni",
-  "25" => "K'arelis Raioni",
-  "26" => "Kaspis Raioni",
-  "27" => "Kharagaulis Raioni",
-  "28" => "Khashuris Raioni",
-  "29" => "Khobis Raioni",
-  "30" => "Khonis Raioni",
-  "31" => "K'ut'aisi",
-  "32" => "Lagodekhis Raioni",
-  "33" => "Lanch'khut'is Raioni",
-  "34" => "Lentekhis Raioni",
-  "35" => "Marneulis Raioni",
-  "36" => "Martvilis Raioni",
-  "37" => "Mestiis Raioni",
-  "38" => "Mts'khet'is Raioni",
-  "39" => "Ninotsmindis Raioni",
-  "40" => "Onis Raioni",
-  "41" => "Ozurget'is Raioni",
-  "42" => "P'ot'i",
-  "43" => "Qazbegis Raioni",
-  "44" => "Qvarlis Raioni",
-  "45" => "Rust'avi",
-  "46" => "Sach'kheris Raioni",
-  "47" => "Sagarejos Raioni",
-  "48" => "Samtrediis Raioni",
-  "49" => "Senakis Raioni",
-  "50" => "Sighnaghis Raioni",
-  "51" => "T'bilisi",
-  "52" => "T'elavis Raioni",
-  "53" => "T'erjolis Raioni",
-  "54" => "T'et'ritsqaros Raioni",
-  "55" => "T'ianet'is Raioni",
-  "56" => "Tqibuli",
-  "57" => "Ts'ageris Raioni",
-  "58" => "Tsalenjikhis Raioni",
-  "59" => "Tsalkis Raioni",
-  "60" => "Tsqaltubo",
-  "61" => "Vanis Raioni",
-  "62" => "Zestap'onis Raioni",
-  "63" => "Zugdidi",
-  "64" => "Zugdidis Raioni"),
-"GH" => array(
-  "01" => "Greater Accra",
-  "02" => "Ashanti",
-  "03" => "Brong-Ahafo",
-  "04" => "Central",
-  "05" => "Eastern",
-  "06" => "Northern",
-  "08" => "Volta",
-  "09" => "Western",
-  "10" => "Upper East",
-  "11" => "Upper West"),
-"GL" => array(
-  "01" => "Nordgronland",
-  "02" => "Ostgronland",
-  "03" => "Vestgronland"),
-"GM" => array(
-  "01" => "Banjul",
-  "02" => "Lower River",
-  "03" => "Central River",
-  "04" => "Upper River",
-  "05" => "Western",
-  "07" => "North Bank"),
-"GN" => array(
-  "01" => "Beyla",
-  "02" => "Boffa",
-  "03" => "Boke",
-  "04" => "Conakry",
-  "05" => "Dabola",
-  "06" => "Dalaba",
-  "07" => "Dinguiraye",
-  "09" => "Faranah",
-  "10" => "Forecariah",
-  "11" => "Fria",
-  "12" => "Gaoual",
-  "13" => "Gueckedou",
-  "15" => "Kerouane",
-  "16" => "Kindia",
-  "17" => "Kissidougou",
-  "18" => "Koundara",
-  "19" => "Kouroussa",
-  "21" => "Macenta",
-  "22" => "Mali",
-  "23" => "Mamou",
-  "25" => "Pita",
-  "27" => "Telimele",
-  "28" => "Tougue",
-  "29" => "Yomou",
-  "30" => "Coyah",
-  "31" => "Dubreka",
-  "32" => "Kankan",
-  "33" => "Koubia",
-  "34" => "Labe",
-  "35" => "Lelouma",
-  "36" => "Lola",
-  "37" => "Mandiana",
-  "38" => "Nzerekore",
-  "39" => "Siguiri"),
-"GQ" => array(
-  "03" => "Annobon",
-  "04" => "Bioko Norte",
-  "05" => "Bioko Sur",
-  "06" => "Centro Sur",
-  "07" => "Kie-Ntem",
-  "08" => "Litoral",
-  "09" => "Wele-Nzas"),
-"GR" => array(
-  "01" => "Evros",
-  "02" => "Rodhopi",
-  "03" => "Xanthi",
-  "04" => "Drama",
-  "05" => "Serrai",
-  "06" => "Kilkis",
-  "07" => "Pella",
-  "08" => "Florina",
-  "09" => "Kastoria",
-  "10" => "Grevena",
-  "11" => "Kozani",
-  "12" => "Imathia",
-  "13" => "Thessaloniki",
-  "14" => "Kavala",
-  "15" => "Khalkidhiki",
-  "16" => "Pieria",
-  "17" => "Ioannina",
-  "18" => "Thesprotia",
-  "19" => "Preveza",
-  "20" => "Arta",
-  "21" => "Larisa",
-  "22" => "Trikala",
-  "23" => "Kardhitsa",
-  "24" => "Magnisia",
-  "25" => "Kerkira",
-  "26" => "Levkas",
-  "27" => "Kefallinia",
-  "28" => "Zakinthos",
-  "29" => "Fthiotis",
-  "30" => "Evritania",
-  "31" => "Aitolia kai Akarnania",
-  "32" => "Fokis",
-  "33" => "Voiotia",
-  "34" => "Evvoia",
-  "35" => "Attiki",
-  "36" => "Argolis",
-  "37" => "Korinthia",
-  "38" => "Akhaia",
-  "39" => "Ilia",
-  "40" => "Messinia",
-  "41" => "Arkadhia",
-  "42" => "Lakonia",
-  "43" => "Khania",
-  "44" => "Rethimni",
-  "45" => "Iraklion",
-  "46" => "Lasithi",
-  "47" => "Dhodhekanisos",
-  "48" => "Samos",
-  "49" => "Kikladhes",
-  "50" => "Khios",
-  "51" => "Lesvos"),
-"GT" => array(
-  "01" => "Alta Verapaz",
-  "02" => "Baja Verapaz",
-  "03" => "Chimaltenango",
-  "04" => "Chiquimula",
-  "05" => "El Progreso",
-  "06" => "Escuintla",
-  "07" => "Guatemala",
-  "08" => "Huehuetenango",
-  "09" => "Izabal",
-  "10" => "Jalapa",
-  "11" => "Jutiapa",
-  "12" => "Peten",
-  "13" => "Quetzaltenango",
-  "14" => "Quiche",
-  "15" => "Retalhuleu",
-  "16" => "Sacatepequez",
-  "17" => "San Marcos",
-  "18" => "Santa Rosa",
-  "19" => "Solola",
-  "20" => "Suchitepequez",
-  "21" => "Totonicapan",
-  "22" => "Zacapa"),
-"GW" => array(
-  "01" => "Bafata",
-  "02" => "Quinara",
-  "04" => "Oio",
-  "05" => "Bolama",
-  "06" => "Cacheu",
-  "07" => "Tombali",
-  "10" => "Gabu",
-  "11" => "Bissau",
-  "12" => "Biombo"),
-"GY" => array(
-  "10" => "Barima-Waini",
-  "11" => "Cuyuni-Mazaruni",
-  "12" => "Demerara-Mahaica",
-  "13" => "East Berbice-Corentyne",
-  "14" => "Essequibo Islands-West Demerara",
-  "15" => "Mahaica-Berbice",
-  "16" => "Pomeroon-Supenaam",
-  "17" => "Potaro-Siparuni",
-  "18" => "Upper Demerara-Berbice",
-  "19" => "Upper Takutu-Upper Essequibo"),
-"HN" => array(
-  "01" => "Atlantida",
-  "02" => "Choluteca",
-  "03" => "Colon",
-  "04" => "Comayagua",
-  "05" => "Copan",
-  "06" => "Cortes",
-  "07" => "El Paraiso",
-  "08" => "Francisco Morazan",
-  "09" => "Gracias a Dios",
-  "10" => "Intibuca",
-  "11" => "Islas de la Bahia",
-  "12" => "La Paz",
-  "13" => "Lempira",
-  "14" => "Ocotepeque",
-  "15" => "Olancho",
-  "16" => "Santa Barbara",
-  "17" => "Valle",
-  "18" => "Yoro"),
-"HR" => array(
-  "01" => "Bjelovarsko-Bilogorska",
-  "02" => "Brodsko-Posavska",
-  "03" => "Dubrovacko-Neretvanska",
-  "04" => "Istarska",
-  "05" => "Karlovacka",
-  "06" => "Koprivnicko-Krizevacka",
-  "07" => "Krapinsko-Zagorska",
-  "08" => "Licko-Senjska",
-  "09" => "Medimurska",
-  "10" => "Osjecko-Baranjska",
-  "11" => "Pozesko-Slavonska",
-  "12" => "Primorsko-Goranska",
-  "13" => "Sibensko-Kninska",
-  "14" => "Sisacko-Moslavacka",
-  "15" => "Splitsko-Dalmatinska",
-  "16" => "Varazdinska",
-  "17" => "Viroviticko-Podravska",
-  "18" => "Vukovarsko-Srijemska",
-  "19" => "Zadarska",
-  "20" => "Zagrebacka",
-  "21" => "Grad Zagreb"),
-"HT" => array(
-  "03" => "Nord-Ouest",
-  "06" => "Artibonite",
-  "07" => "Centre",
-  "09" => "Nord",
-  "10" => "Nord-Est",
-  "11" => "Ouest",
-  "12" => "Sud",
-  "13" => "Sud-Est",
-  "14" => "Grand' Anse",
-  "15" => "Nippes"),
-"HU" => array(
-  "01" => "Bacs-Kiskun",
-  "02" => "Baranya",
-  "03" => "Bekes",
-  "04" => "Borsod-Abauj-Zemplen",
-  "05" => "Budapest",
-  "06" => "Csongrad",
-  "07" => "Debrecen",
-  "08" => "Fejer",
-  "09" => "Gyor-Moson-Sopron",
-  "10" => "Hajdu-Bihar",
-  "11" => "Heves",
-  "12" => "Komarom-Esztergom",
-  "13" => "Miskolc",
-  "14" => "Nograd",
-  "15" => "Pecs",
-  "16" => "Pest",
-  "17" => "Somogy",
-  "18" => "Szabolcs-Szatmar-Bereg",
-  "19" => "Szeged",
-  "20" => "Jasz-Nagykun-Szolnok",
-  "21" => "Tolna",
-  "22" => "Vas",
-  "23" => "Veszprem",
-  "24" => "Zala",
-  "25" => "Gyor",
-  "26" => "Bekescsaba",
-  "27" => "Dunaujvaros",
-  "28" => "Eger",
-  "29" => "Hodmezovasarhely",
-  "30" => "Kaposvar",
-  "31" => "Kecskemet",
-  "32" => "Nagykanizsa",
-  "33" => "Nyiregyhaza",
-  "34" => "Sopron",
-  "35" => "Szekesfehervar",
-  "36" => "Szolnok",
-  "37" => "Szombathely",
-  "38" => "Tatabanya",
-  "39" => "Veszprem",
-  "40" => "Zalaegerszeg",
-  "41" => "Salgotarjan",
-  "42" => "Szekszard"),
-"ID" => array(
-  "01" => "Aceh",
-  "02" => "Bali",
-  "03" => "Bengkulu",
-  "04" => "Jakarta Raya",
-  "05" => "Jambi",
-  "06" => "Jawa Barat",
-  "07" => "Jawa Tengah",
-  "08" => "Jawa Timur",
-  "09" => "Papua",
-  "10" => "Yogyakarta",
-  "11" => "Kalimantan Barat",
-  "12" => "Kalimantan Selatan",
-  "13" => "Kalimantan Tengah",
-  "14" => "Kalimantan Timur",
-  "15" => "Lampung",
-  "16" => "Maluku",
-  "17" => "Nusa Tenggara Barat",
-  "18" => "Nusa Tenggara Timur",
-  "19" => "Riau",
-  "20" => "Sulawesi Selatan",
-  "21" => "Sulawesi Tengah",
-  "22" => "Sulawesi Tenggara",
-  "23" => "Sulawesi Utara",
-  "24" => "Sumatera Barat",
-  "25" => "Sumatera Selatan",
-  "26" => "Sumatera Utara",
-  "28" => "Maluku",
-  "29" => "Maluku Utara",
-  "30" => "Jawa Barat",
-  "31" => "Sulawesi Utara",
-  "32" => "Sumatera Selatan",
-  "33" => "Banten",
-  "34" => "Gorontalo",
-  "35" => "Kepulauan Bangka Belitung",
-  "36" => "Papua",
-  "37" => "Riau",
-  "38" => "Sulawesi Selatan",
-  "39" => "Irian Jaya Barat",
-  "40" => "Kepulauan Riau",
-  "41" => "Sulawesi Barat"),
-"IE" => array(
-  "01" => "Carlow",
-  "02" => "Cavan",
-  "03" => "Clare",
-  "04" => "Cork",
-  "06" => "Donegal",
-  "07" => "Dublin",
-  "10" => "Galway",
-  "11" => "Kerry",
-  "12" => "Kildare",
-  "13" => "Kilkenny",
-  "14" => "Leitrim",
-  "15" => "Laois",
-  "16" => "Limerick",
-  "18" => "Longford",
-  "19" => "Louth",
-  "20" => "Mayo",
-  "21" => "Meath",
-  "22" => "Monaghan",
-  "23" => "Offaly",
-  "24" => "Roscommon",
-  "25" => "Sligo",
-  "26" => "Tipperary",
-  "27" => "Waterford",
-  "29" => "Westmeath",
-  "30" => "Wexford",
-  "31" => "Wicklow"),
-"IL" => array(
-  "01" => "HaDarom",
-  "02" => "HaMerkaz",
-  "03" => "HaZafon",
-  "04" => "Hefa",
-  "05" => "Tel Aviv",
-  "06" => "Yerushalayim"),
-"IN" => array(
-  "01" => "Andaman and Nicobar Islands",
-  "02" => "Andhra Pradesh",
-  "03" => "Assam",
-  "05" => "Chandigarh",
-  "06" => "Dadra and Nagar Haveli",
-  "07" => "Delhi",
-  "09" => "Gujarat",
-  "10" => "Haryana",
-  "11" => "Himachal Pradesh",
-  "12" => "Jammu and Kashmir",
-  "13" => "Kerala",
-  "14" => "Lakshadweep",
-  "16" => "Maharashtra",
-  "17" => "Manipur",
-  "18" => "Meghalaya",
-  "19" => "Karnataka",
-  "20" => "Nagaland",
-  "21" => "Orissa",
-  "22" => "Puducherry",
-  "23" => "Punjab",
-  "24" => "Rajasthan",
-  "25" => "Tamil Nadu",
-  "26" => "Tripura",
-  "28" => "West Bengal",
-  "29" => "Sikkim",
-  "30" => "Arunachal Pradesh",
-  "31" => "Mizoram",
-  "32" => "Daman and Diu",
-  "33" => "Goa",
-  "34" => "Bihar",
-  "35" => "Madhya Pradesh",
-  "36" => "Uttar Pradesh",
-  "37" => "Chhattisgarh",
-  "38" => "Jharkhand",
-  "39" => "Uttarakhand"),
-"IQ" => array(
-  "01" => "Al Anbar",
-  "02" => "Al Basrah",
-  "03" => "Al Muthanna",
-  "04" => "Al Qadisiyah",
-  "05" => "As Sulaymaniyah",
-  "06" => "Babil",
-  "07" => "Baghdad",
-  "08" => "Dahuk",
-  "09" => "Dhi Qar",
-  "10" => "Diyala",
-  "11" => "Arbil",
-  "12" => "Karbala'",
-  "13" => "At Ta'mim",
-  "14" => "Maysan",
-  "15" => "Ninawa",
-  "16" => "Wasit",
-  "17" => "An Najaf",
-  "18" => "Salah ad Din"),
-"IR" => array(
-  "01" => "Azarbayjan-e Bakhtari",
-  "02" => "Azarbayjan-e Khavari",
-  "03" => "Chahar Mahall va Bakhtiari",
-  "04" => "Sistan va Baluchestan",
-  "05" => "Kohkiluyeh va Buyer Ahmadi",
-  "07" => "Fars",
-  "08" => "Gilan",
-  "09" => "Hamadan",
-  "10" => "Ilam",
-  "11" => "Hormozgan",
-  "12" => "Kerman",
-  "13" => "Bakhtaran",
-  "15" => "Khuzestan",
-  "16" => "Kordestan",
-  "17" => "Mazandaran",
-  "18" => "Semnan Province",
-  "19" => "Markazi",
-  "21" => "Zanjan",
-  "22" => "Bushehr",
-  "23" => "Lorestan",
-  "24" => "Markazi",
-  "25" => "Semnan",
-  "26" => "Tehran",
-  "27" => "Zanjan",
-  "28" => "Esfahan",
-  "29" => "Kerman",
-  "30" => "Khorasan",
-  "31" => "Yazd",
-  "32" => "Ardabil",
-  "33" => "East Azarbaijan",
-  "34" => "Markazi",
-  "35" => "Mazandaran",
-  "36" => "Zanjan",
-  "37" => "Golestan",
-  "38" => "Qazvin",
-  "39" => "Qom",
-  "40" => "Yazd",
-  "41" => "Khorasan-e Janubi",
-  "42" => "Khorasan-e Razavi",
-  "43" => "Khorasan-e Shemali"),
-"IS" => array(
-  "03" => "Arnessysla",
-  "05" => "Austur-Hunavatnssysla",
-  "06" => "Austur-Skaftafellssysla",
-  "07" => "Borgarfjardarsysla",
-  "09" => "Eyjafjardarsysla",
-  "10" => "Gullbringusysla",
-  "15" => "Kjosarsysla",
-  "17" => "Myrasysla",
-  "20" => "Nordur-Mulasysla",
-  "21" => "Nordur-Tingeyjarsysla",
-  "23" => "Rangarvallasysla",
-  "28" => "Skagafjardarsysla",
-  "29" => "Snafellsnes- og Hnappadalssysla",
-  "30" => "Strandasysla",
-  "31" => "Sudur-Mulasysla",
-  "32" => "Sudur-Tingeyjarsysla",
-  "34" => "Vestur-Bardastrandarsysla",
-  "35" => "Vestur-Hunavatnssysla",
-  "36" => "Vestur-Isafjardarsysla",
-  "37" => "Vestur-Skaftafellssysla",
-  "40" => "Norourland Eystra",
-  "41" => "Norourland Vestra",
-  "42" => "Suourland",
-  "43" => "Suournes",
-  "44" => "Vestfiroir",
-  "45" => "Vesturland"),
-"IT" => array(
-  "01" => "Abruzzi",
-  "02" => "Basilicata",
-  "03" => "Calabria",
-  "04" => "Campania",
-  "05" => "Emilia-Romagna",
-  "06" => "Friuli-Venezia Giulia",
-  "07" => "Lazio",
-  "08" => "Liguria",
-  "09" => "Lombardia",
-  "10" => "Marche",
-  "11" => "Molise",
-  "12" => "Piemonte",
-  "13" => "Puglia",
-  "14" => "Sardegna",
-  "15" => "Sicilia",
-  "16" => "Toscana",
-  "17" => "Trentino-Alto Adige",
-  "18" => "Umbria",
-  "19" => "Valle d'Aosta",
-  "20" => "Veneto"),
-"JM" => array(
-  "01" => "Clarendon",
-  "02" => "Hanover",
-  "04" => "Manchester",
-  "07" => "Portland",
-  "08" => "Saint Andrew",
-  "09" => "Saint Ann",
-  "10" => "Saint Catherine",
-  "11" => "Saint Elizabeth",
-  "12" => "Saint James",
-  "13" => "Saint Mary",
-  "14" => "Saint Thomas",
-  "15" => "Trelawny",
-  "16" => "Westmoreland",
-  "17" => "Kingston"),
-"JO" => array(
-  "02" => "Al Balqa'",
-  "07" => "Ma",
-  "09" => "Al Karak",
-  "10" => "Al Mafraq",
-  "11" => "Amman Governorate",
-  "12" => "At Tafilah",
-  "13" => "Az Zarqa",
-  "14" => "Irbid",
-  "16" => "Amman"),
-"JP" => array(
-  "01" => "Aichi",
-  "02" => "Akita",
-  "03" => "Aomori",
-  "04" => "Chiba",
-  "05" => "Ehime",
-  "06" => "Fukui",
-  "07" => "Fukuoka",
-  "08" => "Fukushima",
-  "09" => "Gifu",
-  "10" => "Gumma",
-  "11" => "Hiroshima",
-  "12" => "Hokkaido",
-  "13" => "Hyogo",
-  "14" => "Ibaraki",
-  "15" => "Ishikawa",
-  "16" => "Iwate",
-  "17" => "Kagawa",
-  "18" => "Kagoshima",
-  "19" => "Kanagawa",
-  "20" => "Kochi",
-  "21" => "Kumamoto",
-  "22" => "Kyoto",
-  "23" => "Mie",
-  "24" => "Miyagi",
-  "25" => "Miyazaki",
-  "26" => "Nagano",
-  "27" => "Nagasaki",
-  "28" => "Nara",
-  "29" => "Niigata",
-  "30" => "Oita",
-  "31" => "Okayama",
-  "32" => "Osaka",
-  "33" => "Saga",
-  "34" => "Saitama",
-  "35" => "Shiga",
-  "36" => "Shimane",
-  "37" => "Shizuoka",
-  "38" => "Tochigi",
-  "39" => "Tokushima",
-  "40" => "Tokyo",
-  "41" => "Tottori",
-  "42" => "Toyama",
-  "43" => "Wakayama",
-  "44" => "Yamagata",
-  "45" => "Yamaguchi",
-  "46" => "Yamanashi",
-  "47" => "Okinawa"),
-"KE" => array(
-  "01" => "Central",
-  "02" => "Coast",
-  "03" => "Eastern",
-  "05" => "Nairobi Area",
-  "06" => "North-Eastern",
-  "07" => "Nyanza",
-  "08" => "Rift Valley",
-  "09" => "Western"),
-"KG" => array(
-  "01" => "Bishkek",
-  "02" => "Chuy",
-  "03" => "Jalal-Abad",
-  "04" => "Naryn",
-  "05" => "Osh",
-  "06" => "Talas",
-  "07" => "Ysyk-Kol",
-  "08" => "Osh",
-  "09" => "Batken"),
-"KH" => array(
-  "00" => "Banteay Meanchey",
-  "01" => "Batdambang",
-  "02" => "Kampong Cham",
-  "03" => "Kampong Chhnang",
-  "04" => "Kampong Speu",
-  "05" => "Kampong Thum",
-  "06" => "Kampot",
-  "07" => "Kandal",
-  "08" => "Koh Kong",
-  "09" => "Kracheh",
-  "10" => "Mondulkiri",
-  "11" => "Phnum Penh",
-  "12" => "Pursat",
-  "13" => "Preah Vihear",
-  "14" => "Prey Veng",
-  "15" => "Ratanakiri Kiri",
-  "16" => "Siem Reap",
-  "17" => "Stung Treng",
-  "18" => "Svay Rieng",
-  "19" => "Takeo",
-  "29" => "Batdambang",
-  "30" => "Pailin"),
-"KI" => array(
-  "01" => "Gilbert Islands",
-  "02" => "Line Islands",
-  "03" => "Phoenix Islands"),
-"KM" => array(
-  "01" => "Anjouan",
-  "02" => "Grande Comore",
-  "03" => "Moheli"),
-"KN" => array(
-  "01" => "Christ Church Nichola Town",
-  "02" => "Saint Anne Sandy Point",
-  "03" => "Saint George Basseterre",
-  "04" => "Saint George Gingerland",
-  "05" => "Saint James Windward",
-  "06" => "Saint John Capisterre",
-  "07" => "Saint John Figtree",
-  "08" => "Saint Mary Cayon",
-  "09" => "Saint Paul Capisterre",
-  "10" => "Saint Paul Charlestown",
-  "11" => "Saint Peter Basseterre",
-  "12" => "Saint Thomas Lowland",
-  "13" => "Saint Thomas Middle Island",
-  "15" => "Trinity Palmetto Point"),
-"KP" => array(
-  "01" => "Chagang-do",
-  "03" => "Hamgyong-namdo",
-  "06" => "Hwanghae-namdo",
-  "07" => "Hwanghae-bukto",
-  "08" => "Kaesong-si",
-  "09" => "Kangwon-do",
-  "11" => "P'yongan-bukto",
-  "12" => "P'yongyang-si",
-  "13" => "Yanggang-do",
-  "14" => "Namp'o-si",
-  "15" => "P'yongan-namdo",
-  "17" => "Hamgyong-bukto",
-  "18" => "Najin Sonbong-si"),
-"KR" => array(
-  "01" => "Cheju-do",
-  "03" => "Cholla-bukto",
-  "05" => "Ch'ungch'ong-bukto",
-  "06" => "Kangwon-do",
-  "10" => "Pusan-jikhalsi",
-  "11" => "Seoul-t'ukpyolsi",
-  "12" => "Inch'on-jikhalsi",
-  "13" => "Kyonggi-do",
-  "14" => "Kyongsang-bukto",
-  "15" => "Taegu-jikhalsi",
-  "16" => "Cholla-namdo",
-  "17" => "Ch'ungch'ong-namdo",
-  "18" => "Kwangju-jikhalsi",
-  "19" => "Taejon-jikhalsi",
-  "20" => "Kyongsang-namdo",
-  "21" => "Ulsan-gwangyoksi"),
-"KW" => array(
-  "01" => "Al Ahmadi",
-  "02" => "Al Kuwayt",
-  "05" => "Al Jahra",
-  "07" => "Al Farwaniyah",
-  "08" => "Hawalli",
-  "09" => "Mubarak al Kabir"),
-"KY" => array(
-  "01" => "Creek",
-  "02" => "Eastern",
-  "03" => "Midland",
-  "04" => "South Town",
-  "05" => "Spot Bay",
-  "06" => "Stake Bay",
-  "07" => "West End",
-  "08" => "Western"),
-"KZ" => array(
-  "01" => "Almaty",
-  "02" => "Almaty City",
-  "03" => "Aqmola",
-  "04" => "Aqtobe",
-  "05" => "Astana",
-  "06" => "Atyrau",
-  "07" => "West Kazakhstan",
-  "08" => "Bayqonyr",
-  "09" => "Mangghystau",
-  "10" => "South Kazakhstan",
-  "11" => "Pavlodar",
-  "12" => "Qaraghandy",
-  "13" => "Qostanay",
-  "14" => "Qyzylorda",
-  "15" => "East Kazakhstan",
-  "16" => "North Kazakhstan",
-  "17" => "Zhambyl"),
-"LA" => array(
-  "01" => "Attapu",
-  "02" => "Champasak",
-  "03" => "Houaphan",
-  "04" => "Khammouan",
-  "05" => "Louang Namtha",
-  "07" => "Oudomxai",
-  "08" => "Phongsali",
-  "09" => "Saravan",
-  "10" => "Savannakhet",
-  "11" => "Vientiane",
-  "13" => "Xaignabouri",
-  "14" => "Xiangkhoang",
-  "17" => "Louangphrabang"),
-"LB" => array(
-  "01" => "Beqaa",
-  "02" => "Al Janub",
-  "03" => "Liban-Nord",
-  "04" => "Beyrouth",
-  "05" => "Mont-Liban",
-  "06" => "Liban-Sud",
-  "07" => "Nabatiye",
-  "08" => "Beqaa",
-  "09" => "Liban-Nord",
-  "10" => "Aakk,r",
-  "11" => "Baalbek-Hermel"),
-"LC" => array(
-  "01" => "Anse-la-Raye",
-  "02" => "Dauphin",
-  "03" => "Castries",
-  "04" => "Choiseul",
-  "05" => "Dennery",
-  "06" => "Gros-Islet",
-  "07" => "Laborie",
-  "08" => "Micoud",
-  "09" => "Soufriere",
-  "10" => "Vieux-Fort",
-  "11" => "Praslin"),
-"LI" => array(
-  "01" => "Balzers",
-  "02" => "Eschen",
-  "03" => "Gamprin",
-  "04" => "Mauren",
-  "05" => "Planken",
-  "06" => "Ruggell",
-  "07" => "Schaan",
-  "08" => "Schellenberg",
-  "09" => "Triesen",
-  "10" => "Triesenberg",
-  "11" => "Vaduz",
-  "21" => "Gbarpolu",
-  "22" => "River Gee"),
-"LK" => array(
-  "01" => "Amparai",
-  "02" => "Anuradhapura",
-  "03" => "Badulla",
-  "04" => "Batticaloa",
-  "06" => "Galle",
-  "07" => "Hambantota",
-  "09" => "Kalutara",
-  "10" => "Kandy",
-  "11" => "Kegalla",
-  "12" => "Kurunegala",
-  "14" => "Matale",
-  "15" => "Matara",
-  "16" => "Moneragala",
-  "17" => "Nuwara Eliya",
-  "18" => "Polonnaruwa",
-  "19" => "Puttalam",
-  "20" => "Ratnapura",
-  "21" => "Trincomalee",
-  "23" => "Colombo",
-  "24" => "Gampaha",
-  "25" => "Jaffna",
-  "26" => "Mannar",
-  "27" => "Mullaittivu",
-  "28" => "Vavuniya",
-  "29" => "Central",
-  "30" => "North Central",
-  "31" => "Northern",
-  "32" => "North Western",
-  "33" => "Sabaragamuwa",
-  "34" => "Southern",
-  "35" => "Uva",
-  "36" => "Western"),
-"LR" => array(
-  "01" => "Bong",
-  "04" => "Grand Cape Mount",
-  "05" => "Lofa",
-  "06" => "Maryland",
-  "07" => "Monrovia",
-  "09" => "Nimba",
-  "10" => "Sino",
-  "11" => "Grand Bassa",
-  "12" => "Grand Cape Mount",
-  "13" => "Maryland",
-  "14" => "Montserrado",
-  "17" => "Margibi",
-  "18" => "River Cess",
-  "19" => "Grand Gedeh",
-  "20" => "Lofa",
-  "21" => "Gbarpolu",
-  "22" => "River Gee"),
-"LS" => array(
-  "10" => "Berea",
-  "11" => "Butha-Buthe",
-  "12" => "Leribe",
-  "13" => "Mafeteng",
-  "14" => "Maseru",
-  "15" => "Mohales Hoek",
-  "16" => "Mokhotlong",
-  "17" => "Qachas Nek",
-  "18" => "Quthing",
-  "19" => "Thaba-Tseka"),
-"LT" => array(
-  "56" => "Alytaus Apskritis",
-  "57" => "Kauno Apskritis",
-  "58" => "Klaipedos Apskritis",
-  "59" => "Marijampoles Apskritis",
-  "60" => "Panevezio Apskritis",
-  "61" => "Siauliu Apskritis",
-  "62" => "Taurages Apskritis",
-  "63" => "Telsiu Apskritis",
-  "64" => "Utenos Apskritis",
-  "65" => "Vilniaus Apskritis"),
-"LU" => array(
-  "01" => "Diekirch",
-  "02" => "Grevenmacher",
-  "03" => "Luxembourg"),
-"LV" => array(
-  "01" => "Aizkraukles",
-  "02" => "Aluksnes",
-  "03" => "Balvu",
-  "04" => "Bauskas",
-  "05" => "Cesu",
-  "06" => "Daugavpils",
-  "07" => "Daugavpils",
-  "08" => "Dobeles",
-  "09" => "Gulbenes",
-  "10" => "Jekabpils",
-  "11" => "Jelgava",
-  "12" => "Jelgavas",
-  "13" => "Jurmala",
-  "14" => "Kraslavas",
-  "15" => "Kuldigas",
-  "16" => "Liepaja",
-  "17" => "Liepajas",
-  "18" => "Limbazu",
-  "19" => "Ludzas",
-  "20" => "Madonas",
-  "21" => "Ogres",
-  "22" => "Preilu",
-  "23" => "Rezekne",
-  "24" => "Rezeknes",
-  "25" => "Riga",
-  "26" => "Rigas",
-  "27" => "Saldus",
-  "28" => "Talsu",
-  "29" => "Tukuma",
-  "30" => "Valkas",
-  "31" => "Valmieras",
-  "32" => "Ventspils",
-  "33" => "Ventspils"),
-"LY" => array(
-  "03" => "Al Aziziyah",
-  "05" => "Al Jufrah",
-  "08" => "Al Kufrah",
-  "13" => "Ash Shati'",
-  "30" => "Murzuq",
-  "34" => "Sabha",
-  "41" => "Tarhunah",
-  "42" => "Tubruq",
-  "45" => "Zlitan",
-  "47" => "Ajdabiya",
-  "48" => "Al Fatih",
-  "49" => "Al Jabal al Akhdar",
-  "50" => "Al Khums",
-  "51" => "An Nuqat al Khams",
-  "52" => "Awbari",
-  "53" => "Az Zawiyah",
-  "54" => "Banghazi",
-  "55" => "Darnah",
-  "56" => "Ghadamis",
-  "57" => "Gharyan",
-  "58" => "Misratah",
-  "59" => "Sawfajjin",
-  "60" => "Surt",
-  "61" => "Tarabulus",
-  "62" => "Yafran"),
-"MA" => array(
-  "01" => "Agadir",
-  "02" => "Al Hoceima",
-  "03" => "Azilal",
-  "04" => "Ben Slimane",
-  "05" => "Beni Mellal",
-  "06" => "Boulemane",
-  "07" => "Casablanca",
-  "08" => "Chaouen",
-  "09" => "El Jadida",
-  "10" => "El Kelaa des Srarhna",
-  "11" => "Er Rachidia",
-  "12" => "Essaouira",
-  "13" => "Fes",
-  "14" => "Figuig",
-  "15" => "Kenitra",
-  "16" => "Khemisset",
-  "17" => "Khenifra",
-  "18" => "Khouribga",
-  "19" => "Marrakech",
-  "20" => "Meknes",
-  "21" => "Nador",
-  "22" => "Ouarzazate",
-  "23" => "Oujda",
-  "24" => "Rabat-Sale",
-  "25" => "Safi",
-  "26" => "Settat",
-  "27" => "Tanger",
-  "29" => "Tata",
-  "30" => "Taza",
-  "32" => "Tiznit",
-  "33" => "Guelmim",
-  "34" => "Ifrane",
-  "35" => "Laayoune",
-  "36" => "Tan-Tan",
-  "37" => "Taounate",
-  "38" => "Sidi Kacem",
-  "39" => "Taroudannt",
-  "40" => "Tetouan",
-  "41" => "Larache",
-  "45" => "Grand Casablanca",
-  "46" => "Fes-Boulemane",
-  "47" => "Marrakech-Tensift-Al Haouz",
-  "48" => "Meknes-Tafilalet",
-  "49" => "Rabat-Sale-Zemmour-Zaer",
-  "50" => "Chaouia-Ouardigha",
-  "51" => "Doukkala-Abda",
-  "52" => "Gharb-Chrarda-Beni Hssen",
-  "53" => "Guelmim-Es Smara",
-  "54" => "Oriental",
-  "55" => "Souss-Massa-Dr,a",
-  "56" => "Tadla-Azilal",
-  "57" => "Tanger-Tetouan",
-  "58" => "Taza-Al Hoceima-Taounate",
-  "59" => "La,youne-Boujdour-Sakia El Hamra"),
-"MC" => array(
-  "01" => "La Condamine",
-  "02" => "Monaco",
-  "03" => "Monte-Carlo"),
-"MD" => array(
-  "46" => "Balti",
-  "47" => "Cahul",
-  "48" => "Chisinau",
-  "49" => "Stinga Nistrului",
-  "50" => "Edinet",
-  "51" => "Gagauzia",
-  "52" => "Lapusna",
-  "53" => "Orhei",
-  "54" => "Soroca",
-  "55" => "Tighina",
-  "56" => "Ungheni",
-  "58" => "Stinga Nistrului",
-  "59" => "Anenii Noi",
-  "60" => "Balti",
-  "61" => "Basarabeasca",
-  "62" => "Bender",
-  "63" => "Briceni",
-  "64" => "Cahul",
-  "65" => "Cantemir",
-  "66" => "Calarasi",
-  "67" => "Causeni",
-  "68" => "Cimislia",
-  "69" => "Criuleni",
-  "70" => "Donduseni",
-  "71" => "Drochia",
-  "72" => "Dubasari",
-  "73" => "Edinet",
-  "74" => "Falesti",
-  "75" => "Floresti",
-  "76" => "Glodeni",
-  "77" => "Hincesti",
-  "78" => "Ialoveni",
-  "79" => "Leova",
-  "80" => "Nisporeni",
-  "81" => "Ocnita",
-  "83" => "Rezina",
-  "84" => "Riscani",
-  "85" => "Singerei",
-  "86" => "Soldanesti",
-  "87" => "Soroca",
-  "88" => "Stefan-Voda",
-  "89" => "Straseni",
-  "90" => "Taraclia",
-  "91" => "Telenesti",
-  "92" => "Ungheni"),
-"MG" => array(
-  "01" => "Antsiranana",
-  "02" => "Fianarantsoa",
-  "03" => "Mahajanga",
-  "04" => "Toamasina",
-  "05" => "Antananarivo",
-  "06" => "Toliara"),
-"MK" => array(
-  "01" => "Aracinovo",
-  "02" => "Bac",
-  "03" => "Belcista",
-  "04" => "Berovo",
-  "05" => "Bistrica",
-  "06" => "Bitola",
-  "07" => "Blatec",
-  "08" => "Bogdanci",
-  "09" => "Bogomila",
-  "10" => "Bogovinje",
-  "11" => "Bosilovo",
-  "12" => "Brvenica",
-  "13" => "Cair",
-  "14" => "Capari",
-  "15" => "Caska",
-  "16" => "Cegrane",
-  "17" => "Centar",
-  "18" => "Centar Zupa",
-  "19" => "Cesinovo",
-  "20" => "Cucer-Sandevo",
-  "21" => "Debar",
-  "22" => "Delcevo",
-  "23" => "Delogozdi",
-  "24" => "Demir Hisar",
-  "25" => "Demir Kapija",
-  "26" => "Dobrusevo",
-  "27" => "Dolna Banjica",
-  "28" => "Dolneni",
-  "29" => "Dorce Petrov",
-  "30" => "Drugovo",
-  "31" => "Dzepciste",
-  "32" => "Gazi Baba",
-  "33" => "Gevgelija",
-  "34" => "Gostivar",
-  "35" => "Gradsko",
-  "36" => "Ilinden",
-  "37" => "Izvor",
-  "38" => "Jegunovce",
-  "39" => "Kamenjane",
-  "40" => "Karbinci",
-  "41" => "Karpos",
-  "42" => "Kavadarci",
-  "43" => "Kicevo",
-  "44" => "Kisela Voda",
-  "45" => "Klecevce",
-  "46" => "Kocani",
-  "47" => "Konce",
-  "48" => "Kondovo",
-  "49" => "Konopiste",
-  "50" => "Kosel",
-  "51" => "Kratovo",
-  "52" => "Kriva Palanka",
-  "53" => "Krivogastani",
-  "54" => "Krusevo",
-  "55" => "Kuklis",
-  "56" => "Kukurecani",
-  "57" => "Kumanovo",
-  "58" => "Labunista",
-  "59" => "Lipkovo",
-  "60" => "Lozovo",
-  "61" => "Lukovo",
-  "62" => "Makedonska Kamenica",
-  "63" => "Makedonski Brod",
-  "64" => "Mavrovi Anovi",
-  "65" => "Meseista",
-  "66" => "Miravci",
-  "67" => "Mogila",
-  "68" => "Murtino",
-  "69" => "Negotino",
-  "70" => "Negotino-Polosko",
-  "71" => "Novaci",
-  "72" => "Novo Selo",
-  "73" => "Oblesevo",
-  "74" => "Ohrid",
-  "75" => "Orasac",
-  "76" => "Orizari",
-  "77" => "Oslomej",
-  "78" => "Pehcevo",
-  "79" => "Petrovec",
-  "80" => "Plasnica",
-  "81" => "Podares",
-  "82" => "Prilep",
-  "83" => "Probistip",
-  "84" => "Radovis",
-  "85" => "Rankovce",
-  "86" => "Resen",
-  "87" => "Rosoman",
-  "88" => "Rostusa",
-  "89" => "Samokov",
-  "90" => "Saraj",
-  "91" => "Sipkovica",
-  "92" => "Sopiste",
-  "93" => "Sopotnica",
-  "94" => "Srbinovo",
-  "95" => "Staravina",
-  "96" => "Star Dojran",
-  "97" => "Staro Nagoricane",
-  "98" => "Stip",
-  "99" => "Struga",
-  "A1" => "Strumica",
-  "A2" => "Studenicani",
-  "A3" => "Suto Orizari",
-  "A4" => "Sveti Nikole",
-  "A5" => "Tearce",
-  "A6" => "Tetovo",
-  "A7" => "Topolcani",
-  "A8" => "Valandovo",
-  "A9" => "Vasilevo",
-  "B1" => "Veles",
-  "B2" => "Velesta",
-  "B3" => "Vevcani",
-  "B4" => "Vinica",
-  "B5" => "Vitoliste",
-  "B6" => "Vranestica",
-  "B7" => "Vrapciste",
-  "B8" => "Vratnica",
-  "B9" => "Vrutok",
-  "C1" => "Zajas",
-  "C2" => "Zelenikovo",
-  "C3" => "Zelino",
-  "C4" => "Zitose",
-  "C5" => "Zletovo",
-  "C6" => "Zrnovci"),
-"ML" => array(
-  "01" => "Bamako",
-  "03" => "Kayes",
-  "04" => "Mopti",
-  "05" => "Segou",
-  "06" => "Sikasso",
-  "07" => "Koulikoro",
-  "08" => "Tombouctou",
-  "09" => "Gao",
-  "10" => "Kidal"),
-"MM" => array(
-  "01" => "Rakhine State",
-  "02" => "Chin State",
-  "03" => "Irrawaddy",
-  "04" => "Kachin State",
-  "05" => "Karan State",
-  "06" => "Kayah State",
-  "07" => "Magwe",
-  "08" => "Mandalay",
-  "09" => "Pegu",
-  "10" => "Sagaing",
-  "11" => "Shan State",
-  "12" => "Tenasserim",
-  "13" => "Mon State",
-  "14" => "Rangoon",
-  "17" => "Yangon"),
-"MN" => array(
-  "01" => "Arhangay",
-  "02" => "Bayanhongor",
-  "03" => "Bayan-Olgiy",
-  "05" => "Darhan",
-  "06" => "Dornod",
-  "07" => "Dornogovi",
-  "08" => "Dundgovi",
-  "09" => "Dzavhan",
-  "10" => "Govi-Altay",
-  "11" => "Hentiy",
-  "12" => "Hovd",
-  "13" => "Hovsgol",
-  "14" => "Omnogovi",
-  "15" => "Ovorhangay",
-  "16" => "Selenge",
-  "17" => "Suhbaatar",
-  "18" => "Tov",
-  "19" => "Uvs",
-  "20" => "Ulaanbaatar",
-  "21" => "Bulgan",
-  "22" => "Erdenet",
-  "23" => "Darhan-Uul",
-  "24" => "Govisumber",
-  "25" => "Orhon"),
-"MO" => array(
-  "01" => "Ilhas",
-  "02" => "Macau"),
-"MR" => array(
-  "01" => "Hodh Ech Chargui",
-  "02" => "Hodh El Gharbi",
-  "03" => "Assaba",
-  "04" => "Gorgol",
-  "05" => "Brakna",
-  "06" => "Trarza",
-  "07" => "Adrar",
-  "08" => "Dakhlet Nouadhibou",
-  "09" => "Tagant",
-  "10" => "Guidimaka",
-  "11" => "Tiris Zemmour",
-  "12" => "Inchiri"),
-"MS" => array(
-  "01" => "Saint Anthony",
-  "02" => "Saint Georges",
-  "03" => "Saint Peter"),
-"MU" => array(
-  "12" => "Black River",
-  "13" => "Flacq",
-  "14" => "Grand Port",
-  "15" => "Moka",
-  "16" => "Pamplemousses",
-  "17" => "Plaines Wilhems",
-  "18" => "Port Louis",
-  "19" => "Riviere du Rempart",
-  "20" => "Savanne",
-  "21" => "Agalega Islands",
-  "22" => "Cargados Carajos",
-  "23" => "Rodrigues"),
-"MV" => array(
-  "01" => "Seenu",
-  "02" => "Aliff",
-  "03" => "Laviyani",
-  "04" => "Waavu",
-  "05" => "Laamu",
-  "07" => "Haa Aliff",
-  "08" => "Thaa",
-  "12" => "Meemu",
-  "13" => "Raa",
-  "14" => "Faafu",
-  "17" => "Daalu",
-  "20" => "Baa",
-  "23" => "Haa Daalu",
-  "24" => "Shaviyani",
-  "25" => "Noonu",
-  "26" => "Kaafu",
-  "27" => "Gaafu Aliff",
-  "28" => "Gaafu Daalu",
-  "29" => "Naviyani",
-  "40" => "Male"),
-"MW" => array(
-  "02" => "Chikwawa",
-  "03" => "Chiradzulu",
-  "04" => "Chitipa",
-  "05" => "Thyolo",
-  "06" => "Dedza",
-  "07" => "Dowa",
-  "08" => "Karonga",
-  "09" => "Kasungu",
-  "11" => "Lilongwe",
-  "12" => "Mangochi",
-  "13" => "Mchinji",
-  "15" => "Mzimba",
-  "16" => "Ntcheu",
-  "17" => "Nkhata Bay",
-  "18" => "Nkhotakota",
-  "19" => "Nsanje",
-  "20" => "Ntchisi",
-  "21" => "Rumphi",
-  "22" => "Salima",
-  "23" => "Zomba",
-  "24" => "Blantyre",
-  "25" => "Mwanza",
-  "26" => "Balaka",
-  "27" => "Likoma",
-  "28" => "Machinga",
-  "29" => "Mulanje",
-  "30" => "Phalombe"),
-"MX" => array(
-  "01" => "Aguascalientes",
-  "02" => "Baja California",
-  "03" => "Baja California Sur",
-  "04" => "Campeche",
-  "05" => "Chiapas",
-  "06" => "Chihuahua",
-  "07" => "Coahuila de Zaragoza",
-  "08" => "Colima",
-  "09" => "Distrito Federal",
-  "10" => "Durango",
-  "11" => "Guanajuato",
-  "12" => "Guerrero",
-  "13" => "Hidalgo",
-  "14" => "Jalisco",
-  "15" => "Mexico",
-  "16" => "Michoacan de Ocampo",
-  "17" => "Morelos",
-  "18" => "Nayarit",
-  "19" => "Nuevo Leon",
-  "20" => "Oaxaca",
-  "21" => "Puebla",
-  "22" => "Queretaro de Arteaga",
-  "23" => "Quintana Roo",
-  "24" => "San Luis Potosi",
-  "25" => "Sinaloa",
-  "26" => "Sonora",
-  "27" => "Tabasco",
-  "28" => "Tamaulipas",
-  "29" => "Tlaxcala",
-  "30" => "Veracruz-Llave",
-  "31" => "Yucatan",
-  "32" => "Zacatecas"),
-"MY" => array(
-  "01" => "Johor",
-  "02" => "Kedah",
-  "03" => "Kelantan",
-  "04" => "Melaka",
-  "05" => "Negeri Sembilan",
-  "06" => "Pahang",
-  "07" => "Perak",
-  "08" => "Perlis",
-  "09" => "Pulau Pinang",
-  "11" => "Sarawak",
-  "12" => "Selangor",
-  "13" => "Terengganu",
-  "14" => "Kuala Lumpur",
-  "15" => "Labuan",
-  "16" => "Sabah",
-  "17" => "Putrajaya"),
-"MZ" => array(
-  "01" => "Cabo Delgado",
-  "02" => "Gaza",
-  "03" => "Inhambane",
-  "04" => "Maputo",
-  "05" => "Sofala",
-  "06" => "Nampula",
-  "07" => "Niassa",
-  "08" => "Tete",
-  "09" => "Zambezia",
-  "10" => "Manica",
-  "11" => "Maputo"),
-"NA" => array(
-  "01" => "Bethanien",
-  "02" => "Caprivi Oos",
-  "03" => "Boesmanland",
-  "04" => "Gobabis",
-  "05" => "Grootfontein",
-  "06" => "Kaokoland",
-  "07" => "Karibib",
-  "08" => "Keetmanshoop",
-  "09" => "Luderitz",
-  "10" => "Maltahohe",
-  "11" => "Okahandja",
-  "12" => "Omaruru",
-  "13" => "Otjiwarongo",
-  "14" => "Outjo",
-  "15" => "Owambo",
-  "16" => "Rehoboth",
-  "17" => "Swakopmund",
-  "18" => "Tsumeb",
-  "20" => "Karasburg",
-  "21" => "Windhoek",
-  "22" => "Damaraland",
-  "23" => "Hereroland Oos",
-  "24" => "Hereroland Wes",
-  "25" => "Kavango",
-  "26" => "Mariental",
-  "27" => "Namaland",
-  "28" => "Caprivi",
-  "29" => "Erongo",
-  "30" => "Hardap",
-  "31" => "Karas",
-  "32" => "Kunene",
-  "33" => "Ohangwena",
-  "34" => "Okavango",
-  "35" => "Omaheke",
-  "36" => "Omusati",
-  "37" => "Oshana",
-  "38" => "Oshikoto",
-  "39" => "Otjozondjupa"),
-"NE" => array(
-  "01" => "Agadez",
-  "02" => "Diffa",
-  "03" => "Dosso",
-  "04" => "Maradi",
-  "05" => "Niamey",
-  "06" => "Tahoua",
-  "07" => "Zinder",
-  "08" => "Niamey"),
-"NG" => array(
-  "05" => "Lagos",
-  "10" => "Rivers",
-  "11" => "Federal Capital Territory",
-  "12" => "Gongola",
-  "16" => "Ogun",
-  "17" => "Ondo",
-  "18" => "Oyo",
-  "21" => "Akwa Ibom",
-  "22" => "Cross River",
-  "23" => "Kaduna",
-  "24" => "Katsina",
-  "25" => "Anambra",
-  "26" => "Benue",
-  "27" => "Borno",
-  "28" => "Imo",
-  "29" => "Kano",
-  "30" => "Kwara",
-  "31" => "Niger",
-  "32" => "Oyo",
-  "35" => "Adamawa",
-  "36" => "Delta",
-  "37" => "Edo",
-  "39" => "Jigawa",
-  "40" => "Kebbi",
-  "41" => "Kogi",
-  "42" => "Osun",
-  "43" => "Taraba",
-  "44" => "Yobe",
-  "45" => "Abia",
-  "46" => "Bauchi",
-  "47" => "Enugu",
-  "48" => "Ondo",
-  "49" => "Plateau",
-  "50" => "Rivers",
-  "51" => "Sokoto",
-  "52" => "Bayelsa",
-  "53" => "Ebonyi",
-  "54" => "Ekiti",
-  "55" => "Gombe",
-  "56" => "Nassarawa",
-  "57" => "Zamfara"),
-"NI" => array(
-  "01" => "Boaco",
-  "02" => "Carazo",
-  "03" => "Chinandega",
-  "04" => "Chontales",
-  "05" => "Esteli",
-  "06" => "Granada",
-  "07" => "Jinotega",
-  "08" => "Leon",
-  "09" => "Madriz",
-  "10" => "Managua",
-  "11" => "Masaya",
-  "12" => "Matagalpa",
-  "13" => "Nueva Segovia",
-  "14" => "Rio San Juan",
-  "15" => "Rivas",
-  "16" => "Zelaya",
-  "17" => "Autonoma Atlantico Norte",
-  "18" => "Region Autonoma Atlantico Sur"),
-"NL" => array(
-  "01" => "Drenthe",
-  "02" => "Friesland",
-  "03" => "Gelderland",
-  "04" => "Groningen",
-  "05" => "Limburg",
-  "06" => "Noord-Brabant",
-  "07" => "Noord-Holland",
-  "08" => "Overijssel",
-  "09" => "Utrecht",
-  "10" => "Zeeland",
-  "11" => "Zuid-Holland",
-  "12" => "Dronten",
-  "13" => "Zuidelijke IJsselmeerpolders",
-  "14" => "Lelystad",
-  "15" => "Overijssel",
-  "16" => "Flevoland"),
-"NO" => array(
-  "01" => "Akershus",
-  "02" => "Aust-Agder",
-  "04" => "Buskerud",
-  "05" => "Finnmark",
-  "06" => "Hedmark",
-  "07" => "Hordaland",
-  "08" => "More og Romsdal",
-  "09" => "Nordland",
-  "10" => "Nord-Trondelag",
-  "11" => "Oppland",
-  "12" => "Oslo",
-  "13" => "Ostfold",
-  "14" => "Rogaland",
-  "15" => "Sogn og Fjordane",
-  "16" => "Sor-Trondelag",
-  "17" => "Telemark",
-  "18" => "Troms",
-  "19" => "Vest-Agder",
-  "20" => "Vestfold"),
-"NP" => array(
-  "01" => "Bagmati",
-  "02" => "Bheri",
-  "03" => "Dhawalagiri",
-  "04" => "Gandaki",
-  "05" => "Janakpur",
-  "06" => "Karnali",
-  "07" => "Kosi",
-  "08" => "Lumbini",
-  "09" => "Mahakali",
-  "10" => "Mechi",
-  "11" => "Narayani",
-  "12" => "Rapti",
-  "13" => "Sagarmatha",
-  "14" => "Seti"),
-"NR" => array(
-  "01" => "Aiwo",
-  "02" => "Anabar",
-  "03" => "Anetan",
-  "04" => "Anibare",
-  "05" => "Baiti",
-  "06" => "Boe",
-  "07" => "Buada",
-  "08" => "Denigomodu",
-  "09" => "Ewa",
-  "10" => "Ijuw",
-  "11" => "Meneng",
-  "12" => "Nibok",
-  "13" => "Uaboe",
-  "14" => "Yaren"),
-"NZ" => array(
-  "10" => "Chatham Islands",
-  "85" => "Waikato",
-  "E7" => "Auckland",
-  "E8" => "Bay of Plenty",
-  "E9" => "Canterbury",
-  "F1" => "Gisborne",
-  "F2" => "Hawke's Bay",
-  "F3" => "Manawatu-Wanganui",
-  "F4" => "Marlborough",
-  "F5" => "Nelson",
-  "F6" => "Northland",
-  "F7" => "Otago",
-  "F8" => "Southland",
-  "F9" => "Taranaki",
-  "G1" => "Waikato",
-  "G2" => "Wellington",
-  "G3" => "West Coast"),
-"OM" => array(
-  "01" => "Ad Dakhiliyah",
-  "02" => "Al Batinah",
-  "03" => "Al Wusta",
-  "04" => "Ash Sharqiyah",
-  "05" => "Az Zahirah",
-  "06" => "Masqat",
-  "07" => "Musandam",
-  "08" => "Zufar"),
-"PA" => array(
-  "01" => "Bocas del Toro",
-  "02" => "Chiriqui",
-  "03" => "Cocle",
-  "04" => "Colon",
-  "05" => "Darien",
-  "06" => "Herrera",
-  "07" => "Los Santos",
-  "08" => "Panama",
-  "09" => "San Blas",
-  "10" => "Veraguas"),
-"PE" => array(
-  "01" => "Amazonas",
-  "02" => "Ancash",
-  "03" => "Apurimac",
-  "04" => "Arequipa",
-  "05" => "Ayacucho",
-  "06" => "Cajamarca",
-  "07" => "Callao",
-  "08" => "Cusco",
-  "09" => "Huancavelica",
-  "10" => "Huanuco",
-  "11" => "Ica",
-  "12" => "Junin",
-  "13" => "La Libertad",
-  "14" => "Lambayeque",
-  "15" => "Lima",
-  "16" => "Loreto",
-  "17" => "Madre de Dios",
-  "18" => "Moquegua",
-  "19" => "Pasco",
-  "20" => "Piura",
-  "21" => "Puno",
-  "22" => "San Martin",
-  "23" => "Tacna",
-  "24" => "Tumbes",
-  "25" => "Ucayali"),
-"PG" => array(
-  "01" => "Central",
-  "02" => "Gulf",
-  "03" => "Milne Bay",
-  "04" => "Northern",
-  "05" => "Southern Highlands",
-  "06" => "Western",
-  "07" => "North Solomons",
-  "08" => "Chimbu",
-  "09" => "Eastern Highlands",
-  "10" => "East New Britain",
-  "11" => "East Sepik",
-  "12" => "Madang",
-  "13" => "Manus",
-  "14" => "Morobe",
-  "15" => "New Ireland",
-  "16" => "Western Highlands",
-  "17" => "West New Britain",
-  "18" => "Sandaun",
-  "19" => "Enga",
-  "20" => "National Capital"),
-"PH" => array(
-  "01" => "Abra",
-  "02" => "Agusan del Norte",
-  "03" => "Agusan del Sur",
-  "04" => "Aklan",
-  "05" => "Albay",
-  "06" => "Antique",
-  "07" => "Bataan",
-  "08" => "Batanes",
-  "09" => "Batangas",
-  "10" => "Benguet",
-  "11" => "Bohol",
-  "12" => "Bukidnon",
-  "13" => "Bulacan",
-  "14" => "Cagayan",
-  "15" => "Camarines Norte",
-  "16" => "Camarines Sur",
-  "17" => "Camiguin",
-  "18" => "Capiz",
-  "19" => "Catanduanes",
-  "20" => "Cavite",
-  "21" => "Cebu",
-  "22" => "Basilan",
-  "23" => "Eastern Samar",
-  "24" => "Davao",
-  "25" => "Davao del Sur",
-  "26" => "Davao Oriental",
-  "27" => "Ifugao",
-  "28" => "Ilocos Norte",
-  "29" => "Ilocos Sur",
-  "30" => "Iloilo",
-  "31" => "Isabela",
-  "32" => "Kalinga-Apayao",
-  "33" => "Laguna",
-  "34" => "Lanao del Norte",
-  "35" => "Lanao del Sur",
-  "36" => "La Union",
-  "37" => "Leyte",
-  "38" => "Marinduque",
-  "39" => "Masbate",
-  "40" => "Mindoro Occidental",
-  "41" => "Mindoro Oriental",
-  "42" => "Misamis Occidental",
-  "43" => "Misamis Oriental",
-  "44" => "Mountain",
-  "45" => "Negros Occidental",
-  "46" => "Negros Oriental",
-  "47" => "Nueva Ecija",
-  "48" => "Nueva Vizcaya",
-  "49" => "Palawan",
-  "50" => "Pampanga",
-  "51" => "Pangasinan",
-  "53" => "Rizal",
-  "54" => "Romblon",
-  "55" => "Samar",
-  "56" => "Maguindanao",
-  "57" => "North Cotabato",
-  "58" => "Sorsogon",
-  "59" => "Southern Leyte",
-  "60" => "Sulu",
-  "61" => "Surigao del Norte",
-  "62" => "Surigao del Sur",
-  "63" => "Tarlac",
-  "64" => "Zambales",
-  "65" => "Zamboanga del Norte",
-  "66" => "Zamboanga del Sur",
-  "67" => "Northern Samar",
-  "68" => "Quirino",
-  "69" => "Siquijor",
-  "70" => "South Cotabato",
-  "71" => "Sultan Kudarat",
-  "72" => "Tawitawi",
-  "A1" => "Angeles",
-  "A2" => "Bacolod",
-  "A3" => "Bago",
-  "A4" => "Baguio",
-  "A5" => "Bais",
-  "A6" => "Basilan City",
-  "A7" => "Batangas City",
-  "A8" => "Butuan",
-  "A9" => "Cabanatuan",
-  "B1" => "Cadiz",
-  "B2" => "Cagayan de Oro",
-  "B3" => "Calbayog",
-  "B4" => "Caloocan",
-  "B5" => "Canlaon",
-  "B6" => "Cavite City",
-  "B7" => "Cebu City",
-  "B8" => "Cotabato",
-  "B9" => "Dagupan",
-  "C1" => "Danao",
-  "C2" => "Dapitan",
-  "C3" => "Davao City",
-  "C4" => "Dipolog",
-  "C5" => "Dumaguete",
-  "C6" => "General Santos",
-  "C7" => "Gingoog",
-  "C8" => "Iligan",
-  "C9" => "Iloilo City",
-  "D1" => "Iriga",
-  "D2" => "La Carlota",
-  "D3" => "Laoag",
-  "D4" => "Lapu-Lapu",
-  "D5" => "Legaspi",
-  "D6" => "Lipa",
-  "D7" => "Lucena",
-  "D8" => "Mandaue",
-  "D9" => "Manila",
-  "E1" => "Marawi",
-  "E2" => "Naga",
-  "E3" => "Olongapo",
-  "E4" => "Ormoc",
-  "E5" => "Oroquieta",
-  "E6" => "Ozamis",
-  "E7" => "Pagadian",
-  "E8" => "Palayan",
-  "E9" => "Pasay",
-  "F1" => "Puerto Princesa",
-  "F2" => "Quezon City",
-  "F3" => "Roxas",
-  "F4" => "San Carlos",
-  "F5" => "San Carlos",
-  "F6" => "San Jose",
-  "F7" => "San Pablo",
-  "F8" => "Silay",
-  "F9" => "Surigao",
-  "G1" => "Tacloban",
-  "G2" => "Tagaytay",
-  "G3" => "Tagbilaran",
-  "G4" => "Tangub",
-  "G5" => "Toledo",
-  "G6" => "Trece Martires",
-  "G7" => "Zamboanga",
-  "G8" => "Aurora",
-  "H2" => "Quezon",
-  "H3" => "Negros Occidental"),
-"PK" => array(
-  "01" => "Federally Administered Tribal Areas",
-  "02" => "Balochistan",
-  "03" => "North-West Frontier",
-  "04" => "Punjab",
-  "05" => "Sindh",
-  "06" => "Azad Kashmir",
-  "07" => "Northern Areas",
-  "08" => "Islamabad"),
-"PL" => array(
-  "23" => "Biala Podlaska",
-  "24" => "Bialystok",
-  "25" => "Bielsko",
-  "26" => "Bydgoszcz",
-  "27" => "Chelm",
-  "28" => "Ciechanow",
-  "29" => "Czestochowa",
-  "30" => "Elblag",
-  "31" => "Gdansk",
-  "32" => "Gorzow",
-  "33" => "Jelenia Gora",
-  "34" => "Kalisz",
-  "35" => "Katowice",
-  "36" => "Kielce",
-  "37" => "Konin",
-  "38" => "Koszalin",
-  "39" => "Krakow",
-  "40" => "Krosno",
-  "41" => "Legnica",
-  "42" => "Leszno",
-  "43" => "Lodz",
-  "44" => "Lomza",
-  "45" => "Lublin",
-  "46" => "Nowy Sacz",
-  "47" => "Olsztyn",
-  "48" => "Opole",
-  "49" => "Ostroleka",
-  "50" => "Pila",
-  "51" => "Piotrkow",
-  "52" => "Plock",
-  "53" => "Poznan",
-  "54" => "Przemysl",
-  "55" => "Radom",
-  "56" => "Rzeszow",
-  "57" => "Siedlce",
-  "58" => "Sieradz",
-  "59" => "Skierniewice",
-  "60" => "Slupsk",
-  "61" => "Suwalki",
-  "62" => "Szczecin",
-  "63" => "Tarnobrzeg",
-  "64" => "Tarnow",
-  "65" => "Torun",
-  "66" => "Walbrzych",
-  "67" => "Warszawa",
-  "68" => "Wloclawek",
-  "69" => "Wroclaw",
-  "70" => "Zamosc",
-  "71" => "Zielona Gora",
-  "72" => "Dolnoslaskie",
-  "73" => "Kujawsko-Pomorskie",
-  "74" => "Lodzkie",
-  "75" => "Lubelskie",
-  "76" => "Lubuskie",
-  "77" => "Malopolskie",
-  "78" => "Mazowieckie",
-  "79" => "Opolskie",
-  "80" => "Podkarpackie",
-  "81" => "Podlaskie",
-  "82" => "Pomorskie",
-  "83" => "Slaskie",
-  "84" => "Swietokrzyskie",
-  "85" => "Warminsko-Mazurskie",
-  "86" => "Wielkopolskie",
-  "87" => "Zachodniopomorskie"),
-"PS" => array(
-  "GZ" => "Gaza",
-  "WE" => "West Bank"),
-"PT" => array(
-  "02" => "Aveiro",
-  "03" => "Beja",
-  "04" => "Braga",
-  "05" => "Braganca",
-  "06" => "Castelo Branco",
-  "07" => "Coimbra",
-  "08" => "Evora",
-  "09" => "Faro",
-  "10" => "Madeira",
-  "11" => "Guarda",
-  "13" => "Leiria",
-  "14" => "Lisboa",
-  "16" => "Portalegre",
-  "17" => "Porto",
-  "18" => "Santarem",
-  "19" => "Setubal",
-  "20" => "Viana do Castelo",
-  "21" => "Vila Real",
-  "22" => "Viseu",
-  "23" => "Azores"),
-"PY" => array(
-  "01" => "Alto Parana",
-  "02" => "Amambay",
-  "03" => "Boqueron",
-  "04" => "Caaguazu",
-  "05" => "Caazapa",
-  "06" => "Central",
-  "07" => "Concepcion",
-  "08" => "Cordillera",
-  "10" => "Guaira",
-  "11" => "Itapua",
-  "12" => "Misiones",
-  "13" => "Neembucu",
-  "15" => "Paraguari",
-  "16" => "Presidente Hayes",
-  "17" => "San Pedro",
-  "19" => "Canindeyu",
-  "20" => "Chaco",
-  "21" => "Nueva Asuncion",
-  "23" => "Alto Paraguay"),
-"QA" => array(
-  "01" => "Ad Dawhah",
-  "02" => "Al Ghuwariyah",
-  "03" => "Al Jumaliyah",
-  "04" => "Al Khawr",
-  "05" => "Al Wakrah Municipality",
-  "06" => "Ar Rayyan",
-  "08" => "Madinat ach Shamal",
-  "09" => "Umm Salal",
-  "10" => "Al Wakrah",
-  "11" => "Jariyan al Batnah",
-  "12" => "Umm Sa'id"),
-"RO" => array(
-  "01" => "Alba",
-  "02" => "Arad",
-  "03" => "Arges",
-  "04" => "Bacau",
-  "05" => "Bihor",
-  "06" => "Bistrita-Nasaud",
-  "07" => "Botosani",
-  "08" => "Braila",
-  "09" => "Brasov",
-  "10" => "Bucuresti",
-  "11" => "Buzau",
-  "12" => "Caras-Severin",
-  "13" => "Cluj",
-  "14" => "Constanta",
-  "15" => "Covasna",
-  "16" => "Dambovita",
-  "17" => "Dolj",
-  "18" => "Galati",
-  "19" => "Gorj",
-  "20" => "Harghita",
-  "21" => "Hunedoara",
-  "22" => "Ialomita",
-  "23" => "Iasi",
-  "25" => "Maramures",
-  "26" => "Mehedinti",
-  "27" => "Mures",
-  "28" => "Neamt",
-  "29" => "Olt",
-  "30" => "Prahova",
-  "31" => "Salaj",
-  "32" => "Satu Mare",
-  "33" => "Sibiu",
-  "34" => "Suceava",
-  "35" => "Teleorman",
-  "36" => "Timis",
-  "37" => "Tulcea",
-  "38" => "Vaslui",
-  "39" => "Valcea",
-  "40" => "Vrancea",
-  "41" => "Calarasi",
-  "42" => "Giurgiu",
-  "43" => "Ilfov"),
-"RS" => array(
-  "01" => "Kosovo",
-  "02" => "Vojvodina"),
-"RU" => array(
-  "01" => "Adygeya, Republic of",
-  "02" => "Aginsky Buryatsky AO",
-  "03" => "Gorno-Altay",
-  "04" => "Altaisky krai",
-  "05" => "Amur",
-  "06" => "Arkhangel'sk",
-  "07" => "Astrakhan'",
-  "08" => "Bashkortostan",
-  "09" => "Belgorod",
-  "10" => "Bryansk",
-  "11" => "Buryat",
-  "12" => "Chechnya",
-  "13" => "Chelyabinsk",
-  "14" => "Chita",
-  "15" => "Chukot",
-  "16" => "Chuvashia",
-  "17" => "Dagestan",
-  "18" => "Evenk",
-  "19" => "Ingush",
-  "20" => "Irkutsk",
-  "21" => "Ivanovo",
-  "22" => "Kabardin-Balkar",
-  "23" => "Kaliningrad",
-  "24" => "Kalmyk",
-  "25" => "Kaluga",
-  "26" => "Kamchatka",
-  "27" => "Karachay-Cherkess",
-  "28" => "Karelia",
-  "29" => "Kemerovo",
-  "30" => "Khabarovsk",
-  "31" => "Khakass",
-  "32" => "Khanty-Mansiy",
-  "33" => "Kirov",
-  "34" => "Komi",
-  "35" => "Komi-Permyak",
-  "36" => "Koryak",
-  "37" => "Kostroma",
-  "38" => "Krasnodar",
-  "39" => "Krasnoyarsk",
-  "40" => "Kurgan",
-  "41" => "Kursk",
-  "42" => "Leningrad",
-  "43" => "Lipetsk",
-  "44" => "Magadan",
-  "45" => "Mariy-El",
-  "46" => "Mordovia",
-  "47" => "Moskva",
-  "48" => "Moscow City",
-  "49" => "Murmansk",
-  "50" => "Nenets",
-  "51" => "Nizhegorod",
-  "52" => "Novgorod",
-  "53" => "Novosibirsk",
-  "54" => "Omsk",
-  "55" => "Orenburg",
-  "56" => "Orel",
-  "57" => "Penza",
-  "58" => "Perm'",
-  "59" => "Primor'ye",
-  "60" => "Pskov",
-  "61" => "Rostov",
-  "62" => "Ryazan'",
-  "63" => "Sakha",
-  "64" => "Sakhalin",
-  "65" => "Samara",
-  "66" => "Saint Petersburg City",
-  "67" => "Saratov",
-  "68" => "North Ossetia",
-  "69" => "Smolensk",
-  "70" => "Stavropol'",
-  "71" => "Sverdlovsk",
-  "72" => "Tambovskaya oblast",
-  "73" => "Tatarstan",
-  "74" => "Taymyr",
-  "75" => "Tomsk",
-  "76" => "Tula",
-  "77" => "Tver'",
-  "78" => "Tyumen'",
-  "79" => "Tuva",
-  "80" => "Udmurt",
-  "81" => "Ul'yanovsk",
-  "82" => "Ust-Orda Buryat",
-  "83" => "Vladimir",
-  "84" => "Volgograd",
-  "85" => "Vologda",
-  "86" => "Voronezh",
-  "87" => "Yamal-Nenets",
-  "88" => "Yaroslavl'",
-  "89" => "Yevrey",
-  "90" => "Permskiy Kray",
-  "91" => "Krasnoyarskiy Kray",
-  "CI" => "Chechnya Republic"),
-"RW" => array(
-  "01" => "Butare",
-  "06" => "Gitarama",
-  "07" => "Kibungo",
-  "09" => "Kigali",
-  "11" => "Est",
-  "12" => "Kigali",
-  "13" => "Nord",
-  "14" => "Ouest",
-  "15" => "Sud"),
-"SA" => array(
-  "02" => "Al Bahah",
-  "03" => "Al Jawf",
-  "05" => "Al Madinah",
-  "06" => "Ash Sharqiyah",
-  "08" => "Al Qasim",
-  "09" => "Al Qurayyat",
-  "10" => "Ar Riyad",
-  "13" => "Ha'il",
-  "14" => "Makkah",
-  "15" => "Al Hudud ash Shamaliyah",
-  "16" => "Najran",
-  "17" => "Jizan",
-  "19" => "Tabuk",
-  "20" => "Al Jawf"),
-"SB" => array(
-  "03" => "Malaita",
-  "06" => "Guadalcanal",
-  "07" => "Isabel",
-  "08" => "Makira",
-  "09" => "Temotu",
-  "10" => "Central",
-  "11" => "Western",
-  "12" => "Choiseul",
-  "13" => "Rennell and Bellona"),
-"SC" => array(
-  "01" => "Anse aux Pins",
-  "02" => "Anse Boileau",
-  "03" => "Anse Etoile",
-  "04" => "Anse Louis",
-  "05" => "Anse Royale",
-  "06" => "Baie Lazare",
-  "07" => "Baie Sainte Anne",
-  "08" => "Beau Vallon",
-  "09" => "Bel Air",
-  "10" => "Bel Ombre",
-  "11" => "Cascade",
-  "12" => "Glacis",
-  "13" => "Grand' Anse",
-  "14" => "Grand' Anse",
-  "15" => "La Digue",
-  "16" => "La Riviere Anglaise",
-  "17" => "Mont Buxton",
-  "18" => "Mont Fleuri",
-  "19" => "Plaisance",
-  "20" => "Pointe La Rue",
-  "21" => "Port Glaud",
-  "22" => "Saint Louis",
-  "23" => "Takamaka"),
-"SD" => array(
-  "27" => "Al Wusta",
-  "28" => "Al Istiwa'iyah",
-  "29" => "Al Khartum",
-  "30" => "Ash Shamaliyah",
-  "31" => "Ash Sharqiyah",
-  "32" => "Bahr al Ghazal",
-  "33" => "Darfur",
-  "34" => "Kurdufan",
-  "35" => "Upper Nile",
-  "40" => "Al Wahadah State",
-  "44" => "Central Equatoria State"),
-"SE" => array(
-  "01" => "Alvsborgs Lan",
-  "02" => "Blekinge Lan",
-  "03" => "Gavleborgs Lan",
-  "04" => "Goteborgs och Bohus Lan",
-  "05" => "Gotlands Lan",
-  "06" => "Hallands Lan",
-  "07" => "Jamtlands Lan",
-  "08" => "Jonkopings Lan",
-  "09" => "Kalmar Lan",
-  "10" => "Dalarnas Lan",
-  "11" => "Kristianstads Lan",
-  "12" => "Kronobergs Lan",
-  "13" => "Malmohus Lan",
-  "14" => "Norrbottens Lan",
-  "15" => "Orebro Lan",
-  "16" => "Ostergotlands Lan",
-  "17" => "Skaraborgs Lan",
-  "18" => "Sodermanlands Lan",
-  "21" => "Uppsala Lan",
-  "22" => "Varmlands Lan",
-  "23" => "Vasterbottens Lan",
-  "24" => "Vasternorrlands Lan",
-  "25" => "Vastmanlands Lan",
-  "26" => "Stockholms Lan",
-  "27" => "Skane Lan",
-  "28" => "Vastra Gotaland"),
-"SH" => array(
-  "01" => "Ascension",
-  "02" => "Saint Helena",
-  "03" => "Tristan da Cunha"),
-"SI" => array(
-  "01" => "Ajdovscina",
-  "02" => "Beltinci",
-  "03" => "Bled",
-  "04" => "Bohinj",
-  "05" => "Borovnica",
-  "06" => "Bovec",
-  "07" => "Brda",
-  "08" => "Brezice",
-  "09" => "Brezovica",
-  "11" => "Celje",
-  "12" => "Cerklje na Gorenjskem",
-  "13" => "Cerknica",
-  "14" => "Cerkno",
-  "15" => "Crensovci",
-  "16" => "Crna na Koroskem",
-  "17" => "Crnomelj",
-  "19" => "Divaca",
-  "20" => "Dobrepolje",
-  "22" => "Dol pri Ljubljani",
-  "24" => "Dornava",
-  "25" => "Dravograd",
-  "26" => "Duplek",
-  "27" => "Gorenja Vas-Poljane",
-  "28" => "Gorisnica",
-  "29" => "Gornja Radgona",
-  "30" => "Gornji Grad",
-  "31" => "Gornji Petrovci",
-  "32" => "Grosuplje",
-  "34" => "Hrastnik",
-  "35" => "Hrpelje-Kozina",
-  "36" => "Idrija",
-  "37" => "Ig",
-  "38" => "Ilirska Bistrica",
-  "39" => "Ivancna Gorica",
-  "40" => "Izola-Isola",
-  "42" => "Jursinci",
-  "44" => "Kanal",
-  "45" => "Kidricevo",
-  "46" => "Kobarid",
-  "47" => "Kobilje",
-  "49" => "Komen",
-  "50" => "Koper-Capodistria",
-  "51" => "Kozje",
-  "52" => "Kranj",
-  "53" => "Kranjska Gora",
-  "54" => "Krsko",
-  "55" => "Kungota",
-  "57" => "Lasko",
-  "61" => "Ljubljana",
-  "62" => "Ljubno",
-  "64" => "Logatec",
-  "66" => "Loski Potok",
-  "68" => "Lukovica",
-  "71" => "Medvode",
-  "72" => "Menges",
-  "73" => "Metlika",
-  "74" => "Mezica",
-  "76" => "Mislinja",
-  "77" => "Moravce",
-  "78" => "Moravske Toplice",
-  "79" => "Mozirje",
-  "80" => "Murska Sobota",
-  "81" => "Muta",
-  "82" => "Naklo",
-  "83" => "Nazarje",
-  "84" => "Nova Gorica",
-  "86" => "Odranci",
-  "87" => "Ormoz",
-  "88" => "Osilnica",
-  "89" => "Pesnica",
-  "91" => "Pivka",
-  "92" => "Podcetrtek",
-  "94" => "Postojna",
-  "97" => "Puconci",
-  "98" => "Racam",
-  "99" => "Radece",
-  "A1" => "Radenci",
-  "A2" => "Radlje ob Dravi",
-  "A3" => "Radovljica",
-  "A6" => "Rogasovci",
-  "A7" => "Rogaska Slatina",
-  "A8" => "Rogatec",
-  "B1" => "Semic",
-  "B2" => "Sencur",
-  "B3" => "Sentilj",
-  "B4" => "Sentjernej",
-  "B6" => "Sevnica",
-  "B7" => "Sezana",
-  "B8" => "Skocjan",
-  "B9" => "Skofja Loka",
-  "C1" => "Skofljica",
-  "C2" => "Slovenj Gradec",
-  "C4" => "Slovenske Konjice",
-  "C5" => "Smarje pri Jelsah",
-  "C6" => "Smartno ob Paki",
-  "C7" => "Sostanj",
-  "C8" => "Starse",
-  "C9" => "Store",
-  "D1" => "Sveti Jurij",
-  "D2" => "Tolmin",
-  "D3" => "Trbovlje",
-  "D4" => "Trebnje",
-  "D5" => "Trzic",
-  "D6" => "Turnisce",
-  "D7" => "Velenje",
-  "D8" => "Velike Lasce",
-  "E1" => "Vipava",
-  "E2" => "Vitanje",
-  "E3" => "Vodice",
-  "E5" => "Vrhnika",
-  "E6" => "Vuzenica",
-  "E7" => "Zagorje ob Savi",
-  "E9" => "Zavrc",
-  "F1" => "Zelezniki",
-  "F2" => "Ziri",
-  "F3" => "Zrece",
-  "G4" => "Dobrova-Horjul-Polhov Gradec",
-  "G7" => "Domzale",
-  "H4" => "Jesenice",
-  "H6" => "Kamnik",
-  "H7" => "Kocevje",
-  "I2" => "Kuzma",
-  "I3" => "Lenart",
-  "I5" => "Litija",
-  "I6" => "Ljutomer",
-  "I7" => "Loska Dolina",
-  "I9" => "Luce",
-  "J1" => "Majsperk",
-  "J2" => "Maribor",
-  "J5" => "Miren-Kostanjevica",
-  "J7" => "Novo Mesto",
-  "J9" => "Piran",
-  "K5" => "Preddvor",
-  "K7" => "Ptuj",
-  "L1" => "Ribnica",
-  "L3" => "Ruse",
-  "L7" => "Sentjur pri Celju",
-  "L8" => "Slovenska Bistrica",
-  "N2" => "Videm",
-  "N3" => "Vojnik",
-  "N5" => "Zalec"),
-"SK" => array(
-  "01" => "Banska Bystrica",
-  "02" => "Bratislava",
-  "03" => "Kosice",
-  "04" => "Nitra",
-  "05" => "Presov",
-  "06" => "Trencin",
-  "07" => "Trnava",
-  "08" => "Zilina"),
-"SL" => array(
-  "01" => "Eastern",
-  "02" => "Northern",
-  "03" => "Southern",
-  "04" => "Western Area"),
-"SM" => array(
-  "01" => "Acquaviva",
-  "02" => "Chiesanuova",
-  "03" => "Domagnano",
-  "04" => "Faetano",
-  "05" => "Fiorentino",
-  "06" => "Borgo Maggiore",
-  "07" => "San Marino",
-  "08" => "Monte Giardino",
-  "09" => "Serravalle"),
-"SN" => array(
-  "01" => "Dakar",
-  "03" => "Diourbel",
-  "04" => "Saint-Louis",
-  "05" => "Tambacounda",
-  "07" => "Thies",
-  "08" => "Louga",
-  "09" => "Fatick",
-  "10" => "Kaolack",
-  "11" => "Kolda",
-  "12" => "Ziguinchor",
-  "13" => "Louga",
-  "14" => "Saint-Louis",
-  "15" => "Matam"),
-"SO" => array(
-  "01" => "Bakool",
-  "02" => "Banaadir",
-  "03" => "Bari",
-  "04" => "Bay",
-  "05" => "Galguduud",
-  "06" => "Gedo",
-  "07" => "Hiiraan",
-  "08" => "Jubbada Dhexe",
-  "09" => "Jubbada Hoose",
-  "10" => "Mudug",
-  "11" => "Nugaal",
-  "12" => "Sanaag",
-  "13" => "Shabeellaha Dhexe",
-  "14" => "Shabeellaha Hoose",
-  "16" => "Woqooyi Galbeed",
-  "18" => "Nugaal",
-  "19" => "Togdheer",
-  "20" => "Woqooyi Galbeed",
-  "21" => "Awdal",
-  "22" => "Sool"),
-"SR" => array(
-  "10" => "Brokopondo",
-  "11" => "Commewijne",
-  "12" => "Coronie",
-  "13" => "Marowijne",
-  "14" => "Nickerie",
-  "15" => "Para",
-  "16" => "Paramaribo",
-  "17" => "Saramacca",
-  "18" => "Sipaliwini",
-  "19" => "Wanica"),
-"ST" => array(
-  "01" => "Principe",
-  "02" => "Sao Tome"),
-"SV" => array(
-  "01" => "Ahuachapan",
-  "02" => "Cabanas",
-  "03" => "Chalatenango",
-  "04" => "Cuscatlan",
-  "05" => "La Libertad",
-  "06" => "La Paz",
-  "07" => "La Union",
-  "08" => "Morazan",
-  "09" => "San Miguel",
-  "10" => "San Salvador",
-  "11" => "Santa Ana",
-  "12" => "San Vicente",
-  "13" => "Sonsonate",
-  "14" => "Usulutan"),
-"SY" => array(
-  "01" => "Al Hasakah",
-  "02" => "Al Ladhiqiyah",
-  "03" => "Al Qunaytirah",
-  "04" => "Ar Raqqah",
-  "05" => "As Suwayda'",
-  "06" => "Dar",
-  "07" => "Dayr az Zawr",
-  "08" => "Rif Dimashq",
-  "09" => "Halab",
-  "10" => "Hamah",
-  "11" => "Hims",
-  "12" => "Idlib",
-  "13" => "Dimashq",
-  "14" => "Tartus"),
-"SZ" => array(
-  "01" => "Hhohho",
-  "02" => "Lubombo",
-  "03" => "Manzini",
-  "04" => "Shiselweni",
-  "05" => "Praslin"),
-"TD" => array(
-  "01" => "Batha",
-  "02" => "Biltine",
-  "03" => "Borkou-Ennedi-Tibesti",
-  "04" => "Chari-Baguirmi",
-  "05" => "Guera",
-  "06" => "Kanem",
-  "07" => "Lac",
-  "08" => "Logone Occidental",
-  "09" => "Logone Oriental",
-  "10" => "Mayo-Kebbi",
-  "11" => "Moyen-Chari",
-  "12" => "Ouaddai",
-  "13" => "Salamat",
-  "14" => "Tandjile"),
-"TG" => array(
-  "09" => "Lama-Kara",
-  "18" => "Tsevie",
-  "22" => "Centrale",
-  "23" => "Kara",
-  "24" => "Maritime",
-  "25" => "Plateaux",
-  "26" => "Savanes"),
-"TH" => array(
-  "01" => "Mae Hong Son",
-  "02" => "Chiang Mai",
-  "03" => "Chiang Rai",
-  "04" => "Nan",
-  "05" => "Lamphun",
-  "06" => "Lampang",
-  "07" => "Phrae",
-  "08" => "Tak",
-  "09" => "Sukhothai",
-  "10" => "Uttaradit",
-  "11" => "Kamphaeng Phet",
-  "12" => "Phitsanulok",
-  "13" => "Phichit",
-  "14" => "Phetchabun",
-  "15" => "Uthai Thani",
-  "16" => "Nakhon Sawan",
-  "17" => "Nong Khai",
-  "18" => "Loei",
-  "20" => "Sakon Nakhon",
-  "21" => "Nakhon Phanom",
-  "22" => "Khon Kaen",
-  "23" => "Kalasin",
-  "24" => "Maha Sarakham",
-  "25" => "Roi Et",
-  "26" => "Chaiyaphum",
-  "27" => "Nakhon Ratchasima",
-  "28" => "Buriram",
-  "29" => "Surin",
-  "30" => "Sisaket",
-  "31" => "Narathiwat",
-  "32" => "Chai Nat",
-  "33" => "Sing Buri",
-  "34" => "Lop Buri",
-  "35" => "Ang Thong",
-  "36" => "Phra Nakhon Si Ayutthaya",
-  "37" => "Saraburi",
-  "38" => "Nonthaburi",
-  "39" => "Pathum Thani",
-  "40" => "Krung Thep",
-  "41" => "Phayao",
-  "42" => "Samut Prakan",
-  "43" => "Nakhon Nayok",
-  "44" => "Chachoengsao",
-  "45" => "Prachin Buri",
-  "46" => "Chon Buri",
-  "47" => "Rayong",
-  "48" => "Chanthaburi",
-  "49" => "Trat",
-  "50" => "Kanchanaburi",
-  "51" => "Suphan Buri",
-  "52" => "Ratchaburi",
-  "53" => "Nakhon Pathom",
-  "54" => "Samut Songkhram",
-  "55" => "Samut Sakhon",
-  "56" => "Phetchaburi",
-  "57" => "Prachuap Khiri Khan",
-  "58" => "Chumphon",
-  "59" => "Ranong",
-  "60" => "Surat Thani",
-  "61" => "Phangnga",
-  "62" => "Phuket",
-  "63" => "Krabi",
-  "64" => "Nakhon Si Thammarat",
-  "65" => "Trang",
-  "66" => "Phatthalung",
-  "67" => "Satun",
-  "68" => "Songkhla",
-  "69" => "Pattani",
-  "70" => "Yala",
-  "71" => "Ubon Ratchathani",
-  "72" => "Yasothon",
-  "73" => "Nakhon Phanom",
-  "75" => "Ubon Ratchathani",
-  "76" => "Udon Thani",
-  "77" => "Amnat Charoen",
-  "78" => "Mukdahan",
-  "79" => "Nong Bua Lamphu",
-  "80" => "Sa Kaeo"),
-"TJ" => array(
-  "01" => "Kuhistoni Badakhshon",
-  "02" => "Khatlon",
-  "03" => "Sughd"),
-"TM" => array(
-  "01" => "Ahal",
-  "02" => "Balkan",
-  "03" => "Dashoguz",
-  "04" => "Lebap",
-  "05" => "Mary"),
-"TN" => array(
-  "02" => "Kasserine",
-  "03" => "Kairouan",
-  "06" => "Jendouba",
-  "14" => "El Kef",
-  "15" => "Al Mahdia",
-  "16" => "Al Munastir",
-  "17" => "Bajah",
-  "18" => "Bizerte",
-  "19" => "Nabeul",
-  "22" => "Siliana",
-  "23" => "Sousse",
-  "26" => "Ariana",
-  "27" => "Ben Arous",
-  "28" => "Madanin",
-  "29" => "Gabes",
-  "30" => "Gafsa",
-  "31" => "Kebili",
-  "32" => "Sfax",
-  "33" => "Sidi Bou Zid",
-  "34" => "Tataouine",
-  "35" => "Tozeur",
-  "36" => "Tunis",
-  "37" => "Zaghouan"),
-"TO" => array(
-  "01" => "Ha",
-  "02" => "Tongatapu",
-  "03" => "Vava"),
-"TR" => array(
-  "02" => "Adiyaman",
-  "03" => "Afyonkarahisar",
-  "04" => "Agri",
-  "05" => "Amasya",
-  "07" => "Antalya",
-  "08" => "Artvin",
-  "09" => "Aydin",
-  "10" => "Balikesir",
-  "11" => "Bilecik",
-  "12" => "Bingol",
-  "13" => "Bitlis",
-  "14" => "Bolu",
-  "15" => "Burdur",
-  "16" => "Bursa",
-  "17" => "Canakkale",
-  "19" => "Corum",
-  "20" => "Denizli",
-  "21" => "Diyarbakir",
-  "22" => "Edirne",
-  "23" => "Elazig",
-  "24" => "Erzincan",
-  "25" => "Erzurum",
-  "26" => "Eskisehir",
-  "28" => "Giresun",
-  "31" => "Hatay",
-  "32" => "Icel",
-  "33" => "Isparta",
-  "34" => "Istanbul",
-  "35" => "Izmir",
-  "37" => "Kastamonu",
-  "38" => "Kayseri",
-  "39" => "Kirklareli",
-  "40" => "Kirsehir",
-  "41" => "Kocaeli",
-  "43" => "Kutahya",
-  "44" => "Malatya",
-  "45" => "Manisa",
-  "46" => "Kahramanmaras",
-  "48" => "Mugla",
-  "49" => "Mus",
-  "50" => "Nevsehir",
-  "52" => "Ordu",
-  "53" => "Rize",
-  "54" => "Sakarya",
-  "55" => "Samsun",
-  "57" => "Sinop",
-  "58" => "Sivas",
-  "59" => "Tekirdag",
-  "60" => "Tokat",
-  "61" => "Trabzon",
-  "62" => "Tunceli",
-  "63" => "Sanliurfa",
-  "64" => "Usak",
-  "65" => "Van",
-  "66" => "Yozgat",
-  "68" => "Ankara",
-  "69" => "Gumushane",
-  "70" => "Hakkari",
-  "71" => "Konya",
-  "72" => "Mardin",
-  "73" => "Nigde",
-  "74" => "Siirt",
-  "75" => "Aksaray",
-  "76" => "Batman",
-  "77" => "Bayburt",
-  "78" => "Karaman",
-  "79" => "Kirikkale",
-  "80" => "Sirnak",
-  "81" => "Adana",
-  "82" => "Cankiri",
-  "83" => "Gaziantep",
-  "84" => "Kars",
-  "85" => "Zonguldak",
-  "86" => "Ardahan",
-  "87" => "Bartin",
-  "88" => "Igdir",
-  "89" => "Karabuk",
-  "90" => "Kilis",
-  "91" => "Osmaniye",
-  "92" => "Yalova",
-  "93" => "Duzce"),
-"TT" => array(
-  "01" => "Arima",
-  "02" => "Caroni",
-  "03" => "Mayaro",
-  "04" => "Nariva",
-  "05" => "Port-of-Spain",
-  "06" => "Saint Andrew",
-  "07" => "Saint David",
-  "08" => "Saint George",
-  "09" => "Saint Patrick",
-  "10" => "San Fernando",
-  "11" => "Tobago",
-  "12" => "Victoria"),
-"TW" => array(
-  "01" => "Fu-chien",
-  "02" => "Kao-hsiung",
-  "03" => "T'ai-pei",
-  "04" => "T'ai-wan"),
-"TZ" => array(
-  "02" => "Pwani",
-  "03" => "Dodoma",
-  "04" => "Iringa",
-  "05" => "Kigoma",
-  "06" => "Kilimanjaro",
-  "07" => "Lindi",
-  "08" => "Mara",
-  "09" => "Mbeya",
-  "10" => "Morogoro",
-  "11" => "Mtwara",
-  "12" => "Mwanza",
-  "13" => "Pemba North",
-  "14" => "Ruvuma",
-  "15" => "Shinyanga",
-  "16" => "Singida",
-  "17" => "Tabora",
-  "18" => "Tanga",
-  "19" => "Kagera",
-  "20" => "Pemba South",
-  "21" => "Zanzibar Central",
-  "22" => "Zanzibar North",
-  "23" => "Dar es Salaam",
-  "24" => "Rukwa",
-  "25" => "Zanzibar Urban",
-  "26" => "Arusha",
-  "27" => "Manyara"),
-"UA" => array(
-  "01" => "Cherkas'ka Oblast'",
-  "02" => "Chernihivs'ka Oblast'",
-  "03" => "Chernivets'ka Oblast'",
-  "04" => "Dnipropetrovs'ka Oblast'",
-  "05" => "Donets'ka Oblast'",
-  "06" => "Ivano-Frankivs'ka Oblast'",
-  "07" => "Kharkivs'ka Oblast'",
-  "08" => "Khersons'ka Oblast'",
-  "09" => "Khmel'nyts'ka Oblast'",
-  "10" => "Kirovohrads'ka Oblast'",
-  "11" => "Krym",
-  "12" => "Kyyiv",
-  "13" => "Kyyivs'ka Oblast'",
-  "14" => "Luhans'ka Oblast'",
-  "15" => "L'vivs'ka Oblast'",
-  "16" => "Mykolayivs'ka Oblast'",
-  "17" => "Odes'ka Oblast'",
-  "18" => "Poltavs'ka Oblast'",
-  "19" => "Rivnens'ka Oblast'",
-  "20" => "Sevastopol'",
-  "21" => "Sums'ka Oblast'",
-  "22" => "Ternopil's'ka Oblast'",
-  "23" => "Vinnyts'ka Oblast'",
-  "24" => "Volyns'ka Oblast'",
-  "25" => "Zakarpats'ka Oblast'",
-  "26" => "Zaporiz'ka Oblast'",
-  "27" => "Zhytomyrs'ka Oblast'"),
-"UG" => array(
-  "05" => "Busoga",
-  "08" => "Karamoja",
-  "12" => "South Buganda",
-  "18" => "Central",
-  "20" => "Eastern",
-  "21" => "Nile",
-  "22" => "North Buganda",
-  "23" => "Northern",
-  "24" => "Southern",
-  "25" => "Western",
-  "33" => "Jinja",
-  "36" => "Kalangala",
-  "37" => "Kampala",
-  "42" => "Kiboga",
-  "52" => "Mbarara",
-  "56" => "Mubende",
-  "65" => "Adjumani",
-  "66" => "Bugiri",
-  "67" => "Busia",
-  "69" => "Katakwi",
-  "71" => "Masaka",
-  "73" => "Nakasongola",
-  "74" => "Sembabule",
-  "77" => "Arua",
-  "78" => "Iganga",
-  "79" => "Kabarole",
-  "80" => "Kaberamaido",
-  "81" => "Kamwenge",
-  "82" => "Kanungu",
-  "83" => "Kayunga",
-  "84" => "Kitgum",
-  "85" => "Kyenjojo",
-  "86" => "Mayuge",
-  "87" => "Mbale",
-  "88" => "Moroto",
-  "89" => "Mpigi",
-  "90" => "Mukono",
-  "91" => "Nakapiripirit",
-  "92" => "Pader",
-  "93" => "Rukungiri",
-  "94" => "Sironko",
-  "95" => "Soroti",
-  "96" => "Wakiso",
-  "97" => "Yumbe"),
-"US" => array(
-  "AA" => "Armed Forces Americas",
-  "AE" => "Armed Forces Europe, Middle East, & Canada",
-  "AK" => "Alaska",
-  "AL" => "Alabama",
-  "AP" => "Armed Forces Pacific",
-  "AR" => "Arkansas",
-  "AS" => "American Samoa",
-  "AZ" => "Arizona",
-  "CA" => "California",
-  "CO" => "Colorado",
-  "CT" => "Connecticut",
-  "DC" => "District of Columbia",
-  "DE" => "Delaware",
-  "FL" => "Florida",
-  "FM" => "Federated States of Micronesia",
-  "GA" => "Georgia",
-  "GU" => "Guam",
-  "HI" => "Hawaii",
-  "IA" => "Iowa",
-  "ID" => "Idaho",
-  "IL" => "Illinois",
-  "IN" => "Indiana",
-  "KS" => "Kansas",
-  "KY" => "Kentucky",
-  "LA" => "Louisiana",
-  "MA" => "Massachusetts",
-  "MD" => "Maryland",
-  "ME" => "Maine",
-  "MH" => "Marshall Islands",
-  "MI" => "Michigan",
-  "MN" => "Minnesota",
-  "MO" => "Missouri",
-  "MP" => "Northern Mariana Islands",
-  "MS" => "Mississippi",
-  "MT" => "Montana",
-  "NC" => "North Carolina",
-  "ND" => "North Dakota",
-  "NE" => "Nebraska",
-  "NH" => "New Hampshire",
-  "NJ" => "New Jersey",
-  "NM" => "New Mexico",
-  "NV" => "Nevada",
-  "NY" => "New York",
-  "OH" => "Ohio",
-  "OK" => "Oklahoma",
-  "OR" => "Oregon",
-  "PA" => "Pennsylvania",
-  "PR" => "Puerto Rico",
-  "PW" => "Palau",
-  "RI" => "Rhode Island",
-  "SC" => "South Carolina",
-  "SD" => "South Dakota",
-  "TN" => "Tennessee",
-  "TX" => "Texas",
-  "UT" => "Utah",
-  "VA" => "Virginia",
-  "VI" => "Virgin Islands",
-  "VT" => "Vermont",
-  "WA" => "Washington",
-  "WI" => "Wisconsin",
-  "WV" => "West Virginia",
-  "WY" => "Wyoming"),
-"UY" => array(
-  "01" => "Artigas",
-  "02" => "Canelones",
-  "03" => "Cerro Largo",
-  "04" => "Colonia",
-  "05" => "Durazno",
-  "06" => "Flores",
-  "07" => "Florida",
-  "08" => "Lavalleja",
-  "09" => "Maldonado",
-  "10" => "Montevideo",
-  "11" => "Paysandu",
-  "12" => "Rio Negro",
-  "13" => "Rivera",
-  "14" => "Rocha",
-  "15" => "Salto",
-  "16" => "San Jose",
-  "17" => "Soriano",
-  "18" => "Tacuarembo",
-  "19" => "Treinta y Tres"),
-"UZ" => array(
-  "01" => "Andijon",
-  "02" => "Bukhoro",
-  "03" => "Farghona",
-  "04" => "Jizzakh",
-  "05" => "Khorazm",
-  "06" => "Namangan",
-  "07" => "Nawoiy",
-  "08" => "Qashqadaryo",
-  "09" => "Qoraqalpoghiston",
-  "10" => "Samarqand",
-  "11" => "Sirdaryo",
-  "12" => "Surkhondaryo",
-  "13" => "Toshkent",
-  "14" => "Toshkent"),
-"VC" => array(
-  "01" => "Charlotte",
-  "02" => "Saint Andrew",
-  "03" => "Saint David",
-  "04" => "Saint George",
-  "05" => "Saint Patrick",
-  "06" => "Grenadines"),
-"VE" => array(
-  "01" => "Amazonas",
-  "02" => "Anzoategui",
-  "03" => "Apure",
-  "04" => "Aragua",
-  "05" => "Barinas",
-  "06" => "Bolivar",
-  "07" => "Carabobo",
-  "08" => "Cojedes",
-  "09" => "Delta Amacuro",
-  "11" => "Falcon",
-  "12" => "Guarico",
-  "13" => "Lara",
-  "14" => "Merida",
-  "15" => "Miranda",
-  "16" => "Monagas",
-  "17" => "Nueva Esparta",
-  "18" => "Portuguesa",
-  "19" => "Sucre",
-  "20" => "Tachira",
-  "21" => "Trujillo",
-  "22" => "Yaracuy",
-  "23" => "Zulia",
-  "24" => "Dependencias Federales",
-  "25" => "Distrito Federal",
-  "26" => "Vargas"),
-"VN" => array(
-  "01" => "An Giang",
-  "02" => "Bac Thai",
-  "03" => "Ben Tre",
-  "04" => "Binh Tri Thien",
-  "05" => "Cao Bang",
-  "06" => "Cuu Long",
-  "07" => "Dac Lac",
-  "09" => "Dong Thap",
-  "11" => "Ha Bac",
-  "12" => "Hai Hung",
-  "13" => "Hai Phong",
-  "14" => "Ha Nam Ninh",
-  "15" => "Ha Noi",
-  "16" => "Ha Son Binh",
-  "17" => "Ha Tuyen",
-  "19" => "Hoang Lien Son",
-  "20" => "Ho Chi Minh",
-  "21" => "Kien Giang",
-  "22" => "Lai Chau",
-  "23" => "Lam Dong",
-  "24" => "Long An",
-  "25" => "Minh Hai",
-  "26" => "Nghe Tinh",
-  "27" => "Nghia Binh",
-  "28" => "Phu Khanh",
-  "29" => "Quang Nam-Da Nang",
-  "30" => "Quang Ninh",
-  "31" => "Song Be",
-  "32" => "Son La",
-  "33" => "Tay Ninh",
-  "34" => "Thanh Hoa",
-  "35" => "Thai Binh",
-  "36" => "Thuan Hai",
-  "37" => "Tien Giang",
-  "38" => "Vinh Phu",
-  "39" => "Lang Son",
-  "40" => "Dong Nai",
-  "43" => "An Giang",
-  "44" => "Dac Lac",
-  "45" => "Dong Nai",
-  "46" => "Dong Thap",
-  "47" => "Kien Giang",
-  "48" => "Minh Hai",
-  "49" => "Song Be",
-  "50" => "Vinh Phu",
-  "51" => "Ha Noi",
-  "52" => "Ho Chi Minh",
-  "53" => "Ba Ria-Vung Tau",
-  "54" => "Binh Dinh",
-  "55" => "Binh Thuan",
-  "56" => "Can Tho",
-  "57" => "Gia Lai",
-  "58" => "Ha Giang",
-  "59" => "Ha Tay",
-  "60" => "Ha Tinh",
-  "61" => "Hoa Binh",
-  "62" => "Khanh Hoa",
-  "63" => "Kon Tum",
-  "64" => "Quang Tri",
-  "65" => "Nam Ha",
-  "66" => "Nghe An",
-  "67" => "Ninh Binh",
-  "68" => "Ninh Thuan",
-  "69" => "Phu Yen",
-  "70" => "Quang Binh",
-  "71" => "Quang Ngai",
-  "72" => "Quang Tri",
-  "73" => "Soc Trang",
-  "74" => "Thua Thien",
-  "75" => "Tra Vinh",
-  "76" => "Tuyen Quang",
-  "77" => "Vinh Long",
-  "78" => "Da Nang",
-  "79" => "Hai Duong",
-  "80" => "Ha Nam",
-  "81" => "Hung Yen",
-  "82" => "Nam Dinh",
-  "83" => "Phu Tho",
-  "84" => "Quang Nam",
-  "85" => "Thai Nguyen",
-  "86" => "Vinh Puc Province",
-  "87" => "Can Tho",
-  "88" => "Dak Lak",
-  "89" => "Lai Chau",
-  "90" => "Lao Cai",
-  "91" => "Dak Nong",
-  "92" => "Dien Bien",
-  "93" => "Hau Giang"),
-"VU" => array(
-  "05" => "Ambrym",
-  "06" => "Aoba",
-  "07" => "Torba",
-  "08" => "Efate",
-  "09" => "Epi",
-  "10" => "Malakula",
-  "11" => "Paama",
-  "12" => "Pentecote",
-  "13" => "Sanma",
-  "14" => "Shepherd",
-  "15" => "Tafea",
-  "16" => "Malampa",
-  "17" => "Penama",
-  "18" => "Shefa"),
-"WS" => array(
-  "02" => "Aiga-i-le-Tai",
-  "03" => "Atua",
-  "04" => "Fa",
-  "05" => "Gaga",
-  "06" => "Va",
-  "07" => "Gagaifomauga",
-  "08" => "Palauli",
-  "09" => "Satupa",
-  "10" => "Tuamasaga",
-  "11" => "Vaisigano"),
-"YE" => array(
-  "01" => "Abyan",
-  "02" => "Adan",
-  "03" => "Al Mahrah",
-  "04" => "Hadramawt",
-  "05" => "Shabwah",
-  "06" => "Al Ghaydah",
-  "08" => "Al Hudaydah",
-  "10" => "Al Mahwit",
-  "11" => "Dhamar",
-  "14" => "Ma'rib",
-  "15" => "Sa",
-  "16" => "San",
-  "20" => "Al Bayda'",
-  "21" => "Al Jawf",
-  "22" => "Hajjah",
-  "23" => "Ibb",
-  "24" => "Lahij",
-  "25" => "Ta"),
-"ZA" => array(
-  "01" => "North-Western Province",
-  "02" => "KwaZulu-Natal",
-  "03" => "Free State",
-  "05" => "Eastern Cape",
-  "06" => "Gauteng",
-  "07" => "Mpumalanga",
-  "08" => "Northern Cape",
-  "09" => "Limpopo",
-  "10" => "North-West",
-  "11" => "Western Cape"),
-"ZM" => array(
-  "01" => "Western",
-  "02" => "Central",
-  "03" => "Eastern",
-  "04" => "Luapula",
-  "05" => "Northern",
-  "06" => "North-Western",
-  "07" => "Southern",
-  "08" => "Copperbelt",
-  "09" => "Lusaka"),
-"ZW" => array(
-  "01" => "Manicaland",
-  "02" => "Midlands",
-  "03" => "Mashonaland Central",
-  "04" => "Mashonaland East",
-  "05" => "Mashonaland West",
-  "06" => "Matabeleland North",
-  "07" => "Matabeleland South",
-  "08" => "Masvingo",
-  "09" => "Bulawayo",
-  "10" => "Harare")
-);
-?>
\ No newline at end of file
diff --git a/lib/geoip/readme_moodle.txt b/lib/geoip/readme_moodle.txt
deleted file mode 100644 (file)
index d2f2812..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-20 Jul 2010
-MDL-20876 - replaced deprecated split() with explode()
-
-diff --git a/lib/geoip/geoipcity.inc b/lib/geoip/geoipcity.inc
-index 2297745..4e7b397 100644
---- a/lib/geoip/geoipcity.inc
-+++ b/lib/geoip/geoipcity.inc
-@@ -67,9 +67,9 @@ class geoipdnsrecord {
- function getrecordwithdnsservice($str){
-   $record = new geoipdnsrecord;
--  $keyvalue = split(";",$str);
-+  $keyvalue = explode(";",$str);
-   foreach ($keyvalue as $keyvalue2){
--    list($key,$value) = split("=",$keyvalue2);
-+    list($key,$value) = explode("=",$keyvalue2);
-     if ($key == "co"){
-       $record->country_code = $value;
-     }
-@@ -214,4 +214,4 @@ function GeoIP_record_by_addr ($gi,$addr){
-   return _get_record($gi, $ipnum);
- }
--?>
-\ No newline at end of file
-+?>
-
-
-
-18 Nov 2009
-Description of geoip modifications to remove ereg related functions deprecated as of php 5.3. Patch below.
-
-Index: geoip.inc
-===================================================================
-RCS file: /cvsroot/moodle/moodle/lib/geoip/geoip.inc,v
-retrieving revision 1.2
-diff -u -r1.2 geoip.inc
---- geoip.inc  19 Jul 2009 13:54:11 -0000      1.2
-+++ geoip.inc  18 Nov 2009 04:03:48 -0000
-@@ -493,7 +493,7 @@
-   $r->nameservers = array("ws1.maxmind.com");
-   $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
-   $str = is_object($p->answer[0])?$p->answer[0]->string():'';
--  ereg("\"(.*)\"",$str,$regs);
-+  preg_match("#\"(.*)\"#",$str,$regs);
-   $str = $regs[1];
-   return $str;
- }
-
diff --git a/lib/pear/Net/GeoIP.php b/lib/pear/Net/GeoIP.php
new file mode 100644 (file)
index 0000000..f2cb3e7
--- /dev/null
@@ -0,0 +1,904 @@
+<?php\r
+/**\r
+ * +----------------------------------------------------------------------+\r
+ * | PHP version 5                                                        |\r
+ * +----------------------------------------------------------------------+\r
+ * | Copyright (C) 2004 MaxMind LLC                                       |\r
+ * +----------------------------------------------------------------------+\r
+ * | This library is free software; you can redistribute it and/or        |\r
+ * | modify it under the terms of the GNU Lesser General Public           |\r
+ * | License as published by the Free Software Foundation; either         |\r
+ * | version 2.1 of the License, or (at your option) any later version.   |\r
+ * |                                                                      |\r
+ * | This library is distributed in the hope that it will be useful,      |\r
+ * | but WITHOUT ANY WARRANTY; without even the implied warranty of       |\r
+ * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    |\r
+ * | Lesser General Public License for more details.                      |\r
+ * |                                                                      |\r
+ * | You should have received a copy of the GNU Lesser General Public     |\r
+ * | License along with this library; if not, write to the Free Software  |\r
+ * | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 |\r
+ * | USA, or view it online at http://www.gnu.org/licenses/lgpl.txt.      |\r
+ * +----------------------------------------------------------------------+\r
+ * | Authors: Jim Winstead <jimw@apache.org> (original Maxmind version)   |\r
+ * |          Hans Lellelid <hans@xmpl.org>                               |\r
+ * +----------------------------------------------------------------------+\r
+ *\r
+ * @category Net\r
+ * @package  Net_GeoIP\r
+ * @author   Jim Winstead <jimw@apache.org> (original Maxmind PHP API)\r
+ * @author   Hans Lellelid <hans@xmpl.org>\r
+ * @license  LGPL http://www.gnu.org/licenses/lgpl.txt\r
+ * @link     http://pear.php.net/package/Net_GeoIp\r
+ * $Id$\r
+ */\r
+\r
+require_once 'PEAR/Exception.php';\r
+\r
+/**\r
+ * GeoIP class provides an API for performing geo-location lookups based on IP\r
+ * address.\r
+ *\r
+ * To use this class you must have a [binary version] GeoIP database. There is\r
+ * a free GeoIP country database which can be obtained from Maxmind:\r
+ * {@link http://www.maxmind.com/app/geoip_country}\r
+ *\r
+ *\r
+ * <b>SIMPLE USE</b>\r
+ *\r
+ *\r
+ * Create an instance:\r
+ *\r
+ * <code>\r
+ * $geoip = Net_GeoIP::getInstance('/path/to/geoipdb.dat', Net_GeoIP::SHARED_MEMORY);\r
+ * </code>\r
+ *\r
+ * Depending on which database you are using (free, or one of paid versions)\r
+ * you must use appropriate lookup method:\r
+ *\r
+ * <code>\r
+ * // for free country db:\r
+ * $country_name = $geoip->lookupCountryName($_SERVER['REMOTE_ADDR']);\r
+ * $country_code = $geoip->lookupCountryCode($_SERVER['REMOTE_ADDR']);\r
+ *\r
+ * // for [non-free] region db:\r
+ * list($ctry_code, $region) = $geoip->lookupRegion($_SERVER['REMOTE_ADDR']);\r
+ *\r
+ * // for [non-free] city db:\r
+ * $location = $geoip->lookupLocation($_SERVER['REMOTE_ADDR']);\r
+ * print "city: " . $location->city . ", " . $location->region;\r
+ * print "lat: " . $location->latitude . ", long: " . $location->longitude;\r
+ *\r
+ * // for organization or ISP db:\r
+ * $org_or_isp_name = $geoip->lookupOrg($_SERVER['REMOTE_ADDR']);\r
+ * </code>\r
+ *\r
+ *\r
+ * <b>MULTIPLE INSTANCES</b>\r
+ *\r
+ *\r
+ * You can have several instances of this class, one for each database file\r
+ * you are using.  You should use the static getInstance() singleton method\r
+ * to save on overhead of setting up database segments.  Note that only one\r
+ * instance is stored per filename, and any flags will be ignored if an\r
+ * instance already exists for the specifiedfilename.\r
+ *\r
+ * <b>Special note on using SHARED_MEMORY flag</b>\r
+ *\r
+ * If you are using SHARED_MEMORY (shmop) you can only use SHARED_MEMORY for\r
+ * one (1) instance  (i.e. for one database). Any subsequent attempts to\r
+ * instantiate using SHARED_MEMORY will read the same shared memory block\r
+ * already initialized, and therefore will cause problems since the expected\r
+ * database format won't match the database in the shared memory block.\r
+ *\r
+ * Note that there is no easy way to flag "nice errors" to prevent attempts\r
+ * to create new instances using SHARED_MEMORY flag and it is also not posible\r
+ * (in a safe way) to allow new instances to overwrite the shared memory block.\r
+ *\r
+ * In short, is you are using multiple databses, use the SHARED_MEMORY flag\r
+ * with care.\r
+ *\r
+ *\r
+ * <b>LOOKUPS ON HOSTNAMES</b>\r
+ *\r
+ *\r
+ * Note that this PHP API does NOT support lookups on hostnames.  This is so\r
+ * that the public API can be kept simple and so that the lookup functions\r
+ * don't need to try name lookups if IP lookup fails (which would be the only\r
+ * way to keep the API simple and support name-based lookups).\r
+ *\r
+ * If you do not know the IP address, you can convert an name to IP very\r
+ * simply using PHP native functions or other libraries:\r
+ *\r
+ * <code>\r
+ *     $geoip->lookupCountryName(gethostbyname('www.sunset.se'));\r
+ * </code>\r
+ *\r
+ * Or, if you don't know whether an address is a name or ip address, use\r
+ * application-level logic:\r
+ *\r
+ * <code>\r
+ * if (ip2long($ip_or_name) === false) {\r
+ *   $ip = gethostbyname($ip_or_name);\r
+ * } else {\r
+ *   $ip = $ip_or_name;\r
+ * }\r
+ * $ctry = $geoip->lookupCountryName($ip);\r
+ * </code>\r
+ *\r
+ * @category Net\r
+ * @package  Net_GeoIP\r
+ * @author   Jim Winstead <jimw@apache.org> (original Maxmind PHP API)\r
+ * @author   Hans Lellelid <hans@xmpl.org>\r
+ * @license  LGPL http://www.gnu.org/licenses/lgpl.txt\r
+ * @link     http://pear.php.net/package/Net_GeoIp\r
+ */\r
+class Net_GeoIP\r
+{\r
+    /**\r
+     * Exception error code used for invalid IP address.\r
+     */\r
+    const ERR_INVALID_IP =  218624992; // crc32('Net_GeoIP::ERR_INVALID_IP')\r
+\r
+    /**\r
+     * Exception error code when there is a DB-format-related error.\r
+     */\r
+    const ERR_DB_FORMAT = 866184008; // crc32('Net_GeoIP::ERR_DB_FORMAT')\r
+\r
+    public static $COUNTRY_CODES = array(\r
+      "", "AP", "EU", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AQ",\r
+      "AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH",\r
+      "BI", "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA",\r
+      "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU",\r
+      "CV", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG",\r
+      "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "FX", "GA", "GB",\r
+      "GD", "GE", "GF", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT",\r
+      "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN",\r
+      "IO", "IQ", "IR", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM",\r
+      "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS",\r
+      "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK", "ML", "MM", "MN",\r
+      "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA",\r
+      "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA",\r
+      "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY",\r
+      "QA", "RE", "RO", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI",\r
+      "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "ST", "SV", "SY", "SZ", "TC", "TD",\r
+      "TF", "TG", "TH", "TJ", "TK", "TM", "TN", "TO", "TL", "TR", "TT", "TV", "TW",\r
+      "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN",\r
+      "VU", "WF", "WS", "YE", "YT", "RS", "ZA", "ZM", "ME", "ZW", "A1", "A2", "O1",\r
+      "AX", "GG", "IM", "JE", "BL", "MF"\r
+        );\r
+\r
+    public static $COUNTRY_CODES3 = array(\r
+    "","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","AQ","ARG",\r
+    "ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI",\r
+    "BEN","BMU","BRN","BOL","BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC",\r
+    "COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV",\r
+    "CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH",\r
+    "ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD",\r
+    "GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM","GUM",\r
+    "GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IO",\r
+    "IRQ","IRN","ISL","ITA","JAM","JOR","JPN","KEN","KGZ","KHM","KIR","COM","KNA",\r
+    "PRK","KOR","KWT","CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",\r
+    "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI","MMR","MNG","MAC",\r
+    "MNP","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL",\r
+    "NER","NFK","NGA","NIC","NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER",\r
+    "PYF","PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW","PRY","QAT",\r
+    "REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN","SWE","SGP","SHN","SVN","SJM",\r
+    "SVK","SLE","SMR","SEN","SOM","SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF",\r
+    "TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA",\r
+    "UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT",\r
+    "WLF","WSM","YEM","YT","SRB","ZAF","ZMB","MNE","ZWE","A1","A2","O1",\r
+    "ALA","GGY","IMN","JEY","BLM","MAF"\r
+        );\r
+\r
+    public static $COUNTRY_NAMES = array(\r
+        "", "Asia/Pacific Region", "Europe", "Andorra", "United Arab Emirates",\r
+        "Afghanistan", "Antigua and Barbuda", "Anguilla", "Albania", "Armenia",\r
+        "Netherlands Antilles", "Angola", "Antarctica", "Argentina", "American Samoa",\r
+        "Austria", "Australia", "Aruba", "Azerbaijan", "Bosnia and Herzegovina",\r
+        "Barbados", "Bangladesh", "Belgium", "Burkina Faso", "Bulgaria", "Bahrain",\r
+        "Burundi", "Benin", "Bermuda", "Brunei Darussalam", "Bolivia", "Brazil",\r
+        "Bahamas", "Bhutan", "Bouvet Island", "Botswana", "Belarus", "Belize",\r
+        "Canada", "Cocos (Keeling) Islands", "Congo, The Democratic Republic of the",\r
+        "Central African Republic", "Congo", "Switzerland", "Cote D'Ivoire", "Cook Islands",\r
+        "Chile", "Cameroon", "China", "Colombia", "Costa Rica", "Cuba", "Cape Verde",\r
+        "Christmas Island", "Cyprus", "Czech Republic", "Germany", "Djibouti",\r
+        "Denmark", "Dominica", "Dominican Republic", "Algeria", "Ecuador", "Estonia",\r
+        "Egypt", "Western Sahara", "Eritrea", "Spain", "Ethiopia", "Finland", "Fiji",\r
+        "Falkland Islands (Malvinas)", "Micronesia, Federated States of", "Faroe Islands",\r
+        "France", "France, Metropolitan", "Gabon", "United Kingdom",\r
+        "Grenada", "Georgia", "French Guiana", "Ghana", "Gibraltar", "Greenland",\r
+        "Gambia", "Guinea", "Guadeloupe", "Equatorial Guinea", "Greece", "South Georgia and the South Sandwich Islands",\r
+        "Guatemala", "Guam", "Guinea-Bissau",\r
+        "Guyana", "Hong Kong", "Heard Island and McDonald Islands", "Honduras",\r
+        "Croatia", "Haiti", "Hungary", "Indonesia", "Ireland", "Israel", "India",\r
+        "British Indian Ocean Territory", "Iraq", "Iran, Islamic Republic of",\r
+        "Iceland", "Italy", "Jamaica", "Jordan", "Japan", "Kenya", "Kyrgyzstan",\r
+        "Cambodia", "Kiribati", "Comoros", "Saint Kitts and Nevis", "Korea, Democratic People's Republic of",\r
+        "Korea, Republic of", "Kuwait", "Cayman Islands",\r
+        "Kazakstan", "Lao People's Democratic Republic", "Lebanon", "Saint Lucia",\r
+        "Liechtenstein", "Sri Lanka", "Liberia", "Lesotho", "Lithuania", "Luxembourg",\r
+        "Latvia", "Libyan Arab Jamahiriya", "Morocco", "Monaco", "Moldova, Republic of",\r
+        "Madagascar", "Marshall Islands", "Macedonia",\r
+        "Mali", "Myanmar", "Mongolia", "Macau", "Northern Mariana Islands",\r
+        "Martinique", "Mauritania", "Montserrat", "Malta", "Mauritius", "Maldives",\r
+        "Malawi", "Mexico", "Malaysia", "Mozambique", "Namibia", "New Caledonia",\r
+        "Niger", "Norfolk Island", "Nigeria", "Nicaragua", "Netherlands", "Norway",\r
+        "Nepal", "Nauru", "Niue", "New Zealand", "Oman", "Panama", "Peru", "French Polynesia",\r
+        "Papua New Guinea", "Philippines", "Pakistan", "Poland", "Saint Pierre and Miquelon",\r
+        "Pitcairn Islands", "Puerto Rico", "Palestinian Territory",\r
+        "Portugal", "Palau", "Paraguay", "Qatar", "Reunion", "Romania",\r
+        "Russian Federation", "Rwanda", "Saudi Arabia", "Solomon Islands",\r
+        "Seychelles", "Sudan", "Sweden", "Singapore", "Saint Helena", "Slovenia",\r
+        "Svalbard and Jan Mayen", "Slovakia", "Sierra Leone", "San Marino", "Senegal",\r
+        "Somalia", "Suriname", "Sao Tome and Principe", "El Salvador", "Syrian Arab Republic",\r
+        "Swaziland", "Turks and Caicos Islands", "Chad", "French Southern Territories",\r
+        "Togo", "Thailand", "Tajikistan", "Tokelau", "Turkmenistan",\r
+        "Tunisia", "Tonga", "Timor-Leste", "Turkey", "Trinidad and Tobago", "Tuvalu",\r
+        "Taiwan", "Tanzania, United Republic of", "Ukraine",\r
+        "Uganda", "United States Minor Outlying Islands", "United States", "Uruguay",\r
+        "Uzbekistan", "Holy See (Vatican City State)", "Saint Vincent and the Grenadines",\r
+        "Venezuela", "Virgin Islands, British", "Virgin Islands, U.S.",\r
+        "Vietnam", "Vanuatu", "Wallis and Futuna", "Samoa", "Yemen", "Mayotte",\r
+        "Serbia", "South Africa", "Zambia", "Montenegro", "Zimbabwe",\r
+        "Anonymous Proxy","Satellite Provider","Other",\r
+        "Aland Islands","Guernsey","Isle of Man","Jersey","Saint Barthelemy","Saint Martin"\r
+        );\r
+\r
+    // storage / caching flags\r
+    const STANDARD = 0;\r
+    const MEMORY_CACHE = 1;\r
+    const SHARED_MEMORY = 2;\r
+\r
+    // Database structure constants\r
+    const COUNTRY_BEGIN = 16776960;\r
+    const STATE_BEGIN_REV0 = 16700000;\r
+    const STATE_BEGIN_REV1 = 16000000;\r
+\r
+    const STRUCTURE_INFO_MAX_SIZE = 20;\r
+    const DATABASE_INFO_MAX_SIZE = 100;\r
+    const COUNTRY_EDITION = 106;\r
+    const REGION_EDITION_REV0 = 112;\r
+    const REGION_EDITION_REV1 = 3;\r
+    const CITY_EDITION_REV0 = 111;\r
+    const CITY_EDITION_REV1 = 2;\r
+    const ORG_EDITION = 110;\r
+    const SEGMENT_RECORD_LENGTH = 3;\r
+    const STANDARD_RECORD_LENGTH = 3;\r
+    const ORG_RECORD_LENGTH = 4;\r
+    const MAX_RECORD_LENGTH = 4;\r
+    const MAX_ORG_RECORD_LENGTH = 300;\r
+    const FULL_RECORD_LENGTH = 50;\r
+\r
+    const US_OFFSET = 1;\r
+    const CANADA_OFFSET = 677;\r
+    const WORLD_OFFSET = 1353;\r
+    const FIPS_RANGE = 360;\r
+\r
+    // SHMOP memory address\r
+    const SHM_KEY = 0x4f415401;\r
+\r
+    /**\r
+     * @var int\r
+     */\r
+    private $flags = 0;\r
+\r
+    /**\r
+     * @var resource\r
+     */\r
+    private $filehandle;\r
+\r
+    /**\r
+     * @var string\r
+     */\r
+    private $memoryBuffer;\r
+\r
+    /**\r
+     * @var int\r
+     */\r
+    private $databaseType;\r
+\r
+    /**\r
+     * @var int\r
+     */\r
+    private $databaseSegments;\r
+\r
+    /**\r
+     * @var int\r
+     */\r
+    private $recordLength;\r
+\r
+    /**\r
+     * The memory addr "id" for use with SHMOP.\r
+     * @var int\r
+     */\r
+    private $shmid;\r
+\r
+    /**\r
+     * Support for singleton pattern.\r
+     * @var array\r
+     */\r
+    private static $instances = array();\r
+\r
+    /**\r
+     * Construct a Net_GeoIP instance.\r
+     * You should use the getInstance() method if you plan to use multiple databases or\r
+     * the same database from several different places in your script.\r
+     *\r
+     * @param string $filename Path to binary geoip database.\r
+     * @param int    $flags    Flags\r
+     *\r
+     * @see getInstance()\r
+     */\r
+    public function __construct($filename = null, $flags = null)\r
+    {\r
+        if ($filename !== null) {\r
+            $this->open($filename, $flags);\r
+        }\r
+        // store the instance, so that it will be returned by a call to\r
+        // getInstance() (with the same db filename).\r
+        self::$instances[$filename] = $this;\r
+    }\r
+\r
+    /**\r
+     * Calls the close() function to free any resources.\r
+     * @see close()\r
+     *\r
+     * COMMENTED OUT TO ADDRESS BUG IN PHP 5.0.4, 5.0.5dev.  THIS RESOURCE\r
+     * SHOULD AUTOMATICALLY BE FREED AT SCRIPT CLOSE, SO A DESTRUCTOR\r
+     * IS A GOOD IDEA BUT NOT NECESSARILY A NECESSITY.\r
+    public function __destruct()\r
+    {\r
+        $this->close();\r
+    }\r
+    */\r
+\r
+    /**\r
+     * Singleton method, use this to get an instance and avoid re-parsing the db.\r
+     *\r
+     * Unique instances are instantiated based on the filename of the db. The flags\r
+     * are ignored -- in that requests to for instance with same filename but different\r
+     * flags will return the already-instantiated instance.  For example:\r
+     * <code>\r
+     * // create new instance with memory_cache enabled\r
+     * $geoip = Net_GeoIP::getInstance('C:\mydb.dat', Net_GeoIP::MEMORY_CACHE);\r
+     * ....\r
+     *\r
+     * // later in code, request instance with no flags specified.\r
+     * $geoip = Net_GeoIP::getInstance('C:\mydb.dat');\r
+     *\r
+     * // Normally this means no MEMORY_CACHE but since an instance\r
+     * // with memory cache enabled has already been created for 'C:\mydb.dat', the\r
+     * // existing instance (with memory cache) will be returned.\r
+     * </code>\r
+     *\r
+     * NOTE: You can only use SHARED_MEMORY flag for one instance!  Any subsquent instances\r
+     * that attempt to use the SHARED_MEMORY will use the *same* shared memory, which will break\r
+     * your script.\r
+     *\r
+     * @param string $filename Filename\r
+     * @param int    $flags    Flags that control class behavior.\r
+     *          + Net_GeoIp::SHARED_MEMORY\r
+     *             Use SHMOP to share a db among multiple PHP instances.\r
+     *             NOTE: ONLY ONE GEOIP INSTANCE CAN USE SHARED MEMORY!!!\r
+     *          + Net_GeoIp::MEMORY_CACHE\r
+     *             Store the full contents of the database in memory for current script.\r
+     *             This is useful if you access the database several times in a script.\r
+     *          + Net_GeoIp::STANDARD\r
+     *             [default] standard no-cache version.\r
+     *\r
+     * @return Net_GeoIP\r
+     */\r
+    public static function getInstance($filename = null, $flags = null)\r
+    {\r
+        if (!isset(self::$instances[$filename])) {\r
+            self::$instances[$filename] = new Net_GeoIP($filename, $flags);\r
+        }\r
+        return self::$instances[$filename];\r
+    }\r
+\r
+    /**\r
+     * Opens geoip database at filename and with specified flags.\r
+     *\r
+     * @param string $filename File to open\r
+     * @param int    $flags    Flags\r
+     *\r
+     * @return void\r
+     *\r
+     * @throws PEAR_Exception if unable to open specified file or shared memory.\r
+     */\r
+    public function open($filename, $flags = null)\r
+    {\r
+        if ($flags !== null) {\r
+            $this->flags = $flags;\r
+        }\r
+        if ($this->flags & self::SHARED_MEMORY) {\r
+            $this->shmid = @shmop_open(self::SHM_KEY, "a", 0, 0);\r
+            if ($this->shmid === false) {\r
+                $this->loadSharedMemory($filename);\r
+                $this->shmid = @shmop_open(self::SHM_KEY, "a", 0, 0);\r
+                if ($this->shmid === false) { // should never be false as loadSharedMemory() will throw Exc if cannot create\r
+                    throw new PEAR_Exception("Unable to open shared memory at key: " . dechex(self::SHM_KEY));\r
+                }\r
+            }\r
+        } else {\r
+            $this->filehandle = fopen($filename, "rb");\r
+            if (!$this->filehandle) {\r
+                throw new PEAR_Exception("Unable to open file: $filename");\r
+            }\r
+            if ($this->flags & self::MEMORY_CACHE) {\r
+                $s_array = fstat($this->filehandle);\r
+                $this->memoryBuffer = fread($this->filehandle, $s_array['size']);\r
+            }\r
+        }\r
+        $this->setupSegments();\r
+    }\r
+\r
+    /**\r
+     * Loads the database file into shared memory.\r
+     *\r
+     * @param string $filename Path to database file to read into shared memory.\r
+     *\r
+     * @return void\r
+     *\r
+     * @throws PEAR_Exception     - if unable to read the db file.\r
+     */\r
+    protected function loadSharedMemory($filename)\r
+    {\r
+        $fp = fopen($filename, "rb");\r
+        if (!$fp) {\r
+            throw new PEAR_Exception("Unable to open file: $filename");\r
+        }\r
+        $s_array = fstat($fp);\r
+        $size = $s_array['size'];\r
+\r
+        if ($shmid = @shmop_open(self::SHM_KEY, "w", 0, 0)) {\r
+            shmop_delete($shmid);\r
+            shmop_close($shmid);\r
+        }\r
+\r
+        if ($shmid = @shmop_open(self::SHM_KEY, "c", 0644, $size)) {\r
+            $offset = 0;\r
+            while ($offset < $size) {\r
+                $buf = fread($fp, 524288);\r
+                shmop_write($shmid, $buf, $offset);\r
+                $offset += 524288;\r
+            }\r
+            shmop_close($shmid);\r
+        }\r
+\r
+        fclose($fp);\r
+    }\r
+\r
+    /**\r
+     * Parses the database file to determine what kind of database is being used and setup\r
+     * segment sizes and start points that will be used by the seek*() methods later.\r
+     *\r
+     * @return void\r
+     */\r
+    protected function setupSegments()\r
+    {\r
+\r
+        $this->databaseType = self::COUNTRY_EDITION;\r
+        $this->recordLength = self::STANDARD_RECORD_LENGTH;\r
+\r
+        if ($this->flags & self::SHARED_MEMORY) {\r
+\r
+            $offset = shmop_size($this->shmid) - 3;\r
+            for ($i = 0; $i < self::STRUCTURE_INFO_MAX_SIZE; $i++) {\r
+                $delim = shmop_read($this->shmid, $offset, 3);\r
+                $offset += 3;\r
+                if ($delim == (chr(255).chr(255).chr(255))) {\r
+                    $this->databaseType = ord(shmop_read($this->shmid, $offset, 1));\r
+                    $offset++;\r
+                    if ($this->databaseType === self::REGION_EDITION_REV0) {\r
+                        $this->databaseSegments = self::STATE_BEGIN_REV0;\r
+                    } elseif ($this->databaseType === self::REGION_EDITION_REV1) {\r
+                        $this->databaseSegments = self::STATE_BEGIN_REV1;\r
+                    } elseif (($this->databaseType === self::CITY_EDITION_REV0)\r
+                                || ($this->databaseType === self::CITY_EDITION_REV1)\r
+                                || ($this->databaseType === self::ORG_EDITION)) {\r
+                        $this->databaseSegments = 0;\r
+                        $buf = shmop_read($this->shmid, $offset, self::SEGMENT_RECORD_LENGTH);\r
+                        for ($j = 0; $j < self::SEGMENT_RECORD_LENGTH; $j++) {\r
+                            $this->databaseSegments += (ord($buf[$j]) << ($j * 8));\r
+                        }\r
+                        if ($this->databaseType === self::ORG_EDITION) {\r
+                            $this->recordLength = self::ORG_RECORD_LENGTH;\r
+                        }\r
+                    }\r
+                    break;\r
+                } else {\r
+                    $offset -= 4;\r
+                }\r
+            }\r
+            if ($this->databaseType == self::COUNTRY_EDITION) {\r
+                $this->databaseSegments = self::COUNTRY_BEGIN;\r
+            }\r
+\r
+        } else {\r
+\r
+            $filepos = ftell($this->filehandle);\r
+            fseek($this->filehandle, -3, SEEK_END);\r
+            for ($i = 0; $i < self::STRUCTURE_INFO_MAX_SIZE; $i++) {\r
+                $delim = fread($this->filehandle, 3);\r
+                if ($delim == (chr(255).chr(255).chr(255))) {\r
+                    $this->databaseType = ord(fread($this->filehandle, 1));\r
+                    if ($this->databaseType === self::REGION_EDITION_REV0) {\r
+                        $this->databaseSegments = self::STATE_BEGIN_REV0;\r
+                    } elseif ($this->databaseType === self::REGION_EDITION_REV1) {\r
+                        $this->databaseSegments = self::STATE_BEGIN_REV1;\r
+                    } elseif ($this->databaseType === self::CITY_EDITION_REV0\r
+                                || $this->databaseType === self::CITY_EDITION_REV1\r
+                                || $this->databaseType === self::ORG_EDITION) {\r
+                        $this->databaseSegments = 0;\r
+                        $buf = fread($this->filehandle, self::SEGMENT_RECORD_LENGTH);\r
+                        for ($j = 0; $j < self::SEGMENT_RECORD_LENGTH; $j++) {\r
+                            $this->databaseSegments += (ord($buf[$j]) << ($j * 8));\r
+                        }\r
+                        if ($this->databaseType === self::ORG_EDITION) {\r
+                            $this->recordLength = self::ORG_RECORD_LENGTH;\r
+                        }\r
+                    }\r
+                    break;\r
+                } else {\r
+                    fseek($this->filehandle, -4, SEEK_CUR);\r
+                }\r
+            }\r
+            if ($this->databaseType === self::COUNTRY_EDITION) {\r
+                $this->databaseSegments = self::COUNTRY_BEGIN;\r
+            }\r
+            fseek($this->filehandle, $filepos, SEEK_SET);\r
+\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Closes the geoip database.\r
+     *\r
+     * @return int Status of close command.\r
+     */\r
+    public function close()\r
+    {\r
+        if ($this->flags & self::SHARED_MEMORY) {\r
+            return shmop_close($this->shmid);\r
+        } else {\r
+            // right now even if file was cached in RAM the file was not closed\r
+            // so it's safe to expect no error w/ fclose()\r
+            return fclose($this->filehandle);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Get the country index.\r
+     *\r
+     * This method is called by the lookupCountryCode() and lookupCountryName()\r
+     * methods.  It lookups up the index ('id') for the country which is the key\r
+     * for the code and name.\r
+     *\r
+     * @param string $addr IP address (hostname not allowed)\r
+     *\r
+     * @throws PEAR_Exception  - if IP address is invalid.\r
+     *                         - if database type is incorrect\r
+     *\r
+     * @return string ID for the country\r
+     */\r
+    protected function lookupCountryId($addr)\r
+    {\r
+        $ipnum = ip2long($addr);\r
+        if ($ipnum === false) {\r
+            throw new PEAR_Exception("Invalid IP address: " . var_export($addr, true), self::ERR_INVALID_IP);\r
+        }\r
+        if ($this->databaseType !== self::COUNTRY_EDITION) {\r
+            throw new PEAR_Exception("Invalid database type; lookupCountry*() methods expect Country database.");\r
+        }\r
+        return $this->seekCountry($ipnum) - self::COUNTRY_BEGIN;\r
+    }\r
+\r
+    /**\r
+     * Returns 2-letter country code (e.g. 'CA') for specified IP address.\r
+     * Use this method if you have a Country database.\r
+     *\r
+     * @param string $addr IP address (hostname not allowed).\r
+     *\r
+     * @return string 2-letter country code\r
+     *\r
+     * @throws PEAR_Exception (see lookupCountryId())\r
+     * @see lookupCountryId()\r
+     */\r
+    public function lookupCountryCode($addr)\r
+    {\r
+        return self::$COUNTRY_CODES[$this->lookupCountryId($addr)];\r
+    }\r
+\r
+    /**\r
+     * Returns full country name for specified IP address.\r
+     * Use this method if you have a Country database.\r
+     *\r
+     * @param string $addr IP address (hostname not allowed).\r
+     *\r
+     * @return string Country name\r
+     * @throws PEAR_Exception (see lookupCountryId())\r
+     * @see lookupCountryId()\r
+     */\r
+    public function lookupCountryName($addr)\r
+    {\r
+        return self::$COUNTRY_NAMES[$this->lookupCountryId($addr)];\r
+    }\r
+\r
+    /**\r
+     * Using the record length and appropriate start points, seek to the country that corresponds\r
+     * to the converted IP address integer.\r
+     *\r
+     * @param int $ipnum Result of ip2long() conversion.\r
+     *\r
+     * @return int Offset of start of record.\r
+     * @throws PEAR_Exception - if fseek() fails on the file or no results after traversing the database (indicating corrupt db).\r
+     */\r
+    protected function seekCountry($ipnum)\r
+    {\r
+        $offset = 0;\r
+        for ($depth = 31; $depth >= 0; --$depth) {\r
+            if ($this->flags & self::MEMORY_CACHE) {\r
+                  $buf = substr($this->memoryBuffer, 2 * $this->recordLength * $offset, 2 * $this->recordLength);\r
+            } elseif ($this->flags & self::SHARED_MEMORY) {\r
+                $buf = shmop_read($this->shmid, 2 * $this->recordLength * $offset, 2 * $this->recordLength);\r
+            } else {\r
+                if (fseek($this->filehandle, 2 * $this->recordLength * $offset, SEEK_SET) !== 0) {\r
+                    throw new PEAR_Exception("fseek failed");\r
+                }\r
+                $buf = fread($this->filehandle, 2 * $this->recordLength);\r
+            }\r
+            $x = array(0,0);\r
+            for ($i = 0; $i < 2; ++$i) {\r
+                for ($j = 0; $j < $this->recordLength; ++$j) {\r
+                    $x[$i] += ord($buf[$this->recordLength * $i + $j]) << ($j * 8);\r
+                }\r
+            }\r
+            if ($ipnum & (1 << $depth)) {\r
+                if ($x[1] >= $this->databaseSegments) {\r
+                    return $x[1];\r
+                }\r
+                $offset = $x[1];\r
+            } else {\r
+                if ($x[0] >= $this->databaseSegments) {\r
+                    return $x[0];\r
+                }\r
+                $offset = $x[0];\r
+            }\r
+        }\r
+        throw new PEAR_Exception("Error traversing database - perhaps it is corrupt?");\r
+    }\r
+\r
+    /**\r
+     * Lookup the organization (or ISP) for given IP address.\r
+     * Use this method if you have an Organization/ISP database.\r
+     *\r
+     * @param string $addr IP address (hostname not allowed).\r
+     *\r
+     * @throws PEAR_Exception  - if IP address is invalid.\r
+     *                         - if database is of wrong type\r
+     *\r
+     * @return string The organization\r
+     */\r
+    public function lookupOrg($addr)\r
+    {\r
+        $ipnum = ip2long($addr);\r
+        if ($ipnum === false) {\r
+            throw new PEAR_Exception("Invalid IP address: " . var_export($addr, true), self::ERR_INVALID_IP);\r
+        }\r
+        if ($this->databaseType !== self::ORG_EDITION) {\r
+            throw new PEAR_Exception("Invalid database type; lookupOrg() method expects Org/ISP database.", self::ERR_DB_FORMAT);\r
+        }\r
+        return $this->getOrg($ipnum);\r
+    }\r
+\r
+    /**\r
+     * Lookup the region for given IP address.\r
+     * Use this method if you have a Region database.\r
+     *\r
+     * @param string $addr IP address (hostname not allowed).\r
+     *\r
+     * @return array Array containing country code and region: array($country_code, $region)\r
+     *\r
+     * @throws PEAR_Exception - if IP address is invalid.\r
+     */\r
+    public function lookupRegion($addr)\r
+    {\r
+        $ipnum = ip2long($addr);\r
+        if ($ipnum === false) {\r
+            throw new PEAR_Exception("Invalid IP address: " . var_export($addr, true), self::ERR_INVALID_IP);\r
+        }\r
+        if ($this->databaseType !== self::REGION_EDITION_REV0 && $this->databaseType !== self::REGION_EDITION_REV1) {\r
+            throw new PEAR_Exception("Invalid database type; lookupRegion() method expects Region database.", self::ERR_DB_FORMAT);\r
+        }\r
+        return $this->getRegion($ipnum);\r
+    }\r
+\r
+    /**\r
+     * Lookup the location record for given IP address.\r
+     * Use this method if you have a City database.\r
+     *\r
+     * @param string $addr IP address (hostname not allowed).\r
+     *\r
+     * @return Net_GeoIP_Location The full location record.\r
+     *\r
+     * @throws PEAR_Exception - if IP address is invalid.\r
+     */\r
+    public function lookupLocation($addr)\r
+    {\r
+        include_once 'Net/GeoIP/Location.php';\r
+        $ipnum = ip2long($addr);\r
+        if ($ipnum === false) {\r
+            throw new PEAR_Exception("Invalid IP address: " . var_export($addr, true), self::ERR_INVALID_IP);\r
+        }\r
+        if ($this->databaseType !== self::CITY_EDITION_REV0 && $this->databaseType !== self::CITY_EDITION_REV1) {\r
+            throw new PEAR_Exception("Invalid database type; lookupLocation() method expects City database.");\r
+        }\r
+        return $this->getRecord($ipnum);\r
+    }\r
+\r
+    /**\r
+     * Seek and return organization (or ISP) name for converted IP addr.\r
+     *\r
+     * @param int $ipnum Converted IP address.\r
+     *\r
+     * @return string The organization\r
+     */\r
+    protected function getOrg($ipnum)\r
+    {\r
+        $seek_org = $this->seekCountry($ipnum);\r
+        if ($seek_org == $this->databaseSegments) {\r
+            return null;\r
+        }\r
+        $record_pointer = $seek_org + (2 * $this->recordLength - 1) * $this->databaseSegments;\r
+        if ($this->flags & self::SHARED_MEMORY) {\r
+            $org_buf = shmop_read($this->shmid, $record_pointer, self::MAX_ORG_RECORD_LENGTH);\r
+        } else {\r
+            fseek($this->filehandle, $record_pointer, SEEK_SET);\r
+            $org_buf = fread($this->filehandle, self::MAX_ORG_RECORD_LENGTH);\r
+        }\r
+        $org_buf = substr($org_buf, 0, strpos($org_buf, 0));\r
+        return $org_buf;\r
+    }\r
+\r
+    /**\r
+     * Seek and return the region info (array containing country code and region name) for converted IP addr.\r
+     *\r
+     * @param int $ipnum Converted IP address.\r
+     *\r
+     * @return array Array containing country code and region: array($country_code, $region)\r
+     */\r
+    protected function getRegion($ipnum)\r
+    {\r
+        if ($this->databaseType == self::REGION_EDITION_REV0) {\r
+            $seek_region = $this->seekCountry($ipnum) - self::STATE_BEGIN_REV0;\r
+            if ($seek_region >= 1000) {\r
+                $country_code = "US";\r
+                $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);\r
+            } else {\r
+                $country_code = self::$COUNTRY_CODES[$seek_region];\r
+                $region = "";\r
+            }\r
+            return array($country_code, $region);\r
+        } elseif ($this->databaseType == self::REGION_EDITION_REV1) {\r
+            $seek_region = $this->seekCountry($ipnum) - self::STATE_BEGIN_REV1;\r
+            //print $seek_region;\r
+            if ($seek_region < self::US_OFFSET) {\r
+                $country_code = "";\r
+                $region = "";\r
+            } elseif ($seek_region < self::CANADA_OFFSET) {\r
+                $country_code = "US";\r
+                $region = chr(($seek_region - self::US_OFFSET)/26 + 65) . chr(($seek_region - self::US_OFFSET)%26 + 65);\r
+            } elseif ($seek_region < self::WORLD_OFFSET) {\r
+                $country_code = "CA";\r
+                $region = chr(($seek_region - self::CANADA_OFFSET)/26 + 65) . chr(($seek_region - self::CANADA_OFFSET)%26 + 65);\r
+            } else {\r
+                $country_code = self::$COUNTRY_CODES[($seek_region - self::WORLD_OFFSET) / self::FIPS_RANGE];\r
+                $region = "";\r
+            }\r
+            return array ($country_code,$region);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Seek and populate Net_GeoIP_Location object for converted IP addr.\r
+     * Note: this\r
+     *\r
+     * @param int $ipnum Converted IP address.\r
+     *\r
+     * @return Net_GeoIP_Location\r
+     */\r
+    protected function getRecord($ipnum)\r
+    {\r
+        $seek_country = $this->seekCountry($ipnum);\r
+        if ($seek_country == $this->databaseSegments) {\r
+            return null;\r
+        }\r
+\r
+        $record_pointer = $seek_country + (2 * $this->recordLength - 1) * $this->databaseSegments;\r
+\r
+        if ($this->flags & self::SHARED_MEMORY) {\r
+            $record_buf = shmop_read($this->shmid, $record_pointer, self::FULL_RECORD_LENGTH);\r
+        } else {\r
+            fseek($this->filehandle, $record_pointer, SEEK_SET);\r
+            $record_buf = fread($this->filehandle, self::FULL_RECORD_LENGTH);\r
+        }\r
+\r
+        $record = new Net_GeoIP_Location();\r
+\r
+        $record_buf_pos = 0;\r
+        $char = ord(substr($record_buf, $record_buf_pos, 1));\r
+\r
+        $record->countryCode  = self::$COUNTRY_CODES[$char];\r
+        $record->countryCode3 = self::$COUNTRY_CODES3[$char];\r
+        $record->countryName  = self::$COUNTRY_NAMES[$char];\r
+        $record_buf_pos++;\r
+        $str_length = 0;\r
+\r
+        //get region\r
+        $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1));\r
+        while ($char != 0) {\r
+            $str_length++;\r
+            $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1));\r
+        }\r
+        if ($str_length > 0) {\r
+            $record->region = substr($record_buf, $record_buf_pos, $str_length);\r
+        }\r
+        $record_buf_pos += $str_length + 1;\r
+        $str_length = 0;\r
+\r
+        //get city\r
+        $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1));\r
+        while ($char != 0) {\r
+            $str_length++;\r
+            $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1));\r
+        }\r
+        if ($str_length > 0) {\r
+            $record->city = substr($record_buf, $record_buf_pos, $str_length);\r
+        }\r
+        $record_buf_pos += $str_length + 1;\r
+        $str_length = 0;\r
+\r
+        //get postal code\r
+        $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1));\r
+        while ($char != 0) {\r
+            $str_length++;\r
+            $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1));\r
+        }\r
+        if ($str_length > 0) {\r
+            $record->postalCode = substr($record_buf, $record_buf_pos, $str_length);\r
+        }\r
+        $record_buf_pos += $str_length + 1;\r
+        $str_length = 0;\r
+        $latitude   = 0;\r
+        $longitude  = 0;\r
+        for ($j = 0;$j < 3; ++$j) {\r
+            $char = ord(substr($record_buf, $record_buf_pos++, 1));\r
+            $latitude += ($char << ($j * 8));\r
+        }\r
+        $record->latitude = ($latitude/10000) - 180;\r
+\r
+        for ($j = 0;$j < 3; ++$j) {\r
+            $char = ord(substr($record_buf, $record_buf_pos++, 1));\r
+            $longitude += ($char << ($j * 8));\r
+        }\r
+        $record->longitude = ($longitude/10000) - 180;\r
+\r
+        if ($this->databaseType === self::CITY_EDITION_REV1) {\r
+            $dmaarea_combo = 0;\r
+            if ($record->countryCode == "US") {\r
+                for ($j = 0;$j < 3;++$j) {\r
+                    $char = ord(substr($record_buf, $record_buf_pos++, 1));\r
+                    $dmaarea_combo += ($char << ($j * 8));\r
+                }\r
+                $record->dmaCode = floor($dmaarea_combo/1000);\r
+                $record->areaCode = $dmaarea_combo%1000;\r
+            }\r
+        }\r
+\r
+        return $record;\r
+    }\r
+\r
+}\r
+\r
diff --git a/lib/pear/Net/GeoIP/DMA.php b/lib/pear/Net/GeoIP/DMA.php
new file mode 100644 (file)
index 0000000..412254d
--- /dev/null
@@ -0,0 +1,315 @@
+<?php\r
+/**\r
+ * +----------------------------------------------------------------------+\r
+ * | PHP version 5                                                        |\r
+ * +----------------------------------------------------------------------+\r
+ * | Copyright (C) 2004 MaxMind LLC                                       |\r
+ * +----------------------------------------------------------------------+\r
+ * | This library is free software; you can redistribute it and/or        |\r
+ * | modify it under the terms of the GNU Lesser General Public           |\r
+ * | License as published by the Free Software Foundation; either         |\r
+ * | version 2.1 of the License, or (at your option) any later version.   |\r
+ * |                                                                      |\r
+ * | This library is distributed in the hope that it will be useful,      |\r
+ * | but WITHOUT ANY WARRANTY; without even the implied warranty of       |\r
+ * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    |\r
+ * | Lesser General Public License for more details.                      |\r
+ * |                                                                      |\r
+ * | You should have received a copy of the GNU Lesser General Public     |\r
+ * | License along with this library; if not, write to the Free Software  |\r
+ * | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 |\r
+ * | USA, or view it online at http://www.gnu.org/licenses/lgpl.txt.      |\r
+ * +----------------------------------------------------------------------+\r
+ * | Authors: Jim Winstead <jimw@apache.org> (original Maxmind version)   |\r
+ * |          Hans Lellelid <hans@xmpl.org>                               |\r
+ * +----------------------------------------------------------------------+\r
+ *\r
+ * @category Net\r
+ * @package  Net_GeoIP\r
+ * @author   Hans Lellelid <hans@xmpl.org>\r
+ * @license  LGPL http://www.gnu.org/licenses/lgpl.txt\r
+ * @link     http://pear.php.net/package/Net_GeoIp\r
+ * $Id$\r
+ */\r
+\r
+/**\r
+ * Static class to handle mapping of DMA codes to metro regions.\r
+ * \r
+ * Use this class with the dmaCode property of the Net_GeoIpLocation object.\r
+ * \r
+ * <code>\r
+ * $region = Net_GeoIPDMA::getMetroRegion($record->dmaCode);\r
+ * </code>\r
+ * \r
+ * @category Net\r
+ * @package  Net_GeoIP\r
+ * @author   Hans Lellelid <hans@xmpl.org>\r
+ * @author   Dmitri Snytkine <d.snytkine@gmail.com>\r
+ * @license  LGPL http://www.gnu.org/licenses/lgpl.txt\r
+ * @version  $Revision$\r
+ * @link     http://pear.php.net/package/Net_GeoIp\r
+ */\r
+class Net_GeoIP_DMA\r
+{\r
+    /**\r
+     * Holds DMA -> Metro mapping.\r
+     * @var array\r
+     */\r
+    private static $dmaMap;\r
+    \r
+    /**\r
+     * Initialize\r
+     * \r
+     * @return void\r
+     */\r
+    public static function initialize()\r
+    {\r
+        self::$dmaMap = array(\r
+            500 => 'Portland-Auburn, ME',\r
+            501 => 'New York, NY',\r
+            502 => 'Binghamton, NY',\r
+            503 => 'Macon, GA',\r
+            504 => 'Philadelphia, PA',\r
+            505 => 'Detroit, MI',\r
+            506 => 'Boston, MA',\r
+            507 => 'Savannah, GA',\r
+            508 => 'Pittsburgh, PA',\r
+            509 => 'Ft Wayne, IN',\r
+            510 => 'Cleveland, OH',\r
+            511 => 'Washington, DC',\r
+            512 => 'Baltimore, MD',\r
+            513 => 'Flint, MI',\r
+            514 => 'Buffalo, NY',\r
+            515 => 'Cincinnati, OH',\r
+            516 => 'Erie, PA',\r
+            517 => 'Charlotte, NC',\r
+            518 => 'Greensboro, NC',\r
+            519 => 'Charleston, SC',\r
+            520 => 'Augusta, GA',\r
+            521 => 'Providence, RI',\r
+            522 => 'Columbus, GA',\r
+            523 => 'Burlington, VT',\r
+            524 => 'Atlanta, GA',\r
+            525 => 'Albany, GA',\r
+            526 => 'Utica-Rome, NY',\r
+            527 => 'Indianapolis, IN',\r
+            528 => 'Miami, FL',\r
+            529 => 'Louisville, KY',\r
+            530 => 'Tallahassee, FL',\r
+            531 => 'Tri-Cities, TN',\r
+            532 => 'Albany-Schenectady-Troy, NY',\r
+            533 => 'Hartford, CT',\r
+            534 => 'Orlando, FL',\r
+            535 => 'Columbus, OH',\r
+            536 => 'Youngstown-Warren, OH',\r
+            537 => 'Bangor, ME',\r
+            538 => 'Rochester, NY',\r
+            539 => 'Tampa, FL',\r
+            540 => 'Traverse City-Cadillac, MI',\r
+            541 => 'Lexington, KY',\r
+            542 => 'Dayton, OH',\r
+            543 => 'Springfield-Holyoke, MA',\r
+            544 => 'Norfolk-Portsmouth, VA',\r
+            545 => 'Greenville-New Bern-Washington, NC',\r
+            546 => 'Columbia, SC',\r
+            547 => 'Toledo, OH',\r
+            548 => 'West Palm Beach, FL',\r
+            549 => 'Watertown, NY',\r
+            550 => 'Wilmington, NC',\r
+            551 => 'Lansing, MI',\r
+            552 => 'Presque Isle, ME',\r
+            553 => 'Marquette, MI',\r
+            554 => 'Wheeling, WV',\r
+            555 => 'Syracuse, NY',\r
+            556 => 'Richmond-Petersburg, VA',\r
+            557 => 'Knoxville, TN',\r
+            558 => 'Lima, OH',\r
+            559 => 'Bluefield-Beckley-Oak Hill, WV',\r
+            560 => 'Raleigh-Durham, NC',\r
+            561 => 'Jacksonville, FL',\r
+            563 => 'Grand Rapids, MI',\r
+            564 => 'Charleston-Huntington, WV',\r
+            565 => 'Elmira, NY',\r
+            566 => 'Harrisburg-Lancaster-Lebanon-York, PA',\r
+            567 => 'Greenville-Spartenburg, SC',\r
+            569 => 'Harrisonburg, VA',\r
+            570 => 'Florence-Myrtle Beach, SC',\r
+            571 => 'Ft Myers, FL',\r
+            573 => 'Roanoke-Lynchburg, VA',\r
+            574 => 'Johnstown-Altoona, PA',\r
+            575 => 'Chattanooga, TN',\r
+            576 => 'Salisbury, MD',\r
+            577 => 'Wilkes Barre-Scranton, PA',\r
+            581 => 'Terre Haute, IN',\r
+            582 => 'Lafayette, IN',\r
+            583 => 'Alpena, MI',\r
+            584 => 'Charlottesville, VA',\r
+            588 => 'South Bend, IN',\r
+            592 => 'Gainesville, FL',\r
+            596 => 'Zanesville, OH',\r
+            597 => 'Parkersburg, WV',\r
+            598 => 'Clarksburg-Weston, WV',\r
+            600 => 'Corpus Christi, TX',\r
+            602 => 'Chicago, IL',\r
+            603 => 'Joplin-Pittsburg, MO',\r
+            604 => 'Columbia-Jefferson City, MO',\r
+            605 => 'Topeka, KS',\r
+            606 => 'Dothan, AL',\r
+            609 => 'St Louis, MO',\r
+            610 => 'Rockford, IL',\r
+            611 => 'Rochester-Mason City-Austin, MN',\r
+            612 => 'Shreveport, LA',\r
+            613 => 'Minneapolis-St Paul, MN',\r
+            616 => 'Kansas City, MO',\r
+            617 => 'Milwaukee, WI',\r
+            618 => 'Houston, TX',\r
+            619 => 'Springfield, MO',\r
+            620 => 'Tuscaloosa, AL',\r
+            622 => 'New Orleans, LA',\r
+            623 => 'Dallas-Fort Worth, TX',\r
+            624 => 'Sioux City, IA',\r
+            625 => 'Waco-Temple-Bryan, TX',\r
+            626 => 'Victoria, TX',\r
+            627 => 'Wichita Falls, TX',\r
+            628 => 'Monroe, LA',\r
+            630 => 'Birmingham, AL',\r
+            631 => 'Ottumwa-Kirksville, IA',\r
+            632 => 'Paducah, KY',\r
+            633 => 'Odessa-Midland, TX',\r
+            634 => 'Amarillo, TX',\r
+            635 => 'Austin, TX',\r
+            636 => 'Harlingen, TX',\r
+            637 => 'Cedar Rapids-Waterloo, IA',\r
+            638 => 'St Joseph, MO',\r
+            639 => 'Jackson, TN',\r
+            640 => 'Memphis, TN',\r
+            641 => 'San Antonio, TX',\r
+            642 => 'Lafayette, LA',\r
+            643 => 'Lake Charles, LA',\r
+            644 => 'Alexandria, LA',\r
+            646 => 'Anniston, AL',\r
+            647 => 'Greenwood-Greenville, MS',\r
+            648 => 'Champaign-Springfield-Decatur, IL',\r
+            649 => 'Evansville, IN',\r
+            650 => 'Oklahoma City, OK',\r
+            651 => 'Lubbock, TX',\r
+            652 => 'Omaha, NE',\r
+            656 => 'Panama City, FL',\r
+            657 => 'Sherman, TX',\r
+            658 => 'Green Bay-Appleton, WI',\r
+            659 => 'Nashville, TN',\r
+            661 => 'San Angelo, TX',\r
+            662 => 'Abilene-Sweetwater, TX',\r
+            669 => 'Madison, WI',\r
+            670 => 'Ft Smith-Fay-Springfield, AR',\r
+            671 => 'Tulsa, OK',\r
+            673 => 'Columbus-Tupelo-West Point, MS',\r
+            675 => 'Peoria-Bloomington, IL',\r
+            676 => 'Duluth, MN',\r
+            678 => 'Wichita, KS',\r
+            679 => 'Des Moines, IA',\r
+            682 => 'Davenport-Rock Island-Moline, IL',\r
+            686 => 'Mobile, AL',\r
+            687 => 'Minot-Bismarck-Dickinson, ND',\r
+            691 => 'Huntsville, AL',\r
+            692 => 'Beaumont-Port Author, TX',\r
+            693 => 'Little Rock-Pine Bluff, AR',\r
+            698 => 'Montgomery, AL',\r
+            702 => 'La Crosse-Eau Claire, WI',\r
+            705 => 'Wausau-Rhinelander, WI',\r
+            709 => 'Tyler-Longview, TX',\r
+            710 => 'Hattiesburg-Laurel, MS',\r
+            711 => 'Meridian, MS',\r
+            716 => 'Baton Rouge, LA',\r
+            717 => 'Quincy, IL',\r
+            718 => 'Jackson, MS',\r
+            722 => 'Lincoln-Hastings, NE',\r
+            724 => 'Fargo-Valley City, ND',\r
+            725 => 'Sioux Falls, SD',\r
+            734 => 'Jonesboro, AR',\r
+            736 => 'Bowling Green, KY',\r
+            737 => 'Mankato, MN',\r
+            740 => 'North Platte, NE',\r
+            743 => 'Anchorage, AK',\r
+            744 => 'Honolulu, HI',\r
+            745 => 'Fairbanks, AK',\r
+            746 => 'Biloxi-Gulfport, MS',\r
+            747 => 'Juneau, AK',\r
+            749 => 'Laredo, TX',\r
+            751 => 'Denver, CO',\r
+            752 => 'Colorado Springs, CO',\r
+            753 => 'Phoenix, AZ',\r
+            754 => 'Butte-Bozeman, MT',\r
+            755 => 'Great Falls, MT',\r
+            756 => 'Billings, MT',\r
+            757 => 'Boise, ID',\r
+            758 => 'Idaho Falls-Pocatello, ID',\r
+            759 => 'Cheyenne, WY',\r
+            760 => 'Twin Falls, ID',\r
+            762 => 'Missoula, MT',\r
+            764 => 'Rapid City, SD',\r
+            765 => 'El Paso, TX',\r
+            766 => 'Helena, MT',\r
+            767 => 'Casper-Riverton, WY',\r
+            770 => 'Salt Lake City, UT',\r
+            771 => 'Yuma, AZ',\r
+            773 => 'Grand Junction, CO',\r
+            789 => 'Tucson, AZ',\r
+            790 => 'Albuquerque, NM',\r
+            798 => 'Glendive, MT',\r
+            800 => 'Bakersfield, CA',\r
+            801 => 'Eugene, OR',\r
+            802 => 'Eureka, CA',\r
+            803 => 'Los Angeles, CA',\r
+            804 => 'Palm Springs, CA',\r
+            807 => 'San Francisco, CA',\r
+            810 => 'Yakima-Pasco, WA',\r
+            811 => 'Reno, NV',\r
+            813 => 'Medford-Klamath Falls, OR',\r
+            819 => 'Seattle-Tacoma, WA',\r
+            820 => 'Portland, OR',\r
+            821 => 'Bend, OR',\r
+            825 => 'San Diego, CA',\r
+            828 => 'Monterey-Salinas, CA',\r
+            839 => 'Las Vegas, NV',\r
+            855 => 'Santa Barbara, CA',\r
+            862 => 'Sacramento, CA',\r
+            866 => 'Fresno, CA',\r
+            868 => 'Chico-Redding, CA',\r
+            881 => 'Spokane, WA');\r
+    }\r
+    \r
+    /**\r
+     * Lookup the metro region based on the provided DMA code.\r
+     * \r
+     * @param int $dmaCode The DMA code\r
+     * \r
+     * @return string Metro region name.\r
+     */\r
+    public static function getMetroRegion($dmaCode)\r
+    {\r
+        if ($dmaCode === null) {\r
+            return null;\r
+        }\r
+        if (self::$dmaMap === null) {\r
+            self::initialize();\r
+        }\r
+        return self::$dmaMap[$dmaCode];\r
+    }\r
+\r
+    /**\r
+     * Reverse lookup of DMA code if [exact] metro region name is known.\r
+     * \r
+     * @param string $metro Metro region name.\r
+     * \r
+     * @return int DMA code, or false if not found.\r
+     */\r
+    public static function getDMACode($metro)    \r
+    {\r
+        if (self::$dmaMap === null) {\r
+            self::initialize();\r
+        }\r
+        return array_search($metro, self::$dmaMap);\r
+    }\r
+\r
+}
\ No newline at end of file
diff --git a/lib/pear/Net/GeoIP/Location.php b/lib/pear/Net/GeoIP/Location.php
new file mode 100644 (file)
index 0000000..2b70f6d
--- /dev/null
@@ -0,0 +1,201 @@
+<?php\r
+/**\r
+ * +----------------------------------------------------------------------+\r
+ * | PHP version 5                                                        |\r
+ * +----------------------------------------------------------------------+\r
+ * | Copyright (C) 2004 MaxMind LLC                                       |\r
+ * +----------------------------------------------------------------------+\r
+ * | This library is free software; you can redistribute it and/or        |\r
+ * | modify it under the terms of the GNU Lesser General Public           |\r
+ * | License as published by the Free Software Foundation; either         |\r
+ * | version 2.1 of the License, or (at your option) any later version.   |\r
+ * |                                                                      |\r
+ * | This library is distributed in the hope that it will be useful,      |\r
+ * | but WITHOUT ANY WARRANTY; without even the implied warranty of       |\r
+ * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    |\r
+ * | Lesser General Public License for more details.                      |\r
+ * |                                                                      |\r
+ * | You should have received a copy of the GNU Lesser General Public     |\r
+ * | License along with this library; if not, write to the Free Software  |\r
+ * | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 |\r
+ * | USA, or view it online at http://www.gnu.org/licenses/lgpl.txt.      |\r
+ * +----------------------------------------------------------------------+\r
+ * | Authors: Jim Winstead <jimw@apache.org> (original Maxmind version)   |\r
+ * |          Hans Lellelid <hans@xmpl.org>                               |\r
+ * +----------------------------------------------------------------------+\r
+ *\r
+ * @category Net\r
+ * @package  Net_GeoIP\r
+ * @author   Hans Lellelid <hans@xmpl.org>\r
+ * @license  LGPL http://www.gnu.org/licenses/lgpl.txt\r
+ * @link     http://pear.php.net/package/Net_GeoIp\r
+ * $Id$\r
+ */\r
+\r
+/**\r
+ * This class represents a location record as returned by Net_GeoIP::lookupLocation().\r
+ *\r
+ * This class is primarily a collection of values (the public properties of the class), but\r
+ * there is also a distance() method to calculate the km distance between two points.\r
+ *\r
+ * @category Net\r
+ * @package  Net_GeoIP\r
+ * @author   Hans Lellelid <hans@xmpl.org>\r
+ * @author   Dmitri Snytkine <d.snytkine@gmail.com>\r
+ * @license  LGPL http://www.gnu.org/licenses/lgpl.txt\r
+ * @version  $Revision$\r
+ * @link     http://pear.php.net/package/Net_GeoIp\r
+ * @see      Net_GeoIP::lookupLocation()\r
+ */\r
+class Net_GeoIP_Location implements Serializable\r
+{\r
+    protected $aData = array(\r
+        'countryCode'  => null,\r
+        'countryCode3' => null,\r
+        'countryName'  => null,\r
+        'region'       => null,\r
+        'city'         => null,\r
+        'postalCode'   => null,\r
+        'latitude'     => null,\r
+        'longitude'    => null,\r
+        'areaCode'     => null,\r
+        'dmaCode'      => null\r
+    );\r
+\r
+\r
+    /**\r
+     * Calculate the distance in km between two points.\r
+     *\r
+     * @param Net_GeoIP_Location $loc The other point to which distance will be calculated.\r
+     *\r
+     * @return float The number of km between two points on the globe.\r
+     */\r
+    public function distance(Net_GeoIP_Location $loc)\r
+    {\r
+        // ideally these should be class constants, but class constants\r
+        // can't be operations.\r
+        $RAD_CONVERT = M_PI / 180;\r
+        $EARTH_DIAMETER = 2 * 6378.2;\r
+\r
+        $lat1 = $this->latitude;\r
+        $lon1 = $this->longitude;\r
+        $lat2 = $loc->latitude;\r
+        $lon2 = $loc->longitude;\r
+\r
+        // convert degrees to radians\r
+        $lat1 *= $RAD_CONVERT;\r
+        $lat2 *= $RAD_CONVERT;\r
+\r
+        // find the deltas\r
+        $delta_lat = $lat2 - $lat1;\r
+        $delta_lon = ($lon2 - $lon1) * $RAD_CONVERT;\r
+\r
+        // Find the great circle distance\r
+        $temp = pow(sin($delta_lat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($delta_lon/2), 2);\r
+        return $EARTH_DIAMETER * atan2(sqrt($temp), sqrt(1-$temp));\r
+    }\r
+\r
+    /**\r
+     * magic method to make it possible\r
+     * to store this object in cache when\r
+     * automatic serialization is on\r
+     * Specifically it makes it possible to store\r
+     * this object in memcache\r
+     *\r
+     * @return array\r
+     */\r
+    public function serialize()\r
+    {\r
+        return serialize($this->aData);\r
+    }\r
+\r
+    /**\r
+     * unserialize a representation of the object\r
+     *\r
+     * @param array $serialized The serialized representation of the location\r
+     *\r
+     * @return void\r
+     */\r
+    public function unserialize($serialized)\r
+    {\r
+        $this->aData = unserialize($serialized);\r
+    }\r
+\r
+\r
+    /**\r
+     * Setter for elements of $this->aData array\r
+     *\r
+     * @param string $name The variable to set\r
+     * @param string $val  The value\r
+     *\r
+     * @return object $this object\r
+     */\r
+    public function set($name, $val)\r
+    {\r
+        if (array_key_exists($name, $this->aData)) {\r
+            $this->aData[$name] = $val;\r
+        }\r
+\r
+        return $this;\r
+    }\r
+\r
+    public function __set($name, $val)\r
+    {\r
+        return $this->set($name, $val);\r
+    }\r
+\r
+    /**\r
+     * Getter for $this->aData array\r
+     *\r
+     * @return array\r
+     */\r
+    public function getData()\r
+    {\r
+         return $this->aData;\r
+    }\r
+\r
+\r
+    /**\r
+     * Magic method to get value from $this->aData array\r
+     *\r
+     * @param string $name The var to get\r
+     *\r
+     * @return mixed string if value exists or null if it is empty of\r
+     * just does not exist\r
+     */\r
+    public function __get($name)\r
+    {\r
+        if (array_key_exists($name, $this->aData)) {\r
+            return $this->aData[$name];\r
+        }\r
+\r
+        return null;\r
+    }\r
+\r
+\r
+    /**\r
+     * String representation of the object\r
+     *\r
+     * @return string text and result of print_r of $this->aData array\r
+     */\r
+    public function __toString()\r
+    {\r
+        return 'object of type '.__CLASS__.'. data: '.implode(',', $this->aData);\r
+    }\r
+\r
+\r
+    /**\r
+     * Magic method\r
+     * makes it possible to check if specific record exists\r
+     * and also makes it possible to use empty() on any property\r
+     *\r
+     * @param strign $name The name of the var to check\r
+     *\r
+     * @return bool\r
+     */\r
+    public function __isset($name)\r
+    {\r
+        return (null !== $this->__get($name));\r
+    }\r
+\r
+}\r
index 58cb6a8..f77c52a 100644 (file)
       <licenseversion></licenseversion>
   </library>
   <library>
-    <location>geoip</location>
+    <location>PEAR_GeoIP</location>
     <name>GeoIP</name>
     <license>LGPL</license>
-    <version>1.8</version>
+    <version>1.0.0RC3</version>
     <licenseversion>2.1+</licenseversion>
   </library>
   <library>