JAVA,GEODATA: libphonenumber 3.9.
authorphilip.liard@gmail.com <philip.liard@gmail.com@ee073f10-1060-11df-b6a4-87a95322a99c>
Tue, 13 Sep 2011 10:41:17 +0000 (10:41 +0000)
committerphilip.liard@gmail.com <philip.liard@gmail.com@ee073f10-1060-11df-b6a4-87a95322a99c>
Tue, 13 Sep 2011 10:41:17 +0000 (10:41 +0000)
git-svn-id: http://libphonenumber.googlecode.com/svn/trunk@348 ee073f10-1060-11df-b6a4-87a95322a99c

85 files changed:
java/release_notes.txt
java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM
java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMap.java
java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
java/src/com/google/i18n/phonenumbers/geocoding/DefaultMapStorage.java
java/src/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
java/src/com/google/i18n/phonenumbers/geocoding/data/381_sr [new file with mode: 0644]
java/src/com/google/i18n/phonenumbers/geocoding/data/49_de
java/src/com/google/i18n/phonenumbers/geocoding/data/81_en [new file with mode: 0644]
java/src/com/google/i18n/phonenumbers/geocoding/data/config
java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java
java/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java
java/test/com/google/i18n/phonenumbers/PhoneNumberMatcherTest.java
java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR
java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG
java/test/com/google/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
java/test/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
resources/PhoneNumberMetaData.xml
resources/PhoneNumberMetaDataForTesting.xml
resources/geocoding/de/49.txt
resources/geocoding/en/81.txt [new file with mode: 0644]
resources/geocoding/sr/381.txt [new file with mode: 0644]
tools/java/common/src/com/google/i18n/phonenumbers/tools/BuildMetadataFromXml.java
tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar
tools/java/java-build/src/com/google/i18n/phonenumbers/tools/GenerateAreaCodeData.java
tools/java/java-build/target/java-build-1.0-SNAPSHOT-jar-with-dependencies.jar
tools/java/java-build/test/com/google/i18n/phonenumbers/tools/GenerateAreaCodeDataTest.java

index f915803..5ed12e1 100644 (file)
@@ -1,3 +1,20 @@
+September 13th, 2011: libphonenumber-3.9
+* Code changes
+ - Enable AsYouTypeFormatter to handle long IDD and NDD.
+ - Allow the presence of an IDD following a +.
+ - Fix formatting of phone numbers which contain only 0s in the national number.
+ - Refactored some code in geocoding including AreaCodeMap and the storage
+   strategies.
+
+* Metadata changes
+ - Updates: AM, BE, BH, BJ, BR, BT, BZ, CI, CL, CN, DE, DK, DM, DZ, EC, EG, FJ,
+   GR, HR, HT, IN, IQ, IS, JM, KE, KG, KH, KR, LA, LB, LR, MA, MD, ML, MO, MX,
+   MY, NE, NG, PG, PH, PK, PY, QA, SA, SD, SG, SN, TD, TG, TH, TN, TT, UG, YE,
+   ZA, ZM
+ - New geocoding data for: AC, CG, CU, CV, EG, ET, FI, FI, FI, GL, JP, KM, MA,
+   MA, MU, MU, MU, MZ, RS, SH, SH, SL, SO, ST, TG, TG, TG, UG, ZM
+ - Updated geocoding data for: AR, DE
+
 August 11th, 2011: libphonenumber-3.8
 * Code changes
  - Fix to demo to not throw null-ptr exceptions for invalid NANPA numbers
