diff --git a/java/release_notes.txt b/java/release_notes.txt
index f915803d5..5ed12e197 100644
--- a/java/release_notes.txt
+++ b/java/release_notes.txt
@@ -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
diff --git a/java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java b/java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
index 9293f4b5b..80eae06d0 100644
--- a/java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
+++ b/java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
@@ -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 possibleFormats = new ArrayList();
@@ -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) {
diff --git a/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
index 476850ed7..acca382b4 100644
--- a/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
+++ b/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
@@ -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)) {
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
index 7d0f2a2f3..91a2fae4a 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
index 246366045..d2a7d2c4d 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
index 9e7b9c857..75d5b6076 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
index e5ef1ec5e..545341885 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
index 9aa4d28e8..8353e3cea 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
index 139f181f3..87251ae0b 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
index 3e4f37164..6e8fd58b1 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI
index dadad8e72..f8ff1ca50 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL
index 8fabf745f..5d301f2a0 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN
index 697b08c50..4b299a678 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK
index cbb0f4c56..d8b8bd4ee 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM
index 8713673df..0a3e39bf5 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ
index c3d52a0a5..4c4e87181 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
index 6578ddde3..a9716d5d1 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG
index a00edb4bd..8ab546d28 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ
index d123c006d..cb06c07ba 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR
index 2c4a82886..849fd68e6 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR
index 9766d5624..ff1590c6d 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
index 6ee3bd1e4..7a117e715 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN
index 8354c600f..401aafdbd 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ
index 475492fe1..ca8ede8b4 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
index eb45cb464..b49745d82 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM
index dce03a832..14b8c4e63 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE
index 4c35cb29f..1c09ed229 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG
index dc63e3111..33f820130 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH
index f88db2f21..9e9c454b5 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
index f74cb4dbf..47942d77f 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA
index 7f78cb8e1..9d4d251d1 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
index f1dfbca3b..168135cfe 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
index dd7306bcb..0bc061c00 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
index dd0beb566..2c885ab6b 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD
index 0763f61a8..521bfa38a 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML
index c7d6d187d..bf29a8d1d 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO
index d0bb6aeb6..2bd32a717 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX
index dc44efbc8..850667efb 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY
index 35b8414df..df113cefc 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE
index 62309e52c..7b9d543ce 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG
index 4e12b3693..d16685c9d 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
index 767f47cab..8e08a8d3e 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH
index cf6ad8d50..52d70e4a2 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK
index 6b0027d56..dd4e23bc3 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY
index 628bd8733..572288729 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA
index da69ee291..a1303acf1 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA
index a938bbf2d..b72118a4e 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
index 37871a15b..6f9420e10 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
index 6020eb319..b45586191 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN
index 853bd4089..fcad90353 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD
index dc573d14d..8cc88a073 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG
index 924a86029..1fdd33853 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH
index 119af7dec..e7c9408c7 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN
index b4c07475c..0e846e818 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
index a0239225d..23294b190 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG
index 97fd6fbf5..a93699931 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE
index b18ec98b4..725f6b6d3 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
index b0369306b..f4c0f11f8 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM
index 5e0253df3..34c8c1339 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM differ
diff --git a/java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMap.java b/java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMap.java
index 9fbd804a3..10f953526 100644
--- a/java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMap.java
+++ b/java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMap.java
@@ -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;
}
/**
diff --git a/java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java b/java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
index a06b0c031..0ef9b918f 100644
--- a/java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
+++ b/java/src/com/google/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
@@ -29,35 +29,10 @@ import java.util.TreeSet;
*
* @author Philippe Liard
*/
-// @VisibleForTesting
abstract class AreaCodeMapStorageStrategy {
protected int numOfEntries = 0;
protected final TreeSet possibleLengths = new TreeSet();
- 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 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 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();
}
diff --git a/java/src/com/google/i18n/phonenumbers/geocoding/DefaultMapStorage.java b/java/src/com/google/i18n/phonenumbers/geocoding/DefaultMapStorage.java
index 8a4007094..4242118bc 100644
--- a/java/src/com/google/i18n/phonenumbers/geocoding/DefaultMapStorage.java
+++ b/java/src/com/google/i18n/phonenumbers/geocoding/DefaultMapStorage.java
@@ -35,11 +35,6 @@ class DefaultMapStorage extends AreaCodeMapStorageStrategy {
private int[] phoneNumberPrefixes;
private String[] descriptions;
- @Override
- public boolean isFlyweight() {
- return false;
- }
-
@Override
public int getPrefix(int index) {
return phoneNumberPrefixes[index];
diff --git a/java/src/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorage.java b/java/src/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
index a23867429..54e96478a 100644
--- a/java/src/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
+++ b/java/src/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
@@ -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 sortedAreaCodeMap) {
+ public void readFromSortedMap(SortedMap areaCodeMap) {
SortedSet descriptionsSet = new TreeSet();
- 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 entry : sortedAreaCodeMap.entrySet()) {
+ for (Entry 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 descriptionsSet,
+ SortedMap 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() {
- 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
index 000000000..14051f754
Binary files /dev/null and b/java/src/com/google/i18n/phonenumbers/geocoding/data/381_sr differ
diff --git a/java/src/com/google/i18n/phonenumbers/geocoding/data/49_de b/java/src/com/google/i18n/phonenumbers/geocoding/data/49_de
index 2da69ea8d..5e007df92 100644
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
index 000000000..c23db642d
Binary files /dev/null and b/java/src/com/google/i18n/phonenumbers/geocoding/data/81_en differ
diff --git a/java/src/com/google/i18n/phonenumbers/geocoding/data/config b/java/src/com/google/i18n/phonenumbers/geocoding/data/config
index 8fdf681a9..fbb487fe6 100644
Binary files a/java/src/com/google/i18n/phonenumbers/geocoding/data/config and b/java/src/com/google/i18n/phonenumbers/geocoding/data/config differ
diff --git a/java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java b/java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java
index 196da6f6b..64171ac5b 100644
--- a/java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java
+++ b/java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java
@@ -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'));
+ }
}
diff --git a/java/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java b/java/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java
index dccd54568..7c30588e3 100644
--- a/java/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java
+++ b/java/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java
@@ -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);
+ }
+ }
}
diff --git a/java/test/com/google/i18n/phonenumbers/PhoneNumberMatcherTest.java b/java/test/com/google/i18n/phonenumbers/PhoneNumberMatcherTest.java
index 9fee8c99b..b7000bda9 100644
--- a/java/test/com/google/i18n/phonenumbers/PhoneNumberMatcherTest.java
+++ b/java/test/com/google/i18n/phonenumbers/PhoneNumberMatcherTest.java
@@ -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 testCases = new ArrayList();
+ 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 testCases = new ArrayList();
+ 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));
diff --git a/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
index 4057a1e8d..660a34e92 100644
--- a/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
+++ b/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
@@ -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);
@@ -1476,6 +1491,16 @@ public class PhoneNumberUtilTest extends TestCase {
NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
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);
diff --git a/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR b/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR
index 7f29bcadd..a96ad5452 100644
Binary files a/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR and b/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR differ
diff --git a/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG b/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG
index 0838f554c..cdce608fd 100644
Binary files a/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG and b/java/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG differ
diff --git a/java/test/com/google/i18n/phonenumbers/geocoding/AreaCodeMapTest.java b/java/test/com/google/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
index 2b70c6ff7..84ec90d22 100644
--- a/java/test/com/google/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
+++ b/java/test/com/google/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
@@ -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);
diff --git a/java/test/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java b/java/test/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
index 63e076936..3db12648a 100644
--- a/java/test/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
+++ b/java/test/com/google/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
@@ -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 areaCodeMap = new TreeMap();
-
- public FlyweightMapStorageTest() {
- areaCodeMap.put(331402, "Paris");
- areaCodeMap.put(331434, "Paris");
- areaCodeMap.put(334910, "Marseille");
- areaCodeMap.put(334911, "Marseille");
+ private static final SortedMap areaCodeMap;
+ static {
+ SortedMap tmpMap = new TreeMap();
+ 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.
+ }
+ }
}
diff --git a/resources/PhoneNumberMetaData.xml b/resources/PhoneNumberMetaData.xml
index c40440175..00919ea86 100644
--- a/resources/PhoneNumberMetaData.xml
+++ b/resources/PhoneNumberMetaData.xml
@@ -560,7 +560,7 @@
(?:
55|
77|
- 9[1-46-9]
+ 9[1-9]
)\d{6}
\d{8}
@@ -1903,8 +1903,8 @@
-
- 4[7-9]
+
+ 4[6-9]
$1 $2 $3 $4
@@ -1962,7 +1962,7 @@
4(?:
- 7\d|
+ [67]\d|
8[3-9]|
9[1-9]
)\d{6}
@@ -2189,13 +2189,15 @@
17001234
+
(?:
3(?:
[23469]\d|
77|
- 8[38]
+ 8[348]
)|
6(?:
1[16]|
@@ -2299,17 +2301,14 @@
20211234
-
+
- 66\d{6}|
- 9(?:
- 0[069]|
- [35][0-2457-9]|
- [6-8]\d
- )\d{5}
+ (?:
+ 6[46]|
+ 9[03-8]
+ )\d{6}
\d{8}
90011234
@@ -2552,9 +2551,15 @@
\d{8,10}
+
+ 1[1-9][2-5]\d{7}|
(?:
- [14689][1-9]|
+ [4689][1-9]|
2[12478]|
3[1-578]|
5[13-5]|
@@ -2565,8 +2570,15 @@
+ 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]|
@@ -2698,22 +2710,23 @@
-
- 1
+
+
+ 1|
+ 77
+
$1 $2 $3 $4
- [2-8]
+
+ [2-68]|
+ 7[246]
+
$1 $2 $3
-
- (?:
- 17|
- [2-8]
- )\d{6}
-
+ [1-8]\d{6,7}
\d{6,8}
@@ -2731,7 +2744,9 @@
2345678
- 17\d{6}
+
+ [17]7\d{6}
\d{8}
17123456
@@ -2973,10 +2988,11 @@
2221234
-
+
6(?:
- [0-2]\d|
+ [0-3]\d|
[67][01]
)\d{4}
@@ -3358,7 +3374,7 @@
- [02-5]\d{7}
+ [02-6]\d{7}
\d{8}
@@ -3382,14 +3398,14 @@
21234567
-
(?:
0[1-9]|
4[04-9]|
5[07]|
- 6[067]
+ 6[0567]
)\d{6}
01234567
@@ -3495,6 +3511,11 @@
\d{6,11}
+
+ 600\d{7,8}
+ \d{10,11}
+ 6001234567
+
(?:
@@ -3520,8 +3541,8 @@
\d{8,9}
961234567
-
+
@@ -3531,11 +3552,12 @@
\d{9,11}
800123456
-
+
+
600\d{7,8}
\d{10,11}
6001234567
-
+
44\d{7}
\d{9}
@@ -3751,7 +3773,7 @@
\d{4,12}
-
21\d{8,10}|
@@ -3815,11 +3837,12 @@
)|
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]|
@@ -4543,9 +4566,6 @@
30123456
-
1(?:
5\d{9}|
@@ -4643,33 +4663,25 @@
[1-9]\d{7}
\d{8}
+
(?:
- 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}
32123456
-
(?:
- 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}
20123456
@@ -4710,15 +4722,16 @@
7674201234
-
+
767(?:
2(?:
- [2346]5|
+ [234689]5|
7[5-7]
)|
31[5-7]|
- 61[4-7]
+ 61[2-7]
)\d{4}
\d{10}
@@ -4851,11 +4864,12 @@
12345678
+
(?:
5[56]|
- 6[69]|
- 7[79]
+ 6[569]|
+ 7[7-9]
)\d{7}
\d{9}
@@ -4895,13 +4909,19 @@
nationalPrefix="0" nationalPrefixFormattingRule="($NP$FG)">
- [2-7]
+
+ [2-57]|
+ 6[2-7]
+
$1 $2-$3
$1-$2-$3
- [89]
+
+ 69|
+ [89]
+
$1 $2 $3
22123456
- [89]\d{7}
+
+ (?:
+ 69|
+ [89]\d
+ )\d{6}
+
\d{8}
99123456
@@ -5075,7 +5100,7 @@
-
+
@@ -5086,17 +5111,31 @@
[23]
$1 $2
+
+
+ 15[0-2]|
+ [89]00
+
+ $1 $2 $3
+
+
+
+
+ 1(?:
+ [0-246-9]|
+ 5[3-9]
+ )
+
+ $1 $2 $3
+
- [14-6]|
+ 13|
+ [4-6]|
[89][2-9]
$1 $2
-
- [89]00
- $1 $2 $3
-
@@ -5142,8 +5181,13 @@
234567890
- 1[0-246-9]\d{7}
- \d{9}
+
+ 1(?:
+ [0-246-9]|
+ 5[0-2]
+ )\d{7}
+
+ \d{9,10}
101234567
@@ -5531,12 +5575,13 @@
3212345
-
+
(?:
- 7[0-4]|
- 9[27-9]
+ 7[0-467]|
+ 8[367]|
+ 9[02346-9]
)\d{5}
\d{7}
@@ -7235,7 +7280,8 @@
)|
7(?:
1\d|
- [23][1-5]|
+ 2[1-5]|
+ 3[1-6]|
4[1-7]|
5[1-57]|
6[134]|
@@ -7728,11 +7774,15 @@
[2-5]
$1 $2 $3
-
+
9
$1 $2 $3
-
+
+ 9
+ $1 $2 $3
+
+
9
$1 $2 $3 $4
@@ -7785,7 +7835,7 @@
12345678
- 9[12589]\d{6,10}
+ 9[1257-9]\d{6,10}
\d{8,12}
912345678
@@ -7833,9 +7883,10 @@
22453300
+
(?:
- 3[2-9]|
+ 3[1-9]|
4\d
)\d{6}
@@ -8517,14 +8568,14 @@
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|
@@ -8568,19 +8619,19 @@
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
)|
@@ -8591,12 +8642,13 @@
)|
5(?:
0[079]|
- [19]1|
+ 11|
2|
30|
4[47]|
53|
- 7[45]
+ 7[45]|
+ 9[015]
)|
6(?:
[0589]|
@@ -8618,8 +8670,8 @@
[057-9]|
2[35-9]|
3[09]|
- 4[038]|
- 6[0-27-9]
+ 4[03678]|
+ 6[0-46-9]
)
)|
9
@@ -8964,13 +9016,14 @@
+ 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]. -->
(?:
7(?:
@@ -8981,14 +9034,14 @@
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|
@@ -9028,10 +9081,13 @@
)
)|
8(?:
- 0[01589]\d|
+ 0(?:
+ [01589]\d|
+ 66
+ )|
1(?:
[024]\d|
- 15|
+ 1[56]|
30|
7[19]|
97
@@ -9039,12 +9095,12 @@
2(?:
[2369]\d|
52|
- 7[0135]|
- 8[67]
+ 7[01357]|
+ 8[567]
)|
3(?:
0[235-8]|
- 4[179]|
+ 4[14789]|
74|
90
)|
@@ -9055,12 +9111,13 @@
)|
5(?:
0[079]|
- [19]1|
+ 11|
2\d|
30|
4[47]|
53|
- 7[45]
+ 7[45]|
+ 9[015]
)|
6(?:
[0589]\d|
@@ -9082,8 +9139,8 @@
[057-9]\d|
2[35-9]|
3[09]|
- 4[038]|
- 6[0-27-9]
+ 4[036-8]|
+ 6[0-46-9]
)
)|
9\d{3}
@@ -9149,7 +9206,7 @@
[2-6]
$1 $2 $3
-
+
7
$1 $2 $3
@@ -9173,7 +9230,7 @@
12345678
- 7[5-9]\d{8}
+ 7[3-9]\d{8}
\d{10}
7912345678
@@ -9371,7 +9428,7 @@
38[59]\d{6}|
(?:
6(?:
- 1[014-8]|
+ 1[0-8]|
2[0-8]|
3[0-27-9]|
4[0-29]|
@@ -9772,15 +9829,17 @@
8765123456
-
+
876(?:
- (?:
- 2[178]|
- [348]\d|
- )\d|
+ 2(?:
+ [178]\d|
+ 99
+ )|
+ [348]\d{2}|
5(?:
+ 08|
27|
66|
[78]\d
@@ -10870,13 +10929,14 @@
202012345
-
+
7(?:
- 0[0-3]|
+ 0[0-5]|
[123]\d|
5[0-3]|
- 7[0-4]
+ 7[0-5]
)\d{6}
\d{9}
@@ -10993,12 +11053,12 @@
312123456
-
+
5[124-7]\d{7}|
7(?:
- 0[05]|
+ 0[0-357-9]|
7\d
)\d{6}
@@ -11050,6 +11110,8 @@
23456789
+
(?:
(?:
@@ -11062,12 +11124,10 @@
0[89]|
5[2-689]|
8\d{2}|
- [1349]\d|
+ [13469]\d|
)
)\d{5}
-
\d{8,9}
91234567
@@ -11357,7 +11417,7 @@
5[1-4]
)|
[68]0|
- [3-9][1-9][2-9]
+ [3-6][1-9][2-9]
1(?:
@@ -11369,7 +11429,7 @@
)
)|
[68]0|
- [3-9][1-9][2-9]
+ [3-6][1-9][2-9]
$1-$2-$3
@@ -11442,9 +11502,9 @@
$1-$2
- [3-9][1-9]1
+ [3-6][1-9]1
- [3-9][1-9]1(?:
+ [3-6][1-9]1(?:
[0-46-9]
)
@@ -11482,7 +11542,7 @@
- [1-79]\d{3,9}|
+ [1-7]\d{3,9}|
8\d{8}
\d{4,10}
@@ -11898,12 +11958,13 @@
21212862
+
20(?:
2[23]|
- 5[4-6]|
- 77|
- 9[89]
+ 5[4-68]|
+ 7[78]|
+ 9[7-9]
)\d{6}
\d{10}
@@ -11933,7 +11994,7 @@
[89][01]|
7(?:
[01]|
- 6[167])
+ 6[136-9])
$1 $2 $3
@@ -11956,12 +12017,14 @@
1123456
+
(?:
3\d|
7(?:
[01]\d|
- 6[167]
+ 6[136-9]
)
)\d{5}
@@ -12235,6 +12298,10 @@
[279]
$1 $2 $3
+
+ 7
+ $1 $2 $3
+
[4-6]
$1 $2 $3
@@ -12247,8 +12314,9 @@
(?:
- [279]\d|
+ [29]\d|
[4-6]|
+ 7\d{1,2}|
[38]\d{2}
)\d{6}
@@ -12261,13 +12329,17 @@
+ 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. -->
(?:
4[67]|
5\d|
6[4-8]|
- 7\d{2}|
+ 7(?:
+ 76\d|
+ \d{2}
+ )|
880\d
)\d{5}
@@ -12751,10 +12823,10 @@
6(?:
- 0[06]|
+ 0[0-36]|
[14-7]\d|
2[236]|
- 33|
+ 3[348]|
99
)\d{6}
@@ -12874,20 +12946,14 @@
22212345
-
(?:
6(?:
- 0[0-3]|
50|
- 7[12]|
- [89]\d
+ 7[1-4]|
+ [089]\d
)|
- 7(?:
- 80|
- 9\d
- )
+ 7[89]\d
)\d{5}
65012345
@@ -13299,16 +13365,17 @@
20212345
+
(?:
6(?:
- [569]\d
+ [3569]\d
)|
7(?:
[08][1-9]|
[3579][0-4]|
4[014-7]|
- 6\d
+ [16]\d
)
)\d{5}
@@ -13515,9 +13582,9 @@
28212345
-
- 6[26]\d{6}
+ 6[236]\d{6}
66123456
@@ -14080,10 +14147,10 @@
nationalPrefixForParsing="0[12]|04[45](\d{10})"
nationalPrefixTransformRule="1$1"
nationalPrefixFormattingRule="$NP $FG">
-
+ national format (leading 044/045), will be parsed into the same form. -->
@@ -14111,7 +14178,7 @@
81
)
- 045 $2 $3 $4
+ 044 $2 $3 $4
$1 $2 $3 $4
@@ -14124,7 +14191,7 @@
9[1-35-9]
)
- 045 $2 $3 $4
+ 044 $2 $3 $4
$1 $2 $3 $4
@@ -14291,7 +14358,7 @@
-
+
@@ -14308,7 +14375,7 @@
- 1[0-46-9][1-9]|
+ 1[02-46-9][1-9]|
8
$1-$2 $3
@@ -14317,6 +14384,11 @@
1[36-8]0
$1-$2-$3-$4
+
+ 11
+ $1-$2 $3
+
15
@@ -14339,8 +14411,13 @@
312345678
- 1[0-46-9]\d{7}
- \d{9}
+
+ 1(?:
+ [02-46-9][2-9]|
+ 11\d
+ )\d{6}
+
+ \d{9,10}
123456789
@@ -14671,8 +14748,9 @@
20201234
-
- 9[03467]\d{6}
+
+ 9[0134678]\d{6}
93123456
@@ -14807,7 +14885,7 @@
)|
8(?:
0[2-9]|
- 1[23689]
+ 1[0235689]
)\d
)\d{6}
@@ -15637,14 +15715,11 @@
+ as well as 68x from Wikipedia and 730 from online numbers. -->
(?:
68|
- 7(?:
- [126]\d|
- 3[1-9]
- )
+ 7[1236]\d
)\d{5}
\d{7,8}
@@ -15801,13 +15876,14 @@
21234567
+
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]
@@ -16039,15 +16115,15 @@
2123456789
-
3(?:
0\d|
1[2-5]|
- 2[1-3]|
+ 2[1-5]|
3[1-6]|
- 4[2-7]|
+ 4[1-7]|
64
)\d{7}
@@ -16586,9 +16662,9 @@
9(?:
61|
- 7[12356]|
+ 7[1-6]|
8[1-5]|
- 9[1235]
+ 9[1-5]
)\d{6}
\d{9}
@@ -16601,7 +16677,7 @@
[2-9]0\d{4,7}
- \d{6,9}
+ \d{6,9}
201234567
@@ -16634,12 +16710,13 @@
44123456
+
(?:
- 33|
+ 3[03]|
55|
66|
- 77
+ 7[07]
)\d{6}
33123456
@@ -17032,7 +17109,7 @@
(?:
- 5[013-69]\d|
+ 5[013-689]\d|
8111
)\d{6}
@@ -17255,7 +17332,8 @@
121231234
- 9[1259]\d{7}
+
+ 9[01259]\d{7}
911231234
@@ -17511,7 +17589,7 @@
(?:
- 8[1-5]|
+ 8[1-6]|
9[0-8]
)\d{6}
@@ -17955,8 +18033,8 @@
+ 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. -->
7(?:
0[1256]0|
@@ -17965,16 +18043,15 @@
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}
@@ -18387,13 +18464,10 @@
+ Also adding 63[5-9] from evidence of successful SMS delivery. -->
(?:
- 6(?:
- 3[0-7]|
- 6\d
- )|
+ 6[36]\d|
77\d|
9(?:
5[0-4]|
@@ -18412,22 +18486,19 @@
-
+
-
- $1 $2 $3
-
$1 $2 $3 $4
- [02-9]\d{6,7}
- \d{7,8}
+ [29]\d{7}
+ \d{8}
- 2?(?:
+ 2(?:
2[2-7]|
3[23]|
44|
@@ -18439,22 +18510,13 @@
22212345
-
-
- (?:
- 0[1-9]|
- 7[56]|
- 8[1-7]|
- 9\d
- )\d{5}|
- 9[0-289]\d{6}
-
+ 9[0-289]\d{6}
90112345
-
+
@@ -18468,8 +18530,8 @@
[3-7]
$1 $2 $3
-
- 8
+
+ [89]
$1 $2 $3
- [2-8]\d{7,8}|
+ [2-9]\d{7,8}|
1\d{9}
\d{8,10}
@@ -18489,9 +18551,9 @@
(?:
2[1-9]|
- 3[24-9]|
+ 3[2-9]|
4[2-5]|
- 5[3-6]|
+ 5[2-6]|
7[3-7]
)\d{6}
@@ -18499,9 +18561,7 @@
21234567
-
- 8\d{8}
+ [89]\d{8}
\d{9}
812345678
@@ -18517,6 +18577,8 @@
1900123456
+
60\d{7}
\d{9}
601234567
@@ -18697,12 +18759,12 @@
-
+
$1 $2 $3
- [247-9]\d{7}
+ [2457-9]\d{7}
\d{8}
@@ -18710,10 +18772,13 @@
71234567
+
(?:
[29]\d|
- 4[01]
+ 4[01]|
+ 5[01258]|
)\d{6}
20123456
@@ -18915,6 +18980,7 @@
8682211234
+
868(?:
29\d|
@@ -18933,6 +18999,7 @@
8\d
)|
7(?:
+ 03|
1[02-9]|
[2-9]\d
)
@@ -19285,7 +19352,7 @@
-
+
@@ -19338,11 +19405,11 @@
312345678
-
+
7(?:
[15789]\d|
- 0[0-4]
+ 0[0-7]
)\d{6}
\d{9}
@@ -20351,8 +20418,8 @@
$1 $2 $3
-
- 7[137]
+
+ 7[0137]
$1 $2 $3
@@ -20379,7 +20446,8 @@
1234567
- 7[137]\d{7}
+
+ 7[0137]\d{7}
\d{9}
712345678
@@ -20434,10 +20502,31 @@
$1 $2 $3
+
+
+ 7|
+ 8[1-5789]
+
+ $1 $2
+
+
+
+ 7|
+ 8[1-5789]
+
+ $1 $2 $3
+
- [1-578]\d{8}
- \d{8,9}
+
+ [1-5]\d{8}|
+ (?:
+ 7\d{4,8}|
+ 8[1-5789]\d{3,7}
+ )|
+ 8[06]\d{7}
+
+ \d{5,9}
@@ -20457,9 +20546,9 @@
(?:
7[1-4689]|
8[1-5789]
- )\d{7}
+ )\d{3,7}
- \d{9}
+ \d{5,9}
711234567
@@ -20507,13 +20596,14 @@
211234567
-
+
9(?:
- 55|
- 6[3-9]|
- 7[4-9]
+ 5[05]|
+ 6[1-9]|
+ 7[13-9]
)\d{6}
955123456
diff --git a/resources/PhoneNumberMetaDataForTesting.xml b/resources/PhoneNumberMetaDataForTesting.xml
index 651b3aeed..3f3597705 100644
--- a/resources/PhoneNumberMetaDataForTesting.xml
+++ b/resources/PhoneNumberMetaDataForTesting.xml
@@ -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.
-->
@@ -381,8 +380,8 @@
$1-$2-$3
- 1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-9][1-9][2-9]
- 1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]
+ 1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-6][1-9][2-9]
+ 1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-6][1-9][2-9]
$1-$2-$3
@@ -424,20 +423,20 @@
$1-$2
- [3-9][1-9]1
- [3-9][1-9]1(?:[0-46-9])
- [3-9][1-9]1(?:[0-247-9]|3[124]|6[1269])
+ [3-6][1-9]1
+ [3-6][1-9]1(?:[0-46-9])
+ [3-6][1-9]1(?:[0-247-9]|3[124]|6[1269])
$1-$2
- [3-9][1-9]1
- [3-9][1-9]1[36]
- [3-9][1-9]1(?:3[035-9]|6[03-578])
+ [3-6][1-9]1
+ [3-6][1-9]1[36]
+ [3-6][1-9]1(?:3[035-9]|6[03-578])
$1-$2
- [1-79]\d{3,9}|8\d{8}
+ [1-7]\d{3,9}|8\d{8}
\d{4,10}
@@ -627,7 +626,9 @@
-
+
+
[369]|8[1-9]
diff --git a/resources/geocoding/de/49.txt b/resources/geocoding/de/49.txt
index 26650f9d2..0876354d0 100644
--- a/resources/geocoding/de/49.txt
+++ b/resources/geocoding/de/49.txt
@@ -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
@@ -536,142 +536,860 @@
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
@@ -679,14 +1397,83 @@
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
@@ -696,16 +1483,121 @@
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
@@ -716,33 +1608,271 @@
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
@@ -753,15 +1883,116 @@
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
@@ -3518,11 +4749,471 @@
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
index 000000000..e57cd6dd4
--- /dev/null
+++ b/resources/geocoding/en/81.txt
@@ -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
index 000000000..f186d647c
--- /dev/null
+++ b/resources/geocoding/sr/381.txt
@@ -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
diff --git a/tools/java/common/src/com/google/i18n/phonenumbers/tools/BuildMetadataFromXml.java b/tools/java/common/src/com/google/i18n/phonenumbers/tools/BuildMetadataFromXml.java
index a2df6f422..bdd311642 100644
--- a/tools/java/common/src/com/google/i18n/phonenumbers/tools/BuildMetadataFromXml.java
+++ b/tools/java/common/src/com/google/i18n/phonenumbers/tools/BuildMetadataFromXml.java
@@ -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();
}
diff --git a/tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar b/tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar
index 72571b193..1e2782a04 100644
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
diff --git a/tools/java/java-build/src/com/google/i18n/phonenumbers/tools/GenerateAreaCodeData.java b/tools/java/java-build/src/com/google/i18n/phonenumbers/tools/GenerateAreaCodeData.java
index 67bb4a525..49571119c 100644
--- a/tools/java/java-build/src/com/google/i18n/phonenumbers/tools/GenerateAreaCodeData.java
+++ b/tools/java/java-build/src/com/google/i18n/phonenumbers/tools/GenerateAreaCodeData.java
@@ -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> 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> availableDataFiles,
OutputStream outputStream) throws IOException {
MappingFileProvider mappingFileProvider = new MappingFileProvider();
diff --git a/tools/java/java-build/target/java-build-1.0-SNAPSHOT-jar-with-dependencies.jar b/tools/java/java-build/target/java-build-1.0-SNAPSHOT-jar-with-dependencies.jar
index 85723fd80..f55eb214c 100644
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
diff --git a/tools/java/java-build/test/com/google/i18n/phonenumbers/tools/GenerateAreaCodeDataTest.java b/tools/java/java-build/test/com/google/i18n/phonenumbers/tools/GenerateAreaCodeDataTest.java
index 04694e7ba..ac9d97fcf 100644
--- a/tools/java/java-build/test/com/google/i18n/phonenumbers/tools/GenerateAreaCodeDataTest.java
+++ b/tools/java/java-build/test/com/google/i18n/phonenumbers/tools/GenerateAreaCodeDataTest.java
@@ -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";