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";