index 9293f4b..80eae06 100644 (file)
@@ -45,7 +45,11 @@ public class AsYouTypeFormatter {
   private String currentFormattingPattern = "";
   private StringBuilder accruedInput = new StringBuilder();
   private StringBuilder accruedInputWithoutFormatting = new StringBuilder();
+  // This indicates whether AsYouTypeFormatter is currently doing the formatting.
   private boolean ableToFormat = true;
+  // Set to true when users enter their own formatting. AsYouTypeFormatter will do no formatting at
+  // all when this is set to true.
+  private boolean inputHasFormatting = false;
   private boolean isInternationalFormatting = false;
   private boolean isExpectingCountryCallingCode = false;
   private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
@@ -91,7 +95,13 @@ public class AsYouTypeFormatter {
   // The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as
   // found in accruedInputWithoutFormatting.
   private int positionToRemember = 0;
+  // This contains anything that has been entered so far preceding the national significant number,
+  // and it is formatted (e.g. with space inserted). For example, this can contain IDD, country
+  // code, and/or NDD, etc.
   private StringBuilder prefixBeforeNationalNumber = new StringBuilder();
+  // This contains the national prefix that has been extracted. It contains only digits without
+  // formatting.
+  private String nationalPrefixExtracted = "";
   private StringBuilder nationalNumber = new StringBuilder();
   private List<NumberFormat> possibleFormats = new ArrayList<NumberFormat>();
 
@@ -137,6 +147,9 @@ public class AsYouTypeFormatter {
       }
       if (createFormattingTemplate(numberFormat)) {
         currentFormattingPattern = pattern;
+        // With a new formatting template, the matched position using the old template needs to be
+        // reset.
+        lastMatchPosition = 0;
         return true;
       } else {  // Remove the current number format from possibleFormats.
         it.remove();
@@ -236,8 +249,10 @@ public class AsYouTypeFormatter {
     lastMatchPosition = 0;
     currentFormattingPattern = "";
     prefixBeforeNationalNumber.setLength(0);
+    nationalPrefixExtracted = "";
     nationalNumber.setLength(0);
     ableToFormat = true;
+    inputHasFormatting = false;
     positionToRemember = 0;
     originalPosition = 0;
     isInternationalFormatting = false;
@@ -283,13 +298,29 @@ public class AsYouTypeFormatter {
     // sign (accepted at the start of the number only).
     if (!isDigitOrLeadingPlusSign(nextChar)) {
       ableToFormat = false;
+      inputHasFormatting = true;
+    } else {
+      nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition);
     }
     if (!ableToFormat) {
+      // When we are unable to format because of reasons other than that formatting chars have been
+      // entered, it can be due to really long IDDs or NDDs. If that is the case, we might be able
+      // to do formatting again after extracting them.
+      if (inputHasFormatting) {
+        return accruedInput.toString();
+      } else if (attemptToExtractIdd()) {
+        if (attemptToExtractCountryCallingCode()) {
+          return attemptToChoosePatternWithPrefixExtracted();
+        }
+      } else if (ableToExtractLongerNdd()) {
+        // Add an additional space to separate long NDD and national significant number for
+        // readability.
+        prefixBeforeNationalNumber.append(" ");
+        return attemptToChoosePatternWithPrefixExtracted();
+      }
       return accruedInput.toString();
     }
 
-    nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition);
-
     // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits (the plus
     // sign is counted as a digit as well for this purpose) have been entered.
     switch (accruedInputWithoutFormatting.length()) {
@@ -300,26 +331,17 @@ public class AsYouTypeFormatter {
       case 3:
         if (attemptToExtractIdd()) {
           isExpectingCountryCallingCode = true;
-        } else {  // No IDD or plus sign is found, must be entering in national format.
-          removeNationalPrefixFromNationalNumber();
+        } else {  // No IDD or plus sign is found, might be entering in national format.
+          nationalPrefixExtracted = removeNationalPrefixFromNationalNumber();
           return attemptToChooseFormattingPattern();
         }
-      case 4:
-      case 5:
+      default:
         if (isExpectingCountryCallingCode) {
           if (attemptToExtractCountryCallingCode()) {
             isExpectingCountryCallingCode = false;
           }
           return prefixBeforeNationalNumber + nationalNumber.toString();
         }
-      // We make a last attempt to extract a country calling code at the 6th digit because the
-      // maximum length of IDD and country calling code are both 3.
-      case 6:
-        if (isExpectingCountryCallingCode && !attemptToExtractCountryCallingCode()) {
-          ableToFormat = false;
-          return accruedInput.toString();
-        }
-      default:
         if (possibleFormats.size() > 0) {  // The formatting pattern is already chosen.
           String tempNationalNumber = inputDigitHelper(nextChar);
           // See if the accrued digits can be formatted properly already. If not, use the results
@@ -341,6 +363,28 @@ public class AsYouTypeFormatter {
     }
   }
 
+  private String attemptToChoosePatternWithPrefixExtracted() {
+    ableToFormat = true;
+    isExpectingCountryCallingCode = false;
+    possibleFormats.clear();
+    return attemptToChooseFormattingPattern();
+  }
+
+  // Some national prefixes are a substring of others. If extracting the shorter NDD doesn't result
+  // in a number we can format, we try to see if we can extract a longer version here.
+  private boolean ableToExtractLongerNdd() {
+    if (nationalPrefixExtracted.length() > 0) {
+      // Put the extracted NDD back to the national number before attempting to extract a new NDD.
+      nationalNumber.insert(0, nationalPrefixExtracted);
+      // Remove the previously extracted NDD from prefixBeforeNationalNumber. We cannot simply set
+      // it to empty string because people sometimes enter national prefix after country code, e.g
+      // +44 (0)20-1234-5678.
+      int indexOfPreviousNdd = prefixBeforeNationalNumber.lastIndexOf(nationalPrefixExtracted);
+      prefixBeforeNationalNumber.setLength(indexOfPreviousNdd);
+    }
+    return !nationalPrefixExtracted.equals(removeNationalPrefixFromNationalNumber());
+  }
+
   private boolean isDigitOrLeadingPlusSign(char nextChar) {
     return Character.isDigit(nextChar) ||
         (accruedInput.length() == 1 &&
@@ -408,13 +452,14 @@ public class AsYouTypeFormatter {
     }
   }
 
-  private void removeNationalPrefixFromNationalNumber() {
+  // Returns the national prefix extracted, or an empty string if it is not present.
+  private String removeNationalPrefixFromNationalNumber() {
     int startOfNationalNumber = 0;
     if (currentMetaData.getCountryCode() == 1 && nationalNumber.charAt(0) == '1') {
       startOfNationalNumber = 1;
       prefixBeforeNationalNumber.append("1 ");
       isInternationalFormatting = true;
-    } else if (currentMetaData.hasNationalPrefix()) {
+    } else if (currentMetaData.hasNationalPrefixForParsing()) {
       Pattern nationalPrefixForParsing =
         regexCache.getPatternForRegex(currentMetaData.getNationalPrefixForParsing());
       Matcher m = nationalPrefixForParsing.matcher(nationalNumber);
@@ -427,7 +472,9 @@ public class AsYouTypeFormatter {
         prefixBeforeNationalNumber.append(nationalNumber.substring(0, startOfNationalNumber));
       }
     }
+    String nationalPrefix = nationalNumber.substring(0, startOfNationalNumber);
     nationalNumber.delete(0, startOfNationalNumber);
+    return nationalPrefix;
   }
 
   /**
@@ -447,6 +494,7 @@ public class AsYouTypeFormatter {
       int startOfCountryCallingCode = iddMatcher.end();
       nationalNumber.setLength(0);
       nationalNumber.append(accruedInputWithoutFormatting.substring(startOfCountryCallingCode));
+      prefixBeforeNationalNumber.setLength(0);
       prefixBeforeNationalNumber.append(
           accruedInputWithoutFormatting.substring(0, startOfCountryCallingCode));
       if (accruedInputWithoutFormatting.charAt(0) != PhoneNumberUtil.PLUS_SIGN) {
index 476850e..acca382 100644 (file)
@@ -978,6 +978,12 @@ public class PhoneNumberUtil {
    * @return  the formatted phone number
    */
   public String format(PhoneNumber number, PhoneNumberFormat numberFormat) {
+    if (number.getNationalNumber() == 0 && number.hasRawInput()) {
+      String rawInput = number.getRawInput();
+      if (rawInput.length() > 0) {
+        return rawInput;
+      }
+    }
     StringBuilder formattedNumber = new StringBuilder(20);
     format(number, numberFormat, formattedNumber);
     return formattedNumber.toString();
@@ -1486,7 +1492,7 @@ public class PhoneNumberUtil {
   public PhoneNumber getExampleNumberForType(String regionCode, PhoneNumberType type) {
     // Check the region code is valid.
     if (!isValidRegionCode(regionCode)) {
-      LOGGER.log(Level.WARNING, "Invalid or unknown region code provided.");
+      LOGGER.log(Level.SEVERE, "Invalid or unknown region code provided: " + regionCode);
       return null;
     }
     PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), type);
@@ -1968,6 +1974,10 @@ public class PhoneNumberUtil {
   // 0 if fullNumber doesn't start with a valid country calling code, and leaves nationalNumber
   // unmodified.
   int extractCountryCode(StringBuilder fullNumber, StringBuilder nationalNumber) {
+    if ((fullNumber.length() == 0) || (fullNumber.charAt(0) == '0')) {
+      // Country codes do not begin with a '0'.
+      return 0;
+    }
     int potentialCountryCode;
     int numberLength = fullNumber.length();
     for (int i = 1; i <= MAX_LENGTH_COUNTRY_CODE && i <= numberLength; i++) {
@@ -2398,8 +2408,29 @@ public class PhoneNumberUtil {
     // Check to see if the number is given in international format so we know whether this number is
     // from the default region or not.
     StringBuilder normalizedNationalNumber = new StringBuilder();
-    int countryCode = maybeExtractCountryCode(nationalNumber.toString(), regionMetadata,
-                                              normalizedNationalNumber, keepRawInput, phoneNumber);
+    int countryCode = 0;
+    try {
+      // TODO: This method should really just take in the string buffer that has already
+      // been created, and just remove the prefix, rather than taking in a string and then
+      // outputting a string buffer.
+      countryCode = maybeExtractCountryCode(nationalNumber.toString(), regionMetadata,
+                                            normalizedNationalNumber, keepRawInput, phoneNumber);
+    } catch (NumberParseException e) {
+      Matcher matcher = PLUS_CHARS_PATTERN.matcher(nationalNumber.toString());
+      if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE &&
+          matcher.lookingAt()) {
+        // Strip the plus-char, and try again.
+        countryCode = maybeExtractCountryCode(nationalNumber.substring(matcher.end()),
+                                              regionMetadata, normalizedNationalNumber,
+                                              keepRawInput, phoneNumber);
+        if (countryCode == 0) {
+          throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
+                                         "Could not interpret numbers after plus-sign.");
+        }
+      } else {
+        throw new NumberParseException(e.getErrorType(), e.getMessage());
+      }
+    }
     if (countryCode != 0) {
       String phoneNumberRegion = getRegionCodeForCountryCode(countryCode);
       if (!phoneNumberRegion.equals(defaultRegion)) {
index 7d0f2a2..91a2fae 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM differ
index 2463660..d2a7d2c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE differ
index 9e7b9c8..75d5b60 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH differ
index e5ef1ec..5453418 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ differ
index 9aa4d28..8353e3c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR differ
index 139f181..87251ae 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT differ
index 3e4f371..6e8fd58 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ differ
index dadad8e..f8ff1ca 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI differ
index 8fabf74..5d301f2 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL differ
index 697b08c..4b299a6 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN differ
index cbb0f4c..d8b8bd4 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK differ
index 8713673..0a3e39b 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM differ
index c3d52a0..4c4e871 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ differ
index 6578ddd..a9716d5 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC differ
index a00edb4..8ab546d 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG differ
index d123c00..cb06c07 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ differ
index 2c4a828..849fd68 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR differ
index 9766d56..ff1590c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR differ
index 6ee3bd1..7a117e7 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT differ
index 8354c60..401aafd 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN differ
index 475492f..ca8ede8 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ differ
index eb45cb4..b49745d 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS differ
index dce03a8..14b8c4e 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM differ
index 4c35cb2..1c09ed2 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE differ
index dc63e31..33f8201 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG differ
index f88db2f..9e9c454 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH differ
index f74cb4d..47942d7 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR differ
index 7f78cb8..9d4d251 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA differ
index f1dfbca..168135c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB differ
index dd7306b..0bc061c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR differ
index dd0beb5..2c885ab 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA differ
index 0763f61..521bfa3 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD differ
index c7d6d18..bf29a8d 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML differ
index d0bb6ae..2bd32a7 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO differ
index dc44efb..850667e 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX differ
index 35b8414..df113ce 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY differ
index 62309e5..7b9d543 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE differ
index 4e12b36..d16685c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG differ
index 767f47c..8e08a8d 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG differ
index cf6ad8d..52d70e4 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH differ
index 6b0027d..dd4e23b 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK differ
index 628bd87..5722887 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY differ
index da69ee2..a1303ac 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA differ
index a938bbf..b72118a 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA differ
index 37871a1..6f9420e 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD differ
index 6020eb3..b455861 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG differ
index 853bd40..fcad903 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN differ
index dc573d1..8cc88a0 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD differ
index 924a860..1fdd338 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG differ
index 119af7d..e7c9408 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH differ
index b4c0747..0e846e8 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN differ
index a023922..23294b1 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT differ
index 97fd6fb..a936999 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG differ
index b18ec98..725f6b6 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE differ
index b036930..f4c0f11 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA differ
index 5e0253d..34c8c13 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM differ
index 9fbd804..10f9535 100644 (file)
@@ -129,12 +129,15 @@ public class AreaCodeMap implements Externalizable {
    * Supports Java Serialization.
    */
   public void writeExternal(ObjectOutput objectOutput) throws IOException {
-    objectOutput.writeBoolean(areaCodeMapStorage.isFlyweight());
+    objectOutput.writeBoolean(areaCodeMapStorage instanceof FlyweightMapStorage);
     areaCodeMapStorage.writeExternal(objectOutput);
   }
 
   /**
-   * Returns the description of the geographical area the {@code number} corresponds to.
+   * Returns the description of the geographical area the {@code number} corresponds to. This method
+   * distinguishes the case of an invalid prefix and a prefix for which the name is not available in
+   * the current language. If the description is not available in the current language an empty
+   * string is returned. If no description was found for the provided number, null is returned.
    *
    * @param number  the phone number to look up
    * @return  the description of the geographical area
@@ -142,7 +145,7 @@ public class AreaCodeMap implements Externalizable {
   String lookup(PhoneNumber number) {
     int numOfEntries = areaCodeMapStorage.getNumOfEntries();
     if (numOfEntries == 0) {
-      return "";
+      return null;
     }
     long phonePrefix =
         Long.parseLong(number.getCountryCode() + phoneUtil.getNationalSignificantNumber(number));
@@ -156,7 +159,7 @@ public class AreaCodeMap implements Externalizable {
       }
       currentIndex = binarySearch(0, currentIndex, phonePrefix);
       if (currentIndex < 0) {
-        return "";
+        return null;
       }
       int currentPrefix = areaCodeMapStorage.getPrefix(currentIndex);
       if (phonePrefix == currentPrefix) {
@@ -164,7 +167,7 @@ public class AreaCodeMap implements Externalizable {
       }
       currentSetOfLengths = currentSetOfLengths.headSet(possibleLength);
     }
-    return "";
+    return null;
   }
 
   /**
index a06b0c0..0ef9b91 100644 (file)
@@ -29,35 +29,10 @@ import java.util.TreeSet;
  *
  * @author Philippe Liard
  */
-// @VisibleForTesting
 abstract class AreaCodeMapStorageStrategy {
   protected int numOfEntries = 0;
   protected final TreeSet<Integer> possibleLengths = new TreeSet<Integer>();
 
-  public AreaCodeMapStorageStrategy() {}
-
-  /**
-   * Returns whether the underlying implementation of this abstract class is flyweight.
-   * It is expected to be flyweight if it implements the {@code FlyweightMapStorage} class.
-   *
-   * @return  whether the underlying implementation of this abstract class is flyweight
-   */
-  public abstract boolean isFlyweight();
-
-  /**
-   * @return  the number of entries contained in the area code map
-   */
-  public int getNumOfEntries() {
-    return numOfEntries;
-  }
-
-  /**
-   * @return  the set containing the possible lengths of prefixes
-   */
-  public TreeSet<Integer> getPossibleLengths() {
-    return possibleLengths;
-  }
-
   /**
    * Gets the phone number prefix located at the provided {@code index}.
    *
@@ -68,7 +43,8 @@ abstract class AreaCodeMapStorageStrategy {
 
   /**
    * Gets the description corresponding to the phone number prefix located at the provided {@code
-   * index}.
+   * index}. If the description is not available in the current language an empty string is
+   * returned.
    *
    * @param index  the index of the phone number prefix that needs to be returned
    * @return  the description corresponding to the phone number prefix at the provided index
@@ -102,16 +78,30 @@ abstract class AreaCodeMapStorageStrategy {
    */
   public abstract void writeExternal(ObjectOutput objectOutput) throws IOException;
 
+  /**
+   * @return  the number of entries contained in the area code map
+   */
+  public int getNumOfEntries() {
+    return numOfEntries;
+  }
+
+  /**
+   * @return  the set containing the possible lengths of prefixes
+   */
+  public TreeSet<Integer> getPossibleLengths() {
+    return possibleLengths;
+  }
+
   @Override
   public String toString() {
     StringBuilder output = new StringBuilder();
     int numOfEntries = getNumOfEntries();
 
     for (int i = 0; i < numOfEntries; i++) {
-      output.append(getPrefix(i));
-      output.append("|");
-      output.append(getDescription(i));
-      output.append("\n");
+      output.append(getPrefix(i))
+          .append("|")
+          .append(getDescription(i))
+          .append("\n");
     }
     return output.toString();
   }
index 8a40070..4242118 100644 (file)
@@ -36,11 +36,6 @@ class DefaultMapStorage extends AreaCodeMapStorageStrategy {
   private String[] descriptions;
 
   @Override
-  public boolean isFlyweight() {
-    return false;
-  }
-
-  @Override
   public int getPrefix(int index) {
     return phoneNumberPrefixes[index];
   }
index a238674..54e9647 100644 (file)
@@ -21,7 +21,6 @@ import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.Map.Entry;
 import java.util.SortedMap;
 import java.util.SortedSet;
@@ -34,10 +33,10 @@ import java.util.TreeSet;
  *
  * @author Philippe Liard
  */
-class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
+final class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
   // Size of short and integer types in bytes.
-  private static final int SHORT_SIZE = Short.SIZE / 8;
-  private static final int INT_SIZE = Integer.SIZE / 8;
+  private static final int SHORT_NUM_BYTES = Short.SIZE / 8;
+  private static final int INT_NUM_BYTES = Integer.SIZE / 8;
 
   // The number of bytes used to store a phone number prefix.
   private int prefixSizeInBytes;
@@ -51,120 +50,60 @@ class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
   // Sorted string array of unique description strings.
   private String[] descriptionPool;
 
-  public FlyweightMapStorage() {}
-
-  @Override
-  public boolean isFlyweight() {
-    return true;
-  }
-
-  /**
-   * Gets the minimum number of bytes that can be used to store the provided {@code value}.
-   */
-  private static int getOptimalNumberOfBytesForValue(int value) {
-    return value <= Short.MAX_VALUE ? SHORT_SIZE : INT_SIZE;
-  }
-
-  /**
-   * Stores the provided {@code value} to the provided byte {@code buffer} at the specified {@code
-   * index} using the provided {@code wordSize} in bytes. Note that only integer and short sizes are
-   * supported.
-   *
-   * @param buffer  the byte buffer to which the value is stored
-   * @param wordSize  the number of bytes used to store the provided value
-   * @param index  the index to which the value is stored
-   * @param value  the value that is stored assuming it does not require more than the specified
-   *    number of bytes.
-   */
-  private static void storeWordInBuffer(ByteBuffer buffer, int wordSize, int index, int value) {
-    index *= wordSize;
-
-    if (wordSize == SHORT_SIZE) {
-      buffer.putShort(index, (short) value);
-    } else {
-      buffer.putInt(index, value);
-    }
-  }
-
-  /**
-   * Reads the {@code value} at the specified {@code index} from the provided byte {@code buffer}.
-   * Note that only integer and short sizes are supported.
-   *
-   * @param buffer  the byte buffer from which the value is read
-   * @param wordSize  the number of bytes used to store the value
-   * @param index  the index where the value is read from
-   *
-   * @return  the value read from the buffer
-   */
-  private static int readWordFromBuffer(ByteBuffer buffer, int wordSize, int index) {
-    index *= wordSize;
-    return wordSize == SHORT_SIZE ? buffer.getShort(index) : buffer.getInt(index);
-  }
-
   @Override
   public int getPrefix(int index) {
     return readWordFromBuffer(phoneNumberPrefixes, prefixSizeInBytes, index);
   }
 
+  /**
+   * This implementation returns the same string (same identity) when called for multiple indexes
+   * corresponding to prefixes that have the same description.
+   */
   @Override
   public String getDescription(int index) {
-    return descriptionPool[readWordFromBuffer(descriptionIndexes, descIndexSizeInBytes, index)];
+    int indexInDescriptionPool =
+        readWordFromBuffer(descriptionIndexes, descIndexSizeInBytes, index);
+    return descriptionPool[indexInDescriptionPool];
   }
 
   @Override
-  public void readFromSortedMap(SortedMap<Integer, String> sortedAreaCodeMap) {
+  public void readFromSortedMap(SortedMap<Integer, String> areaCodeMap) {
     SortedSet<String> descriptionsSet = new TreeSet<String>();
-    numOfEntries = sortedAreaCodeMap.size();
-    prefixSizeInBytes = getOptimalNumberOfBytesForValue(sortedAreaCodeMap.lastKey());
+    numOfEntries = areaCodeMap.size();
+    prefixSizeInBytes = getOptimalNumberOfBytesForValue(areaCodeMap.lastKey());
     phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
 
     // Fill the phone number prefixes byte buffer, the set of possible lengths of prefixes and the
     // description set.
     int index = 0;
-    for (Entry<Integer, String> entry : sortedAreaCodeMap.entrySet()) {
+    for (Entry<Integer, String> entry : areaCodeMap.entrySet()) {
       int prefix = entry.getKey();
-      storeWordInBuffer(phoneNumberPrefixes, prefixSizeInBytes, index++, prefix);
+      storeWordInBuffer(phoneNumberPrefixes, prefixSizeInBytes, index, prefix);
       possibleLengths.add((int) Math.log10(prefix) + 1);
       descriptionsSet.add(entry.getValue());
+      ++index;
     }
+    createDescriptionPool(descriptionsSet, areaCodeMap);
+  }
 
-    // Create the description pool.
+  /**
+   * Creates the description pool from the provided set of string descriptions and area code map.
+   */
+  private void createDescriptionPool(SortedSet<String> descriptionsSet,
+      SortedMap<Integer, String> areaCodeMap) {
     descIndexSizeInBytes = getOptimalNumberOfBytesForValue(descriptionsSet.size() - 1);
     descriptionIndexes = ByteBuffer.allocate(numOfEntries * descIndexSizeInBytes);
     descriptionPool = new String[descriptionsSet.size()];
     descriptionsSet.toArray(descriptionPool);
 
     // Map the phone number prefixes to the descriptions.
-    index = 0;
+    int index = 0;
     for (int i = 0; i < numOfEntries; i++) {
       int prefix = readWordFromBuffer(phoneNumberPrefixes, prefixSizeInBytes, i);
-      String description = sortedAreaCodeMap.get(prefix);
-      int positionInDescriptionPool =
-          Arrays.binarySearch(descriptionPool, description, new Comparator<String>() {
-            public int compare(String o1, String o2) { return o1.compareTo(o2); }
-          });
-      storeWordInBuffer(descriptionIndexes, descIndexSizeInBytes, index++,
-                        positionInDescriptionPool);
-    }
-  }
-
-  /**
-   * Stores a value which is read from the provided {@code objectInput} to the provided byte {@code
-   * buffer} at the specified {@code index}.
-   *
-   * @param objectInput  the object input stream from which the value is read
-   * @param wordSize  the number of bytes used to store the value read from the stream
-   * @param outputBuffer  the byte buffer to which the value is stored
-   * @param index  the index where the value is stored in the buffer
-   * @throws IOException  if an error occurred reading from the object input stream
-   */
-  private static void readExternalWord(ObjectInput objectInput, int wordSize,
-                                       ByteBuffer outputBuffer, int index) throws IOException {
-    index *= wordSize;
-    if (wordSize == SHORT_SIZE) {
-      outputBuffer.putShort(index, objectInput.readShort());
-    } else {
-      outputBuffer.putInt(index, objectInput.readInt());
+      String description = areaCodeMap.get(prefix);
+      int positionInDescriptionPool = Arrays.binarySearch(descriptionPool, description);
+      storeWordInBuffer(descriptionIndexes, descIndexSizeInBytes, index, positionInDescriptionPool);
+      ++index;
     }
   }
 
@@ -173,12 +112,14 @@ class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
     // Read binary words sizes.
     prefixSizeInBytes = objectInput.readInt();
     descIndexSizeInBytes = objectInput.readInt();
+
     // Read possible lengths.
     int sizeOfLengths = objectInput.readInt();
     possibleLengths.clear();
     for (int i = 0; i < sizeOfLengths; i++) {
       possibleLengths.add(objectInput.readInt());
     }
+
     // Read description pool size.
     int descriptionPoolSize = objectInput.readInt();
     // Read description pool.
@@ -189,10 +130,17 @@ class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
       String description = objectInput.readUTF();
       descriptionPool[i] = description;
     }
-    // Read entries.
+    readEntries(objectInput);
+  }
+
+  /**
+   * Reads the area code entries from the provided input stream and stores them to the internal byte
+   * buffers.
+   */
+  private void readEntries(ObjectInput objectInput) throws IOException {
     numOfEntries = objectInput.readInt();
     if (phoneNumberPrefixes == null || phoneNumberPrefixes.capacity() < numOfEntries) {
-        phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
+      phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
     }
     if (descriptionIndexes == null || descriptionIndexes.capacity() < numOfEntries) {
       descriptionIndexes = ByteBuffer.allocate(numOfEntries * descIndexSizeInBytes);
@@ -203,43 +151,26 @@ class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
     }
   }
 
-  /**
-   * Writes the value read from the provided byte {@code buffer} at the specified {@code index} to
-   * the provided {@code objectOutput}.
-   *
-   * @param objectOutput  the object output stream to which the value is written
-   * @param wordSize  the number of bytes used to store the value
-   * @param inputBuffer  the byte buffer from which the value is read
-   * @param index  the index of the value in the the byte buffer
-   * @throws IOException if an error occurred writing to the provided object output stream
-   */
-  private static void writeExternalWord(ObjectOutput objectOutput, int wordSize,
-                                        ByteBuffer inputBuffer, int index) throws IOException {
-    index *= wordSize;
-    if (wordSize == SHORT_SIZE) {
-      objectOutput.writeShort(inputBuffer.getShort(index));
-    } else {
-      objectOutput.writeInt(inputBuffer.getInt(index));
-    }
-  }
-
   @Override
   public void writeExternal(ObjectOutput objectOutput) throws IOException {
     // Write binary words sizes.
     objectOutput.writeInt(prefixSizeInBytes);
     objectOutput.writeInt(descIndexSizeInBytes);
+
     // Write possible lengths.
     int sizeOfLengths = possibleLengths.size();
     objectOutput.writeInt(sizeOfLengths);
     for (Integer length : possibleLengths) {
       objectOutput.writeInt(length);
     }
+
     // Write description pool size.
     objectOutput.writeInt(descriptionPool.length);
     // Write description pool.
     for (String description : descriptionPool) {
       objectOutput.writeUTF(description);
     }
+
     // Write entries.
     objectOutput.writeInt(numOfEntries);
     for (int i = 0; i < numOfEntries; i++) {
@@ -247,4 +178,86 @@ class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
       writeExternalWord(objectOutput, descIndexSizeInBytes, descriptionIndexes, i);
     }
   }
+
+  /**
+   * Gets the minimum number of bytes that can be used to store the provided {@code value}.
+   */
+  private static int getOptimalNumberOfBytesForValue(int value) {
+    return value <= Short.MAX_VALUE ? SHORT_NUM_BYTES : INT_NUM_BYTES;
+  }
+
+  /**
+   * Stores a value which is read from the provided {@code objectInput} to the provided byte {@code
+   * buffer} at the specified {@code index}.
+   *
+   * @param objectInput  the object input stream from which the value is read
+   * @param wordSize  the number of bytes used to store the value read from the stream
+   * @param outputBuffer  the byte buffer to which the value is stored
+   * @param index  the index where the value is stored in the buffer
+   * @throws IOException  if an error occurred reading from the object input stream
+   */
+  private static void readExternalWord(ObjectInput objectInput, int wordSize,
+      ByteBuffer outputBuffer, int index) throws IOException {
+    int wordIndex = index * wordSize;
+    if (wordSize == SHORT_NUM_BYTES) {
+      outputBuffer.putShort(wordIndex, objectInput.readShort());
+    } else {
+      outputBuffer.putInt(wordIndex, objectInput.readInt());
+    }
+  }
+
+  /**
+   * Writes the value read from the provided byte {@code buffer} at the specified {@code index} to
+   * the provided {@code objectOutput}.
+   *
+   * @param objectOutput  the object output stream to which the value is written
+   * @param wordSize  the number of bytes used to store the value
+   * @param inputBuffer  the byte buffer from which the value is read
+   * @param index  the index of the value in the the byte buffer
+   * @throws IOException if an error occurred writing to the provided object output stream
+   */
+  private static void writeExternalWord(ObjectOutput objectOutput, int wordSize,
+      ByteBuffer inputBuffer, int index) throws IOException {
+    int wordIndex = index * wordSize;
+    if (wordSize == SHORT_NUM_BYTES) {
+      objectOutput.writeShort(inputBuffer.getShort(wordIndex));
+    } else {
+      objectOutput.writeInt(inputBuffer.getInt(wordIndex));
+    }
+  }
+
+  /**
+   * Reads the {@code value} at the specified {@code index} from the provided byte {@code buffer}.
+   * Note that only integer and short sizes are supported.
+   *
+   * @param buffer  the byte buffer from which the value is read
+   * @param wordSize  the number of bytes used to store the value
+   * @param index  the index where the value is read from
+   *
+   * @return  the value read from the buffer
+   */
+  private static int readWordFromBuffer(ByteBuffer buffer, int wordSize, int index) {
+    int wordIndex = index * wordSize;
+    return wordSize == SHORT_NUM_BYTES ? buffer.getShort(wordIndex) : buffer.getInt(wordIndex);
+  }
+
+  /**
+   * Stores the provided {@code value} to the provided byte {@code buffer} at the specified {@code
+   * index} using the provided {@code wordSize} in bytes. Note that only integer and short sizes are
+   * supported.
+   *
+   * @param buffer  the byte buffer to which the value is stored
+   * @param wordSize  the number of bytes used to store the provided value
+   * @param index  the index to which the value is stored
+   * @param value  the value that is stored assuming it does not require more than the specified
+   *    number of bytes.
+   */
+  private static void storeWordInBuffer(ByteBuffer buffer, int wordSize, int index, int value) {
+    int wordIndex = index * wordSize;
+    if (wordSize == SHORT_NUM_BYTES) {
+      buffer.putShort(wordIndex, (short) value);
+    } else {
+      buffer.putInt(wordIndex, value);
+    }
+  }
 }
diff --git a/java/src/com/google/i18n/phonenumbers/geocoding/data/381_sr b/java/src/com/google/i18n/phonenumbers/geocoding/data/381_sr
new file mode 100644 (file)
index 0000000..14051f7
Binary files /dev/null and b/java/src/com/google/i18n/phonenumbers/geocoding/data/381_sr differ
index 2da69ea..5e007df 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/geocoding/data/49_de and b/java/src/com/google/i18n/phonenumbers/geocoding/data/49_de differ
diff --git a/java/src/com/google/i18n/phonenumbers/geocoding/data/81_en b/java/src/com/google/i18n/phonenumbers/geocoding/data/81_en
new file mode 100644 (file)
index 0000000..c23db64
Binary files /dev/null and b/java/src/com/google/i18n/phonenumbers/geocoding/data/81_en differ
index 8fdf681..fbb487f 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/geocoding/data/config and b/java/src/com/google/i18n/phonenumbers/geocoding/data/config differ
index 196da6f..64171ac 100644 (file)
@@ -68,9 +68,9 @@ public class AsYouTypeFormatterTest extends TestCase {
     assertEquals("+48 88 123", formatter.inputDigit('3'));
     assertEquals("+48 88 123 1", formatter.inputDigit('1'));
     // A plus sign can only appear at the beginning of the number; otherwise, no formatting is
-    // applied. 
+    // applied.
     assertEquals("+48881231+", formatter.inputDigit('+'));
-    assertEquals("+48881231+2", formatter.inputDigit('2'));    
+    assertEquals("+48881231+2", formatter.inputDigit('2'));
   }
 
   public void testTooLongNumberMatchingMultipleLeadingDigits() {
@@ -731,4 +731,137 @@ public class AsYouTypeFormatterTest extends TestCase {
     assertEquals("+81 3332 2 567", formatter.inputDigit('7'));
     assertEquals("+81 3332 2 5678", formatter.inputDigit('8'));
   }
+
+  public void testAYTFLongIDD_AU() {
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AU");
+    // 0011 1 650 253 2250
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("00", formatter.inputDigit('0'));
+    assertEquals("001", formatter.inputDigit('1'));
+    assertEquals("0011", formatter.inputDigit('1'));
+    assertEquals("0011 1 ", formatter.inputDigit('1'));
+    assertEquals("0011 1 6", formatter.inputDigit('6'));
+    assertEquals("0011 1 65", formatter.inputDigit('5'));
+    assertEquals("0011 1 650", formatter.inputDigit('0'));
+    assertEquals("0011 1 650 2", formatter.inputDigit('2'));
+    assertEquals("0011 1 650 25", formatter.inputDigit('5'));
+    assertEquals("0011 1 650 253", formatter.inputDigit('3'));
+    assertEquals("0011 1 650 253 2", formatter.inputDigit('2'));
+    assertEquals("0011 1 650 253 22", formatter.inputDigit('2'));
+    assertEquals("0011 1 650 253 222", formatter.inputDigit('2'));
+    assertEquals("0011 1 650 253 2222", formatter.inputDigit('2'));
+
+    // 0011 81 3332 2 5678
+    formatter.clear();
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("00", formatter.inputDigit('0'));
+    assertEquals("001", formatter.inputDigit('1'));
+    assertEquals("0011", formatter.inputDigit('1'));
+    assertEquals("00118", formatter.inputDigit('8'));
+    assertEquals("0011 81 ", formatter.inputDigit('1'));
+    assertEquals("0011 81 3", formatter.inputDigit('3'));
+    assertEquals("0011 81 33", formatter.inputDigit('3'));
+    assertEquals("0011 81 33 3", formatter.inputDigit('3'));
+    assertEquals("0011 81 3332", formatter.inputDigit('2'));
+    assertEquals("0011 81 3332 2", formatter.inputDigit('2'));
+    assertEquals("0011 81 3332 2 5", formatter.inputDigit('5'));
+    assertEquals("0011 81 3332 2 56", formatter.inputDigit('6'));
+    assertEquals("0011 81 3332 2 567", formatter.inputDigit('7'));
+    assertEquals("0011 81 3332 2 5678", formatter.inputDigit('8'));
+
+    // 0011 244 250 253 222
+    formatter.clear();
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("00", formatter.inputDigit('0'));
+    assertEquals("001", formatter.inputDigit('1'));
+    assertEquals("0011", formatter.inputDigit('1'));
+    assertEquals("00112", formatter.inputDigit('2'));
+    assertEquals("001124", formatter.inputDigit('4'));
+    assertEquals("0011 244 ", formatter.inputDigit('4'));
+    assertEquals("0011 244 2", formatter.inputDigit('2'));
+    assertEquals("0011 244 25", formatter.inputDigit('5'));
+    assertEquals("0011 244 250", formatter.inputDigit('0'));
+    assertEquals("0011 244 250 2", formatter.inputDigit('2'));
+    assertEquals("0011 244 250 25", formatter.inputDigit('5'));
+    assertEquals("0011 244 250 253", formatter.inputDigit('3'));
+    assertEquals("0011 244 250 253 2", formatter.inputDigit('2'));
+    assertEquals("0011 244 250 253 22", formatter.inputDigit('2'));
+    assertEquals("0011 244 250 253 222", formatter.inputDigit('2'));
+  }
+
+  public void testAYTFLongIDD_KR() {
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+    // 00300 1 650 253 2222
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("00", formatter.inputDigit('0'));
+    assertEquals("003", formatter.inputDigit('3'));
+    assertEquals("0030", formatter.inputDigit('0'));
+    assertEquals("00300", formatter.inputDigit('0'));
+    assertEquals("00300 1 ", formatter.inputDigit('1'));
+    assertEquals("00300 1 6", formatter.inputDigit('6'));
+    assertEquals("00300 1 65", formatter.inputDigit('5'));
+    assertEquals("00300 1 650", formatter.inputDigit('0'));
+    assertEquals("00300 1 650 2", formatter.inputDigit('2'));
+    assertEquals("00300 1 650 25", formatter.inputDigit('5'));
+    assertEquals("00300 1 650 253", formatter.inputDigit('3'));
+    assertEquals("00300 1 650 253 2", formatter.inputDigit('2'));
+    assertEquals("00300 1 650 253 22", formatter.inputDigit('2'));
+    assertEquals("00300 1 650 253 222", formatter.inputDigit('2'));
+    assertEquals("00300 1 650 253 2222", formatter.inputDigit('2'));
+  }
+
+  public void testAYTFLongNDD_KR() {
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+    // 08811-9876-7890
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("08", formatter.inputDigit('8'));
+    assertEquals("088", formatter.inputDigit('8'));
+    assertEquals("0881", formatter.inputDigit('1'));
+    assertEquals("08811", formatter.inputDigit('1'));
+    assertEquals("08811-9", formatter.inputDigit('9'));
+    assertEquals("08811-98", formatter.inputDigit('8'));
+    assertEquals("08811-987", formatter.inputDigit('7'));
+    assertEquals("08811-9876", formatter.inputDigit('6'));
+    assertEquals("08811-9876-7", formatter.inputDigit('7'));
+    assertEquals("08811-9876-78", formatter.inputDigit('8'));
+    assertEquals("08811-9876-789", formatter.inputDigit('9'));
+    assertEquals("08811-9876-7890", formatter.inputDigit('0'));
+
+    // 08500 11-9876-7890
+    formatter.clear();
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("08", formatter.inputDigit('8'));
+    assertEquals("085", formatter.inputDigit('5'));
+    assertEquals("0850", formatter.inputDigit('0'));
+    assertEquals("08500 ", formatter.inputDigit('0'));
+    assertEquals("08500 1", formatter.inputDigit('1'));
+    assertEquals("08500 11", formatter.inputDigit('1'));
+    assertEquals("08500 11-9", formatter.inputDigit('9'));
+    assertEquals("08500 11-98", formatter.inputDigit('8'));
+    assertEquals("08500 11-987", formatter.inputDigit('7'));
+    assertEquals("08500 11-9876", formatter.inputDigit('6'));
+    assertEquals("08500 11-9876-7", formatter.inputDigit('7'));
+    assertEquals("08500 11-9876-78", formatter.inputDigit('8'));
+    assertEquals("08500 11-9876-789", formatter.inputDigit('9'));
+    assertEquals("08500 11-9876-7890", formatter.inputDigit('0'));
+  }
+
+  public void testAYTFLongNDD_SG() {
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("SG");
+    // 777777 9876 7890
+    assertEquals("7", formatter.inputDigit('7'));
+    assertEquals("77", formatter.inputDigit('7'));
+    assertEquals("777", formatter.inputDigit('7'));
+    assertEquals("7777", formatter.inputDigit('7'));
+    assertEquals("77777", formatter.inputDigit('7'));
+    assertEquals("777777 ", formatter.inputDigit('7'));
+    assertEquals("777777 9", formatter.inputDigit('9'));
+    assertEquals("777777 98", formatter.inputDigit('8'));
+    assertEquals("777777 987", formatter.inputDigit('7'));
+    assertEquals("777777 9876", formatter.inputDigit('6'));
+    assertEquals("777777 9876 7", formatter.inputDigit('7'));
+    assertEquals("777777 9876 78", formatter.inputDigit('8'));
+    assertEquals("777777 9876 789", formatter.inputDigit('9'));
+    assertEquals("777777 9876 7890", formatter.inputDigit('0'));
+  }
 }
index dccd545..7c30588 100644 (file)
@@ -166,4 +166,11 @@ public class ExampleNumbersTest extends TestCase {
     }
     assertEquals(0, wrongTypeCases.size());
   }
+
+  public void testEveryRegionHasAnExampleNumber() throws Exception {
+    for (String regionCode : phoneNumberUtil.getSupportedRegions()) {
+      PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumber(regionCode);
+      assertNotNull("None found for region " + regionCode, exampleNumber);
+    }
+  }
 }
index 9fee8c9..b7000bd 100644 (file)
@@ -392,6 +392,8 @@ public class PhoneNumberMatcherTest extends TestCase {
     new NumberTest("1979-2011 100%", RegionCode.US),
     new NumberTest("800 234 1 111x1111", RegionCode.US),
     new NumberTest("+494949-4-94", RegionCode.DE),  // National number in wrong format
+    new NumberTest("\uFF14\uFF11\uFF15\uFF16\uFF16\uFF16\uFF16-\uFF17\uFF17\uFF17\uFF17",
+                   RegionCode.US)
   };
 
   /**
@@ -440,8 +442,8 @@ public class PhoneNumberMatcherTest extends TestCase {
   }
 
   public void testNonMatchesWithStrictGroupLeniency() throws Exception {
-    int matchFoundCount = 0;
     List<NumberTest> testCases = new ArrayList<NumberTest>();
+    testCases.addAll(Arrays.asList(IMPOSSIBLE_CASES));
     testCases.addAll(Arrays.asList(POSSIBLE_ONLY_CASES));
     testCases.addAll(Arrays.asList(VALID_CASES));
     doTestNumberNonMatchesForLeniency(testCases, Leniency.STRICT_GROUPING);
@@ -455,6 +457,7 @@ public class PhoneNumberMatcherTest extends TestCase {
 
   public void testNonMatchesExactGroupLeniency() throws Exception {
     List<NumberTest> testCases = new ArrayList<NumberTest>();
+    testCases.addAll(Arrays.asList(IMPOSSIBLE_CASES));
     testCases.addAll(Arrays.asList(POSSIBLE_ONLY_CASES));
     testCases.addAll(Arrays.asList(VALID_CASES));
     testCases.addAll(Arrays.asList(STRICT_GROUPING_CASES));
index 4057a1e..660a34e 100644 (file)
@@ -98,6 +98,11 @@ public class PhoneNumberUtilTest extends TestCase {
       new PhoneNumber().setCountryCode(1).setNationalNumber(650253000L);
   private static final PhoneNumber US_TOLLFREE =
       new PhoneNumber().setCountryCode(1).setNationalNumber(8002530000L);
+  private static final PhoneNumber US_SPOOF =
+      new PhoneNumber().setCountryCode(1).setNationalNumber(0L);
+  private static final PhoneNumber US_SPOOF_WITH_RAW_INPUT =
+      new PhoneNumber().setCountryCode(1).setNationalNumber(0L)
+          .setRawInput("000-000-0000");
 
   public PhoneNumberUtilTest() {
     phoneUtil = initializePhoneUtilForTesting();
@@ -322,6 +327,11 @@ public class PhoneNumberUtilTest extends TestCase {
     assertEquals("900 253 0000", phoneUtil.format(US_PREMIUM, PhoneNumberFormat.NATIONAL));
     assertEquals("+1 900 253 0000", phoneUtil.format(US_PREMIUM, PhoneNumberFormat.INTERNATIONAL));
     assertEquals("+1-900-253-0000", phoneUtil.format(US_PREMIUM, PhoneNumberFormat.RFC3966));
+    // Numbers with all zeros in the national number part will be formatted by using the raw_input
+    // if that is available no matter which format is specified.
+    assertEquals("000-000-0000",
+                 phoneUtil.format(US_SPOOF_WITH_RAW_INPUT, PhoneNumberFormat.NATIONAL));
+    assertEquals("0", phoneUtil.format(US_SPOOF, PhoneNumberFormat.NATIONAL));
   }
 
   public void testFormatBSNumber() {
@@ -1294,6 +1304,11 @@ public class PhoneNumberUtilTest extends TestCase {
     // recognise the country calling code and parse accordingly.
     assertEquals(NZ_NUMBER, phoneUtil.parse("01164 3 331 6005", RegionCode.US));
     assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", RegionCode.US));
+    // We should ignore the leading plus here, since it is not followed by a valid country code but
+    // instead is followed by the IDD for the US.
+    assertEquals(NZ_NUMBER, phoneUtil.parse("+01164 3 331 6005", RegionCode.US));
+    assertEquals(NZ_NUMBER, phoneUtil.parse("+0064 3 331 6005", RegionCode.NZ));
+    assertEquals(NZ_NUMBER, phoneUtil.parse("+ 00 64 3 331 6005", RegionCode.NZ));
 
     PhoneNumber nzNumber = new PhoneNumber();
     nzNumber.setCountryCode(64).setNationalNumber(64123456L);
@@ -1477,6 +1492,16 @@ public class PhoneNumberUtilTest extends TestCase {
                    e.getErrorType());
     }
     try {
+      String plusAndIddAndInvalidCountryCode = "+ 00 210 3 331 6005";
+      phoneUtil.parse(plusAndIddAndInvalidCountryCode, RegionCode.NZ);
+      fail("This should not parse without throwing an exception.");
+    } catch (NumberParseException e) {
+      // Expected this exception. 00 is a correct IDD, but 210 is not a valid country code.
+      assertEquals("Wrong error type stored in exception.",
+                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
+                   e.getErrorType());
+    }
+    try {
       String someNumber = "123 456 7890";
       phoneUtil.parse(someNumber, RegionCode.ZZ);
       fail("'Unknown' region code not allowed: should fail.");
index 7f29bca..a96ad54 100644 (file)
Binary files a/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR and b/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR differ
index 0838f55..cdce608 100644 (file)
Binary files a/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG and b/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG differ
index 2b70c6f..84ec90d 100644 (file)
@@ -84,13 +84,13 @@ public class AreaCodeMapTest extends TestCase {
   public void testGetSmallerMapStorageChoosesDefaultImpl() {
     AreaCodeMapStorageStrategy mapStorage =
         new AreaCodeMap().getSmallerMapStorage(createDefaultStorageMapCandidate());
-    assertFalse(mapStorage.isFlyweight());
+    assertFalse(mapStorage instanceof FlyweightMapStorage);
   }
 
   public void testGetSmallerMapStorageChoosesFlyweightImpl() {
     AreaCodeMapStorageStrategy mapStorage =
         new AreaCodeMap().getSmallerMapStorage(createFlyweightStorageMapCandidate());
-    assertTrue(mapStorage.isFlyweight());
+    assertTrue(mapStorage instanceof FlyweightMapStorage);
   }
 
   public void testLookupInvalidNumber_US() {
@@ -126,12 +126,12 @@ public class AreaCodeMapTest extends TestCase {
 
   public void testLookupNumberNotFound_TX() {
     number.setCountryCode(1).setNationalNumber(9724811234L);
-    assertEquals("", areaCodeMapForUS.lookup(number));
+    assertNull(areaCodeMapForUS.lookup(number));
   }
 
   public void testLookupNumber_CH() {
     number.setCountryCode(41).setNationalNumber(446681300L);
-    assertEquals("", areaCodeMapForUS.lookup(number));
+    assertNull(areaCodeMapForUS.lookup(number));
   }
 
   public void testLookupNumber_IT() {
@@ -146,7 +146,7 @@ public class AreaCodeMapTest extends TestCase {
 
     // A mobile number
     number.setNationalNumber(321123456L).setItalianLeadingZero(false);
-    assertEquals("", areaCodeMapForIT.lookup(number));
+    assertNull(areaCodeMapForIT.lookup(number));
 
     // An invalid number (too short)
     number.setNationalNumber(321123L).setItalianLeadingZero(true);
@@ -173,7 +173,7 @@ public class AreaCodeMapTest extends TestCase {
   public void testReadWriteExternalWithDefaultStrategy() throws IOException {
     AreaCodeMap localAreaCodeMap = new AreaCodeMap();
     localAreaCodeMap.readAreaCodeMap(createDefaultStorageMapCandidate());
-    assertFalse(localAreaCodeMap.getAreaCodeMapStorage().isFlyweight());
+    assertFalse(localAreaCodeMap.getAreaCodeMapStorage() instanceof FlyweightMapStorage);
 
     AreaCodeMap newAreaCodeMap;
     newAreaCodeMap = createNewAreaCodeMap(localAreaCodeMap);
@@ -183,7 +183,7 @@ public class AreaCodeMapTest extends TestCase {
   public void testReadWriteExternalWithFlyweightStrategy() throws IOException {
     AreaCodeMap localAreaCodeMap = new AreaCodeMap();
     localAreaCodeMap.readAreaCodeMap(createFlyweightStorageMapCandidate());
-    assertTrue(localAreaCodeMap.getAreaCodeMapStorage().isFlyweight());
+    assertTrue(localAreaCodeMap.getAreaCodeMapStorage() instanceof FlyweightMapStorage);
 
     AreaCodeMap newAreaCodeMap;
     newAreaCodeMap = createNewAreaCodeMap(localAreaCodeMap);
index 63e0769..3db1264 100644 (file)
@@ -23,6 +23,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.Collections;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
@@ -32,37 +33,48 @@ import java.util.TreeMap;
  * @author Philippe Liard
  */
 public class FlyweightMapStorageTest extends TestCase {
-  private final SortedMap<Integer, String> areaCodeMap = new TreeMap<Integer, String>();
-
-  public FlyweightMapStorageTest() {
-    areaCodeMap.put(331402, "Paris");
-    areaCodeMap.put(331434, "Paris");
-    areaCodeMap.put(334910, "Marseille");
-    areaCodeMap.put(334911, "Marseille");
+  private static final SortedMap<Integer, String> areaCodeMap;
+  static {
+    SortedMap<Integer, String> tmpMap = new TreeMap<Integer, String>();
+    tmpMap.put(331402, "Paris");
+    tmpMap.put(331434, "Paris");
+    tmpMap.put(334910, "Marseille");
+    tmpMap.put(334911, "Marseille");
+    tmpMap.put(334912, "");
+    tmpMap.put(334913, "");
+    areaCodeMap = Collections.unmodifiableSortedMap(tmpMap);
   }
 
-  public void testReadFromSortedMap() {
-    FlyweightMapStorage mapStorage = new FlyweightMapStorage();
+  private FlyweightMapStorage mapStorage;
+
+  @Override
+  protected void setUp() throws Exception {
+    mapStorage = new FlyweightMapStorage();
     mapStorage.readFromSortedMap(areaCodeMap);
+  }
 
+  public void testReadFromSortedMap() {
     assertEquals(331402, mapStorage.getPrefix(0));
     assertEquals(331434, mapStorage.getPrefix(1));
     assertEquals(334910, mapStorage.getPrefix(2));
     assertEquals(334911, mapStorage.getPrefix(3));
 
-    String desc = mapStorage.getDescription(0);
-    assertEquals("Paris", desc);
-    assertTrue(desc == mapStorage.getDescription(1));  // Same identity.
+    assertEquals("Paris", mapStorage.getDescription(0));
+    assertSame(mapStorage.getDescription(0), mapStorage.getDescription(1));
 
-    desc = mapStorage.getDescription(2);
-    assertEquals("Marseille", desc);
-    assertTrue(desc == mapStorage.getDescription(3));  // Same identity.
+    assertEquals("Marseille", mapStorage.getDescription(2));
+    assertSame(mapStorage.getDescription(2), mapStorage.getDescription(3));
   }
 
-  public void testWriteAndReadExternal() throws IOException {
-    FlyweightMapStorage mapStorage = new FlyweightMapStorage();
-    mapStorage.readFromSortedMap(areaCodeMap);
+  public void testReadFromSortedMapSupportsEmptyDescription() {
+    assertEquals(334912, mapStorage.getPrefix(4));
+    assertEquals(334913, mapStorage.getPrefix(5));
+
+    assertEquals("", mapStorage.getDescription(4));
+    assertSame(mapStorage.getDescription(4), mapStorage.getDescription(5));
+  }
 
+  public void testWriteAndReadExternal() throws IOException {
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
     mapStorage.writeExternal(objectOutputStream);
@@ -74,7 +86,22 @@ public class FlyweightMapStorageTest extends TestCase {
     newMapStorage.readExternal(objectInputStream);
 
     String expected = mapStorage.toString();
-    assertFalse(expected.length() == 0);
     assertEquals(expected, newMapStorage.toString());
   }
+
+  public void testReadExternalThrowsIOExceptionWithMalformedData() throws IOException {
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
+    objectOutputStream.writeUTF("hello");
+    objectOutputStream.flush();
+    ObjectInputStream objectInputStream =
+        new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
+    FlyweightMapStorage newMapStorage = new FlyweightMapStorage();
+    try {
+      newMapStorage.readExternal(objectInputStream);
+      fail();
+    } catch (IOException e) {
+      // Exception expected.
+    }
+  }
 }
index c404401..00919ea 100644 (file)
           (?:
             55|
             77|
-            9[1-46-9]
+            9[1-9]
           )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
     <territory id="BE" countryCode="32" internationalPrefix="00"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
       <availableFormats>
-        <numberFormat pattern="(4[7-9]\d)(\d{2})(\d{2})(\d{2})">
-          <leadingDigits>4[7-9]</leadingDigits>
+        <numberFormat pattern="(4[6-9]\d)(\d{2})(\d{2})(\d{2})">
+          <leadingDigits>4[6-9]</leadingDigits>
           <format>$1 $2 $3 $4</format>
         </numberFormat>
         <numberFormat pattern="([2-49])(\d{3})(\d{2})(\d{2})">
       <mobile>
         <nationalNumberPattern>
           4(?:
-            7\d|
+            [67]\d|
             8[3-9]|
             9[1-9]
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>17001234</exampleNumber>
       </fixedLine>
+      <!-- Mobile prefix 384 is not yet in the ITU document but other sources (e.g. Google
+           searches) suggest mobile numbers with this prefix are in use. -->
       <mobile>
         <nationalNumberPattern>
           (?:
             3(?:
               [23469]\d|
               77|
-              8[38]
+              8[348]
             )|
             6(?:
               1[16]|
         <exampleNumber>20211234</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- 93 0, 93 4, 93 5 and 93 8 have been added as many online examples of these prefixes can
-             be found. 9[68] and 97[23] prefixes have also been added because of online numbers
-             following these patterns and numbers where SMSs were successfully delivered. 66 has
-             been also added, as it seems to be a prefix for Mobile MTN. -->
+        <!-- We have restricted the pattern here to the first two digits, as beyond this the data
+             seems to be no longer accurate. The prefixes 9[468] have also been added, along with 66
+             (seemingly a prefix for Mobile MTN), and 64 for BeninCell. -->
         <nationalNumberPattern>
-          66\d{6}|
-          9(?:
-            0[069]|
-            [35][0-2457-9]|
-            [6-8]\d
-          )\d{5}
+          (?:
+            6[46]|
+            9[03-8]
+          )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>90011234</exampleNumber>
         <possibleNumberPattern>\d{8,10}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
+        <!-- According to this publication, the prefixes 11 53, 11 54 and 11 57 are to be used for
+             mobile phones prior to the introduction of a ninth digit. It is not clear whether they
+             are still valid as fixed-line numbers, so we are leaving them here in the meantime:
+             http://www.anatel.gov.br/Portal/exibirPortalNoticias.do?acao=carregaNoticia&codigo=22406
+             -->
         <nationalNumberPattern>
+          1[1-9][2-5]\d{7}|
           (?:
-            [14689][1-9]|
+            [4689][1-9]|
             2[12478]|
             3[1-578]|
             5[13-5]|
       </fixedLine>
       <mobile>
         <nationalNumberPattern>
+          1(?:
+            1(?:
+              [6-9]\d|
+              5[347]
+            )|
+            [2-9][6-9]\d
+          )\d{6}|
           (?:
-            [14689][1-9]|
+            [4689][1-9]|
             2[12478]|
             3[1-578]|
             5[13-5]|
       <availableFormats>
         <!-- Format is from
              http://www.tourism.gov.bt/tour-operators/bhutan-abbot-tours-and-travels.html -->
-        <numberFormat pattern="(17)(\d{2})(\d{2})(\d{2})">
-          <leadingDigits>1</leadingDigits>
+        <numberFormat pattern="([17]7)(\d{2})(\d{2})(\d{2})">
+          <leadingDigits>
+            1|
+            77
+          </leadingDigits>
           <format>$1 $2 $3 $4</format>
         </numberFormat>
         <numberFormat pattern="([2-8])(\d{3})(\d{3})">
-          <leadingDigits>[2-8]</leadingDigits>
+          <leadingDigits>
+            [2-68]|
+            7[246]
+          </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>
-          (?:
-            17|
-            [2-8]
-          )\d{6}
-        </nationalNumberPattern>
+        <nationalNumberPattern>[1-8]\d{6,7}</nationalNumberPattern>
         <possibleNumberPattern>\d{6,8}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <exampleNumber>2345678</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>17\d{6}</nationalNumberPattern>
+        <!-- The 77 prefix is not yet in the ITU document but numbers online indicate this prefix
+             is in use. -->
+        <nationalNumberPattern>[17]7\d{6}</nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>17123456</exampleNumber>
       </mobile>
         <exampleNumber>2221234</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- 62[6-9] were added as we have been able to successfully send SMSs to these numbers. -->
+        <!-- 62[6-9] and 63X were added as we have been able to successfully send SMSs to these
+             numbers. -->
         <nationalNumberPattern>
           6(?:
-            [0-2]\d|
+            [0-3]\d|
             [67][01]
           )\d{4}
         </nationalNumberPattern>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[02-5]\d{7}</nationalNumberPattern>
+        <nationalNumberPattern>[02-6]\d{7}</nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <exampleNumber>21234567</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Added the prefixes 40 and 57 because SMS messages have been successfully delivered.
+        <!-- Added the prefixes 40, 57 & 65 because SMS messages have been successfully delivered.
              Supported by numbers found on the internet. -->
         <nationalNumberPattern>
           (?:
             0[1-9]|
             4[04-9]|
             5[07]|
-            6[067]
+            6[0567]
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>01234567</exampleNumber>
         </nationalNumberPattern>
         <possibleNumberPattern>\d{6,11}</possibleNumberPattern>
       </generalDesc>
+      <noInternationalDialling>
+        <nationalNumberPattern>600\d{7,8}</nationalNumberPattern>
+        <possibleNumberPattern>\d{10,11}</possibleNumberPattern>
+        <exampleNumber>6001234567</exampleNumber>
+      </noInternationalDialling>
       <fixedLine>
         <nationalNumberPattern>
           (?:
         <possibleNumberPattern>\d{8,9}</possibleNumberPattern>
         <exampleNumber>961234567</exampleNumber>
       </mobile>
-      <!-- Toll free and premium rate patterns have been collected by looking at numbers on the
-           internet, rather than from a definitive source. -->
+      <!-- Toll free patterns have been collected by looking at numbers on the internet, rather than
+           from a definitive source. -->
       <tollFree>
         <!-- 1230 numbers are used by Visa/Mastercard helplines in Chile -->
         <nationalNumberPattern>
         <possibleNumberPattern>\d{9,11}</possibleNumberPattern>
         <exampleNumber>800123456</exampleNumber>
       </tollFree>
-      <premiumRate>
+      <sharedCost>
+        <!-- http://empresa.movistar.cl/nuestros_productos/soluciones_telefonia_ip/servicios/servicio_600.php -->
         <nationalNumberPattern>600\d{7,8}</nationalNumberPattern>
         <possibleNumberPattern>\d{10,11}</possibleNumberPattern>
         <exampleNumber>6001234567</exampleNumber>
-      </premiumRate>
+      </sharedCost>
       <voip>
         <nationalNumberPattern>44\d{7}</nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
         <possibleNumberPattern>\d{4,12}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
-        <!-- 0432 increased to 8 digits on October 24, 2009. 0791 will increase to 8 digits on
+        <!-- 0432 increased to 8 digits on October 24, 2009. 0791 increased to 8 digits on
              August 28, 2011. 0475 is the prefix for Tongliao but is not in the ITU data. -->
         <nationalNumberPattern>
           21\d{8,10}|
             )|
             7(?:
               01|
-              [1579]\d|
+              [157]\d|
               2[248]|
               3[04-9]|
               4[3-6]|
-              6[2368]
+              6[2368]|
+              9[02-9]
             )|
             8(?:
               1[236-8]|
         <exampleNumber>30123456</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Note: 8 digit numbers seem to be available for prefix 176 now,
-        although no official documentation can be found, according to user
-        bug-reports. -->
         <nationalNumberPattern>
           1(?:
             5\d{9}|
         <nationalNumberPattern>[1-9]\d{7}</nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
       </generalDesc>
+      <!-- There are some overlaps for some number prefixes - the plan says that they are 'mainly'
+           used for a certain type of number. For this reason, both "mainly mobile" and "mainly
+           fixed-line" are put under both number types. -->
       <fixedLine>
         <nationalNumberPattern>
           (?:
-            3[2-9]|
-            4[3-9]|
-            5[4-9]|
-            6[2-9]|
-            7[02-9]|
-            8[26-9]|
+            [2-7]\d|
+            8[126-9]|
             9[6-9]
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>32123456</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- There are some overlaps for some number prefixes - the plan says that they are 'mainly'
-             used for a certain type of number. -->
         <nationalNumberPattern>
           (?:
-            2[0-9]|
-            3[0-2]|
-            4[0-2]|
-            5[0-3]|
-            6[01]|
-            7[12]|
-            81|
-            99
+            [2-7]\d|
+            8[126-9]|
+            9[6-9]
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>20123456</exampleNumber>
         <exampleNumber>7674201234</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding 617 since online numbers have been found with this prefix. -->
+        <!-- Adding 61[237], 285 and 295 since online numbers have been found with this
+             prefix. -->
         <nationalNumberPattern>
           767(?:
             2(?:
-              [2346]5|
+              [234689]5|
               7[5-7]
             )|
             31[5-7]|
-            61[4-7]
+            61[2-7]
           )\d{4}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{10}</possibleNumberPattern>
         <exampleNumber>12345678</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding 65 and 78 from numbers found online. -->
         <nationalNumberPattern>
           (?:
             5[56]|
-            6[69]|
-            7[79]
+            6[569]|
+            7[7-9]
           )\d{7}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
                nationalPrefix="0" nationalPrefixFormattingRule="($NP$FG)">
       <availableFormats>
         <numberFormat pattern="(\d)(\d{3})(\d{4})">
-          <leadingDigits>[2-7]</leadingDigits>
+          <leadingDigits>
+            [2-57]|
+            6[2-7]
+          </leadingDigits>
           <format>$1 $2-$3</format>
           <intlFormat>$1-$2-$3</intlFormat>
         </numberFormat>
         <numberFormat pattern="(\d{2})(\d{3})(\d{3})"
           nationalPrefixFormattingRule="$NP$FG">
-          <leadingDigits>[89]</leadingDigits>
+          <leadingDigits>
+            69|
+            [89]
+          </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
         <numberFormat pattern="(1800)(\d{3})(\d{3,4})"
         <exampleNumber>22123456</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>[89]\d{7}</nationalNumberPattern>
+        <nationalNumberPattern>
+          (?:
+            69|
+            [89]\d
+          )\d{6}
+        </nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>99123456</exampleNumber>
       </mobile>
     </territory>
 
     <!-- Egypt -->
-    <!-- http://www.itu.int/dms_pub/itu-t/oth/02/02/T020200003E0001MSWE.doc -->
+    <!-- http://www.itu.int/oth/T020200003E/en -->
     <territory id="EG" countryCode="20" internationalPrefix="00"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
        <availableFormats>
            <leadingDigits>[23]</leadingDigits>
            <format>$1 $2</format>
          </numberFormat>
+         <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+           <leadingDigits>
+             15[0-2]|
+             [89]00
+           </leadingDigits>
+           <format>$1 $2 $3</format>
+         </numberFormat>
+         <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+           <!-- Formatting mobile numbers in 3 groups, as per ITU. -->
+           <leadingDigits>
+             1(?:
+               [0-246-9]|
+               5[3-9]
+             )
+           </leadingDigits>
+           <format>$1 $2 $3</format>
+         </numberFormat>
          <numberFormat pattern="(\d{2})(\d{7})">
            <leadingDigits>
-             [14-6]|
+             13|
+             [4-6]|
              [89][2-9]
            </leadingDigits>
            <format>$1 $2</format>
          </numberFormat>
-         <numberFormat pattern="([89]00)(\d{3})(\d{4})">
-           <leadingDigits>[89]00</leadingDigits>
-           <format>$1 $2 $3</format>
-         </numberFormat>
        </availableFormats>
       <generalDesc>
         <nationalNumberPattern>
         <exampleNumber>234567890</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>1[0-246-9]\d{7}</nationalNumberPattern>
-        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <nationalNumberPattern>
+          1(?:
+            [0-246-9]|
+            5[0-2]
+          )\d{7}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{9,10}</possibleNumberPattern>
         <exampleNumber>101234567</exampleNumber>
       </mobile>
       <tollFree>
         <exampleNumber>3212345</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding 9[78] from numbers found online and numbers where SMSs have been received from.
-             -->
+        <!-- Adding 7[67], 8[367], and 9[034678] from numbers found online and numbers where SMSs have
+             been received from.  -->
         <nationalNumberPattern>
           (?:
-            7[0-4]|
-            9[27-9]
+            7[0-467]|
+            8[367]|
+            9[02346-9]
           )\d{5}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{7}</possibleNumberPattern>
             )|
             7(?:
               1\d|
-              [23][1-5]|
+              2[1-5]|
+              3[1-6]|
               4[1-7]|
               5[1-57]|
               6[134]|
          <leadingDigits>[2-5]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="(9[12589])(\d{3,4})(\d{3,4})">
+        <numberFormat pattern="(9\d)(\d{3})(\d{3,4})">
           <leadingDigits>9</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="(9[12589])(\d{3,4})(\d{3})(\d{3})">
+        <numberFormat pattern="(9\d)(\d{4})(\d{4})">
+          <leadingDigits>9</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+        <numberFormat pattern="(9\d)(\d{3,4})(\d{3})(\d{3})">
           <leadingDigits>9</leadingDigits>
           <format>$1 $2 $3 $4</format>
         </numberFormat>
         <exampleNumber>12345678</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>9[12589]\d{6,10}</nationalNumberPattern>
+        <nationalNumberPattern>9[1257-9]\d{6,10}</nationalNumberPattern>
         <possibleNumberPattern>\d{8,12}</possibleNumberPattern>
         <exampleNumber>912345678</exampleNumber>
       </mobile>
         <exampleNumber>22453300</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- The prefix 31 seems to be also used, based on online searches. -->
         <nationalNumberPattern>
           (?:
-            3[2-9]|
+            3[1-9]|
             4\d
           )\d{6}
         </nationalNumberPattern>
                  9[389]
                )|
                3(?:
-                 0[134679]|
-                 5[0-489]|
+                 0[13-9]|
+                 5[0-4789]|
                  7[3679]|
-                 8[3-9]|
+                 8[1-9]|
                  9[689]
                )|
                4(?:
-                 0[4579]|
+                 0[245789]|
                  1[15-9]|
                  [29][89]|
                  39|
                0[01589]|
                1(?:
                  [024]|
-                 15|
+                 1[56]|
                  30|
                  7[19]|
                  97
                )|
                2(?:
                  [2369]|
-                 7[0135]|
-                 8[67]
+                 7[01357]|
+                 8[567]
                )|
                3(?:
                  0[235-8]|
-                 4[179]|
+                 4[14789]|
                  74|
                  90
                )|
                )|
                5(?:
                  0[079]|
-                 [19]1|
+                 11|
                  2|
                  30|
                  4[47]|
                  53|
-                 7[45]
+                 7[45]|
+                 9[015]
                )|
                6(?:
                  [0589]|
                  [057-9]|
                  2[35-9]|
                  3[09]|
-                 4[038]|
-                 6[0-27-9]
+                 4[03678]|
+                 6[0-46-9]
                )
              )|
              9
         <!-- A couple of additional prefixes not found on the wikipedia page, are added because SMS
              messages have been successfully sent to these numbers. It seems almost impossible to
              know for some of these numbers whether they are land-line or mobile, since the ranges
-             overlap. Extra prefixes added: 7277, 730[12469], 735[0-489], 738[3-9], 740[479],
-             750[79], 7520, 7796, 787[2-4], 789[146], 810[0-8], 8115, 812[0-2569], 814[0-35], 8171,
-             8179, 8197, 822[1-689], 823\d, 8252, 826[0-7], 827[0135], 828[67], 829[0-246-9], the
-             ranges in 83X excepting 8390, 840[0-57-9], 842[2-689], 843[0-59], 844[0-489],
-             845[0-24-9], 846[09], 847[0135], 848[0-8], 850[079], 8511, 852[0-689], 8530, 854[47],
-             857[45], 860[125-9], 865[03-79], 867[09], 868[0-579], 869[0-467], 8712, 872[013-9],
-             875[1-35-9], 876[0-8], 879[24589], 882[04], 885[89], 8887, 892[679], 8948, 8969.  -->
+             overlap. Extra prefixes added: 7277, 730[124-689], 735[0-4789], 738[1-9], 740[47-9],
+             750[79], 7520, 7796, 787[2-4], 789[146], 810[0-8], 811[56], 812[0-2569], 814[0-35],
+             8171, 8179, 8197, 822[1-689], 823\d, 8252, 826[0-7], 827[01357], 828[567],
+             829[0-246-9], the ranges in 83X excepting 8303, 8344 and 8390, 840[0-57-9], 842[2-689],
+             843[0-59], 844[0-489], 845[0-24-9], 846[09], 847[0135], 848[0-8], 850[079], 8511,
+             852[0-689], 8530, 854[47], 857[45], 8595, 860[125-9], 865[03-79], 867[09], 868[0-579],
+             869[0-467], 8712, 872[013-9], 875[1-35-9], 876[0-8], 879[24589], 882[04], 885[89],
+             8887, 892[679], 894[6-8], 896[3469].  -->
         <nationalNumberPattern>
           (?:
             7(?:
                 9[389]
               )|
               3(?:
-                0[134679]|
-                5[0-489]|
+                0[13-9]|
+                5[0-4789]|
                 7[3679]|
-                8[3-9]|
+                8[1-9]|
                 9[689]
               )|
               4(?:
-                0[4579]|
+                0[245789]|
                 1[15-9]|
                 [29][89]|
                 39|
               )
             )|
             8(?:
-              0[01589]\d|
+              0(?:
+                [01589]\d|
+                66
+              )|
               1(?:
                 [024]\d|
-                15|
+                1[56]|
                 30|
                 7[19]|
                 97
               2(?:
                 [2369]\d|
                 52|
-                7[0135]|
-                8[67]
+                7[01357]|
+                8[567]
               )|
               3(?:
                 0[235-8]|
-                4[179]|
+                4[14789]|
                 74|
                 90
               )|
               )|
               5(?:
                 0[079]|
-                [19]1|
+                11|
                 2\d|
                 30|
                 4[47]|
                 53|
-                7[45]
+                7[45]|
+                9[015]
               )|
               6(?:
                 [0589]\d|
                 [057-9]\d|
                 2[35-9]|
                 3[09]|
-                4[038]|
-                6[0-27-9]
+                4[036-8]|
+                6[0-46-9]
               )
             )|
             9\d{3}
           <leadingDigits>[2-6]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="(7[5-9]\d)(\d{3})(\d{4})">
+        <numberFormat pattern="(7\d{2})(\d{3})(\d{4})">
           <leadingDigits>7</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
         <exampleNumber>12345678</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>7[5-9]\d{8}</nationalNumberPattern>
+        <nationalNumberPattern>7[3-9]\d{8}</nationalNumberPattern>
         <possibleNumberPattern>\d{10}</possibleNumberPattern>
         <exampleNumber>7912345678</exampleNumber>
       </mobile>
           38[59]\d{6}|
           (?:
             6(?:
-              1[014-8]|
+              1[0-8]|
               2[0-8]|
               3[0-27-9]|
               4[0-29]|
         <exampleNumber>8765123456</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding 27, 28, 31, 527 and 566 as extra prefixes, as they have been found to be valid
-             by sending SMSs and looking at online number lookup sites. -->
+        <!-- Adding 27, 28, 299, 31, 508, 527 and 566 as extra prefixes, as they have been found to
+             be valid by sending SMSs and looking at online number lookup sites. -->
         <nationalNumberPattern>
           876(?:
-            (?:
-              2[178]|
-              [348]\d|
-            )\d|
+            2(?:
+              [178]\d|
+              99
+            )|
+            [348]\d{2}|
             5(?:
+              08|
               27|
               66|
               [78]\d
         <exampleNumber>202012345</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding 70[0-3], 71[6-9], 73[019], 753 and 77[14] after successful delivery of SMSs. -->
+        <!-- Adding 70[0-5], 71[6-9], 73[019], 753 and 77[145] after successful delivery of SMSs.
+             -->
         <nationalNumberPattern>
           7(?:
-            0[0-3]|
+            0[0-5]|
             [123]\d|
             5[0-3]|
-            7[0-4]
+            7[0-5]
           )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
         <exampleNumber>312123456</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Added 705 since SMS messages have been successfully sent to numbers with this prefix.
-         -->
+        <!-- Added 70[1235789] since SMS messages have been successfully sent to numbers with this
+             prefix, and numbers have been found like this online.  -->
         <nationalNumberPattern>
           5[124-7]\d{7}|
           7(?:
-            0[05]|
+            0[0-357-9]|
             7\d
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>23456789</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding 86 from numbers found online, along with 88 (these numbers seem to be one digit
+             longer as well.) -->
         <nationalNumberPattern>
           (?:
             (?:
               0[89]|
               5[2-689]|
               8\d{2}|
-              [1349]\d|
+              [13469]\d|
             )
           )\d{5}
         </nationalNumberPattern>
-        <!-- Add an additional digit used by the numbers starting with the prefix 88 found on Web
-             Search. -->
         <possibleNumberPattern>\d{8,9}</possibleNumberPattern>
         <exampleNumber>91234567</exampleNumber>
       </mobile>
               5[1-4]
             )|
             [68]0|
-            [3-9][1-9][2-9]
+            [3-6][1-9][2-9]
           </leadingDigits>
           <leadingDigits>
             1(?:
               )
             )|
             [68]0|
-            [3-9][1-9][2-9]
+            [3-6][1-9][2-9]
           </leadingDigits>
           <format>$1-$2-$3</format>
         </numberFormat>
           <format>$1-$2</format>
         </numberFormat>
         <numberFormat pattern="(\d{2})(\d{3,4})">
-          <leadingDigits>[3-9][1-9]1</leadingDigits>
+          <leadingDigits>[3-6][1-9]1</leadingDigits>
           <leadingDigits>
-            [3-9][1-9]1(?:
+            [3-6][1-9]1(?:
               [0-46-9]
             )
           </leadingDigits>
       </availableFormats>
       <generalDesc>
         <nationalNumberPattern>
-          [1-79]\d{3,9}|
+          [1-7]\d{3,9}|
           8\d{8}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{4,10}</possibleNumberPattern>
         <exampleNumber>21212862</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding 2078, 2058 and 2097 from numbers found online. -->
         <nationalNumberPattern>
           20(?:
             2[23]|
-            5[4-6]|
-            77|
-            9[89]
+            5[4-68]|
+            7[78]|
+            9[7-9]
           )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{10}</possibleNumberPattern>
             [89][01]|
             7(?:
               [01]|
-              6[167])
+              6[136-9])
           </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
         <exampleNumber>1123456</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding 76[389] from numbers where SMSs have been received and online examples have been
+             found. -->
         <nationalNumberPattern>
           (?:
             3\d|
             7(?:
               [01]\d|
-              6[167]
+              6[136-9]
             )
           )\d{5}
         </nationalNumberPattern>
           <leadingDigits>[279]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
+        <numberFormat pattern="(7\d{2})(\d{3})(\d{3})">
+          <leadingDigits>7</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
         <numberFormat pattern="([4-6])(\d{3})(\d{3})">
           <leadingDigits>[4-6]</leadingDigits>
           <format>$1 $2 $3</format>
       <generalDesc>
         <nationalNumberPattern>
           (?:
-            [279]\d|
+            [29]\d|
             [4-6]|
+            7\d{1,2}|
             [38]\d{2}
           )\d{6}
         </nationalNumberPattern>
       </fixedLine>
       <mobile>
         <!-- Added 66, 67 and 68 as prefixes because of online numbers fitting this pattern. It
-             seems that 88-0xx is also being used, for 9-digit long numbers. -->
+             seems that 88-0xx is also being used, for 9-digit long numbers, and that some numbers
+             beginning with 776 are also 9 digits long now. -->
         <nationalNumberPattern>
           (?:
             4[67]|
             5\d|
             6[4-8]|
-            7\d{2}|
+            7(?:
+              76\d|
+              \d{2}
+            )|
             880\d
           )\d{5}
         </nationalNumberPattern>
       <mobile>
         <nationalNumberPattern>
           6(?:
-            0[06]|
+            0[0-36]|
             [14-7]\d|
             2[236]|
-            33|
+            3[348]|
             99
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>22212345</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Added 60[0-3], 688 and 689 since SMS messages have been successfully sent to these
-             numbers.  -->
         <nationalNumberPattern>
           (?:
             6(?:
-              0[0-3]|
               50|
-              7[12]|
-              [89]\d
+              7[1-4]|
+              [089]\d
             )|
-            7(?:
-              80|
-              9\d
-            )
+            7[89]\d
           )\d{5}
         </nationalNumberPattern>
         <exampleNumber>65012345</exampleNumber>
         <exampleNumber>20212345</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding 63 and 71 from numbers found online. -->
         <nationalNumberPattern>
           (?:
             6(?:
-              [569]\d
+              [3569]\d
             )|
             7(?:
               [08][1-9]|
               [3579][0-4]|
               4[014-7]|
-              6\d
+              [16]\d
             )
           )\d{5}
         </nationalNumberPattern>
         <exampleNumber>28212345</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- The 62 prefix is added as SMS messages have been successfully delivered to these
+        <!-- The 6[23] prefixes are added as SMS messages have been successfully delivered to these
              numbers, and they are also widely present on the Internet. -->
-        <nationalNumberPattern>6[26]\d{6}</nationalNumberPattern>
+        <nationalNumberPattern>6[236]\d{6}</nationalNumberPattern>
         <exampleNumber>66123456</exampleNumber>
       </mobile>
       <!-- No tollFree or premiumRate information can be found. -->
                nationalPrefixForParsing="0[12]|04[45](\d{10})"
                nationalPrefixTransformRule="1$1"
                nationalPrefixFormattingRule="$NP $FG">
-      <!-- When a number starts with 01 or 02, we remove the prefixes; when a number starts with 045
-           or 046 followed by 10 digits, we replace the prefixes with 1. This way all the mobile
+      <!-- When a number starts with 01 or 02, we remove the prefixes; when a number starts with 044
+           or 045 followed by 10 digits, we replace the prefixes with 1. This way all the mobile
            numbers, regardless of whether they are written in international format (leading 1) or
-           national format (leading 045/046), will be parsed into the same form. -->
+           national format (leading 044/045), will be parsed into the same form. -->
       <availableFormats>
         <numberFormat pattern="([358]\d)(\d{4})(\d{4})">
           <leadingDigits>
               81
             )
           </leadingDigits>
-          <format>045 $2 $3 $4</format>
+          <format>044 $2 $3 $4</format>
           <intlFormat>$1 $2 $3 $4</intlFormat>
         </numberFormat>
         <numberFormat nationalPrefixFormattingRule="$FG" pattern="(1)(\d{3})(\d{3})(\d{4})">
               9[1-35-9]
             )
           </leadingDigits>
-          <format>045 $2 $3 $4</format>
+          <format>044 $2 $3 $4</format>
           <intlFormat>$1 $2 $3 $4</intlFormat>
         </numberFormat>
       </availableFormats>
 
     <!-- Malaysia -->
     <!-- http://en.wikipedia.org/wiki/%2B60 -->
-    <!-- http://www.skmm.gov.my/what_we_do/numbering/index.asp -->
+    <!-- http://www.skmm.gov.my -->
     <territory id="MY" countryCode="60" internationalPrefix="00"
                nationalPrefix="0">
       <availableFormats>
         <numberFormat nationalPrefixFormattingRule="$NP$FG"
           pattern="([18]\d)(\d{3})(\d{3,4})">
           <leadingDigits>
-            1[0-46-9][1-9]|
+            1[02-46-9][1-9]|
             8
           </leadingDigits>
           <format>$1-$2 $3</format>
           <format>$1-$2-$3-$4</format>
         </numberFormat>
         <numberFormat nationalPrefixFormattingRule="$NP$FG"
+          pattern="(11)(\d{4})(\d{4})">
+          <leadingDigits>11</leadingDigits>
+          <format>$1-$2 $3</format>
+        </numberFormat>
+        <numberFormat nationalPrefixFormattingRule="$NP$FG"
           pattern="(154)(\d{3})(\d{4})">
           <leadingDigits>15</leadingDigits>
           <format>$1-$2 $3</format>
         <exampleNumber>312345678</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>1[0-46-9]\d{7}</nationalNumberPattern>
-        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <nationalNumberPattern>
+          1(?:
+            [02-46-9][2-9]|
+            11\d
+          )\d{6}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{9,10}</possibleNumberPattern>
         <exampleNumber>123456789</exampleNumber>
       </mobile>
       <tollFree>
         <exampleNumber>20201234</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Added 90 and 97 from online data. Zain have confirmed that they use the 97 prefix. -->
-        <nationalNumberPattern>9[03467]\d{6}</nationalNumberPattern>
+        <!-- Added 90, 91, 97 & 98 from online data. Zain have confirmed that they use the 97
+             prefix. -->
+        <nationalNumberPattern>9[0134678]\d{6}</nationalNumberPattern>
         <exampleNumber>93123456</exampleNumber>
       </mobile>
       <tollFree>
             )|
             8(?:
               0[2-9]|
-              1[23689]
+              1[0235689]
             )\d
           )\d{6}
         </nationalNumberPattern>
       </fixedLine>
       <mobile>
         <!-- Mobile number patterns from the numbering plan are included here,
-        as well as 68x from wikipedia. -->
+        as well as 68x from Wikipedia and 730 from online numbers. -->
         <nationalNumberPattern>
           (?:
             68|
-            7(?:
-              [126]\d|
-              3[1-9]
-            )
+            7[1236]\d
           )\d{5}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
         <exampleNumber>21234567</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding Sun prefixes 94[23] based on http://en.wikipedia.org/wiki/Sun_Cellular -->
         <nationalNumberPattern>
           9(?:
             0[5-9]|
             1[025-9]|
             2[0-36-9]|
-            3[0235-9]|
-            4[89]|
+            3[02-9]|
+            4[236-9]|
             7[349]|
             89|
             9[49]
         <exampleNumber>2123456789</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding 347 as SMSs have been successfully sent to these numbers and numbers can be
+        <!-- Adding 341 as SMSs have been successfully sent to these numbers and numbers can be
              found online with these prefixes. -->
         <nationalNumberPattern>
           3(?:
             0\d|
             1[2-5]|
-            2[1-3]|
+            2[1-5]|
             3[1-6]|
-            4[2-7]|
+            4[1-7]|
             64
           )\d{7}
         </nationalNumberPattern>
         <nationalNumberPattern>
           9(?:
             61|
-            7[12356]|
+            7[1-6]|
             8[1-5]|
-            9[1235]
+            9[1-5]
           )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
       </voip>
       <uan>
         <nationalNumberPattern>[2-9]0\d{4,7}</nationalNumberPattern>
-        <possibleNumber>\d{6,9}</possibleNumber>
+        <possibleNumberPattern>\d{6,9}</possibleNumberPattern>
         <exampleNumber>201234567</exampleNumber>
       </uan>
       <shortCode>
         <exampleNumber>44123456</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Extra prefixes 30 and 70 have been added from numbers found online.  -->
         <nationalNumberPattern>
           (?:
-            33|
+            3[03]|
             55|
             66|
-            77
+            7[07]
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>33123456</exampleNumber>
         <!-- Including "Nomadic" numbers from the Telecom Company "Go" -->
         <nationalNumberPattern>
           (?:
-            5[013-69]\d|
+            5[013-689]\d|
             8111
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>121231234</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>9[1259]\d{7}</nationalNumberPattern>
+        <!-- Adding 90X as online numbers have been found with this prefix. -->
+        <nationalNumberPattern>9[01259]\d{7}</nationalNumberPattern>
         <exampleNumber>911231234</exampleNumber>
       </mobile>
     </territory>
       <mobile>
         <nationalNumberPattern>
           (?:
-            8[1-5]|
+            8[1-6]|
             9[0-8]
           )\d{6}
         </nationalNumberPattern>
       <mobile>
         <!-- The patterns from the ITU document seem too restrictive, based on numbers found in
              online searches and phones that SMSs have been successfully received from, so the
-             ranges, have been extended to include 76 65 and 77 01, 2[89], 3[49], 4[7-9], 7[4-7], 89
-             and 9\d. -->
+             ranges, have been extended to include 76 5[4-7], 76 6[3-5] and 77 01, 1[239], 2[89],
+             3[49], 4[7-9], 7[4-7], 8[39] and 9\d. -->
         <nationalNumberPattern>
           7(?:
             0[1256]0|
               2[89]|
               3[3489]|
               4[6-9]|
-              5[1-389]|
-              6[5-9]|
+              5[1-9]|
+              6[3-9]|
               7[45]|
               8[3-8]
             )|
             7(?:
               01|
-              1[014-8]|
-              [2-79]\d|
-              8[019]
+              [12-79]\d|
+              8[0139]
             )
           )\d{5}
         </nationalNumberPattern>
       <mobile>
         <!-- Sotel Tchad "SALAM" (77 XX XX XX) is classified as a fixed operator in the plan, but it
              also says numbers starting with 7 are mobile numbers. Putting under mobile for now.
-             Also adding 63[5-7] from evidence of successful SMS delivery. -->
+             Also adding 63[5-9] from evidence of successful SMS delivery. -->
         <nationalNumberPattern>
           (?:
-            6(?:
-              3[0-7]|
-              6\d
-            )|
+            6[36]\d|
             77\d|
             9(?:
               5[0-4]|
 
     <!-- Togo -->
     <!-- http://www.itu.int/oth/T02020000D1/en -->
-    <territory id="TG" countryCode="228" internationalPrefix="00" leadingZeroPossible="true">
+    <territory id="TG" countryCode="228" internationalPrefix="00">
       <availableFormats>
-        <numberFormat pattern="(\d{3})(\d{2})(\d{2})">
-          <format>$1 $2 $3</format>
-        </numberFormat>
         <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">
           <format>$1 $2 $3 $4</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[02-9]\d{6,7}</nationalNumberPattern>
-        <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
+        <nationalNumberPattern>[29]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <nationalNumberPattern>
-          2?(?:
+          2(?:
             2[2-7]|
             3[23]|
             44|
         <exampleNumber>22212345</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Added prefix 09 because many mobile numbers were found with this. -->
-        <nationalNumberPattern>
-          (?:
-            0[1-9]|
-            7[56]|
-            8[1-7]|
-            9\d
-          )\d{5}|
-          9[0-289]\d{6}
-        </nationalNumberPattern>
+        <nationalNumberPattern>9[0-289]\d{6}</nationalNumberPattern>
         <exampleNumber>90112345</exampleNumber>
       </mobile>
     </territory>
 
     <!-- Thailand -->
-    <!-- http://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000CD0001MSWE.doc -->
+    <!-- http://www.itu.int/oth/T02020000CD/en -->
     <territory id="TH" countryCode="66" internationalPrefix="00"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
       <availableFormats>
           <leadingDigits>[3-7]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="(8)(\d{4})(\d{4})">
-          <leadingDigits>8</leadingDigits>
+        <numberFormat pattern="([89])(\d{4})(\d{4})">
+          <leadingDigits>[89]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
         <numberFormat nationalPrefixFormattingRule="$FG"
       </availableFormats>
       <generalDesc>
         <nationalNumberPattern>
-          [2-8]\d{7,8}|
+          [2-9]\d{7,8}|
           1\d{9}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{8,10}</possibleNumberPattern>
         <nationalNumberPattern>
           (?:
             2[1-9]|
-            3[24-9]|
+            3[2-9]|
             4[2-5]|
-            5[3-6]|
+            5[2-6]|
             7[3-7]
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>21234567</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- 8[02] numbers are added as SMS messages have been successfully delivered to these
-             numbers, and they are also widely present on the Internet. -->
-        <nationalNumberPattern>8\d{8}</nationalNumberPattern>
+        <nationalNumberPattern>[89]\d{8}</nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
         <exampleNumber>812345678</exampleNumber>
       </mobile>
         <exampleNumber>1900123456</exampleNumber>
       </premiumRate>
       <voip>
+        <!-- The ITU document says that the 89 prefix is also VOIP but there are lots of numbers
+             online to suggest they are actually used as mobile numbers -->
         <nationalNumberPattern>60\d{7}</nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
         <exampleNumber>601234567</exampleNumber>
     <!-- http://www.itu.int/oth/T02020000D5/en -->
     <territory id="TN" countryCode="216" internationalPrefix="00">
       <availableFormats>
-        <numberFormat pattern="([247-9]\d)(\d{3})(\d{3})">
+        <numberFormat pattern="(\d{2})(\d{3})(\d{3})">
           <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[247-9]\d{7}</nationalNumberPattern>
+        <nationalNumberPattern>[2457-9]\d{7}</nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <exampleNumber>71234567</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding 5[01258] from numbers found online. According to Wikipedia,
+             these are assigned to Orange Tunisia Communication Company. -->
         <nationalNumberPattern>
           (?:
             [29]\d|
-            4[01]
+            4[01]|
+            5[01258]|
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>20123456</exampleNumber>
         <exampleNumber>8682211234</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding 703 as messages have been successfully delivered to phones with this prefix. -->
         <nationalNumberPattern>
           868(?:
             29\d|
               8\d
             )|
             7(?:
+              03|
               1[02-9]|
               [2-9]\d
             )
     </territory>
 
     <!-- Uganda -->
-    <!-- http://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000F10001MSWE.doc -->
+    <!-- http://www.itu.int/oth/T0202000019/en -->
     <!-- http://www.ucc.co.ug/licensing/ugandaNumberingPlan.pdf -->
     <territory id="UG" countryCode="256" internationalPrefix="00[057]"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
         <exampleNumber>312345678</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Added 79X from online numbers found with this prefix. -->
+        <!-- Added 79X and 70[5-7] from online numbers found with this prefix. -->
         <nationalNumberPattern>
           7(?:
             [15789]\d|
-            0[0-4]
+            0[0-7]
           )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
           </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="(7[137]\d)(\d{3})(\d{3})">
-          <leadingDigits>7[137]</leadingDigits>
+        <numberFormat pattern="(7\d{2})(\d{3})(\d{3})">
+          <leadingDigits>7[0137]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
         <exampleNumber>1234567</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>7[137]\d{7}</nationalNumberPattern>
+        <!-- Adding 70 from numbers found online. -->
+        <nationalNumberPattern>7[0137]\d{7}</nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
         <exampleNumber>712345678</exampleNumber>
       </mobile>
           </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
+        <numberFormat pattern="(\d{2})(\d{3,4})">
+          <leadingDigits>
+            7|
+            8[1-5789]
+          </leadingDigits>
+          <format>$1 $2</format>
+        </numberFormat>
+        <numberFormat pattern="(\d{2})(\d{3})(\d{2,3})">
+          <leadingDigits>
+            7|
+            8[1-5789]
+          </leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[1-578]\d{8}</nationalNumberPattern>
-        <possibleNumberPattern>\d{8,9}</possibleNumberPattern>
+        <nationalNumberPattern>
+          [1-5]\d{8}|
+          (?:
+            7\d{4,8}|
+            8[1-5789]\d{3,7}
+          )|
+          8[06]\d{7}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{5,9}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <nationalNumberPattern>
           (?:
             7[1-4689]|
             8[1-5789]
-          )\d{7}
+          )\d{3,7}
         </nationalNumberPattern>
-        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <possibleNumberPattern>\d{5,9}</possibleNumberPattern>
         <exampleNumber>711234567</exampleNumber>
       </mobile>
       <tollFree>
         <exampleNumber>211234567</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding extra prefixes 6[3-57-9] and 7[4-6] since SMS messages have been successfully
-             delivered to these numbers, and numbers like this can be found on the Internet. -->
+        <!-- Adding extra prefixes 50, 6[1-57-9] and 7[13-6] since SMS messages have been
+             successfully delivered to these numbers, and numbers like this can be found on the
+             Internet. -->
         <nationalNumberPattern>
           9(?:
-            55|
-            6[3-9]|
-            7[4-9]
+            5[05]|
+            6[1-9]|
+            7[13-9]
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>955123456</exampleNumber>
index 651b3ae..3f35977 100644 (file)
@@ -16,8 +16,7 @@
 
      MetaData on Phone Number Plan and formatting rules. This file is used
      solely for the purpose of unittesting, so data in this file is not
-     necessarily consistent with that of
-     ../resources/PhoneNumberMetaData.xml
+     necessarily consistent with that of PhoneNumberMetaData.xml.
 -->
 
 <phoneNumberMetadata>
           <format>$1-$2-$3</format>
         </numberFormat>
         <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
-          <leadingDigits>1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-9][1-9][2-9]</leadingDigits>
-          <leadingDigits>1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]</leadingDigits>
+          <leadingDigits>1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-6][1-9][2-9]</leadingDigits>
+          <leadingDigits>1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-6][1-9][2-9]</leadingDigits>
           <format>$1-$2-$3</format>
         </numberFormat>
         <numberFormat pattern="(\d{3})(\d)(\d{4})">
           <format>$1-$2</format>
         </numberFormat>
         <numberFormat pattern="(\d{2})(\d{3})">
-          <leadingDigits>[3-9][1-9]1</leadingDigits>
-          <leadingDigits>[3-9][1-9]1(?:[0-46-9])</leadingDigits>
-          <leadingDigits>[3-9][1-9]1(?:[0-247-9]|3[124]|6[1269])</leadingDigits>
+          <leadingDigits>[3-6][1-9]1</leadingDigits>
+          <leadingDigits>[3-6][1-9]1(?:[0-46-9])</leadingDigits>
+          <leadingDigits>[3-6][1-9]1(?:[0-247-9]|3[124]|6[1269])</leadingDigits>
           <format>$1-$2</format>
         </numberFormat>
         <numberFormat pattern="(\d{2})(\d{4})">
-          <leadingDigits>[3-9][1-9]1</leadingDigits>
-          <leadingDigits>[3-9][1-9]1[36]</leadingDigits>
-          <leadingDigits>[3-9][1-9]1(?:3[035-9]|6[03-578])</leadingDigits>
+          <leadingDigits>[3-6][1-9]1</leadingDigits>
+          <leadingDigits>[3-6][1-9]1[36]</leadingDigits>
+          <leadingDigits>[3-6][1-9]1(?:3[035-9]|6[03-578])</leadingDigits>
           <format>$1-$2</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[1-79]\d{3,9}|8\d{8}</nationalNumberPattern>
+        <nationalNumberPattern>[1-7]\d{3,9}|8\d{8}</nationalNumberPattern>
         <possibleNumberPattern>\d{4,10}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
 
     <!-- Singapore -->
     <!-- http://www.ida.gov.sg/policies%20and%20regulation/20060508120124.aspx -->
-    <territory id="SG" countryCode="65" internationalPrefix="0[0-3][0-9]">
+    <!-- For testing the AYTF with long NDDs, "777777" is added as a possible national prefix. -->
+    <territory id="SG" countryCode="65" internationalPrefix="0[0-3][0-9]"
+               nationalPrefixForParsing="777777">
       <availableFormats>
         <numberFormat pattern="(\d{4})(\d{4})">
           <leadingDigits>[369]|8[1-9]</leadingDigits>
index 26650f9..0876354 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # Generated from:
-# http://www.itu.int/oth/T0202000051/en [2010-09-16]
+# http://www.itu.int/oth/T0202000051/en [2011-08-11]
 
 49201|Essen
 49202|Wuppertal
 493302|Hennigsdorf
 493303|Birkenwerder
 493304|Velten
+4933051|Nassenheide
+4933052|Leegebruch
+4933053|Zehlendorf Kreis Oberhavel
+4933054|Liebenwalde
+4933055|Kremmen
+4933056|Mühlenbeck Kreis Oberhavel
 493306|Gransee
 493307|Zehdenick
+4933080|Marienthal Kreis Oberhavel
+4933082|Menz Kreis Oberhavel
+4933083|Schulzendorf Kreis Oberhavel
+4933084|Gutengermendorf
+4933085|Seilershof
+4933086|Grieben Kreis Oberhavel
+4933087|Bredereiche
+4933088|Falkenthal
+4933089|Himmelpfort
+4933093|Fürstenberg Havel
+4933094|Löwenberg
 49331|Potsdam
+4933200|Bergholz-Rehbrücke
+4933201|Gross Glienicke
+4933202|Töplitz
+4933203|Kleinmachnow
+4933204|Beelitz Mark
+4933205|Michendorf
+4933206|Fichtenwalde
+4933207|Gross Kreutz
+4933208|Fahrland
+4933209|Caputh
 493321|Nauen Brandenburg
 493322|Falkensee
+4933230|Börnicke Kreis Havelland
+4933231|Pausin
+4933232|Brieselang
+4933233|Ketzin
+4933234|Wustermark
+4933235|Friesack
+4933237|Paulinenaue
+4933238|Senzke
+4933239|Gross Behnitz
 493327|Werder Havel
 493328|Teltow
 493329|Stahnsdorf
 493331|Angermünde
 493332|Schwedt/Oder
+4933331|Casekow
+4933332|Gartz Oder
+4933333|Tantow
+4933334|Greiffenberg
+4933335|Pinnow Kreis Uckermark
+4933336|Passow Kreis Uckermark
+4933337|Altkünkendorf
+4933338|Stolpe/Oder
 493334|Eberswalde
 493335|Finowfurt
+4933361|Joachimsthal
+4933362|Liepe Kreis Barnim
+4933363|Altenhof Kreis Barnim
+4933364|Gross Ziethen Kreis Barnim
+4933365|Lüdersdorf Kreis Barnim
+4933366|Chorin
+4933367|Friedrichswalde Brandenburg
+4933368|Hohensaaten
+4933369|Oderberg
 493337|Biesenthal Brandenburg
 493338|Bernau Brandenburg
+4933393|Gross Schönebeck Kreis Barnim
+4933394|Blumberg Kreis Barnim
+4933395|Zerpenschleuse
+4933396|Klosterfelde
+4933397|Wandlitz
+4933398|Werneuchen
 493341|Strausberg
 493342|Neuenhagen bei Berlin
+4933432|Müncheberg
+4933433|Buckow Märkische Schweiz
+4933434|Herzfelde bei Strausberg
+4933435|Rehfelde
+4933436|Prötzel
+4933437|Reichenberg bei Strausberg
+4933438|Altlandsberg
+4933439|Fredersdorf-Vogelsdorf
 493344|Bad Freienwalde
+4933451|Heckelberg
+4933452|Neulewin
+4933454|Wölsickendorf/Wollenberg
+4933456|Wriezen
+4933457|Altreetz
+4933458|Falkenberg Mark
 493346|Seelow
+4933470|Lietzen
+4933472|Golzow bei Seelow
+4933473|Zechin
+4933474|Neutrebbin
+4933475|Letschin
+4933476|Neuhardenberg
+4933477|Trebnitz bei Müncheberg
+4933478|Gross Neuendorf
+4933479|Küstrin-Kietz
 49335|Frankfurt (Oder)
+4933601|Podelzig
+4933602|Alt Zeschdorf
+4933603|Falkenhagen bei Seelow
+4933604|Lebus
+4933605|Boossen
+4933606|Müllrose
+4933607|Briesen Mark
+4933608|Jacobsdorf Mark
+4933609|Brieskow-Finkenheerd
 493361|Fürstenwalde Spree
 493362|Erkner
+4933631|Bad Saarow-Pieskow
+4933632|Hangelsberg
+4933633|Spreenhagen
+4933634|Berkenbrück Kreis Oder-Spree
+4933635|Arensdorf Kreis Oder-Spree
+4933636|Steinhöfel Kreis Oder-Spree
+4933637|Beerfelde
+4933638|Rüdersdorf bei Berlin
 493364|Eisenhüttenstadt
+4933652|Neuzelle
+4933653|Ziltendorf
+4933654|Fünfeichen
+4933655|Grunow Kreis Oder-Spree
+4933656|Bahro
+4933657|Steinsdorf Brandenburg
 493366|Beeskow
+4933671|Lieberose
+4933672|Pfaffendorfb Beeskow
+4933673|Weichensdorf
+4933674|Trebatsch
+4933675|Tauche
+4933676|Friedland bei Beeskow
+4933677|Glienicke bei Beeskow
+4933678|Storkow Mark
+4933679|Wendisch Rietz
+4933701|Grossbeeren
+4933702|Wünsdorf
+4933703|Sperenberg
+4933704|Baruth Mark
+4933708|Rangsdorf
 493371|Luckenwalde
 493372|Jüterbog
+4933731|Trebbin
+4933732|Hennickendorf bei Luckenwalde
+4933733|Stülpe
+4933734|Felgentreu
+4933741|Niedergörsdorf
+4933742|Oehna Brandenburg
+4933743|Blönsdorf
+4933744|Hohenseefeld
+4933745|Petkus
+4933746|Werbig bei Jüterbog
+4933747|Marzahna
+4933748|Treuenbrietzen
 493375|Königs Wusterhausen
+4933760|Münchehofe Kreis Dahme-Spreewald
+4933762|Zeuthen
+4933763|Bestensee
+4933764|Mittenwalde Mark
+4933765|Märkisch Buchholz
+4933766|Teupitz
+4933767|Friedersdorf bei Berlin
+4933768|Prieros
+4933769|Töpchin
 493377|Zossen Brandenburg
 493378|Ludwigsfelde
 493379|Mahlow
 493381|Brandenburg an der Havel
 493382|Lehnin
+4933830|Ziesar
+4933831|Weseram
+4933832|Rogäsen
+4933833|Wollin bei Brandenburg
+4933834|Pritzerbe
+4933835|Golzow bei Brandenburg
+4933836|Butzow bei Brandenburg
+4933837|Brielow
+4933838|Päwesin
+4933839|Wusterwitz
+4933841|Belzig
+4933843|Niemegk
+4933844|Brück Brandenburg
+4933845|Borkheide
+4933846|Dippmannsdorf
+4933847|Görzke
+4933848|Raben
+4933849|Wiesenburg Mark
 493385|Rathenow
 493386|Premnitz
+4933870|Zollchow bei Rathenow
+4933872|Hohennauen
+4933873|Grosswudicke
+4933874|Stechow Brandenburg
+4933875|Rhinow
+4933876|Buschow
+4933877|Nitzahn
+4933878|Nennhausen
 493391|Neuruppin
+4933920|Walsleben bei Neuruppin
+4933921|Zechlinerhütte
+4933922|Karwesee
+4933923|Flecken Zechlin
+4933924|Rägelin
+4933925|Wustrau-Altfriesack
+4933926|Herzberg Mark
+4933927|Linum
+4933928|Wildberg Brandenburg
+4933929|Gühlen-Glienicke
+4933931|Rheinsberg Mark
+4933932|Fehrbellin
+4933933|Lindow Mark
 493394|Wittstock Dosse
 493395|Pritzwalk
+4933962|Heiligengrabe
+4933963|Wulfersdorf bei Wittstock
+4933964|Fretzdorf
+4933965|Herzsprung bei Wittstock
+4933966|Dranse
+4933967|Freyenstein
+4933968|Meyenburg Kreis Prignitz
+4933969|Stepenitz
+4933970|Neustadt Dosse
+4933971|Kyritz Brandenburg
+4933972|Breddin
+4933973|Zernitz bei Neustadt Dosse
+4933974|Dessow
+4933975|Dannenwalde Kreis Prignitz
+4933976|Wutike
+4933977|Gumtow
+4933978|Segeletz
+4933979|Wusterhausen Dosse
+4933981|Putlitz
+4933982|Hoppenrade Kreis Prignitz
+4933983|Gross Pankow Kreis Prignitz
+4933984|Blumenthal bei Pritzwalk
+4933986|Falkenhagen Kreis Prignitz
+4933989|Sadenbeck
 49340|Dessau Anh
 49341|Leipzig
+4934202|Delitzsch
+4934203|Zwenkau
+4934204|Schkeuditz
+4934205|Markranstädt
+4934206|Rötha
+4934207|Zwochau
+4934208|Löbnitz bei Delitzsch
 493421|Torgau
+4934221|Schildau Gneisenaustadt
+4934222|Arzberg bei Torgau
+4934223|Dommitzsch
+4934224|Belgern Sachsen
 493423|Eilenburg
+4934241|Jesewitz
+4934242|Hohenpriessnitz
+4934243|Bad Düben
+4934244|Mockrehna
 493425|Wurzen
+4934261|Kühren bei Wurzen
+4934262|Falkenhain bei Wurzen
+4934263|Hohburg
+4934291|Borsdorf
+4934292|Brandis bei Wurzen
+4934293|Naunhof bei Grimma
+4934294|Rackwitz
+4934295|Krensitz
+4934296|Groitzsch bei Pegau
+4934297|Liebertwolkwitz
+4934298|Taucha bei Leipzig
+4934299|Gaschwitz
 493431|Döbeln
+4934321|Leisnig
+4934322|Rosswein
+4934324|Ostrau Sachsen
+4934325|Mochau-Lüttewitz
+4934327|Waldheim Sachsen
+4934328|Hartha bei Döbeln
 493433|Borna Stadt
+4934341|Geithain
+4934342|Neukieritzsch
+4934343|Regis-Breitingen
+4934344|Kohren-Sahlis
+4934345|Bad Lausick
+4934346|Narsdorf
+4934347|Oelzschau bei Borna
+4934348|Frohburg
 493435|Oschatz
+4934361|Dahlen Sachsen
+4934362|Mügeln bei Oschatz
+4934363|Cavertitz
+4934364|Wermsdorf
 493437|Grimma
+4934381|Colditz
+4934382|Nerchau
+4934383|Trebsen Mulde
+4934384|Grossbothen
+4934385|Mutzschen
+4934386|Dürrweitzschen bei Grimma
 493441|Zeitz
+4934422|Osterfeld
+4934423|Heuckewalde
+4934424|Reuden bei Zeitz
+4934425|Droyssig
+4934426|Kayna
 493443|Weissenfels Sachsen-Anhalt
+4934441|Hohenmölsen
+4934443|Teuchern
+4934444|Lützen
+4934445|Stößen
+4934446|Grosskorbetha
 493445|Naumburg Saale
+4934461|Nebra Unstrut
+4934462|Laucha Unstrut
+4934463|Bad Kösen
+4934464|Freyburg Unstrut
+4934465|Bad Bibra
+4934466|Janisroda
+4934467|Eckartsberga
 493447|Altenburg Thüringen
 493448|Meuselwitz Thüringen
+4934491|Schmölln Thüringen
+4934492|Lucka
+4934493|Gößnitz Thüringen
+4934494|Ehrenhain
+4934495|Dobitschen
+4934496|Nöbdenitz
+4934497|Langenleuba-Niederhain
+4934498|Rositz
 49345|Halle Saale
+4934600|Ostrau Saalkreis
+4934601|Teutschenthal
+4934602|Landsberg Sachsen-Anhalt
+4934603|Nauendorf Sachsen-Anhalt
+4934604|Niemberg
+4934605|Gröbers
+4934606|Teicha Sachsen-Anhalt
+4934607|Wettin
+4934609|Salzmünde
 493461|Merseburg Saale
 493462|Bad Dürrenberg
+4934632|Mücheln Geiseltal
+4934633|Braunsbedra
+4934635|Bad Lauchstädt
+4934636|Schafstädt
+4934637|Frankleben
+4934638|Zöschen
+4934639|Wallendorf Luppe
 493464|Sangerhausen
+4934651|Rossla
+4934652|Allstedt
+4934653|Rottleberode
+4934654|Stolberg Harz
+4934656|Wallhausen Sachsen-Anhalt
+4934658|Hayn Harz
+4934659|Blankenheim bei Sangerhausen
 493466|Artern Unstrut
+4934671|Bad Frankenhausen Kyffhäuser
+4934672|Rossleben
+4934673|Heldrungen
+4934691|Könnern
+4934692|Alsleben Saale
 493471|Bernburg Saale
+4934721|Nienburg Saale
+4934722|Preusslitz
 493473|Aschersleben Sachsen-Anhalt
+4934741|Frose
+4934742|Sylda
+4934743|Ermsleben
+4934745|Winningen Sachsen-Anhalt
+4934746|Giersleben
 493475|Lutherstadt Eisleben
 493476|Hettstedt Sachsen-Anhalt
+4934771|Querfurt
+4934772|Helbra
+4934773|Schwittersdorf
+4934774|Röblingen am See
+4934775|Wippra
+4934776|Rothenschirmbach
+4934779|Abberode
+4934781|Greifenhagen
+4934782|Mansfeld Südharz
+4934783|Gerbstedt
+4934785|Sandersleben
+4934901|Roßlau Elbe
+4934903|Coswig Anhalt
+4934904|Oranienbaum
+4934905|Wörlitz
+4934906|Raguhn
+4934907|Jeber-Bergfrieden
+4934909|Aken Elbe
 493491|Lutherstadt Wittenberg
+4934920|Kropstädt
+4934921|Kemberg
+4934922|Mühlanger
+4934923|Cobbelsdorf
+4934924|Zahna
+4934925|Bad Schmiedeberg
+4934926|Pretzsch Elbe
+4934927|Globig-Bleddin
+4934928|Seegrehna
+4934929|Straach
 493493|Bitterfeld
 493494|Wolfen
+4934953|Gräfenhainichen
+4934954|Roitzsch bei Bitterfeld
+4934955|Gossa
+4934956|Zörbig
 493496|Köthen Anhalt
+4934973|Osternienburg
+4934975|Görzig Kreis Köthen
+4934976|Gröbzig
+4934977|Quellendorf
+4934978|Radegast Kreis Köthen
+4934979|Wulfen Sachsen-Anhalt
 493501|Pirna
+4935020|Struppen
+4935021|Königstein Sächsische Schweiz
+4935022|Bad Schandau
+4935023|Bad Gottleuba
+4935024|Stadt Wehlen
+4935025|Liebstadt
+4935026|Dürrröhrsdorf-Dittersbach
+4935027|Weesenstein
+4935028|Krippen
+4935032|Langenhennersdorf
+4935033|Rosenthal Sächsische Schweiz
 493504|Dippoldiswalde
+4935052|Kipsdorf Kurort
+4935053|Glashütte Sachsen
+4935054|Lauenstein Sachsen
+4935055|Höckendorf bei Dippoldiswalde
+4935056|Altenberg Sachsen
+4935057|Hermsdorf Erzgebirge
+4935058|Pretzschendorf
 49351|Dresden
+4935200|Arnsdorf bei Dresden
+4935201|Langebrück
+4935202|Klingenberg Sachsen
+4935203|Tharandt
+4935204|Wilsdruff
+4935205|Ottendorf-Okrilla
+4935206|Kreischa bei Dresden
+4935207|Moritzburg
+4935208|Radeburg
+4935209|Mohorn
 493521|Meissen
 493522|Grossenhain Sachsen
 493523|Coswig bei Dresden
+4935240|Tauscha bei Großenhain
+4935241|Lommatzsch
+4935242|Nossen
+4935243|Weinböhla
+4935244|Krögis
+4935245|Burkhardswalde-Munzig
+4935246|Ziegenhain Sachsen
+4935247|Zehren Sachsen
+4935248|Schönfeld bei Großenhain
+4935249|Basslitz
 493525|Riesa
+4935263|Gröditz bei Riesa
+4935264|Strehla
+4935265|Glaubitz
+4935266|Heyda bei Riesa
+4935267|Diesbar-Seusslitz
+4935268|Stauchitz
 493528|Radeberg
 493529|Heidenau Sachsen
 493531|Finsterwalde
+4935322|Doberlug-Kirchhain
+4935323|Sonnewalde
+4935324|Crinitz
+4935325|Rückersdorf bei Finsterwalde
+4935326|Schönborn Kreis Elbe-Elster
+4935327|Priessen
+4935329|Dollenchen
 493533|Elsterwerda
+4935341|Bad Liebenwerda
+4935342|Mühlberg Elbe
+4935343|Hirschfeld bei Elsterwerda
 493535|Herzberg Elster
+4935361|Schlieben
+4935362|Schönewalde bei Herzberg
+4935363|Fermerswalde
+4935364|Lebusa
+4935365|Falkenberg Elster
 493537|Jessen Elster
+4935383|Elster Elbe
+4935384|Steinsdorf bei Jessen
+4935385|Annaburg
+4935386|Prettin
+4935387|Seyda
+4935388|Klöden
+4935389|Holzdorf Elster
 493541|Calau
 493542|Lübbenau Spreewald
+4935433|Vetschau
+4935434|Altdöbern
+4935435|Gollmitz bei Calau
+4935436|Laasow bei Calau
+4935439|Zinnitz
 493544|Luckau Brandenburg
+4935451|Dahme Brandenburg
+4935452|Golssen
+4935453|Drahnsdorf
+4935454|Uckro
+4935455|Walddrehna
+4935456|Terpt
 493546|Lübben Spreewald
+4935471|Birkenhainchen
+4935472|Schlepzig
+4935473|Neu Lübbenau
+4935474|Schönwalde bei Lübben
+4935475|Straupitz
+4935476|Wittmannsdorf-Bückchen
+4935477|Rietzneuendorf-Friedrichshof
+4935478|Goyatz
 49355|Cottbus
+4935600|Döbern NL
+4935601|Peitz
+4935602|Drebkau
+4935603|Burg Spreewald
+4935604|Krieschow
+4935605|Komptendorf
+4935606|Briesen bei Cottbus
+4935607|Jänschwalde
+4935608|Gross Ossnig
+4935609|Drachhausen
 493561|Guben
 493562|Forst Lausitz
 493563|Spremberg
 493564|Schwarze Pumpe
+4935691|Bärenklau NL
+4935692|Kerkwitz
+4935693|Lauschütz
+4935694|Gosda bei Klinge
+4935695|Simmersdorf
+4935696|Briesnig
+4935697|Bagenz
+4935698|Hornow
 493571|Hoyerswerda
+4935722|Lauta bei Hoyerswerda
+4935723|Bernsdorf OL
+4935724|Lohsa
+4935725|Wittichenau
+4935726|Groß Särchen
+4935727|Burghammer
+4935728|Uhyst Spree
 493573|Senftenberg
 493574|Lauchhammer
+4935751|Welzow
+4935752|Ruhland
+4935753|Großräschen
+4935754|Klettwitz
+4935755|Ortrand
+4935756|Hosena
 493576|Weisswasser
+4935771|Bad Muskau
+4935772|Rietschen
+4935773|Schleife
+4935774|Boxberg Sachsen
+4935775|Pechern
 493578|Kamenz
+4935792|Ossling
+4935793|Elstra
+4935795|Königsbrück
+4935796|Panschwitz-Kuckau
+4935797|Schwepnitz
 493581|Görlitz
+4935820|Zodel
+4935822|Hagenwerder
+4935823|Ostritz
+4935825|Kodersdorf
+4935826|Königshain bei Görlitz
+4935827|Nieder-Seifersdorf
+4935828|Reichenbach OL
+4935829|Gersdorf bei Görlitz
 493583|Zittau
+4935841|Großschönau Sachsen
+4935842|Oderwitz
+4935843|Hirschfelde bei Zittau
+4935844|Oybin Kurort
 493585|Löbau
 493586|Neugersdorf Sachsen
+4935872|Neusalza-Spremberg
+4935873|Herrnhut
+4935874|Bernstadt an der Eigen
+4935875|Obercunnersdorf bei Löbau
+4935876|Weissenberg Sachsen
+4935877|Cunewalde
 493588|Niesky
+4935891|Rothenburg OL
+4935892|Horka OL
+4935893|Mücka
+4935894|Hähnichen
+4935895|Klitten
 493591|Bautzen
 493592|Kirschau
+4935930|Seitschen
+4935931|Königswartha
+4935932|Guttau
+4935933|Neschwitz
+4935934|Grossdubrau
+4935935|Kleinwelka
+4935936|Sohland Spree
+4935937|Prischwitz
+4935938|Großpostwitz OL
+4935939|Hochkirch
 493594|Bischofswerda
+4935951|Neukirch Lausitz
+4935952|Großröhrsdorf OL
+4935953|Burkau
+4935954|Grossharthau
+4935955|Pulsnitz
 493596|Neustadt in Sachsen
+4935971|Sebnitz
+4935973|Stolpen
+4935974|Hinterhermsdorf
+4935975|Hohnstein
 493601|Mühlhausen Thüringen
+4936020|Ebeleben
+4936021|Schlotheim
+4936022|Grossengottern
+4936023|Horsmar
+4936024|Diedorf bei Mühlhausen
+4936025|Körner
+4936026|Struth bei Mühlhausen
+4936027|Lengenfeld Unterm Stein
+4936028|Kammerforst Thüringen
+4936029|Menteroda
 493603|Bad Langensalza
+4936041|Bad Tennstedt
+4936042|Tonna
+4936043|Kirchheilingen
 493605|Leinefelde
 493606|Heiligenstadt Heilbad
+4936071|Teistungen
+4936072|Weißenborn-Lüderode
+4936074|Worbis
+4936075|Dingelstädt Eichsfeld
+4936076|Niederorschel
+4936077|Grossbodungen
+4936081|Arenshausen
+4936082|Ershausen
+4936083|Uder
+4936084|Heuthen
+4936085|Reinholterode
+4936087|Wüstheuterode
 49361|Erfurt
+4936200|Elxleben bei Arnstadt
+4936201|Walschleben
+4936202|Neudietendorf
+4936203|Vieselbach
+4936204|Stotternheim
+4936205|Gräfenroda
+4936206|Grossfahner
+4936207|Plaue Thüringen
+4936208|Ermstedt
+4936209|Klettbach
 493621|Gotha Thüringen
 493622|Waltershausen Thüringen
 493623|Friedrichroda
 493624|Ohrdruf
+4936252|Tambach-Dietharz
+4936253|Georgenthal Thüringer Wald
+4936254|Friedrichswerth
+4936255|Goldbach bei Gotha
+4936256|Wechmar
+4936257|Luisenthal Thüringen
+4936258|Friemar
+4936259|Tabarz Thüringer Wald
 493628|Arnstadt
 493629|Stadtilm
 493631|Nordhausen Thüringen
 493632|Sondershausen
+4936330|Grossberndten
+4936331|Ilfeld
+4936332|Ellrich
+4936333|Heringen Helme
+4936334|Wolkramshausen
+4936335|Grosswechsungen
+4936336|Klettenberg
+4936337|Schiedungen
+4936338|Bleicherode
 493634|Sömmerda
 493635|Kölleda
 493636|Greussen
+4936370|Grossenehrich
+4936371|Schlossvippach
+4936372|Kleinneuhausen
+4936373|Buttstädt
+4936374|Weissensee
+4936375|Kindelbrück
+4936376|Straussfurt
+4936377|Rastenberg
+4936378|Ostramondra
+4936379|Holzengel
 493641|Jena
+4936421|Camburg
+4936422|Reinstädt Thüringen
+4936423|Orlamünde
+4936424|Kahla Thüringen
+4936425|Isserstedt
+4936426|Ottendorf bei Stadtroda
+4936427|Dornburg Saale
+4936428|Stadtroda
 493643|Weimar Thüringen
 493644|Apolda
+4936450|Kranichfeld
+4936451|Buttelstedt
+4936452|Berlstedt
+4936453|Mellingen
+4936454|Magdala
+4936458|Bad Berka
+4936459|Blankenhain Thüringen
+4936461|Bad Sulza
+4936462|Ossmannstedt
+4936463|Gebstedt
+4936464|Wormstedt
+4936465|Oberndorf bei Apolda
 493647|Pößneck
+4936481|Neustadt an der Orla
+4936482|Triptis
+4936483|Ziegenrück
+4936484|Knau bei Pößneck
 49365|Gera
+4936601|Hermsdorf Thüringen
+4936602|Ronneburg Thüringen
+4936603|Weida
+4936604|Münchenbernsdorf
+4936605|Bad Köstritz
+4936606|Kraftsdorf
+4936607|Niederpöllnitz
+4936608|Seelingstädt bei Gera
 493661|Greiz
+4936621|Elsterberg bei Plauen
+4936622|Triebes
+4936623|Berga Elster
+4936624|Teichwolframsdorf
+4936625|Langenwetzendorf
+4936626|Auma
+4936628|Zeulenroda
 493663|Schleiz
+4936640|Remptendorf
+4936642|Harra
+4936643|Thimmendorf
+4936644|Hirschberg Saale
+4936645|Mühltroff
+4936646|Tanna bei Schleiz
+4936647|Saalburg Thüringen
+4936648|Dittersdorf bei Schleiz
+4936649|Gefell bei Schleiz
+4936651|Lobenstein
+4936652|Wurzbach
+4936653|Lehesten Thüringer Wald
+4936691|Eisenberg Thüringen
+4936692|Bürgel
+4936693|Crossen an der Elster
+4936694|Schkölen Thüringen
+4936695|Söllmnitz
+4936701|Lichte
+4936702|Lauscha
+4936703|Gräfenthal
+4936704|Steinheid
+4936705|Oberweißbach Thüringer Wald
 493671|Saalfeld Saale
 493672|Rudolstadt
+4936730|Sitzendorf
+4936731|Unterloquitz
+4936732|Könitz
+4936733|Kaulsdorf
+4936734|Leutenberg
+4936735|Probstzella
+4936736|Arnsgereuth
+4936737|Drognitz
+4936738|Königsee
+4936739|Rottenbach
+4936741|Bad Blankenburg
+4936742|Uhlstädt
+4936743|Teichel
+4936744|Remda
 493675|Sonneberg Thüringen
+4936761|Heubisch
+4936762|Steinach Thüringen
+4936764|Neuhaus-Schierschnitz
+4936766|Schalkau
 493677|Ilmenau Thüringen
+4936781|Grossbreitenbach
+4936782|Schmiedefeld am Rennsteig
+4936783|Gehren Thüringen
+4936784|Stützerbach
+4936785|Gräfinau-Angstedt
 493679|Neuhaus am Rennweg
 493681|Suhl
 493682|Zella-Mehlis
 493683|Schmalkalden
+4936840|Trusetal
+4936841|Schleusingen
+4936842|Oberhof Thüringen
+4936843|Benshausen
+4936844|Rohr Thüringen
+4936845|Gehlberg
+4936846|Suhl-Dietzhausen
+4936847|Steinbach-Hallenberg
+4936848|Wernshausen
+4936849|Kleinschmalkalden
 493685|Hildburghausen
 493686|Eisfeld
+4936870|Masserberg
+4936871|Bad Colberg-Heldburg
+4936873|Themar
+4936874|Schönbrunn bei Hildburghaus
+4936875|Straufhain-Streufdorf
+4936878|Oberland
 493691|Eisenach Thüringen
+4936920|Grossenlupnitz
+4936921|Wutha-Farnroda
+4936922|Gerstungen
+4936923|Treffurt
+4936924|Mihla
+4936925|Marksuhl
+4936926|Creuzburg
+4936927|Unterellen
+4936928|Neuenhof Thüringen
+4936929|Ruhla
 493693|Meiningen
+4936940|Oepfershausen
+4936941|Wasungen
+4936943|Bettenhausen Thüringen
+4936944|Rentwertshausen
+4936945|Henneberg
+4936946|Erbenhausen Thüringen
+4936947|Jüchsen
+4936948|Römhild
+4936949|Obermaßfeld-Grimmenthal
 493695|Bad Salzungen
+4936961|Bad Liebenstein
+4936962|Vacha
+4936963|Dorndorf Rhön
+4936964|Dermbach Rhön
+4936965|Stadtlengsfeld
+4936966|Kaltennordheim
+4936967|Geisa
+4936968|Rossdorf Rhön
+4936969|Merkers
 49371|Chemnitz Sachsen
+4937200|Wittgensdorf bei Chemnitz
+4937202|Claussnitz bei Chemnitz
+4937203|Gersdorf bei Chemnitz
+4937204|Lichtenstein Sachsen
+4937206|Frankenberg Sachsen
+4937207|Hainichen Sachsen
+4937208|Auerswalde
+4937209|Einsiedel bei Chemnitz
 493721|Meinersdorf
 493722|Limbach-Oberfrohna
 493723|Hohenstein-Ernstthal
 493725|Zschopau
 493726|Flöha
 493727|Mittweida
+4937291|Augustusburg
+4937292|Oederan
+4937293|Eppendorf Sachsen
+4937294|Grünhainichen
+4937295|Lugau Erzgebirge
+4937296|Stollberg Erzgebirge
+4937297|Thum Sachsen
+4937298|Oelsnitz Erzgebirge
 493731|Freiberg Sachsen
+4937320|Mulda Sachsen
+4937321|Frankenstein Sachsen
+4937322|Brand-Erbisdorf
+4937323|Lichtenberg Erzgebirge
+4937324|Reinsberg Sachsen
+4937325|Niederbobritzsch
+4937326|Frauenstein Sachsen
+4937327|Rechenberg-Bienenmühle
+4937328|Grossschirma
+4937329|Grosshartmannsdorf
 493733|Annaberg-Buchholz
+4937341|Ehrenfriedersdorf
+4937342|Cranzahl
+4937343|Jöhstadt
+4937344|Crottendorf Sachsen
+4937346|Geyer
+4937347|Bärenstein Kreis Annaberg
+4937348|Oberwiesenthal Kurort
+4937349|Scheibenberg
 493735|Marienberg Sachsen
+4937360|Olbernhau
+4937361|Neuhausen Erzgebirge
+4937362|Seiffen Erzgebirge
+4937363|Zöblitz
+4937364|Reitzenhain Erzgebirge
+4937365|Sayda
+4937366|Rübenau
+4937367|Lengefeld Erzgebirge
+4937368|Deutschneudorf
+4937369|Wolkenstein
 493737|Rochlitz
+4937381|Penig
+4937382|Geringswalde
+4937383|Lunzenau
+4937384|Wechselburg
 493741|Plauen
+4937421|Oelsnitz Vogtland
+4937422|Markneukirchen
+4937423|Adorf Vogtland
+4937430|Eichigt
+4937431|Mehltheuer Vogtland
+4937432|Pausa Vogtland
+4937433|Gutenfürst
+4937434|Bobenneukirchen
+4937435|Reuth bei Plauen
+4937436|Weischlitz
+4937437|Bad Elster
+4937438|Bad Brambach
+4937439|Jocketa
 493744|Auerbach Vogtland
 493745|Falkenstein Vogtland
+4937462|Rothenkirchen Vogtland
+4937463|Bergen Vogtland
+4937464|Schöneck Vogtland
+4937465|Tannenbergsthal Vogtland
+4937467|Klingenthal Sachsen
+4937468|Treuen Vogtland
 49375|Zwickau
+4937600|Neumark Sachsen
+4937601|Mülsen Skt Jacob
+4937602|Kirchberg Sachsen
+4937603|Wildenfels
+4937604|Mosel
+4937605|Hartenstein Sachsen
+4937606|Lengenfeld Vogtland
+4937607|Ebersbrunn Sachsen
+4937608|Waldenburg Sachsen
+4937609|Wolkenburg Mulde
 493761|Werdau Sachsen
 493762|Crimmitschau
 493763|Glauchau
 493772|Schneeberg Erzgebirge
 493773|Johanngeorgenstadt
 493774|Schwarzenberg
+4937752|Eibenstock
+4937754|Zwönitz
+4937755|Schönheide Erzgebirge
+4937756|Breitenbrunn Erzgebirge
+4937757|Rittersgrün
 49381|Rostock
+4938201|Gelbensande
+4938202|Volkenshagen
+4938203|Bad Doberan
+4938204|Broderstorf
+4938205|Tessin bei Rostock
+4938206|Graal-Müritz Seeheilbad
+4938207|Stäbelow
+4938208|Kavelstorf
+4938209|Sanitz bei Rostock
 493821|Ribnitz-Damgarten
+4938220|Wustrow Ostseebad
+4938221|Marlow
+4938222|Semlow
+4938223|Saal Vorpom
+4938224|Gresenhorst
+4938225|Trinwillershagen
+4938226|Dierhagen Ostseebad
+4938227|Lüdershagen bei Barth
+4938228|Dettmannsdorf-Kölzow
+4938229|Bad Sülze
+4938231|Barth
+4938232|Zingst Ostseebad
+4938233|Prerow Ostseebad
+4938234|Born Darß
+4938292|Kröpelin
+4938293|Kühlungsborn Ostseebad
+4938294|Neubukow
+4938295|Satow bei Bad Doberan
+4938296|Rerik Ostseebad
+4938297|Moitin
+4938300|Insel Hiddensee
+4938301|Putbus
+4938302|Sagard
+4938303|Sellin Ostseebad
+4938304|Garz Rügen
+4938305|Gingst
+4938306|Samtens
+4938307|Poseritz
+4938308|Göhren Rügen
+4938309|Trent
 493831|Stralsund
+4938320|Tribsees
+4938321|Martensdorf bei Stralsund
+4938322|Richtenberg
+4938323|Prohn
+4938324|Velgast
+4938325|Rolofshagen
+4938326|Grimmen
+4938327|Elmenhorst Vorpom
+4938328|Miltzow
+4938331|Rakow Vorpom
+4938332|Gross Bisdorf
+4938333|Horst bei Grimmen
+4938334|Grammendorf
 493834|Greifswald
+4938351|Mesekenhagen
+4938352|Kemnitz bei Greifswald
+4938353|Gützkow bei Greifswald
+4938354|Wusterhusen
+4938355|Züssow
+4938356|Behrenhoff
 493836|Wolgast
+4938370|Kröslin
+4938371|Karlshagen
+4938372|Usedom
+4938373|Katzow
+4938374|Lassan bei Wolgast
+4938375|Koserow
+4938376|Zirchow
+4938377|Zinnowitz
+4938378|Heringsdorf Seebad
+4938379|Benz Usedom
 493838|Bergen auf Rügen
+4938391|Altenkirchen Rügen
+4938392|Sassnitz
+4938393|Binz Ostseebad
 493841|Wismar
+4938422|Neukloster
+4938423|Bad Kleinen
+4938424|Bobitz
+4938425|Kirchdorf Poel
+4938426|Neuburg-Steinhausen
+4938427|Blowatz
+4938428|Hohenkirchen bei Wismar
+4938429|Glasin
 493843|Güstrow
 493844|Schwaan
+4938450|Tarnow bei Bützow
+4938451|Hoppenrade bei Güstrow
+4938452|Lalendorf
+4938453|Mistorf
+4938454|Kritzkow
+4938455|Plaaz
+4938456|Langhagen bei Güstrow
+4938457|Krakow am See
+4938458|Zehna
+4938459|Laage
+4938461|Bützow
+4938462|Baumgarten
+4938464|Bernitt
+4938466|Jürgenshagen
 493847|Sternberg
+4938481|Witzin
+4938482|Warin
+4938483|Brüel
+4938484|Ventschow
+4938485|Dabel
+4938486|Gustävel
+4938488|Demen
 49385|Schwerin
 493860|Raben Steinfeld
 493861|Plate
 493868|Rastow
 493869|Dümmer
 493871|Parchim
+4938720|Grebbin
+4938721|Ziegendorf
+4938722|Raduhn
+4938723|Kladrum
+4938724|Siggelkow
+4938725|Gross Godems
+4938726|Spornitz
+4938727|Mestlin
+4938728|Domsühl
+4938729|Marnitz
+4938731|Lübz
+4938732|Gallin bei Lübz
+4938733|Karbow-Vietlübbe
+4938735|Plau am See
+4938736|Goldberg
+4938737|Ganzlin
+4938738|Karow bei Lübz
 493874|Ludwigslust
+4938750|Malliss
+4938751|Picher
+4938752|Zierzow bei Ludwigslust
+4938753|Wöbbelin
+4938754|Leussow bei Ludwigslust
+4938755|Eldena
+4938756|Grabow
+4938757|Neustadt-Glewe
+4938758|Dömitz
+4938759|Tewswoos
 493876|Perleberg
 493877|Wittenberge
+4938780|Lanz Brandenburg
+4938781|Mellen
+4938782|Reetz bei Perleberg
+4938783|Dallmin
+4938784|Kleinow Kreis Prignitz
+4938785|Berge bei Perleberg
+4938787|Glöwen
+4938788|Gross Warnow
+4938789|Wolfshagen bei Perleberg
+4938791|Bad Wilsnack
+4938792|Lenzen (Elbe)
+4938793|Dergenthin
+4938794|Cumlosen
+4938796|Viesecke
+4938797|Karstädt Kreis Prignitz
 493881|Grevesmühlen
+4938821|Lüdersdorf
+4938822|Diedrichshagen bei Grevesmühlen
+4938823|Selmsdorf
+4938824|Mallentin
+4938825|Klütz
+4938826|Dassow
+4938827|Kalkhorst
+4938828|Schönberg
 493883|Hagenow
+4938841|Neuhaus Elbe
+4938842|Lüttenmark
+4938843|Bennin
+4938844|Gülze
+4938845|Kaarssen
+4938847|Boizenburg Elbe
+4938848|Vellahn
+4938850|Gammelin
+4938851|Zarrentin
+4938852|Wittenburg
+4938853|Drönnewitz bei Hagenow
+4938854|Redefin
+4938855|Lübtheen
+4938856|Pritzier bei Hagenow
+4938858|Lassahn
+4938859|Alt Zachun
 493886|Gadebusch
+4938871|Mühlen Eichsen
+4938872|Rehna
+4938873|Carlow
+4938874|Lützow
+4938875|Schlagsdorf bei Gadebusch
+4938876|Roggendorf
+4939000|Beetzendorf
+4939001|Apenburg
+4939002|Oebisfelde
+4939003|Jübar
+4939004|Köckte bei Gardelegen
+4939005|Kusey
+4939006|Miesterhorst
+4939007|Tangeln
+4939008|Kunrau
+4939009|Badel
 493901|Salzwedel
 493902|Diesdorf Altm
+4939030|Brunau
+4939031|Dähre
+4939032|Mahlsdorf bei Salzwedel
+4939033|Wallstawe
+4939034|Fleetmark
+4939035|Kuhfelde
+4939036|Binde
+4939037|Pretzier
+4939038|Henningen
+4939039|Bonese
 493904|Haldensleben
+4939050|Bartensleben
+4939051|Calvörde
+4939052|Erxleben bei Haldensleben
+4939053|Süplingen
+4939054|Flechtingen
+4939055|Hörsingen
+4939056|Klüden
+4939057|Rätzlingen Sachsen-Anhalt
+4939058|Uthmöden
+4939059|Wegenstedt
+4939061|Weferlingen
+4939062|Bebertal
 493907|Gardelegen
+4939080|Kalbe Milde
+4939081|Kakerbeck Sachsen-Anhalt
+4939082|Mieste
+4939083|Messdorf
+4939084|Lindstedt
+4939085|Zichtau
+4939086|Jävenitz
+4939087|Jerchel Altmark
+4939088|Letzlingen
+4939089|Bismark Altmark
 493909|Klötze Altmark
 49391|Magdeburg
+4939200|Gommern
+4939201|Wolmirstedt
+4939202|Gross Ammensleben
+4939203|Barleben
+4939204|Niederndodeleben
+4939205|Langenweddingen
+4939206|Eichenbarleben
+4939207|Colbitz
+4939208|Loitsche
+4939209|Wanzleben
 493921|Burg bei Magdeburg
+4939221|Möckern bei Magdeburg
+4939222|Möser
+4939223|Theessen
+4939224|Büden
+4939225|Altengrabow
+4939226|Hohenziatz
 493923|Zerbst
+4939241|Leitzkau
+4939242|Prödel
+4939243|Nedlitz bei Zerbst
+4939244|Steutz
+4939245|Loburg
+4939246|Lindau Anh
+4939247|Güterglück
+4939248|Dobritz
 493925|Stassfurt
+4939262|Güsten Anh
+4939263|Unseburg
+4939264|Kroppenstedt
+4939265|Löderburg
+4939266|Förderstedt
+4939267|Schneidlingen
+4939268|Egeln
 493928|Schönebeck Elbe
+4939291|Calbe Saale
+4939292|Biederitz
+4939293|Dreileben
+4939294|Gross Rosenburg
+4939295|Zuchau
+4939296|Welsleben
+4939297|Eickendorf Kreis Schönebeck
+4939298|Barby Elbe
 493931|Stendal
+4939320|Schinne
+4939321|Arneburg
+4939322|Tangermünde
+4939323|Schönhausen Elbe
+4939324|Kläden bei Stendal
+4939325|Vinzelberg
+4939327|Klietz
+4939328|Rochau
+4939329|Möringen
 493933|Genthin
+4939341|Redekin
+4939342|Gladau
+4939343|Jerichow
+4939344|Güsen
+4939345|Parchen
+4939346|Tucheim
+4939347|Kade
+4939348|Klitsche
+4939349|Parey Elbe
 493935|Tangerhütte
+4939361|Lüderitz
+4939362|Grieben bei Tangerhütte
+4939363|Angern
+4939364|Dolle
+4939365|Bellingen bei Stendal
+4939366|Kehnert
 493937|Osterburg Altmark
+4939382|Kamern
+4939383|Sandau Elbe
+4939384|Arendsee Altmark
+4939386|Seehausen Altmark
+4939387|Havelberg
+4939388|Goldbeck Altm
+4939389|Schollene
+4939390|Iden
+4939391|Lückstedt
+4939392|Rönnebeck Sachsen-Anhalt
+4939393|Werben Elbe
+4939394|Hohenberg-Krusemark
+4939395|Wanzer
+4939396|Neukirchen Altmark
+4939397|Geestgottberg
+4939398|Gross Garz
+4939399|Kleinau
+4939400|Wefensleben
+4939401|Neuwegersleben
+4939402|Völpke
+4939403|Gröningen Sachsen-Anhalt
+4939404|Ausleben
+4939405|Hötensleben
+4939406|Harbke
+4939407|Seehausen Börde
+4939408|Hadmersleben
+4939409|Eilsleben
 493941|Halberstadt
+4939421|Osterwieck
+4939422|Badersleben
+4939423|Wegeleben
+4939424|Schwanebeck Sachsen-Anhalt
+4939425|Dingelstedt am Huy
+4939426|Hessen
+4939427|Ströbeck
+4939428|Pabstorf
 493943|Wernigerode
 493944|Blankenburg Harz
+4939451|Wasserleben
+4939452|Ilsenburg
+4939453|Derenburg
+4939454|Elbingerode Harz
+4939455|Schierke
+4939456|Altenbrak
+4939457|Benneckenstein Harz
+4939458|Heudeber
+4939459|Hasselfelde
 493946|Quedlinburg
 493947|Thale
+4939481|Hedersleben bei Aschersleben
+4939482|Gatersleben
+4939483|Ballenstedt
+4939484|Harzgerode
+4939485|Gernrode Harz
+4939487|Friedrichsbrunn
+4939488|Güntersberge
+4939489|Strassberg Harz
 493949|Oschersleben Bode
 49395|Neubrandenburg
+4939600|Zwiedorf
+4939601|Friedland
+4939602|Kleeth
+4939603|Burg Stargard
+4939604|Wildberg bei Altentreptow
+4939605|Gross Nemerow
+4939606|Glienke
+4939607|Kotelow
+4939608|Staven
 493961|Altentreptow
 493962|Penzlin bei Waren
 493963|Woldegk
 493968|Schönbeck
 493969|Siedenbollentin
 493971|Anklam
+4939721|Liepen bei Anklam
+4939722|Sarnow bei Anklam
+4939723|Krien
+4939724|Klein Bünzow
+4939726|Ducherow
+4939727|Spantekow
+4939728|Medow bei Anklam
 493973|Pasewalk
+4939740|Nechlin
+4939741|Jatznick
+4939742|Brüssow bei Pasewalk
+4939743|Zerrenthin
+4939744|Rothenklempenow
+4939745|Hetzdorf bei Strasburg
+4939746|Krackow
+4939747|Züsedom
+4939748|Viereck
+4939749|Grambow bei Pasewalk
+4939751|Penkun
+4939752|Blumenhagen bei Strasburg
+4939753|Strasburg
+4939754|Löcknitz Vorpom
 493976|Torgelow bei Ueckermünde
+4939771|Ueckermünde
+4939772|Rothemühl
+4939773|Altwarp
+4939774|Mönkebude
+4939775|Ahlbeck bei Torgelow
+4939776|Hintersee
+4939777|Borkenfriede
+4939778|Ferdinandshof bei Torgelow
+4939779|Eggesin
 493981|Neustrelitz
+4939820|Triepkendorf
+4939821|Carpin
+4939822|Kratzeburg
+4939823|Rechlin
+4939824|Hohenzieritz
+4939825|Wokuhl
+4939826|Blankensee bei Neustrelitz
+4939827|Schwarz bei Neustrelitz
+4939828|Wustrow Kreis Mecklenburg-Strelitz
+4939829|Blankenförde
+4939831|Feldberg
+4939832|Wesenberg
+4939833|Mirow Kreis Neustrelitz
 493984|Prenzlau
+4939851|Göritz bei Prenzlau
+4939852|Schönermark bei Prenzlau
+4939853|Holzendorf bei Prenzlau
+4939854|Kleptow
+4939855|Parmen-Weggun
+4939856|Beenz bei Prenzlau
+4939857|Drense
+4939858|Bietikow
+4939859|Fürstenwerder
+4939861|Gramzow bei Prenzlau
+4939862|Schmölln bei Prenzlau
+4939863|Seehausen bei Prenzlau
 493987|Templin
+4939881|Ringenwalde bei Templin
+4939882|Gollin
+4939883|Groß Dölln
+4939884|Hassleben bei Prenzlau
+4939885|Jakobshagen
+4939886|Milmersdorf
+4939887|Gerswalde
+4939888|Lychen
+4939889|Boitzenburg
 493991|Waren Müritz
+4939921|Ankershagen
+4939922|Dambeck bei Röbel
+4939923|Priborn
+4939924|Stuer
+4939925|Wredenhagen
+4939926|Grabowhöfe
+4939927|Nossentiner Hütte
+4939928|Möllenhagen
+4939929|Jabel bei Waren
+4939931|Röbel Müritz
+4939932|Malchow bei Waren
+4939933|Vollrathsruhe
+4939934|Groß Plasten
 493994|Malchin
+4939951|Faulenrost
+4939952|Grammentin
+4939953|Schwinkendorf
+4939954|Stavenhagen Reuterstadt
+4939955|Jürgenstorf
+4939956|Neukalen
+4939957|Gielow
+4939959|Dargun
 493996|Teterow
+4939971|Gnoien
+4939972|Walkendorf
+4939973|Altkalen
+4939975|Thürkow
+4939976|Groß Bützin
+4939977|Jördenstorf
+4939978|Gross Roge
 493998|Demmin
+4939991|Daberkow
+4939992|Görmin
+4939993|Hohenmocker
+4939994|Metschow
+4939995|Nossendorf
+4939996|Törpin
+4939997|Jarmen
+4939998|Loitz bei Demmin
+4939999|Tutow
 4940|Hamburg
 494101|Pinneberg
 494102|Ahrensburg
 499183|Burgthann
 499184|Deining Oberpfalz
 499185|Mühlhausen Oberpfalz
+499186|Lauterhofen Oberpfalz
+499187|Altdorf bei Nürnberg
+499188|Postbauer-Heng
+499189|Berg bei Neumarkt in der Oberpfalz
+499190|Heroldsbach
+499191|Forchheim Oberfranken
+499192|Gräfenberg
+499193|Höchstadt an der Aisch
+499194|Ebermannstadt
+499195|Adelsdorf Mittelfranken
+499196|Wiesenttal
+499197|Egloffstein
+499198|Heiligenstadt in Oberfranken
+499199|Kunreuth
+499201|Gesees
+499202|Waischenfeld
+499203|Neudrossenfeld
+499204|Plankenfels
+499205|Vorbach
+499206|Mistelgau-Obernsees
+499207|Königsfeld Oberfranken
+499208|Bindlach
+499209|Emtmannsberg
 49921|Bayreuth
+499220|Kasendorf-Azendorf
+499221|Kulmbach
+499222|Presseck
+499223|Rugendorf
+499225|Stadtsteinach
+499227|Neuenmarkt
+499228|Thurnau
+499229|Mainleus
+499231|Marktredwitz
+499232|Wunsiedel
+499233|Arzberg Oberfranken
+499234|Neusorg
+499235|Thierstein
+499236|Nagel
+499238|Röslau
+499241|Pegnitz
+499242|Gößweinstein
+499243|Pottenstein
+499244|Betzenstein
+499245|Obertrubach
+499246|Pegnitz-Trockau
+499251|Münchberg
+499252|Helmbrechts
+499253|Weissenstadt
+499254|Gefrees
+499255|Marktleugast
+499256|Stammbach
+499257|Zell Oberfranken
+499260|Wilhelmsthal Oberfranken
+499261|Kronach
+499262|Wallenfels
+499263|Ludwigsstadt
+499264|Küps
+499265|Pressig
+499266|Mitwitz
+499267|Nordhalben
+499268|Teuschnitz
+499269|Tettau Kreis Kronach
+499270|Creussen
+499271|Thurnau-Alladorf
+499272|Fichtelberg
+499273|Bad Berneck im Fichtelgebirge
+499274|Hollfeld
+499275|Speichersdorf
+499276|Bischofsgrün
+499277|Warmensteinach
+499278|Weidenberg
+499279|Mistelgau
+499280|Selbitz Oberfranken
+499281|Hof Saale
+499282|Naila
+499283|Rehau
+499284|Schwarzenbach an der Saale
+499285|Kirchenlamitz
+499286|Oberkotzau
+499287|Selb
+499288|Bad Steben
+499289|Schwarzenbach am Wald
+499292|Konradsreuth
+499293|Berg Oberfranken
+499294|Regnitzlosau
+499295|Töpen
+499302|Rottendorf Unterfranken
+499303|Eibelstadt
+499305|Estenfeld
+499306|Kist
+499307|Altertheim
 49931|Würzburg
+499321|Kitzingen
+499323|Iphofen
+499324|Dettelbach
+499325|Kleinlangheim
+499326|Markt Einersheim
+499331|Ochsenfurt
+499332|Marktbreit
+499333|Sommerhausen
+499334|Giebelstadt
+499335|Aub Kreis Würzburg
+499336|Bütthard
+499337|Gaukönigshofen
+499338|Röttingen Unterfranken
+499339|Ippesheim
+499340|Königheim-Brehmen
+499341|Tauberbischofsheim
+499342|Wertheim
+499343|Lauda-Königshofen
+499344|Gerchsheim
+499345|Külsheim Baden
+499346|Grünsfeld
+499347|Wittighausen
+499348|Werbach-Gamburg
+499349|Werbach-Wenkheim
+499350|Eussenheim-Hundsbach
+499351|Gemünden am Main
+499352|Lohr am Main
+499353|Karlstadt
+499354|Rieneck
+499355|Frammersbach
+499356|Burgsinn
+499357|Gräfendorf Bayern
+499358|Gössenheim
+499359|Karlstadt-Wiesenfeld
+499360|Thüngen
+499363|Arnstein Unterfranken
+499364|Zellingen
+499365|Rimpar
+499366|Geroldshausen Unterfranken
+499367|Unterpleichfeld
+499369|Uettingen
+499371|Miltenberg
+499372|Klingenberg am Main
+499373|Amorbach
+499374|Eschau
+499375|Freudenberg Baden
+499376|Collenberg
+499377|Freudenberg-Boxtal
+499378|Eichenbühl-Riedern
+499381|Volkach
+499382|Gerolzhofen
+499383|Wiesentheid
+499384|Schwanfeld
+499385|Kolitzheim
+499386|Prosselsheim
+499391|Marktheidenfeld
+499392|Faulbach Unterfranken
+499393|Rothenfels Unterfranken
+499394|Esselbach
+499395|Triefenstein
+499396|Urspringen bei Lohr
+499397|Wertheim-Dertingen
+499398|Birkenfeld bei Würzburg
+499401|Neutraubling
+499402|Regenstauf
+499403|Donaustauf
+499404|Nittendorf
+499405|Bad Abbach
+499406|Mintraching
+499407|Wenzenbach
+499408|Altenthann
+499409|Pielenhofen
 49941|Regensburg
+499420|Feldkirchen Niederbayern
+499421|Straubing
+499422|Bogen Niederbayern
+499423|Geiselhöring
+499424|Strasskirchen
+499426|Oberschneiding
+499427|Leiblfing
+499428|Kirchroth
+499429|Rain Niederbayern
+499431|Schwandorf
+499433|Nabburg
+499434|Bodenwöhr
+499435|Schwarzenfeld
+499436|Nittenau
+499438|Fensterbach
+499439|Neunburg-Kemnath
+499441|Kelheim
+499442|Riedenburg
+499443|Abensberg
+499444|Siegenburg
+499445|Neustadt an der Donau
+499446|Altmannstein
+499447|Essing
+499448|Hausen Niederbayern
+499451|Schierling
+499452|Langquaid
+499453|Thalmassing
+499454|Aufhausen Oberpfalz
+499461|Roding
+499462|Falkenstein Oberpfalz
+499463|Wald Oberpfalz
+499464|Walderbach
+499465|Neukirchen-Balbini
+499466|Stamsried
+499467|Michelsneukirchen
+499468|Zell Oberpfalz
+499469|Roding-Neubäu
+499471|Burglengenfeld
+499472|Hohenfels Oberpfalz
+499473|Kallmünz
+499474|Schmidmühlen
+499480|Sünching
+499481|Pfatter
+499482|Wörth an der Donau
+499484|Brennberg
+499491|Hemau
+499492|Parsberg
+499493|Beratzhausen
+499495|Breitenbrunn Oberpfalz
+499497|Seubersdorf in der Oberpfalz
+499498|Laaber
+499499|Painten
+499502|Frensdorf
+499503|Oberhaid Oberfranken
+499504|Stadelhofen
+499505|Litzendorf
 49951|Bamberg
+499521|Hassfurt
+499522|Eltmann
+499523|Hofheim in Unterfranken
+499524|Zeil am Main
+499525|Königsberg in Bayern
+499526|Riedbach
+499527|Knetzgau
+499528|Donnersdorf
+499529|Oberaurach
+499531|Ebern
+499532|Maroldsweisach
+499533|Untermerzbach
+499534|Burgpreppach
+499535|Pfarrweisach
+499536|Kirchlauter
+499542|Schesslitz
+499543|Hirschaid
+499544|Baunach
+499545|Buttenheim
+499546|Burgebrach
+499547|Zapfendorf
+499548|Mühlhausen Mittelfranken
+499549|Lisberg
+499551|Burgwindheim
+499552|Burghaslach
+499553|Ebrach Oberfranken
+499554|Untersteinbach Unterfranken
+499555|Schlüsselfeld-Aschbach
+499556|Geiselwind
+499560|Grub am Forst
+499561|Coburg
+499562|Sonnefeld
+499563|Rödental
+499564|Bad Rodach
+499565|Untersiemau
+499566|Meeder
+499567|Seßlach-Gemünda
+499568|Neustadt bei Coburg
+499569|Sesslach
+499571|Lichtenfels Bayern
+499572|Burgkunstadt
+499573|Staffelstein Oberfranken
+499574|Marktzeuln
+499575|Weismain
+499576|Lichtenfels-Isling
+499602|Neustadt an der Waldnaab
+499603|Floss
+499604|Wernberg-Köblitz
+499605|Weiherhammer
+499606|Pfreimd
+499607|Luhe-Wildenau
+499608|Kohlberg Oberpfalz
 49961|Weiden in der Oberpfalz
+499621|Amberg Oberpfalz
+499622|Hirschau Oberpfalz
+499624|Ensdorf Oberpfalz
+499625|Kastl bei Amberg
+499626|Hohenburg
+499627|Freudenberg Oberpfalz
+499628|Ursensollen
+499631|Tirschenreuth
+499632|Waldsassen
+499633|Mitterteich
+499634|Wiesau
+499635|Bärnau
+499636|Plößberg
+499637|Falkenberg Oberpfalz
+499638|Neualbenreuth
+499639|Mähring
+499641|Grafenwöhr
+499642|Kemnath Stadt
+499643|Auerbach in der Oberpfalz
+499644|Pressath
+499645|Eschenbach in der Oberpfalz
+499646|Freihung
+499647|Kirchenthumbach
+499648|Neustadt am Kulm
+499651|Vohenstrauss
+499652|Waidhaus
+499653|Eslarn
+499654|Pleystein
+499655|Tännesberg
+499656|Moosbach bei Vohenstrauß
+499657|Waldthurn
+499658|Georgenberg
+499659|Leuchtenberg
+499661|Sulzbach-Rosenberg
+499662|Vilseck
+499663|Neukirchen bei Sulzbach-Rosenberg
+499664|Hahnbach
+499665|Königstein Oberpfalz
+499666|Illschwang
+499671|Oberviechtach
+499672|Neunburg vorm Wald
+499673|Tiefenbach Oberpfalz
+499674|Schönsee
+499675|Altendorf am Nabburg
+499676|Winklarn
+499677|Oberviechtach-Pullenried
+499681|Windischeschenbach
+499682|Erbendorf
+499683|Friedenfels
+499701|Sandberg Unterfranken
+499704|Euerdorf
+499708|Bad Bocklet
 49971|Bad Kissingen
+499720|Üchtelhausen
+499721|Schweinfurt
+499722|Werneck
+499723|Röthlein
+499724|Stadtlauringen
+499725|Poppenhausen Unterfranken
+499726|Euerbach
+499727|Schonungen-Marktsteinach
+499728|Wülfershausen Unterfranken
+499729|Grettstadt
+499732|Hammelburg
+499733|Münnerstadt
+499734|Burkardroth
+499735|Massbach
+499736|Oberthulba
+499737|Wartmannsroth
+499738|Rottershausen
+499741|Bad Brückenau
+499742|Kalbach Rhön
+499744|Zeitlofs-Detter
+499745|Wildflecken
+499746|Zeitlofs
+499747|Geroda Bayern
+499748|Motten
+499749|Oberbach Unterfranken
+499761|Bad Königshofen im Grabfeld
+499762|Saal an der Saale
+499763|Sulzdorf an der Lederhecke
+499764|Höchheim
+499765|Trappstadt
+499766|Grosswenkheim
+499771|Bad Neustadt an der Saale
+499772|Bischofsheim an der Rhön
+499773|Unsleben
+499774|Oberelsbach
+499775|Schönau an der Brend
+499776|Mellrichstadt
+499777|Ostheim von der Rhön
+499778|Fladungen
+499779|Nordheim von der Rhön
+499802|Ansbach-Katterbach
+499803|Colmberg
+499804|Aurach
+499805|Burgoberbach
 49981|Ansbach
+499820|Lehrberg
+499822|Bechhofen an der Heide
+499823|Leutershausen
+499824|Dietenhofen
+499825|Herrieden
+499826|Weidenbach Mittelfranken
+499827|Lichtenau Mittelfranken
+499828|Rügland
+499829|Flachslanden
+499831|Gunzenhausen
+499832|Wassertrüdingen
+499833|Heidenheim Mittelfranken
+499834|Theilenhofen
+499835|Ehingen Mittelfranken
+499836|Gunzenhausen-Cronheim
+499837|Haundorf
+499841|Bad Windsheim
+499842|Uffenheim
+499843|Burgbernheim
+499844|Obernzenn
+499845|Oberdachstetten
+499846|Ipsheim
+499847|Ergersheim
+499848|Simmershofen
+499851|Dinkelsbühl
+499852|Feuchtwangen
+499853|Wilburgstetten
+499854|Wittelshofen
+499855|Dentlein am Forst
+499856|Dürrwangen
+499857|Schopfloch Mittelfranken
+499861|Rothenburg ob der Tauber
+499865|Adelshofen Mittelfranken
+499867|Geslau
+499868|Schillingsfürst
+499869|Wettringen Mittelfranken
+499871|Windsbach
+499872|Heilsbronn
+499873|Abenberg-Wassermungenau
+499874|Neuendettelsau
+499875|Wolframs-Eschenbach
+499876|Rohr Mittelfranken
+499901|Hengersberg Bayern
+499903|Schöllnach
+499904|Lalling
+499905|Bernried Niederbayern
+499906|Mariaposching
+499907|Zenting
+499908|Schöfweg
 49991|Deggendorf
+499920|Bischofsmais
+499921|Regen
+499922|Zwiesel
+499923|Teisnach
+499924|Bodenmais
+499925|Bayerisch Eisenstein
+499926|Frauenau
+499927|Kirchberg Wald
+499928|Kirchdorf im Wald
+499929|Ruhmannsfelden
+499931|Plattling
+499932|Osterhofen
+499933|Wallersdorf
+499935|Stephansposching
+499936|Wallerfing
+499937|Oberpöring
+499938|Moos Niederbayern
+499941|Kötzting
+499942|Viechtach
+499943|Lam Oberpfalz
+499944|Miltach
+499945|Arnbruck
+499946|Hohenwarth bei Kötzing
+499947|Neukirchen bei Hl Blut
+499948|Eschlkam
+499951|Landau an der Isar
+499952|Eichendorf
+499953|Pilsting
+499954|Simbach Niederbayern
+499955|Mamming
+499956|Eichendorf-Aufhausen
+499961|Mitterfels
+499962|Schwarzach Niederbayern
+499963|Konzell
+499964|Stallwang
+499965|Sankt Englmar
+499966|Wiesenfelden
+499971|Cham
+499972|Waldmünchen
+499973|Furth im Wald
+499974|Traitsching
+499975|Waldmünchen-Geigant
+499976|Rötz
+499977|Arnschwang
+499978|Schönthal Oberpfalz
diff --git a/resources/geocoding/en/81.txt b/resources/geocoding/en/81.txt
new file mode 100644 (file)
index 0000000..e57cd6d
--- /dev/null
@@ -0,0 +1,1546 @@
+# Copyright (C) 2011 The Libphonenumber Authors
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Generated from:
+# ja/81.txt and translated with Freebase.
+
+8111|Sapporo, Hokkaido
+811232|Chitose, Hokkaido
+811233|Chitose, Hokkaido
+811234|Chitose, Hokkaido
+811235|Yubari, Hokkaido
+811236|Chitose, Hokkaido
+811237|Kuriyama, Hokkaido
+811238|Kuriyama, Hokkaido
+8112390|Yubari, Hokkaido
+8112391|Yubari, Hokkaido
+8112392|Yubari, Hokkaido
+8112393|Yubari, Hokkaido
+8112394|Yubari, Hokkaido
+8112395|Kuriyama, Hokkaido
+8112396|Kuriyama, Hokkaido
+8112397|Kuriyama, Hokkaido
+8112398|Kuriyama, Hokkaido
+8112399|Kuriyama, Hokkaido
+81124|Ashibetsu, Hokkaido
+81125|Takikawa, Hokkaido
+81126|Iwamizawa, Hokkaido
+811332|Tobetsu, Hokkaido
+811333|Tobetsu, Hokkaido
+811336|Ishikari, Hokkaido
+811337|Ishikari, Hokkaido
+81134|Otaru, Hokkaido
+811352|Yoichi, Hokkaido
+811353|Yoichi, Hokkaido
+811354|Yoichi, Hokkaido
+811356|Iwanai, Hokkaido
+811357|Iwanai, Hokkaido
+811362|Kutchan, Hokkaido
+811363|Kutchan, Hokkaido
+811364|Kutchan, Hokkaido
+811365|Kutchan, Hokkaido
+811366|Rusutsu, Hokkaido
+811367|Rusutsu, Hokkaido
+811372|Shikabe, Hokkaido
+811374|Aomori, Aomori
+811375|Yakumo, Hokkaido
+811376|Yakumo, Hokkaido
+811377|Yakumo, Hokkaido
+811378|Imakane, Hokkaido
+81138|Hakodate, Hokkaido
+811392|Kikonai, Hokkaido
+811393|Matsumae, Hokkaido
+811394|Matsumae, Hokkaido
+811395|Esashi, Hokkaido
+811396|Esashi, Hokkaido
+811397|Okushiri, Hokkaido
+811398|Kumaishi, Hokkaido
+81142|Date, Hokkaido
+81143|Muroran, Hokkaido
+81144|Tomakomai, Hokkaido
+811452|Hayakita, Hokkaido
+811453|Hayakita, Hokkaido
+811454|Mukawa, Hokkaido
+811455|Mukawa, Hokkaido
+811456|
+811457|
+811462|Urakawa, Hokkaido
+811463|Urakawa, Hokkaido
+811464|Shizunai, Hokkaido
+811465|Shizunai, Hokkaido
+811466|Erimo, Hokkaido
+811522|Shari, Hokkaido
+811523|Shari, Hokkaido
+811524|Abashiri, Hokkaido
+811525|Abashiri, Hokkaido
+811526|Abashiri, Hokkaido
+811527|Bihoro, Hokkaido
+811528|Bihoro, Hokkaido
+811532|Nemuro, Hokkaido
+811533|Nemuro, Hokkaido
+811534|Nakashibetsu, Hokkaido
+811535|Akkeshi, Hokkaido
+811536|Akkeshi, Hokkaido
+811537|Nakashibetsu, Hokkaido
+811538|
+811539|
+811541|Teshikaga, Hokkaido
+811542|Kushiro, Hokkaido
+811543|Kushiro, Hokkaido
+811544|Kushiro, Hokkaido
+811545|Kushiro, Hokkaido
+811546|Kushiro, Hokkaido
+811547|Shiranuka, Hokkaido
+811548|Teshikaga, Hokkaido
+811549|Kushiro, Hokkaido
+811551|
+811552|Obihiro, Hokkaido
+811553|Obihiro, Hokkaido
+811554|Obihiro, Hokkaido
+811555|Obihiro, Hokkaido
+811556|Obihiro, Hokkaido
+811557|
+811558|Hiroo, Hokkaido
+811559|Obihiro, Hokkaido
+811562|Honbetsu, Hokkaido
+811563|Honbetsu, Hokkaido
+811564|Kamishihoro, Hokkaido
+811566|
+811567|
+81157|Kitami, Hokkaido
+811582|Monbetsu, Hokkaido
+811583|Monbetsu, Hokkaido
+811584|Engaru, Hokkaido
+811585|Engaru, Hokkaido
+811586|
+811587|
+811588|Okoppe, Hokkaido
+811589|Okoppe, Hokkaido
+81162|Wakkanai, Hokkaido
+811632|Teshio, Hokkaido
+811634|Hamatonbetsu, Hokkaido
+811635|Hamatonbetsu, Hokkaido
+811636|
+811637|
+811638|
+811639|
+811642|
+811643|
+811644|Rumoi, Hokkaido
+811645|Rumoi, Hokkaido
+811646|Haboro, Hokkaido
+811647|Haboro, Hokkaido
+811648|
+811652|Shibetsu, Hokkaido
+811653|Shibetsu, Hokkaido
+811654|Nayoro, Hokkaido
+811655|Nayoro, Hokkaido
+811656|Bifuka, Hokkaido
+811658|Kamikawa, Hokkaido
+81166|Asahikawa, Hokkaido
+81167|Furano, Hokkaido
+81172|Hirosaki, Aomori
+811732|Goshogawara, Aomori
+811733|Goshogawara, Aomori
+811734|Goshogawara, Aomori
+811735|Goshogawara, Aomori
+811736|Goshogawara, Aomori
+811737|
+811738|
+81174|Kanita, Aomori
+811752|Mutsu, Aomori
+811753|Mutsu, Aomori
+811754|Mutsu, Aomori
+811756|Noheji, Aomori
+811757|Noheji, Aomori
+81176|Towada, Aomori
+81177|Aomori, Aomori
+81178|Hachinohe, Aomori
+81179|Sannohe, Aomori
+81182|Yokote, Akita
+81183|Yuzawa, Akita
+81184|Honjo, Akita
+811852|Oga, Akita
+811853|Oga, Akita
+811854|Oga, Akita
+811855|Noshiro, Akita
+811856|Noshiro, Akita
+811857|Noshiro, Akita
+811858|Noshiro, Akita
+811862|Kazuno, Akita
+811863|Kazuno, Akita
+811864|Odate, Akita
+811865|Odate, Akita
+811866|Takanosu, Akita
+811867|Takanosu, Akita
+811868|Takanosu, Akita
+811869|Odate, Akita
+811873|Kakunodate, Akita
+811874|Kakunodate, Akita
+811875|Kakunodate, Akita
+811876|Omagari, Akita
+811877|Omagari, Akita
+811878|Omagari, Akita
+81188|Akita, Akita
+81191|Ichinoseki, Iwate
+81192|Ofunato, Iwate
+811932|Kamaishi, Iwate
+811933|Kamaishi, Iwate
+811934|Kamaishi, Iwate
+811935|Kamaishi, Iwate
+811936|Miyako, Iwate
+811937|Miyako, Iwate
+811938|Miyako, Iwate
+811939|Miyako, Iwate
+811942|Iwaizumi, Iwate
+811943|Iwaizumi, Iwate
+811944|Iwaizumi, Iwate
+811945|Kuji, Iwate
+811946|Kuji, Iwate
+811947|Kuji, Iwate
+811952|Ninohe, Iwate
+811953|Ninohe, Iwate
+811954|Ninohe, Iwate
+811955|Ninohe, Iwate
+811956|Iwate, Iwate
+811957|Iwate, Iwate
+811958|Iwate, Iwate
+81196|Morioka, Iwate
+811972|Mizusawa, Iwate
+811973|Mizusawa, Iwate
+811974|Mizusawa, Iwate
+811975|Mizusawa, Iwate
+811976|Kitakami, Iwate
+811977|Kitakami, Iwate
+811978|Kitakami, Iwate
+811982|Hanamaki, Iwate
+811983|Hanamaki, Iwate
+811984|Hanamaki, Iwate
+811986|Tono, Iwate
+811987|Tono, Iwate
+81199|Morioka, Iwate
+81220|Ohasama, Iwate
+81222|Sendai, Miyagi
+812230|Sendai, Miyagi
+812232|Iwanuma, Miyagi
+812233|Iwanuma, Miyagi
+812234|Sendai, Miyagi
+812235|Sendai, Miyagi
+812236|Sendai, Miyagi
+812237|Sendai, Miyagi
+812238|Sendai, Miyagi
+812239|Sendai, Miyagi
+812242|Shiroishi, Saga
+812243|Shiroishi, Saga
+812244|Shiroishi, Saga
+812245|Ogawara, Miyagi
+812246|Ogawara, Miyagi
+812247|Ogawara, Miyagi
+812248|Ogawara, Miyagi
+81225|Ishinomaki, Miyagi
+81226|Kesennuma, Miyagi
+81227|Sendai, Miyagi
+81228|
+81229|Kakogawa, Hyogo
+81233|Shinjo, Yamagata
+81234|Sakata, Yamagata
+81235|Tsuruoka, Yamagata
+81236|Yamagata, Yamagata
+812372|Yamate, Okayama
+812373|Yamate, Okayama
+812374|Yamate, Okayama
+812375|Yamate, Okayama
+812376|Sagae, Yamagata
+812377|Sagae, Yamagata
+812378|Sagae, Yamagata
+812382|Yonezawa, Yamagata
+812383|Yonezawa, Yamagata
+812384|Yonezawa, Yamagata
+812385|Yonezawa, Yamagata
+812386|Nagai, Yamagata
+812387|Nagai, Yamagata
+812388|Nagai, Yamagata
+812389|Yonezawa, Yamagata
+81240|
+812412|Kitakata, Fukushima
+812413|Kitakata, Fukushima
+812414|Yanaizu, Fukushima
+812415|Yanaizu, Fukushima
+812416|Etajima, Hiroshima
+812417|
+812418|
+8124190|Etajima, Hiroshima
+8124191|Etajima, Hiroshima
+8124192|Etajima, Hiroshima
+8124193|Etajima, Hiroshima
+8124194|Etajima, Hiroshima
+8124195|Etajima, Hiroshima
+8124196|Yanaizu, Fukushima
+8124197|Yanaizu, Fukushima
+8124198|Etajima, Hiroshima
+8124199|Etajima, Hiroshima
+81242|Aizuwakamatsu, Fukushima
+81243|Nihonmatsu, Fukushima
+81244|Nishihara, Okinawa
+81245|Fukushima, Fukushima
+81246|Iwaki, Fukushima
+812472|Ishikawa, Fukushima
+812473|Ishikawa, Fukushima
+812474|Ishikawa, Fukushima
+812475|Ishikawa, Fukushima
+812476|Miharu, Fukushima
+812477|Miharu, Fukushima
+812478|Miharu, Fukushima
+812482|Shirakawa, Fukushima
+812483|Shirakawa, Fukushima
+812484|Shirakawa, Fukushima
+812485|Shirakawa, Fukushima
+812486|Sukagawa, Fukushima
+812487|Sukagawa, Fukushima
+812488|Sukagawa, Fukushima
+812489|Sukagawa, Fukushima
+81249|Koriyama, Fukushima
+81250|Niitsu, Niigata
+81252|Niigata, Niigata
+81253|Niigata, Niigata
+812542|Shibata, Niigata
+812543|Shibata, Niigata
+812544|Shibata, Niigata
+812545|Ueno, Gunma
+812546|Ueno, Gunma
+812547|Ueno, Gunma
+8125480|Ueno, Gunma
+8125481|Ueno, Gunma
+8125482|Ueno, Gunma
+8125483|Ueno, Gunma
+8125484|Ueno, Gunma
+8125485|Nakatsugawa, Gifu
+8125486|Nakatsugawa, Gifu
+8125487|Nakatsugawa, Gifu
+8125488|Nakatsugawa, Gifu
+8125489|Nakatsugawa, Gifu
+812549|Nakatsugawa, Gifu
+812550|Yasuzuka, Niigata
+812551|Joetsu, Niigata
+812552|Joetsu, Niigata
+812553|Joetsu, Niigata
+812554|Joetsu, Niigata
+812555|Itoigawa, Niigata
+812556|Itoigawa, Niigata
+812557|
+812558|
+812559|Yasuzuka, Niigata
+812560|Itoigawa, Niigata
+812562|Sanjo, Niigata
+812563|Sanjo, Niigata
+812564|Sanjo, Niigata
+812565|Sanjo, Niigata
+812566|Sanjo, Niigata
+812567|Ishinomaki, Miyagi
+812568|Ishinomaki, Miyagi
+812569|Ishinomaki, Miyagi
+812570|
+812571|Muika, Niigata
+812572|Kashiwazaki, Niigata
+812573|Kashiwazaki, Niigata
+812574|Kashiwazaki, Niigata
+812575|Tokamachi, Niigata
+812576|Tokamachi, Niigata
+812577|Muika, Niigata
+812578|Muika, Niigata
+812579|
+812580|Tokamachi, Niigata
+812582|Nagaoka, Niigata
+812583|Nagaoka, Niigata
+812584|Nagaoka, Niigata
+812585|Nagaoka, Niigata
+812586|Nagaoka, Niigata
+812587|Nagaoka, Niigata
+812588|Nagaoka, Niigata
+812589|Nagaoka, Niigata
+81259|Sado, Niigata
+81260|Anan, Nagano
+812612|Daisen, Tottori
+812613|Daisen, Tottori
+812614|Daisen, Tottori
+812615|Daisen, Tottori
+812616|Daisen, Tottori
+8126170|Daisen, Tottori
+8126171|Daisen, Tottori
+8126172|Daisen, Tottori
+8126173|Daisen, Tottori
+8126174|Daisen, Tottori
+8126175|Daisen, Tottori
+8126176|Daisen, Tottori
+8126177|Nagano, Nagano
+8126178|Daisen, Tottori
+8126179|Daisen, Tottori
+812618|Daisen, Tottori
+812619|Daisen, Tottori
+81262|Nagano, Nagano
+81263|Matsumoto, Nagano
+812640|Nagano, Nagano
+812642|
+812643|
+812644|
+812645|
+812646|Nagano, Nagano
+812647|Nagano, Nagano
+812648|Nagano, Nagano
+812649|Nagano, Nagano
+812652|Iida, Nagano
+812653|Iida, Nagano
+812654|Iida, Nagano
+812655|Iida, Nagano
+812656|Ina, Nagano
+812657|Ina, Nagano
+812658|Ina, Nagano
+812659|Ina, Nagano
+81266|Suwa, Nagano
+812672|Komoro, Nagano
+812673|Komoro, Nagano
+812674|Komoro, Nagano
+812675|Saku, Nagano
+812676|Saku, Nagano
+812677|Saku, Nagano
+812678|Saku, Nagano
+812679|Saku, Nagano
+81268|Asahikawa, Hokkaido
+812692|Nakano, Tokyo
+812693|Nakano, Tokyo
+812694|Nakano, Tokyo
+812695|Nakano, Tokyo
+812696|Iiyama, Nagano
+812697|Iiyama, Nagano
+812698|Iiyama, Nagano
+81270|Isesaki, Gunma
+81272|Maebashi, Gunma
+81273|Takasaki, Gunma
+812742|Fujioka, Gunma
+812743|Fujioka, Gunma
+812744|Fujioka, Gunma
+812745|Fujioka, Gunma
+812746|Tomioka, Fukushima
+812747|Tomioka, Fukushima
+812748|Tomioka, Fukushima
+81276|Ota, Gunma
+81277|Kiryu, Gunma
+812780|Maebashi, Gunma
+812782|Numata, Hokkaido
+812783|Numata, Hokkaido
+812784|Numata, Hokkaido
+812785|Numata, Hokkaido
+812786|Numata, Hokkaido
+812787|Numata, Hokkaido
+812788|Maebashi, Gunma
+812789|Maebashi, Gunma
+812792|Shibukawa, Gunma
+812793|Shibukawa, Gunma
+812794|Shibukawa, Gunma
+812795|Shibukawa, Gunma
+812796|Shibukawa, Gunma
+812797|Shibukawa, Gunma
+812798|Naganohara, Gunma
+812799|Naganohara, Gunma
+81280|Koga, Ibaraki
+81281|Utsunomiya, Tochigi
+81282|Tochigi, Tochigi
+812830|Utsunomiya, Tochigi
+812832|Sano, Tochigi
+812833|Utsunomiya, Tochigi
+812834|Utsunomiya, Tochigi
+812835|Sano, Tochigi
+812836|Sano, Tochigi
+812837|Sano, Tochigi
+812838|Sano, Tochigi
+812839|Sano, Tochigi
+81284|Ashikaga, Tochigi
+812852|Oyama, Shizuoka
+812853|Oyama, Shizuoka
+812854|Oyama, Shizuoka
+812855|Oyama, Shizuoka
+812856|Mooka, Tochigi
+812857|Mooka, Tochigi
+812858|Mooka, Tochigi
+812859|Oyama, Shizuoka
+81286|Utsunomiya, Tochigi
+812872|Otawara, Tochigi
+812873|Otawara, Tochigi
+812874|Otawara, Tochigi
+812875|Otawara, Tochigi
+812876|Kuroiso, Tochigi
+812877|Kuroiso, Tochigi
+812878|
+8128790|
+8128791|
+8128792|
+8128793|
+8128794|
+8128795|
+8128796|
+8128797|
+8128798|Otawara, Tochigi
+8128799|
+81288|Imabari, Ehime
+812890|Utsunomiya, Tochigi
+812892|Utsunomiya, Tochigi
+812893|Utsunomiya, Tochigi
+812894|Utsunomiya, Tochigi
+812895|Utsunomiya, Tochigi
+812896|Kanuma, Tochigi
+812897|Kanuma, Tochigi
+812898|Kanuma, Tochigi
+812899|Kanuma, Tochigi
+812911|Hokota, Ibaraki
+812913|Hokota, Ibaraki
+812914|Hokota, Ibaraki
+812917|Mito, Ibaraki
+81292|Mito, Ibaraki
+812930|Mito, Ibaraki
+812932|Takahagi, Ibaraki
+812933|Takahagi, Ibaraki
+812934|Takahagi, Ibaraki
+812935|Mito, Ibaraki
+812936|Mito, Ibaraki
+812937|Mito, Ibaraki
+812938|Mito, Ibaraki
+812939|Mito, Ibaraki
+81294|Hitachiota, Ibaraki
+812955|Hitachi-Omiya, Ibaraki
+812956|Hitachi-Omiya, Ibaraki
+812957|Daigo, Ibaraki
+812962|Shimodate, Ibaraki
+812963|Shimodate, Ibaraki
+812964|Shimodate, Ibaraki
+812965|Shimodate, Ibaraki
+812967|Kasama, Ibaraki
+812968|Kasama, Ibaraki
+812972|Shimizu, Hokkaido
+812973|Shimizu, Hokkaido
+812974|Shimizu, Hokkaido
+812975|Shimizu, Hokkaido
+812976|
+812977|
+812978|
+812979|
+81298|Tsuchiura, Ibaraki
+812992|Ishioka, Ibaraki
+812993|Ishioka, Ibaraki
+812994|Ishioka, Ibaraki
+812995|Ishioka, Ibaraki
+812996|Itako, Ibaraki
+812997|Itako, Ibaraki
+812998|Itako, Ibaraki
+812999|Itako, Ibaraki
+813|
+81420|Tokorozawa, Saitama
+814220|Kokubunji, Tokyo
+814222|
+814223|
+814224|
+814225|
+814226|
+814227|
+814228|
+814229|
+81423|Kokubunji, Tokyo
+814240|Kokubunji, Tokyo
+814241|
+814242|
+814243|
+814244|
+814245|
+814246|
+814247|
+814248|
+814249|
+81425|Tachikawa, Tokyo
+81426|Hachioji, Tokyo
+81427|Sagamihara, Kanagawa
+814280|Tachikawa, Tokyo
+814281|Sagamihara, Kanagawa
+814282|Ome, Tokyo
+814283|Ome, Tokyo
+814284|Tachikawa, Tokyo
+814285|Sagamihara, Kanagawa
+814286|Sagamihara, Kanagawa
+814287|Ome, Tokyo
+814288|Ome, Tokyo
+814289|Ome, Tokyo
+814290|Tokorozawa, Saitama
+814291|Hanno, Saitama
+814292|Tokorozawa, Saitama
+814293|Tokorozawa, Saitama
+814294|Tokorozawa, Saitama
+814295|Tokorozawa, Saitama
+814296|Tokorozawa, Saitama
+814297|Hanno, Saitama
+814298|Hanno, Saitama
+814299|Tokorozawa, Saitama
+81432|Chiba, Chiba
+81433|Chiba, Chiba
+81434|Chiba, Chiba
+81436|Odawara, Kanagawa
+81438|Kisarazu, Chiba
+81439|Kisarazu, Chiba
+8144|Kawasaki, Kanagawa
+8145|Yokohama, Kanagawa
+81460|Odawara, Kanagawa
+81462|Atsugi, Kanagawa
+81463|Hiratsuka, Kanagawa
+81464|Atsugi, Kanagawa
+81465|Odawara, Kanagawa
+81466|Fujisawa, Kanagawa
+81467|Fujisawa, Kanagawa
+81468|Yokosuka, Kanagawa
+814700|Kamogawa, Chiba
+814701|Kamogawa, Chiba
+814702|Tateyama, Chiba
+814703|Tateyama, Chiba
+814704|Tateyama, Chiba
+814705|Tateyama, Chiba
+814706|Ogawara, Miyagi
+814707|Ogawara, Miyagi
+814708|Ogawara, Miyagi
+814709|Kamogawa, Chiba
+81471|Kashiwa, Chiba
+81473|Kyoto, Kyoto
+81474|Funabashi, Chiba
+814752|Mobara, Chiba
+814753|Mobara, Chiba
+814754|Mobara, Chiba
+814755|Togane, Chiba
+814756|Togane, Chiba
+814757|Togane, Chiba
+814758|Togane, Chiba
+81476|Narita, Chiba
+814770|Kyoto, Kyoto
+814771|Kyoto, Kyoto
+814772|Kyoto, Kyoto
+814775|Funabashi, Chiba
+814776|Funabashi, Chiba
+814777|Funabashi, Chiba
+81478|Sawara, Chiba
+814792|Choshi, Chiba
+814793|Choshi, Chiba
+814794|Choshi, Chiba
+8147950|Yokaichiba, Chiba
+8147951|Choshi, Chiba
+8147952|Choshi, Chiba
+8147953|Choshi, Chiba
+8147954|Choshi, Chiba
+8147955|Yokaichiba, Chiba
+8147956|Choshi, Chiba
+8147957|Yokaichiba, Chiba
+8147958|Choshi, Chiba
+8147959|Choshi, Chiba
+814796|Yokaichiba, Chiba
+814797|Yokaichiba, Chiba
+814798|Yokaichiba, Chiba
+81480|Kuki, Saitama
+81482|Kawaguchi, Niigata
+81484|Kawaguchi, Niigata
+81485|Kumagaya, Saitama
+81486|Urawa, Saitama
+81487|Urawa, Saitama
+81488|Urawa, Saitama
+81489|Soka, Saitama
+81492|Kawagoe, Mie
+81493|
+81494|Chichibu, Saitama
+81495|Honjo, Saitama
+814992|
+814994|
+814996|
+814998|Ogasawara, Tokyo
+8152|Nagoya, Aichi
+81531|Odawara, Kanagawa
+81532|Toyohashi, Aichi
+81533|Toyohashi, Aichi
+81534|Hamamatsu, Shizuoka
+81535|Hamamatsu, Shizuoka
+815362|Shinshiro, Aichi
+815363|Shinshiro, Aichi
+815366|Shitara, Aichi
+815367|Shitara, Aichi
+815368|Shitara, Aichi
+81537|Kakegawa, Shizuoka
+81538|Iwata, Shizuoka
+815392|Hamamatsu, Shizuoka
+815393|Hamamatsu, Shizuoka
+815394|Hamamatsu, Shizuoka
+815395|Hamamatsu, Shizuoka
+8153960|Tenryu Ward, Hamamatsu
+8153961|Tenryu Ward, Hamamatsu
+8153962|Tenryu Ward, Hamamatsu
+8153963|Tenryu Ward, Hamamatsu
+8153964|Hamamatsu, Shizuoka
+8153965|Hamamatsu, Shizuoka
+8153966|Hamamatsu, Shizuoka
+8153967|Hamamatsu, Shizuoka
+8153968|Hamamatsu, Shizuoka
+8153969|Hamamatsu, Shizuoka
+8153970|Hamamatsu, Shizuoka
+8153971|Hamamatsu, Shizuoka
+8153972|Hamamatsu, Shizuoka
+8153973|Hamamatsu, Shizuoka
+8153974|Tenryu Ward, Hamamatsu
+8153975|Hamamatsu, Shizuoka
+8153976|Hamamatsu, Shizuoka
+8153977|Tenryu Ward, Hamamatsu
+8153978|Hamamatsu, Shizuoka
+8153979|Hamamatsu, Shizuoka
+815398|Hamamatsu, Shizuoka
+815399|Tenryu Ward, Hamamatsu
+81542|Mori, Shizuoka
+81543|Mori, Shizuoka
+81544|Fujinomiya, Shizuoka
+81545|Fuji, Shizuoka
+81546|Mori, Shizuoka
+81547|Etajima, Hiroshima
+81548|Haibara, Shizuoka
+81549|Mori, Shizuoka
+81550|Gotenba, Shizuoka
+81551|Nirasaki, Yamanashi
+81552|Kofu, Yamanashi
+81553|Nanbu, Yamanashi
+81554|Otsuki, Kochi
+81555|Fujiyoshida, Yamanashi
+815562|
+815563|
+815564|
+815565|
+815566|Minobu, Yamanashi
+81557|Ito, Shizuoka
+815582|Shimoda, Aomori
+815583|Shimoda, Aomori
+815584|Shimoda, Aomori
+815585|Shimoda, Aomori
+815586|Shimoda, Aomori
+815587|
+815588|
+815589|
+81559|Numazu, Shizuoka
+81561|Seto, Aichi
+81562|
+81563|Nishio, Aichi
+81564|Okazaki, Aichi
+81565|Toyota, Aichi
+81566|Kariya, Aichi
+81567|Tsushima, Aichi
+81568|Kasugai, Aichi
+81569|Handa, Aichi
+81572|Tajimi, Gifu
+815732|Ena, Gifu
+815733|Ena, Gifu
+815734|Ena, Gifu
+815735|Ena, Gifu
+815736|Nakatsugawa, Gifu
+815737|Nakatsugawa, Gifu
+815738|Nakatsugawa, Gifu
+815742|Minokamo, Gifu
+815743|Minokamo, Gifu
+815744|Minokamo, Gifu
+815745|Minokamo, Gifu
+815746|Minokamo, Gifu
+815747|
+815748|
+815752|Shimonoseki, Yamaguchi
+815753|Shimonoseki, Yamaguchi
+815754|Shimonoseki, Yamaguchi
+815755|Shimonoseki, Yamaguchi
+815756|
+815757|
+815758|
+815762|Gero, Gifu
+815763|Gero, Gifu
+815764|Gero, Gifu
+815765|Gero, Gifu
+815766|Gero, Gifu
+815767|Gero, Gifu
+815768|Gero, Gifu
+815769|Shokawa, Gifu
+81577|Takayama, Gifu
+81578|Kamioka, Akita
+81581|
+81582|Gifu, Gifu
+81583|Gifu, Gifu
+81584|Ogaki, Gifu
+81585|Ibigawa, Gifu
+81586|Ichinomiya, Chiba
+81587|Ichinomiya, Chiba
+81591|
+81592|
+81593|Yokkaichi, Mie
+81594|Kuwana, Mie
+815952|Asahikawa, Hokkaido
+815953|Asahikawa, Hokkaido
+815954|Asahikawa, Hokkaido
+815955|Asahikawa, Hokkaido
+815956|Asahikawa, Hokkaido
+815957|Asahikawa, Hokkaido
+815958|Kameyama, Mie
+815959|Kameyama, Mie
+81596|Ise, Mie
+815972|Owase, Mie
+815973|Owase, Mie
+815974|Owase, Mie
+815977|Kumano, Hiroshima
+815978|Kumano, Hiroshima
+815979|Kumano, Hiroshima
+815982|Matsusaka, Mie
+815983|Matsusaka, Mie
+815984|Matsusaka, Mie
+815985|Matsusaka, Mie
+815986|Matsusaka, Mie
+815987|
+815988|
+815992|Toba, Mie
+815993|Toba, Mie
+815994|Ago, Mie
+815995|Ago, Mie
+815996|Ago, Mie
+815997|Ago, Mie
+815998|Ago, Mie
+815999|
+816|Osaka, Osaka
+81721|Tondabayashi, Osaka
+81722|Sakai, Osaka
+817230|Neyagawa, Osaka
+817231|Sakai, Osaka
+817232|Sakai, Osaka
+817233|Sakai, Osaka
+817234|Sakai, Osaka
+817235|Sakai, Osaka
+817236|Sakai, Osaka
+817237|Sakai, Osaka
+817238|Neyagawa, Osaka
+817239|Neyagawa, Osaka
+81724|
+81725|Izumi, Osaka
+81726|Ibaraki, Osaka
+81727|Ikeda, Osaka
+81728|Neyagawa, Osaka
+81729|Yao, Osaka
+81734|Misato, Wakayama
+817352|Shingu, Fukuoka
+817353|Shingu, Fukuoka
+817354|Shingu, Fukuoka
+817355|Shingu, Fukuoka
+817356|Kushimoto, Wakayama
+817357|Kushimoto, Wakayama
+817362|
+817363|
+817364|
+817365|
+817366|Iwade, Wakayama
+817367|Iwade, Wakayama
+817368|Iwade, Wakayama
+81737|Yuasa, Wakayama
+81738|Gobo, Wakayama
+81739|Tanabe, Wakayama
+81740|Imazu, Shiga
+81742|Nara, Nara
+81743|Nara, Nara
+81744|Yamatotakada, Nara
+817452|Yamatotakada, Nara
+817453|Yamatotakada, Nara
+817454|Yamatotakada, Nara
+817455|Yamatotakada, Nara
+817456|Yamatotakada, Nara
+817457|Yamatotakada, Nara
+817458|
+817459|
+817463|Yoshino, Nara
+817464|Yoshino, Nara
+817465|Yoshino, Nara
+817466|Totsukawa, Nara
+817468|Kamikitayama, Nara
+817472|
+817473|
+817474|
+817475|Shimonoseki, Yamaguchi
+817476|Shimonoseki, Yamaguchi
+817482|Yokaichi, Shiga
+817483|Yokaichi, Shiga
+817484|Yokaichi, Shiga
+817485|Yokaichi, Shiga
+817486|Minakuchi, Shiga
+817487|Minakuchi, Shiga
+817488|Minakuchi, Shiga
+817492|Hikone, Shiga
+817493|Hikone, Shiga
+817494|Hikone, Shiga
+817495|Nagahama, Shiga
+817496|Nagahama, Shiga
+817497|Nagahama, Shiga
+817498|Nagahama, Shiga
+8175|
+817612|Komatsu, Ishikawa
+817613|Komatsu, Ishikawa
+817614|Komatsu, Ishikawa
+817615|Komatsu, Ishikawa
+817616|Komatsu, Ishikawa
+817617|Kaga, Ishikawa
+817618|Kaga, Ishikawa
+81762|Kanazawa, Ishikawa
+81763|Fukuno, Toyama
+81764|Toyama, Toyama
+81765|Uozu, Toyama
+81766|Takaoka, Toyama
+817672|Hakui, Ishikawa
+817673|Hakui, Ishikawa
+817674|Hakui, Ishikawa
+817675|Nanao, Ishikawa
+817676|Nanao, Ishikawa
+817677|Nanao, Ishikawa
+817678|Nanao, Ishikawa
+817682|Wajima, Ishikawa
+817683|Wajima, Ishikawa
+817684|Wajima, Ishikawa
+817685|Wajima, Ishikawa
+817686|Noto, Ishikawa
+817687|Noto, Ishikawa
+817688|Noto, Ishikawa
+817702|Tsuruga, Fukui
+817703|Tsuruga, Fukui
+817704|Tsuruga, Fukui
+817705|Obama, Fukui
+817706|Obama, Fukui
+817707|Obama, Fukui
+817712|Kameoka, Kyoto
+817713|Kameoka, Kyoto
+817714|Kameoka, Kyoto
+817715|Kameoka, Kyoto
+817716|Sonobe, Kyoto
+817717|Sonobe, Kyoto
+817718|Sonobe, Kyoto
+817722|Miyazu, Kyoto
+817723|Miyazu, Kyoto
+817724|Miyazu, Kyoto
+817725|Miyazu, Kyoto
+817726|
+817727|
+817728|
+817732|Fukuchiyama, Kyoto
+817733|Fukuchiyama, Kyoto
+817734|Fukuchiyama, Kyoto
+817735|Fukuchiyama, Kyoto
+817736|Maizuru, Kyoto
+817737|Maizuru, Kyoto
+817738|Maizuru, Kyoto
+81774|Uji, Kyoto
+81775|Otsu, Shiga
+81776|Fukui, Fukui
+81778|Takefu, Fukui
+81779|Ono, Fukui
+8178|Kobe, Hyogo
+817902|Kawasaki, Fukuoka
+817903|Kawasaki, Fukuoka
+817904|Kawasaki, Fukuoka
+817905|Kawasaki, Fukuoka
+817906|
+817907|
+817908|
+817912|Aioi, Hyogo
+817914|Aioi, Hyogo
+817915|Aioi, Hyogo
+817916|
+817917|
+81792|Himeji, Hyogo
+81793|Himeji, Hyogo
+817940|Kakogawa, Hyogo
+817942|Kakogawa, Hyogo
+817943|Kakogawa, Hyogo
+817944|Kakogawa, Hyogo
+817945|Kakogawa, Hyogo
+817946|Miki, Kagawa
+817947|Miki, Kagawa
+817948|Miki, Kagawa
+817949|Kakogawa, Hyogo
+817950|Omuta, Fukuoka
+817952|Nishiwaki, Hyogo
+817953|Nishiwaki, Hyogo
+817954|Nishiwaki, Hyogo
+817955|Omuta, Fukuoka
+817956|Omuta, Fukuoka
+817957|
+817958|
+817959|Omuta, Fukuoka
+817960|
+817962|Toyooka, Hyogo
+817963|Toyooka, Hyogo
+817964|Toyooka, Hyogo
+817965|Toyooka, Hyogo
+817966|
+817967|
+817968|Hamasaka, Hyogo
+817969|Hamasaka, Hyogo
+81797|Nishinomiya, Hyogo
+81798|Nishinomiya, Hyogo
+817992|Sumoto, Hyogo
+817993|Sumoto, Hyogo
+817994|Sumoto, Hyogo
+817995|Sumoto, Hyogo
+817996|Tsuna, Hyogo
+817997|Tsuna, Hyogo
+817998|Tsuna, Hyogo
+818202|Yanai, Yamaguchi
+818203|Yanai, Yamaguchi
+818204|Yanai, Yamaguchi
+818205|Yanai, Yamaguchi
+818206|Yanai, Yamaguchi
+818207|
+818208|
+81822|Hiroshima, Hiroshima
+81823|Kure, Hiroshima
+818240|Higashi-ku, Hiroshima
+818242|Higashi-ku, Hiroshima
+818243|Higashi-ku, Hiroshima
+818244|Miyoshi, Hiroshima
+818245|Miyoshi, Hiroshima
+818246|Miyoshi, Hiroshima
+818247|Shobara, Hiroshima
+818248|Shobara, Hiroshima
+818249|Higashi-ku, Hiroshima
+81825|Hiroshima, Hiroshima
+818262|Kake, Hiroshima
+818263|Kake, Hiroshima
+818264|
+818265|
+818266|Chiyoda, Tokyo
+818267|Chiyoda, Tokyo
+818268|Chiyoda, Tokyo
+81827|Iwakuni, Yamaguchi
+81828|Hiroshima, Hiroshima
+818290|Hiroshima, Hiroshima
+8182920|Hatsukaichi, Hiroshima
+8182921|Hiroshima, Hiroshima
+8182922|Hiroshima, Hiroshima
+8182923|Hiroshima, Hiroshima
+8182924|Hiroshima, Hiroshima
+8182925|Hiroshima, Hiroshima
+8182926|Hiroshima, Hiroshima
+8182927|Hiroshima, Hiroshima
+8182928|Hiroshima, Hiroshima
+8182929|Hiroshima, Hiroshima
+818293|Hatsukaichi, Hiroshima
+8182940|Hatsukaichi, Hiroshima
+8182941|Hiroshima, Hiroshima
+8182942|Hiroshima, Hiroshima
+8182943|Hiroshima, Hiroshima
+8182944|Hatsukaichi, Hiroshima
+8182945|Hatsukaichi, Hiroshima
+8182946|Hatsukaichi, Hiroshima
+8182947|Hatsukaichi, Hiroshima
+8182948|Hatsukaichi, Hiroshima
+8182949|Hatsukaichi, Hiroshima
+818295|Hatsukaichi, Hiroshima
+818296|Hiroshima, Hiroshima
+818297|Hatsukaichi, Hiroshima
+818298|Hatsukaichi, Hiroshima
+818299|Hiroshima, Hiroshima
+81832|Shimonoseki, Yamaguchi
+81833|Kudamatsu, Yamaguchi
+81834|Tokuyama, Yamaguchi
+81835|Hofu, Yamaguchi
+818360|Ogori, Yamaguchi
+818362|Ube, Yamaguchi
+818363|Ube, Yamaguchi
+818364|Ube, Yamaguchi
+818365|Ube, Yamaguchi
+818366|Ube, Yamaguchi
+818367|Ube, Yamaguchi
+818368|Ube, Yamaguchi
+818369|Ube, Yamaguchi
+818372|Nagato, Yamaguchi
+818373|Nagato, Yamaguchi
+818374|Nagato, Yamaguchi
+818375|Mine, Yamaguchi
+8183760|Mine, Yamaguchi
+8183761|Mine, Yamaguchi
+8183762|Mine, Yamaguchi
+8183763|Mine, Yamaguchi
+8183764|Mine, Yamaguchi
+8183765|Mine, Yamaguchi
+8183766|Shimonoseki, Yamaguchi
+8183767|Shimonoseki, Yamaguchi
+8183768|Shimonoseki, Yamaguchi
+8183769|Mine, Yamaguchi
+818377|Shimonoseki, Yamaguchi
+818378|Shimonoseki, Yamaguchi
+818382|Hagi, Yamaguchi
+818383|Hagi, Yamaguchi
+818384|Hagi, Yamaguchi
+818385|Hagi, Yamaguchi
+818387|Tamagawa, Yamaguchi
+818388|Tamagawa, Yamaguchi
+818390|Yamaguchi, Yamaguchi
+818391|Ogori, Yamaguchi
+818392|Yamaguchi, Yamaguchi
+818393|Yamaguchi, Yamaguchi
+818394|Yamaguchi, Yamaguchi
+818395|Yamaguchi, Yamaguchi
+818396|Yamaguchi, Yamaguchi
+818397|Ogori, Yamaguchi
+818398|Ogori, Yamaguchi
+818399|Yamaguchi, Yamaguchi
+81845|Innoshima, Hiroshima
+818462|Takehara, Hiroshima
+818463|Takehara, Hiroshima
+818464|Takehara, Hiroshima
+818466|Mima, Tokushima
+818467|Mima, Tokushima
+818472|
+818473|
+818474|Fuchu, Hiroshima
+818475|Fuchu, Hiroshima
+818476|Fuchu, Hiroshima
+818477|Tojo, Hiroshima
+818478|Tojo, Hiroshima
+818479|Tojo, Hiroshima
+81848|Onomichi, Hiroshima
+818490|Onomichi, Hiroshima
+818491|Fukuyama, Hiroshima
+818492|Fukuyama, Hiroshima
+8184930|Onomichi, Hiroshima
+8184931|Fukuyama, Hiroshima
+8184932|Fukuyama, Hiroshima
+8184933|Onomichi, Hiroshima
+8184934|Onomichi, Hiroshima
+8184935|Onomichi, Hiroshima
+8184936|Onomichi, Hiroshima
+8184937|Onomichi, Hiroshima
+8184938|Onomichi, Hiroshima
+8184939|Onomichi, Hiroshima
+818494|Fukuyama, Hiroshima
+818495|Fukuyama, Hiroshima
+818496|Fukuyama, Hiroshima
+818497|Fukuyama, Hiroshima
+818498|Fukuyama, Hiroshima
+818499|Fukuyama, Hiroshima
+818512|Nishigo, Fukushima
+818514|Ama, Shimane
+81852|Matsue, Shimane
+81853|Izumo, Shimane
+818542|Yasugi, Shimane
+818543|Yasugi, Shimane
+818544|Kisuki, Shimane
+818545|Kisuki, Shimane
+818546|Kakeya, Shimane
+818547|Kakeya, Shimane
+818548|
+818549|
+818552|Hamada, Shimane
+818553|Hamada, Shimane
+818554|Hamada, Shimane
+818555|Gotsu, Shimane
+818556|Gotsu, Shimane
+818557|Kawamoto, Shimane
+818558|Kawamoto, Shimane
+818559|Kawamoto, Shimane
+818562|Masuda, Shimane
+818563|Masuda, Shimane
+818564|Masuda, Shimane
+818565|Masuda, Shimane
+818567|Tsuwano, Shimane
+818568|Tsuwano, Shimane
+81857|Tottori, Tottori
+818582|Kurayoshi, Tottori
+818583|Kurayoshi, Tottori
+818584|Kurayoshi, Tottori
+818585|Kurayoshi, Tottori
+818586|Kurayoshi, Tottori
+818587|Koge, Tottori
+818588|Koge, Tottori
+818592|Yonago, Tottori
+818593|Yonago, Tottori
+818594|Yonago, Tottori
+818595|Yonago, Tottori
+818596|Yonago, Tottori
+818597|
+818598|
+81862|Okayama, Okayama
+81863|Tamano, Okayama
+81864|Kurashiki, Okayama
+818652|Kurashiki, Okayama
+818654|Kamogata, Okayama
+8186550|Kamogata, Okayama
+8186551|Kamogata, Okayama
+8186552|Kurashiki, Okayama
+8186553|Kurashiki, Okayama
+8186554|Kamogata, Okayama
+8186555|Kamogata, Okayama
+8186556|Kamogata, Okayama
+8186557|Kamogata, Okayama
+8186558|Kamogata, Okayama
+8186559|Kamogata, Okayama
+818656|Kasaoka, Okayama
+818657|Kasaoka, Okayama
+818660|Seto, Okayama
+818662|Takahashi, Okayama
+818663|Soja, Okayama
+818664|Takahashi, Okayama
+818665|Takahashi, Okayama
+818666|Ibara, Okayama
+818667|Ibara, Okayama
+818668|Ibara, Okayama
+8186690|Soja, Okayama
+8186691|Kurashiki, Okayama
+8186692|Soja, Okayama
+8186693|Soja, Okayama
+8186694|Soja, Okayama
+8186695|Soja, Okayama
+8186696|Soja, Okayama
+8186697|Kurashiki, Okayama
+8186698|Kurashiki, Okayama
+8186699|Soja, Okayama
+818672|
+818673|
+818674|Kuse, Okayama
+818675|Kuse, Okayama
+818676|Kuse, Okayama
+818677|Niimi, Okayama
+818678|Niimi, Okayama
+818679|Niimi, Okayama
+818680|Okayama, Okayama
+818682|Tsuyama, Okayama
+818683|Tsuyama, Okayama
+818684|Tsuyama, Okayama
+818685|Tsuyama, Okayama
+818686|Tsuyama, Okayama
+818687|Mimasaka, Okayama
+818688|Mimasaka, Okayama
+818689|Okayama, Okayama
+818690|Okayama, Okayama
+818692|Oku, Okayama
+818693|Oku, Okayama
+818694|Okayama, Okayama
+818695|Seto, Okayama
+818696|Bizen, Okayama
+818697|Bizen, Okayama
+818698|Bizen, Okayama
+8186992|Bizen, Okayama
+8186993|Bizen, Okayama
+8186994|Seto, Okayama
+8186995|Seto, Okayama
+8186996|Seto, Okayama
+8186997|Seto, Okayama
+8186998|Seto, Okayama
+8186999|Seto, Okayama
+81875|Kan'onji, Kagawa
+81877|Marugame, Kagawa
+81878|Takamatsu, Kagawa
+818792|
+818793|
+818794|
+818795|
+818796|Tonosho, Kagawa
+818797|Tonosho, Kagawa
+818798|Tonosho, Kagawa
+818802|
+818803|
+818804|
+818805|
+818806|Sukumo, Kochi
+818807|Sukumo, Kochi
+818808|Tosashimizu, Kochi
+8188090|
+8188091|
+8188092|
+8188093|
+8188094|
+8188095|Tosashimizu, Kochi
+8188096|Tosashimizu, Kochi
+8188097|Tosashimizu, Kochi
+8188098|Tosashimizu, Kochi
+8188099|Tosashimizu, Kochi
+818832|Kamojima, Tokushima
+818833|Kamojima, Tokushima
+818834|Kamojima, Tokushima
+818835|Mima, Tokushima
+818836|Mima, Tokushima
+818837|
+818838|
+818842|Anan, Nagano
+818843|Anan, Nagano
+818844|Anan, Nagano
+818845|
+818846|
+818847|
+818848|
+81885|Komatsushima, Tokushima
+81886|Tokushima, Tokushima
+818872|Muroto, Kochi
+818873|Aki, Kochi
+818874|Aki, Kochi
+818875|
+818876|
+818877|
+818878|
+818879|Muroto, Kochi
+81888|Kochi, Kochi
+818892|Sakawa, Kochi
+818893|Sakawa, Kochi
+818894|Susaki, Kochi
+818895|Susaki, Kochi
+818896|Susaki, Kochi
+81892|Kumakogen, Ehime
+81893|Ozu, Ehime
+818942|Yawatahama, Ehime
+818943|Yawatahama, Ehime
+818944|Yawatahama, Ehime
+818945|Yawatahama, Ehime
+818946|Uwajima, Ehime
+818947|Uwajima, Ehime
+818948|Uwajima, Ehime
+818949|Uwajima, Ehime
+818952|Uwajima, Ehime
+818953|Uwajima, Ehime
+818954|Uwajima, Ehime
+818955|Uwajima, Ehime
+818956|Uwajima, Ehime
+818957|Misho, Ehime
+818958|Misho, Ehime
+81896|Iyomishima, Ehime
+818972|Niihama, Ehime
+818973|Niihama, Ehime
+818974|Niihama, Ehime
+818975|Niihama, Ehime
+818976|Niihama, Ehime
+818977|Hakata, Ehime
+818978|Hakata, Ehime
+81898|Imabari, Ehime
+81899|Matsuyama, Ehime
+819204|
+819205|
+819208|
+81922|Fukuoka, Fukuoka
+819230|Fukuoka, Fukuoka
+819231|Fukuoka, Fukuoka
+819232|Maebaru, Fukuoka
+819233|Maebaru, Fukuoka
+819234|Fukuoka, Fukuoka
+819235|Fukuoka, Fukuoka
+819236|Fukuoka, Fukuoka
+819237|Fukuoka, Fukuoka
+819238|Fukuoka, Fukuoka
+819239|Fukuoka, Fukuoka
+81924|Fukuoka, Fukuoka
+81925|Fukuoka, Fukuoka
+81926|Fukuoka, Fukuoka
+81927|Fukuoka, Fukuoka
+81928|Fukuoka, Fukuoka
+81929|Fukuoka, Fukuoka
+81930|Yukuhashi, Fukuoka
+81932|Kitakyushu, Fukuoka
+81933|Kitakyushu, Fukuoka
+81934|Kitakyushu, Fukuoka
+81935|Kitakyushu, Fukuoka
+81936|Kitakyushu, Fukuoka
+81937|Kitakyushu, Fukuoka
+81938|Kitakyushu, Fukuoka
+81939|Kitakyushu, Fukuoka
+81940|Munakata, Fukuoka
+81942|Kurume, Fukuoka
+819432|Yame, Fukuoka
+819433|Yame, Fukuoka
+819434|Yame, Fukuoka
+819435|Yame, Fukuoka
+819437|Tanushimaru, Fukuoka
+819438|Tanushimaru, Fukuoka
+81944|Setaka, Fukuoka
+81946|Amagi, Fukuoka
+81947|Asahikawa, Hokkaido
+81948|Iizuka, Fukuoka
+81949|Nogata, Fukuoka
+81950|Hirado, Nagasaki
+81952|Saga, Saga
+819542|Takeo, Saga
+819543|Takeo, Saga
+819544|Takeo, Saga
+819546|Kagoshima, Kagoshima
+819547|Kagoshima, Kagoshima
+819552|Imari, Saga
+819553|Imari, Saga
+819554|Imari, Saga
+819555|Karatsu, Saga
+819556|Karatsu, Saga
+819557|Karatsu, Saga
+819558|Karatsu, Saga
+81956|Sasebo, Japan
+819572|Isahaya, Nagasaki
+819573|Isahaya, Nagasaki
+819574|Isahaya, Nagasaki
+819575|Isahaya, Nagasaki
+819576|Shimabara, Nagasaki
+819577|Shimabara, Nagasaki
+819578|Shimabara, Nagasaki
+81958|Nagasaki, Nagasaki
+819592|Oseto, Nagasaki
+819593|Oseto, Nagasaki
+819594|Aridagawa, Wakayama
+819595|Aridagawa, Wakayama
+819596|Fukue, Nagasaki
+819597|Fukue, Nagasaki
+819598|Fukue, Nagasaki
+819599|Oseto, Nagasaki
+81962|Kumamoto, Kumamoto
+81963|Kumamoto, Kumamoto
+81964|
+81965|Yatsushiro, Kumamoto
+819662|Hitoyoshi, Kumamoto
+819663|Hitoyoshi, Kumamoto
+819664|Hitoyoshi, Kumamoto
+819665|Hitoyoshi, Kumamoto
+819666|Minamata, Kumamoto
+819667|Minamata, Kumamoto
+819668|Minamata, Kumamoto
+819672|
+819673|
+819674|
+819675|
+819676|Takamori, Kumamoto
+819677|Oyabe, Toyama
+819678|Oyabe, Toyama
+819679|Takamori, Kumamoto
+819682|Yamaga, Kumamoto
+819683|Yamaga, Kumamoto
+819684|Yamaga, Kumamoto
+819685|Tamana, Kumamoto
+819686|Tamana, Kumamoto
+819687|Tamana, Kumamoto
+819688|Tamana, Kumamoto
+81969|Amakusa, Kumamoto
+819722|Saiki, Oita
+819723|Saiki, Oita
+819724|Saiki, Oita
+819725|Saiki, Oita
+819726|Usuki, Oita
+819727|Usuki, Oita
+819728|Usuki, Oita
+819732|Hita, Oita
+819733|Hita, Oita
+819734|Hita, Oita
+819735|Hita, Oita
+819737|Kusu, Oita
+819738|Kusu, Oita
+819742|Mie, Oita
+819743|Mie, Oita
+819744|Mie, Oita
+819746|Taketa, Oita
+819747|Taketa, Oita
+81975|Oita, Oita
+81977|Beppu, Oita
+819782|Bungotakada, Oita
+819783|Bungotakada, Oita
+819784|Bungotakada, Oita
+819785|Bungotakada, Oita
+819786|Kitsuki, Oita
+819787|Kunisaki, Oita
+819788|Kunisaki, Oita
+819789|Kitsuki, Oita
+81979|Nakatsugawa, Gifu
+819802|Minamidaito, Okinawa
+819803|Nago, Okinawa
+819804|Nago, Okinawa
+819805|Nago, Okinawa
+819806|
+819807|
+819808|Yaeyama District, Okinawa
+819809|Yaeyama District, Okinawa
+819822|Nobeoka, Miyazaki
+819823|Nobeoka, Miyazaki
+819824|Nobeoka, Miyazaki
+819825|Hyuga, Miyazaki
+819826|Hyuga, Miyazaki
+819827|Takachiho, Miyazaki
+819828|Takachiho, Miyazaki
+8198290|Nobeoka, Miyazaki
+8198291|Nobeoka, Miyazaki
+8198292|Nobeoka, Miyazaki
+8198293|Nobeoka, Miyazaki
+8198294|Nobeoka, Miyazaki
+8198295|Hyuga, Miyazaki
+8198296|Hyuga, Miyazaki
+8198297|Hyuga, Miyazaki
+8198298|Hyuga, Miyazaki
+8198299|Hyuga, Miyazaki
+81983|Takanabe, Miyazaki
+81984|Kobayashi, Miyazaki
+81985|Miyazaki, Miyazaki
+81986|Miyakonojo, Miyazaki
+81987|Nichinan, Tottori
+81988|Naha, Okinawa
+81989|Naha, Okinawa
+819912|
+819913|
+81992|Kagoshima, Kagoshima
+819932|Ibusuki, Kagoshima
+8199330|Ibusuki, Kagoshima
+8199331|Kagoshima, Kagoshima
+8199332|Ibusuki, Kagoshima
+8199333|Ibusuki, Kagoshima
+8199334|Ibusuki, Kagoshima
+8199335|Ibusuki, Kagoshima
+8199336|Ibusuki, Kagoshima
+8199337|Ibusuki, Kagoshima
+8199338|Ibusuki, Kagoshima
+8199339|Ibusuki, Kagoshima
+8199340|Ibusuki, Kagoshima
+8199341|Ibusuki, Kagoshima
+8199342|Ibusuki, Kagoshima
+8199343|Kagoshima, Kagoshima
+8199344|Ibusuki, Kagoshima
+8199345|Kagoshima, Kagoshima
+8199346|Ibusuki, Kagoshima
+8199347|Kagoshima, Kagoshima
+8199348|Ibusuki, Kagoshima
+8199349|Ibusuki, Kagoshima
+819935|Kaseda, Kagoshima
+819936|Kaseda, Kagoshima
+819937|Kaseda, Kagoshima
+819938|Kaseda, Kagoshima
+819940|Shibushi, Kagoshima
+819942|
+819943|Kanoya, Kagoshima
+819944|Kanoya, Kagoshima
+819945|Kanoya, Kagoshima
+819946|Kanoya, Kagoshima
+819947|Shibushi, Kagoshima
+819948|Shibushi, Kagoshima
+819949|
+819952|Okuchi, Kagoshima
+819953|Okuchi, Kagoshima
+819954|Kajiki, Kagoshima
+819955|Kajiki, Kagoshima
+819956|Kajiki, Kagoshima
+819957|Kajiki, Kagoshima
+819962|Satsumasendai, Kagoshima
+819963|Satsumasendai, Kagoshima
+819964|Satsumasendai, Kagoshima
+819965|Satsumasendai, Kagoshima
+819966|Izumi, Kagoshima
+819967|Izumi, Kagoshima
+819968|Izumi, Kagoshima
+819969|
+819972|
+819973|
+819974|Yakushima, Kagoshima
+819975|Naze, Kagoshima
+819976|Naze, Kagoshima
+819977|Setouchi, Kagoshima
+819978|Tokunoshima, Kagoshima
+819979|Tokunoshima, Kagoshima
+81998|Kagoshima, Kagoshima
diff --git a/resources/geocoding/sr/381.txt b/resources/geocoding/sr/381.txt
new file mode 100644 (file)
index 0000000..f186d64
--- /dev/null
@@ -0,0 +1,51 @@
+# Copyright (C) 2011 The Libphonenumber Authors
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Generated from:
+# http://www.itu.int/oth/T02020000B9/en [2011-07-04]
+
+38110|Pirot
+38111|Beograd
+38112|Požarevac
+38113|Pančevo
+38114|Valjevo
+38115|Šabac
+38116|Leskovac
+38117|Vranje
+38118|Niš
+38119|Zaječar
+38120|Novi Pazar
+38121|Novi Sad
+38122|Sremska Mitrovica
+38123|Zrenjanin
+381230|Kikinda
+38124|Subotica
+38125|Sombor
+38126|Smederevo
+38127|Prokuplje
+38128|Kosovska Mitrovica
+381280|Gnjilane
+38129|Prizren
+381290|Uroševac
+38130|Bor
+38131|Užice
+38132|Čačak
+38133|Prijepolje
+38134|Kragujevac (TC)
+38135|Jagodina
+38136|Kraljevo
+38137|Kruševac
+38138|Priština
+38139|Peć
+381390|Dakovica
index a2df6f4..bdd3116 100644 (file)
@@ -98,9 +98,14 @@ public class BuildMetadataFromXml {
     int numOfTerritories = territory.getLength();
     for (int i = 0; i < numOfTerritories; i++) {
       Element territoryElement = (Element) territory.item(i);
-      String regionCode = territoryElement.getAttribute("id");
-      PhoneMetadata metadata = loadCountryMetadata(regionCode, territoryElement);
-      metadataCollection.addMetadata(metadata);
+      String id = territoryElement.getAttribute("id");
+      try {
+        PhoneMetadata metadata = loadCountryMetadata(id, territoryElement);
+        metadataCollection.addMetadata(metadata);
+      } catch (IllegalArgumentException e) {
+        LOGGER.log(Level.WARNING, "Found data for region '" + id + "' but no valid region code " +
+                   "can be found to match this. Data will be ignored.");
+      }
     }
     return metadataCollection.build();
   }
index 72571b1..1e2782a 100644 (file)
Binary files a/tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar and b/tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar differ
index 67bb4a5..4957111 100644 (file)
@@ -135,9 +135,6 @@ public class GenerateAreaCodeData extends Command {
                                                  lineNumber));
       }
       String prefix = line.substring(0, indexOfPipe);
-      if (indexOfPipe == line.length() - 1) {
-        throw new RuntimeException(String.format("line %d: missing location", lineNumber));
-      }
       String location = line.substring(indexOfPipe + 1);
       handler.process(Integer.parseInt(prefix), location);
     }
@@ -277,7 +274,7 @@ public class GenerateAreaCodeData extends Command {
    * generated from the provided file name previously used to output the area code/location mappings
    * for the given country.
    */
-   // @VisibleForTesting
+  // @VisibleForTesting
   static void addConfigurationMapping(SortedMap<Integer, Set<String>> availableDataFiles,
                                       File outputAreaCodeMappingsFile) {
     String outputAreaCodeMappingsFileName = outputAreaCodeMappingsFile.getName();
@@ -296,7 +293,7 @@ public class GenerateAreaCodeData extends Command {
   /**
    * Outputs the binary configuration file mapping country codes to language strings.
    */
-   // @VisibleForTesting
+  // @VisibleForTesting
   static void outputBinaryConfiguration(SortedMap<Integer, Set<String>> availableDataFiles,
                                         OutputStream outputStream) throws IOException {
     MappingFileProvider mappingFileProvider = new MappingFileProvider();
index 85723fd..f55eb21 100644 (file)
Binary files a/tools/java/java-build/target/java-build-1.0-SNAPSHOT-jar-with-dependencies.jar and b/tools/java/java-build/target/java-build-1.0-SNAPSHOT-jar-with-dependencies.jar differ
index 04694e7..ac9d97f 100644 (file)
@@ -138,13 +138,8 @@ public class GenerateAreaCodeDataTest extends TestCase {
     }
   }
 
-  public void testParseTextFileThrowsExceptionWithMissingLocation() throws IOException {
-    try {
-      parseTextFileHelper("331|");
-      fail();
-    } catch (RuntimeException e) {
-      // Expected.
-    }
+  public void testParseTextFileAcceptsMissingLocation() throws IOException {
+    parseTextFileHelper("331|");
   }
 
   public void testSplitMap() {
@@ -187,6 +182,14 @@ public class GenerateAreaCodeDataTest extends TestCase {
     assertEquals(input, dataAfterDeserialization);
   }
 
+  public void testConvertDataSupportsEmptyDescription() throws IOException {
+    String input = "331|Paris\n334|Marseilles\n3341|\n";
+
+    String dataAfterDeserialization = convertDataHelper(input);
+    assertEquals(3, dataAfterDeserialization.split("\n").length);
+    assertEquals(input, dataAfterDeserialization);
+  }
+
   public void testConvertDataThrowsExceptionWithDuplicatedAreaCodes() throws IOException {
     String input = "331|Paris\n331|Marseilles\n";