Browse Source

Returning new validation types for ValidationResult (#1679)

IS_POSSIBLE_LOCAL_ONLY and INVALID_LENGTH are now being returned from IsPossibleNumberWithReason.

The enums were added in v8.3.0

Groups announcement: https://groups.google.com/forum/#!topic/libphonenumber-discuss/sPhYzdzFCmg
reviewable/pr1689/r1
lararennie 9 years ago
committed by GitHub
parent
commit
29810dcd1b
9 changed files with 214 additions and 178 deletions
  1. +8
    -9
      cpp/src/phonenumbers/phonenumberutil.cc
  2. +36
    -23
      cpp/src/phonenumbers/phonenumberutil.h
  3. +13
    -15
      cpp/test/phonenumbers/phonenumberutil_test.cc
  4. +44
    -33
      java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
  5. +8
    -10
      java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
  6. +42
    -42
      javascript/i18n/phonenumbers/demo-compiled.js
  7. +52
    -36
      javascript/i18n/phonenumbers/phonenumberutil.js
  8. +8
    -10
      javascript/i18n/phonenumbers/phonenumberutil_test.js
  9. +3
    -0
      pending_code_changes.txt

+ 8
- 9
cpp/src/phonenumbers/phonenumberutil.cc View File

@ -369,9 +369,11 @@ PhoneNumberUtil::ValidationResult TestNumberLength(
}
int actual_length = number.length();
// This is safe because there is never an overlap beween the possible lengths
// and the local-only lengths; this is checked at build time.
if (std::find(local_lengths.begin(), local_lengths.end(), actual_length) !=
local_lengths.end()) {
return PhoneNumberUtil::IS_POSSIBLE;
return PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY;
}
int minimum_length = possible_lengths.Get(0);
if (minimum_length == actual_length) {
@ -381,16 +383,11 @@ PhoneNumberUtil::ValidationResult TestNumberLength(
} else if (*(possible_lengths.end() - 1) < actual_length) {
return PhoneNumberUtil::TOO_LONG;
}
// Note that actually the number is not too long if possible_lengths does not
// contain the length: we know it is less than the highest possible number
// length, and higher than the lowest possible number length. However, we
// don't currently have an enum to express this, so we return TOO_LONG in the
// short-term.
// We skip the first element; we've already checked it.
return std::find(possible_lengths.begin() + 1, possible_lengths.end(),
actual_length) != possible_lengths.end()
? PhoneNumberUtil::IS_POSSIBLE
: PhoneNumberUtil::TOO_LONG;
: PhoneNumberUtil::INVALID_LENGTH;
}
// Helper method to check a number against possible lengths for this region,
@ -2251,12 +2248,14 @@ void PhoneNumberUtil::ExtractPossibleNumber(const string& number,
}
bool PhoneNumberUtil::IsPossibleNumber(const PhoneNumber& number) const {
return IsPossibleNumberWithReason(number) == IS_POSSIBLE;
ValidationResult result = IsPossibleNumberWithReason(number);
return result == IS_POSSIBLE || result == IS_POSSIBLE_LOCAL_ONLY;
}
bool PhoneNumberUtil::IsPossibleNumberForType(
const PhoneNumber& number, const PhoneNumberType type) const {
return IsPossibleNumberForTypeWithReason(number, type) == IS_POSSIBLE;
ValidationResult result = IsPossibleNumberForTypeWithReason(number, type);
return result == IS_POSSIBLE || result == IS_POSSIBLE_LOCAL_ONLY;
}
bool PhoneNumberUtil::IsPossibleNumberForString(


+ 36
- 23
cpp/src/phonenumbers/phonenumberutil.h View File

@ -499,20 +499,26 @@ class PhoneNumberUtil : public Singleton<PhoneNumberUtil> {
// 2. It doesn't attempt to figure out the type of the number, but uses
// general rules which applies to all types of phone numbers in a
// region. Therefore, it is much faster than IsValidNumber().
// 3. For fixed line numbers, many regions have the concept of area code,
// which together with subscriber number constitute the national
// significant number. It is sometimes okay to dial only the subscriber
// number when dialing in the same area. This function will return
// true if the subscriber-number-only version is passed in. On the other
// hand, because IsValidNumber() validates using information on both
// starting digits (for fixed line numbers, that would most likely be
// area codes) and length (obviously includes the length of area codes
// for fixed line numbers), it will return false for the
// subscriber-number-only version.
// 3. For some numbers (particularly fixed-line), many regions have the
// concept of area code, which together with subscriber number constitute
// the national significant number. It is sometimes okay to dial only the
// subscriber number when dialing in the same area. This function will
// return IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is
// passed in. On the other hand, because IsValidNumber() validates using
// information on both starting digits (for fixed line numbers, that
// would most likely be area codes) and length (obviously includes the
// length of area codes for fixed line numbers), it will return false for
// the subscriber-number-only version.
ValidationResult IsPossibleNumberWithReason(const PhoneNumber& number) const;
// Convenience wrapper around IsPossibleNumberWithReason(). Instead of
// returning the reason for failure, this method returns a boolean value.
// returning the reason for failure, this method returns true if the number is
// either a possible fully-qualified number (containing the area code and
// country code), or if the number could be a possible local number (with a
// country code, but missing an area code). Local numbers are considered
// possible if they could be possibly dialled in this format: if the area code
// is needed for a call to connect, the number is not considered possible
// without it.
bool IsPossibleNumber(const PhoneNumber& number) const;
// Check whether a phone number is a possible number of a particular type. For
@ -525,22 +531,29 @@ class PhoneNumberUtil : public Singleton<PhoneNumberUtil> {
// This provides a more lenient check than IsValidNumber() in the following
// sense:
//
// * It only checks the length of phone numbers. In particular, it doesn't
// check starting digits of the number.
// * For fixed line numbers, many regions have the concept of area code, which
// together with subscriber number constitute the national significant
// number. It is sometimes okay to dial only the subscriber number when
// dialing in the same area. This function will return true if the
// subscriber-number-only version is passed in. On the other hand, because
// IsValidNumber() validates using information on both starting digits (for
// fixed line numbers, that would most likely be area codes) and length
// (obviously includes the length of area codes for fixed line numbers), it
// will return false for the subscriber-number-only version.
// 1. It only checks the length of phone numbers. In particular, it doesn't
// check starting digits of the number.
// 2. For some numbers (particularly fixed-line), many regions have the
// concept of area code, which together with subscriber number constitute
// the national significant number. It is sometimes okay to dial only the
// subscriber number when dialing in the same area. This function will
// return IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is
// passed in. On the other hand, because IsValidNumber() validates using
// information on both starting digits (for fixed line numbers, that
// would most likely be area codes) and length (obviously includes the
// length of area codes for fixed line numbers), it will return false for
// the subscriber-number-only version.
ValidationResult IsPossibleNumberForTypeWithReason(
const PhoneNumber& number, PhoneNumberType type) const;
// Convenience wrapper around IsPossibleNumberForTypeWithReason(). Instead of
// returning the reason for failure, this method returns a boolean value.
// returning the reason for failure, this method returns true if the number is
// either a possible fully-qualified number (containing the area code and
// country code), or if the number could be a possible local number (with a
// country code, but missing an area code). Local numbers are considered
// possible if they could be possibly dialled in this format: if the area code
// is needed for a call to connect, the number is not considered possible
// without it.
bool IsPossibleNumberForType(const PhoneNumber& number,
PhoneNumberType type) const;


+ 13
- 15
cpp/test/phonenumbers/phonenumberutil_test.cc View File

@ -1780,18 +1780,18 @@ TEST_F(PhoneNumberUtilTest, IsPossibleNumber) {
RegionCode::US()));
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("(650) 253-0000",
RegionCode::US()));
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("253-0000",
RegionCode::US()));
EXPECT_TRUE(
phone_util_.IsPossibleNumberForString("253-0000", RegionCode::US()));
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 253 0000",
RegionCode::GB()));
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+44 20 7031 3000",
RegionCode::GB()));
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("(020) 7031 300",
RegionCode::GB()));
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("7031 3000",
RegionCode::GB()));
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("3331 6005",
RegionCode::NZ()));
EXPECT_TRUE(
phone_util_.IsPossibleNumberForString("7031 3000", RegionCode::GB()));
EXPECT_TRUE(
phone_util_.IsPossibleNumberForString("3331 6005", RegionCode::NZ()));
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+800 1234 5678",
RegionCode::UN001()));
}
@ -1930,7 +1930,7 @@ TEST_F(PhoneNumberUtilTest, IsPossibleNumberWithReason) {
number.set_country_code(1);
number.set_national_number(2530000ULL);
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
phone_util_.IsPossibleNumberWithReason(number));
number.set_country_code(0);
@ -2050,10 +2050,10 @@ TEST_F(PhoneNumberUtilTest, IsPossibleNumberForTypeWithReason_LocalOnly) {
// Here we test a number length which matches a local-only length.
number.set_country_code(49);
number.set_national_number(12ULL);
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
phone_util_.IsPossibleNumberForTypeWithReason(
number, PhoneNumberUtil::UNKNOWN));
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
phone_util_.IsPossibleNumberForTypeWithReason(
number, PhoneNumberUtil::FIXED_LINE));
// Mobile numbers must be 10 or 11 digits, and there are no local-only
@ -2072,10 +2072,10 @@ TEST_F(PhoneNumberUtilTest,
// Local-only number.
number.set_country_code(55);
number.set_national_number(12345678ULL);
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
phone_util_.IsPossibleNumberForTypeWithReason(
number, PhoneNumberUtil::UNKNOWN));
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
phone_util_.IsPossibleNumberForTypeWithReason(
number, PhoneNumberUtil::FIXED_LINE));
// Normal-length number.
@ -2099,7 +2099,7 @@ TEST_F(PhoneNumberUtilTest,
phone_util_.IsPossibleNumberForTypeWithReason(
number, PhoneNumberUtil::MOBILE));
// This matches a fixed-line length though.
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
phone_util_.IsPossibleNumberForTypeWithReason(
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
// This is too short for fixed-line, and no mobile numbers exist.
@ -2168,9 +2168,7 @@ TEST_F(PhoneNumberUtilTest,
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
phone_util_.IsPossibleNumberForTypeWithReason(
number, PhoneNumberUtil::MOBILE));
// This will change to INVALID_LENGTH once we start returning this type in the
// main isPossibleNumberWithReason API.
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
phone_util_.IsPossibleNumberForTypeWithReason(
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));


+ 44
- 33
java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java View File

@ -2468,24 +2468,37 @@ public class PhoneNumberUtil {
/**
* Convenience wrapper around {@link #isPossibleNumberWithReason}. Instead of returning the reason
* for failure, this method returns a boolean value.
* for failure, this method returns true if the number is either a possible fully-qualified number
* (containing the area code and country code), or if the number could be a possible local number
* (with a country code, but missing an area code). Local numbers are considered possible if they
* could be possibly dialled in this format: if the area code is needed for a call to connect, the
* number is not considered possible without it.
*
* @param number the number that needs to be checked
* @return true if the number is possible
*/
public boolean isPossibleNumber(PhoneNumber number) {
return isPossibleNumberWithReason(number) == ValidationResult.IS_POSSIBLE;
ValidationResult result = isPossibleNumberWithReason(number);
return result == ValidationResult.IS_POSSIBLE
|| result == ValidationResult.IS_POSSIBLE_LOCAL_ONLY;
}
/**
* Convenience wrapper around {@link #isPossibleNumberForTypeWithReason}. Instead of returning the
* reason for failure, this method returns a boolean value.
* reason for failure, this method returns true if the number is either a possible fully-qualified
* number (containing the area code and country code), or if the number could be a possible local
* number (with a country code, but missing an area code). Local numbers are considered possible
* if they could be possibly dialled in this format: if the area code is needed for a call to
* connect, the number is not considered possible without it.
*
* @param number the number that needs to be checked
* @param type the type we are interested in
* @return true if the number is possible for this particular type
*/
public boolean isPossibleNumberForType(PhoneNumber number, PhoneNumberType type) {
return isPossibleNumberForTypeWithReason(number, type) == ValidationResult.IS_POSSIBLE;
ValidationResult result = isPossibleNumberForTypeWithReason(number, type);
return result == ValidationResult.IS_POSSIBLE
|| result == ValidationResult.IS_POSSIBLE_LOCAL_ONLY;
}
/**
@ -2556,8 +2569,10 @@ public class PhoneNumberUtil {
}
int actualLength = number.length();
// This is safe because there is never an overlap beween the possible lengths and the local-only
// lengths; this is checked at build time.
if (localLengths.contains(actualLength)) {
return ValidationResult.IS_POSSIBLE;
return ValidationResult.IS_POSSIBLE_LOCAL_ONLY;
}
int minimumLength = possibleLengths.get(0);
@ -2568,32 +2583,28 @@ public class PhoneNumberUtil {
} else if (possibleLengths.get(possibleLengths.size() - 1) < actualLength) {
return ValidationResult.TOO_LONG;
}
// Note that actually the number is not too long if possibleLengths does not contain the length:
// we know it is less than the highest possible number length, and higher than the lowest
// possible number length. However, we don't currently have an enum to express this, so we
// return TOO_LONG in the short-term.
// We skip the first element; we've already checked it.
return possibleLengths.subList(1, possibleLengths.size()).contains(actualLength)
? ValidationResult.IS_POSSIBLE : ValidationResult.TOO_LONG;
? ValidationResult.IS_POSSIBLE : ValidationResult.INVALID_LENGTH;
}
/**
* Check whether a phone number is a possible number. It provides a more lenient check than
* {@link #isValidNumber} in the following sense:
*<ol>
* <li> It only checks the length of phone numbers. In particular, it doesn't check starting
* digits of the number.
* <li> It doesn't attempt to figure out the type of the number, but uses general rules which
* applies to all types of phone numbers in a region. Therefore, it is much faster than
* isValidNumber.
* <li> For fixed line numbers, many regions have the concept of area code, which together with
* subscriber number constitute the national significant number. It is sometimes okay to dial
* only the subscriber number when dialing in the same area. This function will return
* true if the subscriber-number-only version is passed in. On the other hand, because
* isValidNumber validates using information on both starting digits (for fixed line
* numbers, that would most likely be area codes) and length (obviously includes the
* length of area codes for fixed line numbers), it will return false for the
* subscriber-number-only version.
* <ol>
* <li> It only checks the length of phone numbers. In particular, it doesn't check starting
* digits of the number.
* <li> It doesn't attempt to figure out the type of the number, but uses general rules which
* applies to all types of phone numbers in a region. Therefore, it is much faster than
* isValidNumber.
* <li> For some numbers (particularly fixed-line), many regions have the concept of area code,
* which together with subscriber number constitute the national significant number. It is
* sometimes okay to dial only the subscriber number when dialing in the same area. This
* function will return IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is
* passed in. On the other hand, because isValidNumber validates using information on both
* starting digits (for fixed line numbers, that would most likely be area codes) and
* length (obviously includes the length of area codes for fixed line numbers), it will
* return false for the subscriber-number-only version.
* </ol>
* @param number the number that needs to be checked
* @return a ValidationResult object which indicates whether the number is possible
@ -2613,15 +2624,15 @@ public class PhoneNumberUtil {
*
* <ol>
* <li> It only checks the length of phone numbers. In particular, it doesn't check starting
* digits of the number.
* <li> For fixed line numbers, many regions have the concept of area code, which together with
* subscriber number constitute the national significant number. It is sometimes okay to
* dial the subscriber number only when dialing in the same area. This function will return
* true if the subscriber-number-only version is passed in. On the other hand, because
* isValidNumber validates using information on both starting digits (for fixed line
* numbers, that would most likely be area codes) and length (obviously includes the length
* of area codes for fixed line numbers), it will return false for the
* subscriber-number-only version.
* digits of the number.
* <li> For some numbers (particularly fixed-line), many regions have the concept of area code,
* which together with subscriber number constitute the national significant number. It is
* sometimes okay to dial only the subscriber number when dialing in the same area. This
* function will return IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is
* passed in. On the other hand, because isValidNumber validates using information on both
* starting digits (for fixed line numbers, that would most likely be area codes) and
* length (obviously includes the length of area codes for fixed line numbers), it will
* return false for the subscriber-number-only version.
* </ol>
*
* @param number the number that needs to be checked


+ 8
- 10
java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java View File

@ -1443,8 +1443,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
// National numbers for country calling code +1 that are within 7 to 10 digits are possible.
assertEquals(ValidationResult.IS_POSSIBLE, phoneUtil.isPossibleNumberWithReason(US_NUMBER));
assertEquals(
ValidationResult.IS_POSSIBLE, phoneUtil.isPossibleNumberWithReason(US_LOCAL_NUMBER));
assertEquals(ValidationResult.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberWithReason(US_LOCAL_NUMBER));
assertEquals(ValidationResult.TOO_LONG, phoneUtil.isPossibleNumberWithReason(US_LONG_NUMBER));
@ -1547,10 +1547,10 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
// Here we test a number length which matches a local-only length.
number.setCountryCode(49).setNationalNumber(12L);
assertEquals(
ValidationResult.IS_POSSIBLE,
ValidationResult.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PhoneNumberType.UNKNOWN));
assertEquals(
ValidationResult.IS_POSSIBLE,
ValidationResult.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PhoneNumberType.FIXED_LINE));
// Mobile numbers must be 10 or 11 digits, and there are no local-only lengths.
assertEquals(
@ -1565,10 +1565,10 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
// Local-only number.
number.setCountryCode(55).setNationalNumber(12345678L);
assertEquals(
ValidationResult.IS_POSSIBLE,
ValidationResult.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PhoneNumberType.UNKNOWN));
assertEquals(
ValidationResult.IS_POSSIBLE,
ValidationResult.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PhoneNumberType.FIXED_LINE));
// Normal-length number.
@ -1590,7 +1590,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
phoneUtil.isPossibleNumberForTypeWithReason(number, PhoneNumberType.MOBILE));
// This matches a fixed-line length though.
assertEquals(
ValidationResult.IS_POSSIBLE,
ValidationResult.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PhoneNumberType.FIXED_LINE_OR_MOBILE));
// This is too short for fixed-line, and no mobile numbers exist.
number.setCountryCode(55).setNationalNumber(1234567L);
@ -1655,10 +1655,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals(
ValidationResult.TOO_LONG,
phoneUtil.isPossibleNumberForTypeWithReason(number, PhoneNumberType.MOBILE));
// This will change to INVALID_LENGTH once we start returning this type in the main
// isPossibleNumberWithReason API.
assertEquals(
ValidationResult.TOO_LONG,
ValidationResult.INVALID_LENGTH,
phoneUtil.isPossibleNumberForTypeWithReason(number, PhoneNumberType.FIXED_LINE_OR_MOBILE));
number.setNationalNumber(123456L);


+ 42
- 42
javascript/i18n/phonenumbers/demo-compiled.js View File

@ -2,15 +2,15 @@
function ca(a,b){if(b){for(var c=ba,d=a.split("."),e=0;e<d.length-1;e++){var f=d[e];f in c||(c[f]={});c=c[f]}d=d[d.length-1];e=c[d];f=b(e);f!=e&&null!=f&&aa(c,d,{configurable:!0,writable:!0,value:f})}}
ca("String.prototype.repeat",function(a){return a?a:function(a){var b;if(null==this)throw new TypeError("The 'this' value for String.prototype.repeat must not be null or undefined");b=this+"";if(0>a||1342177279<a)throw new RangeError("Invalid count value");a|=0;for(var d="";a;)if(a&1&&(d+=b),a>>>=1)b+=b;return d}});ca("Math.sign",function(a){return a?a:function(a){a=Number(a);return!a||isNaN(a)?a:0<a?1:-1}});
function da(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function k(a){return"string"==typeof a}function l(a,b){function c(){}c.prototype=b.prototype;a.ha=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function n(a){if(Error.captureStackTrace)Error.captureStackTrace(this,n);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))}l(n,Error);n.prototype.name="CustomError";function ea(a,b){for(var c=a.split("%s"),d="",e=Array.prototype.slice.call(arguments,1);e.length&&1<c.length;)d+=c.shift()+e.shift();return d+c.join("%s")};function fa(a,b){b.unshift(a);n.call(this,ea.apply(null,b));b.shift()}l(fa,n);fa.prototype.name="AssertionError";function ga(a,b){throw new fa("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1));};var p=Array.prototype.indexOf?function(a,b,c){return Array.prototype.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(k(a))return k(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ha(a,b){a.sort(b||ia)}function ia(a,b){return a>b?1:a<b?-1:0};function ja(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b}function ka(a,b){var c;a:{for(c in a)if(b.call(void 0,a[c],c,a))break a;c=void 0}return c&&a[c]};function q(a){var b=document;return k(a)?b.getElementById(a):a};function la(a){var b=[];ma(new na,a,b);return b.join("")}function na(){}
else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function k(a){return"string"==typeof a}function m(a,b){function c(){}c.prototype=b.prototype;a.ha=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function n(a){if(Error.captureStackTrace)Error.captureStackTrace(this,n);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))}m(n,Error);n.prototype.name="CustomError";function ea(a,b){for(var c=a.split("%s"),d="",e=Array.prototype.slice.call(arguments,1);e.length&&1<c.length;)d+=c.shift()+e.shift();return d+c.join("%s")};function fa(a,b){b.unshift(a);n.call(this,ea.apply(null,b));b.shift()}m(fa,n);fa.prototype.name="AssertionError";function ga(a,b){throw new fa("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1));};var p=Array.prototype.indexOf?function(a,b,c){return Array.prototype.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(k(a))return k(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ha(a,b){a.sort(b||ia)}function ia(a,b){return a>b?1:a<b?-1:0};function ja(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b}function ka(a,b){var c;a:{for(c in a)if(b.call(void 0,a[c],c,a))break a;c=void 0}return c&&a[c]};function q(a){var b=document;return k(a)?b.getElementById(a):a};function la(a){var b=[];ma(new na,a,b);return b.join("")}function na(){}
function ma(a,b,c){if(null==b)c.push("null");else{if("object"==typeof b){if("array"==da(b)){var d=b;b=d.length;c.push("[");for(var e="",f=0;f<b;f++)c.push(e),ma(a,d[f],c),e=",";c.push("]");return}if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();else{c.push("{");e="";for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(f=b[d],"function"!=typeof f&&(c.push(e),oa(d,c),c.push(":"),ma(a,f,c),e=","));c.push("}");return}}switch(typeof b){case "string":oa(b,c);break;case "number":c.push(isFinite(b)&&
!isNaN(b)?String(b):"null");break;case "boolean":c.push(String(b));break;case "function":c.push("null");break;default:throw Error("Unknown type: "+typeof b);}}}var pa={'"':'\\"',"\\":"\\\\","/":"\\/","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\x0B":"\\u000b"},qa=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
function oa(a,b){b.push('"',a.replace(qa,function(a){var b=pa[a];b||(b="\\u"+(a.charCodeAt(0)|65536).toString(16).substr(1),pa[a]=b);return b}),'"')};function ra(a,b){this.a=a;this.l=b.name;this.f=!!b.u;this.b=b.c;this.j=b.type;this.i=!1;switch(this.b){case sa:case ta:case ua:case va:case wa:case xa:case ya:this.i=!0}this.g=b.defaultValue}var ya=1,xa=2,sa=3,ta=4,ua=6,va=16,wa=18;function za(a,b){this.b=a;this.a={};for(var c=0;c<b.length;c++){var d=b[c];this.a[d.a]=d}}function Aa(a){a=ja(a.a);ha(a,function(a,c){return a.a-c.a});return a}function Ba(a,b){return ka(a.a,function(a){return a.l==b})||null};function r(){this.b={};this.f=this.h().a;this.a=this.g=null}function Ca(a,b){for(var c in a.b){var d=Number(c);a.f[d]||b.call(a,d,a.b[c])}}r.prototype.has=function(a){return t(this,a.a)};r.prototype.get=function(a,b){return u(this,a.a,b)};r.prototype.set=function(a,b){v(this,a.a,b)};
function Da(a,b){for(var c=Aa(a.h()),d=0;d<c.length;d++){var e=c[d],f=e.a;if(t(b,f)){a.a&&delete a.a[e.a];var g=11==e.b||10==e.b;if(e.f)for(var e=w(b,f),h=0;h<e.length;h++)Ea(a,f,g?e[h].clone():e[h]);else e=Fa(b,f),g?(g=Fa(a,f))?Da(g,e):v(a,f,e.clone()):v(a,f,e)}}}r.prototype.clone=function(){var a=new this.constructor;a!=this&&(a.b={},a.a&&(a.a={}),Da(a,this));return a};function t(a,b){return null!=a.b[b]}
function Fa(a,b){var c=a.b[b];if(null==c)return null;if(a.g){if(!(b in a.a)){var d=a.g,e=a.f[b];if(null!=c)if(e.f){for(var f=[],g=0;g<c.length;g++)f[g]=d.a(e,c[g]);c=f}else c=d.a(e,c);return a.a[b]=c}return a.a[b]}return c}function u(a,b,c){var d=Fa(a,b);return a.f[b].f?d[c||0]:d}function x(a,b){var c;if(t(a,b))c=u(a,b,void 0);else a:{c=a.f[b];if(void 0===c.g){var d=c.j;if(d===Boolean)c.g=!1;else if(d===Number)c.g=0;else if(d===String)c.g=c.i?"0":"";else{c=new d;break a}}c=c.g}return c}
function w(a,b){return Fa(a,b)||[]}function y(a,b){return a.f[b].f?t(a,b)?a.b[b].length:0:t(a,b)?1:0}function v(a,b,c){a.b[b]=c;a.a&&(a.a[b]=c)}function Ea(a,b,c){a.b[b]||(a.b[b]=[]);a.b[b].push(c);a.a&&delete a.a[b]}function Ga(a,b){delete a.b[b];a.a&&delete a.a[b]}function Ha(a,b){var c=[],d;for(d in b)0!=d&&c.push(new ra(d,b[d]));return new za(a,c)};function z(){}z.prototype.b=function(a,b){return 11==a.b||10==a.b?this.g(b):"number"!=typeof b||isFinite(b)?b:b.toString()};z.prototype.f=function(a,b){var c=new a.b;this.i(c,b);return c};
z.prototype.a=function(a,b){if(11==a.b||10==a.b)return b instanceof r?b:this.f(a.j.prototype.h(),b);if(14==a.b){if(k(b)&&Ia.test(b)){var c=Number(b);if(0<c)return c}return b}if(!a.i)return b;c=a.j;if(c===String){if("number"==typeof b)return String(b)}else if(c===Number&&k(b)&&("Infinity"===b||"-Infinity"===b||"NaN"===b||Ia.test(b)))return Number(b);return b};var Ia=/^-?[0-9]+$/;function A(a,b){this.j=a;this.l=b}l(A,z);A.prototype.g=function(a){for(var b=Aa(a.h()),c={},d=0;d<b.length;d++){var e=b[d],f=1==this.j?e.l:e.a;if(a.has(e))if(e.f){var g=[];c[f]=g;for(f=0;f<y(a,e.a);f++)g.push(this.b(e,a.get(e,f)))}else c[f]=this.b(e,a.get(e))}Ca(a,function(a,b){c[a]=b});return c};A.prototype.b=function(a,b){return this.l&&8==a.b&&"boolean"==typeof b?b?1:0:A.ha.b.call(this,a,b)};A.prototype.a=function(a,b){return 8==a.b&&"number"==typeof b?!!b:A.ha.a.call(this,a,b)};
A.prototype.i=function(a,b){var c=a.h(),d;for(d in b){var e,f=b[d],g=!/[^0-9]/.test(d);if(e=g?c.a[parseInt(d,10)]||null:Ba(c,d))if(e.f)for(g=0;g<f.length;g++){var h=this.a(e,f[g]);Ea(a,e.a,h)}else a.set(e,this.a(e,f));else g?(e=a,g=Number(d),e.b[g]=f,e.a&&delete e.a[g]):ga("Failed to find field: "+e)}};function B(a,b){null!=a&&this.a.apply(this,arguments)}B.prototype.b="";B.prototype.set=function(a){this.b=""+a};B.prototype.a=function(a,b,c){this.b+=String(a);if(null!=b)for(var d=1;d<arguments.length;d++)this.b+=arguments[d];return this};function C(a){a.b=""}B.prototype.toString=function(){return this.b};/*
function Fa(a,b){var c=a.b[b];if(null==c)return null;if(a.g){if(!(b in a.a)){var d=a.g,e=a.f[b];if(null!=c)if(e.f){for(var f=[],g=0;g<c.length;g++)f[g]=d.a(e,c[g]);c=f}else c=d.a(e,c);return a.a[b]=c}return a.a[b]}return c}function u(a,b,c){var d=Fa(a,b);return a.f[b].f?d[c||0]:d}function y(a,b){var c;if(t(a,b))c=u(a,b,void 0);else a:{c=a.f[b];if(void 0===c.g){var d=c.j;if(d===Boolean)c.g=!1;else if(d===Number)c.g=0;else if(d===String)c.g=c.i?"0":"";else{c=new d;break a}}c=c.g}return c}
function w(a,b){return Fa(a,b)||[]}function z(a,b){return a.f[b].f?t(a,b)?a.b[b].length:0:t(a,b)?1:0}function v(a,b,c){a.b[b]=c;a.a&&(a.a[b]=c)}function Ea(a,b,c){a.b[b]||(a.b[b]=[]);a.b[b].push(c);a.a&&delete a.a[b]}function Ga(a,b){delete a.b[b];a.a&&delete a.a[b]}function Ha(a,b){var c=[],d;for(d in b)0!=d&&c.push(new ra(d,b[d]));return new za(a,c)};function A(){}A.prototype.b=function(a,b){return 11==a.b||10==a.b?this.g(b):"number"!=typeof b||isFinite(b)?b:b.toString()};A.prototype.f=function(a,b){var c=new a.b;this.i(c,b);return c};
A.prototype.a=function(a,b){if(11==a.b||10==a.b)return b instanceof r?b:this.f(a.j.prototype.h(),b);if(14==a.b){if(k(b)&&Ia.test(b)){var c=Number(b);if(0<c)return c}return b}if(!a.i)return b;c=a.j;if(c===String){if("number"==typeof b)return String(b)}else if(c===Number&&k(b)&&("Infinity"===b||"-Infinity"===b||"NaN"===b||Ia.test(b)))return Number(b);return b};var Ia=/^-?[0-9]+$/;function B(a,b){this.j=a;this.l=b}m(B,A);B.prototype.g=function(a){for(var b=Aa(a.h()),c={},d=0;d<b.length;d++){var e=b[d],f=1==this.j?e.l:e.a;if(a.has(e))if(e.f){var g=[];c[f]=g;for(f=0;f<z(a,e.a);f++)g.push(this.b(e,a.get(e,f)))}else c[f]=this.b(e,a.get(e))}Ca(a,function(a,b){c[a]=b});return c};B.prototype.b=function(a,b){return this.l&&8==a.b&&"boolean"==typeof b?b?1:0:B.ha.b.call(this,a,b)};B.prototype.a=function(a,b){return 8==a.b&&"number"==typeof b?!!b:B.ha.a.call(this,a,b)};
B.prototype.i=function(a,b){var c=a.h(),d;for(d in b){var e,f=b[d],g=!/[^0-9]/.test(d);if(e=g?c.a[parseInt(d,10)]||null:Ba(c,d))if(e.f)for(g=0;g<f.length;g++){var h=this.a(e,f[g]);Ea(a,e.a,h)}else a.set(e,this.a(e,f));else g?(e=a,g=Number(d),e.b[g]=f,e.a&&delete e.a[g]):ga("Failed to find field: "+e)}};function C(a,b){null!=a&&this.a.apply(this,arguments)}C.prototype.b="";C.prototype.set=function(a){this.b=""+a};C.prototype.a=function(a,b,c){this.b+=String(a);if(null!=b)for(var d=1;d<arguments.length;d++)this.b+=arguments[d];return this};function D(a){a.b=""}C.prototype.toString=function(){return this.b};/*
Protocol Buffer 2 Copyright 2008 Google Inc.
All other code copyright its respective owners.
@ -28,12 +28,12 @@ A.prototype.i=function(a,b){var c=a.h(),d;for(d in b){var e,f=b[d],g=!/[^0-9]/.t
See the License for the specific language governing permissions and
limitations under the License.
*/
function D(){r.call(this)}l(D,r);var Ja=null;function F(){r.call(this)}l(F,r);var Ka=null;function G(){r.call(this)}l(G,r);var La=null;
D.prototype.h=function(){var a=Ja;a||(Ja=a=Ha(D,{0:{name:"NumberFormat",ba:"i18n.phonenumbers.NumberFormat"},1:{name:"pattern",required:!0,c:9,type:String},2:{name:"format",required:!0,c:9,type:String},3:{name:"leading_digits_pattern",u:!0,c:9,type:String},4:{name:"national_prefix_formatting_rule",c:9,type:String},6:{name:"national_prefix_optional_when_formatting",c:8,type:Boolean},5:{name:"domestic_carrier_code_formatting_rule",c:9,type:String}}));return a};D.h=D.prototype.h;
function E(){r.call(this)}m(E,r);var Ja=null;function F(){r.call(this)}m(F,r);var Ka=null;function G(){r.call(this)}m(G,r);var La=null;
E.prototype.h=function(){var a=Ja;a||(Ja=a=Ha(E,{0:{name:"NumberFormat",ba:"i18n.phonenumbers.NumberFormat"},1:{name:"pattern",required:!0,c:9,type:String},2:{name:"format",required:!0,c:9,type:String},3:{name:"leading_digits_pattern",u:!0,c:9,type:String},4:{name:"national_prefix_formatting_rule",c:9,type:String},6:{name:"national_prefix_optional_when_formatting",c:8,type:Boolean},5:{name:"domestic_carrier_code_formatting_rule",c:9,type:String}}));return a};E.h=E.prototype.h;
F.prototype.h=function(){var a=Ka;a||(Ka=a=Ha(F,{0:{name:"PhoneNumberDesc",ba:"i18n.phonenumbers.PhoneNumberDesc"},2:{name:"national_number_pattern",c:9,type:String},3:{name:"possible_number_pattern",c:9,type:String},9:{name:"possible_length",u:!0,c:5,type:Number},10:{name:"possible_length_local_only",u:!0,c:5,type:Number},6:{name:"example_number",c:9,type:String},7:{name:"national_number_matcher_data",c:12,type:String},8:{name:"possible_number_matcher_data",c:12,type:String}}));return a};F.h=F.prototype.h;
G.prototype.h=function(){var a=La;a||(La=a=Ha(G,{0:{name:"PhoneMetadata",ba:"i18n.phonenumbers.PhoneMetadata"},1:{name:"general_desc",c:11,type:F},2:{name:"fixed_line",c:11,type:F},3:{name:"mobile",c:11,type:F},4:{name:"toll_free",c:11,type:F},5:{name:"premium_rate",c:11,type:F},6:{name:"shared_cost",c:11,type:F},7:{name:"personal_number",c:11,type:F},8:{name:"voip",c:11,type:F},21:{name:"pager",c:11,type:F},25:{name:"uan",c:11,type:F},27:{name:"emergency",c:11,type:F},28:{name:"voicemail",c:11,type:F},
24:{name:"no_international_dialling",c:11,type:F},9:{name:"id",required:!0,c:9,type:String},10:{name:"country_code",c:5,type:Number},11:{name:"international_prefix",c:9,type:String},17:{name:"preferred_international_prefix",c:9,type:String},12:{name:"national_prefix",c:9,type:String},13:{name:"preferred_extn_prefix",c:9,type:String},15:{name:"national_prefix_for_parsing",c:9,type:String},16:{name:"national_prefix_transform_rule",c:9,type:String},18:{name:"same_mobile_and_fixed_line_pattern",c:8,defaultValue:!1,
type:Boolean},19:{name:"number_format",u:!0,c:11,type:D},20:{name:"intl_number_format",u:!0,c:11,type:D},22:{name:"main_country_for_code",c:8,defaultValue:!1,type:Boolean},23:{name:"leading_digits",c:9,type:String},26:{name:"leading_zero_possible",c:8,defaultValue:!1,type:Boolean}}));return a};G.h=G.prototype.h;function Ma(){}l(Ma,z);Ma.prototype.f=function(a,b){var c=new a.b;c.g=this;c.b=b;c.a={};return c};Ma.prototype.i=function(){throw Error("Unimplemented");};function H(){}l(H,Ma);H.prototype.g=function(a){for(var b=Aa(a.h()),c=[],d=0;d<b.length;d++){var e=b[d];if(a.has(e)){var f=e.a;if(e.f){c[f]=[];for(var g=0;g<y(a,e.a);g++)c[f][g]=this.b(e,a.get(e,g))}else c[f]=this.b(e,a.get(e))}}Ca(a,function(a,b){c[a]=b});return c};H.prototype.b=function(a,b){return 8==a.b?b?1:0:z.prototype.b.apply(this,arguments)};H.prototype.a=function(a,b){return 8==a.b?!!b:z.prototype.a.apply(this,arguments)};function I(){r.call(this)}var Na;l(I,r);var Oa={la:1,ka:5,ja:10,ia:20};
type:Boolean},19:{name:"number_format",u:!0,c:11,type:E},20:{name:"intl_number_format",u:!0,c:11,type:E},22:{name:"main_country_for_code",c:8,defaultValue:!1,type:Boolean},23:{name:"leading_digits",c:9,type:String},26:{name:"leading_zero_possible",c:8,defaultValue:!1,type:Boolean}}));return a};G.h=G.prototype.h;function Ma(){}m(Ma,A);Ma.prototype.f=function(a,b){var c=new a.b;c.g=this;c.b=b;c.a={};return c};Ma.prototype.i=function(){throw Error("Unimplemented");};function H(){}m(H,Ma);H.prototype.g=function(a){for(var b=Aa(a.h()),c=[],d=0;d<b.length;d++){var e=b[d];if(a.has(e)){var f=e.a;if(e.f){c[f]=[];for(var g=0;g<z(a,e.a);g++)c[f][g]=this.b(e,a.get(e,g))}else c[f]=this.b(e,a.get(e))}}Ca(a,function(a,b){c[a]=b});return c};H.prototype.b=function(a,b){return 8==a.b?b?1:0:A.prototype.b.apply(this,arguments)};H.prototype.a=function(a,b){return 8==a.b?!!b:A.prototype.a.apply(this,arguments)};function I(){r.call(this)}var Na;m(I,r);var Oa={la:1,ka:5,ja:10,ia:20};
I.prototype.h=function(){Na||(Na=Ha(I,{0:{name:"PhoneNumber",ba:"i18n.phonenumbers.PhoneNumber"},1:{name:"country_code",required:!0,c:5,type:Number},2:{name:"national_number",required:!0,c:4,type:Number},3:{name:"extension",c:9,type:String},4:{name:"italian_leading_zero",c:8,type:Boolean},8:{name:"number_of_leading_zeros",c:5,defaultValue:1,type:Number},5:{name:"raw_input",c:9,type:String},6:{name:"country_code_source",c:14,defaultValue:1,type:Oa},7:{name:"preferred_domestic_carrier_code",c:9,type:String}}));
return Na};I.ctor=I;I.ctor.h=I.prototype.h;/*
@ -439,37 +439,37 @@ var L={0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9","\uff10":"0",
7:"7",8:"8",9:"9","+":"+","*":"*","#":"#"},Ra={0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9","\uff10":"0","\uff11":"1","\uff12":"2","\uff13":"3","\uff14":"4","\uff15":"5","\uff16":"6","\uff17":"7","\uff18":"8","\uff19":"9","\u0660":"0","\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u06f0":"0","\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9",A:"2",
B:"2",C:"2",D:"3",E:"3",F:"3",G:"4",H:"4",I:"4",J:"5",K:"5",L:"5",M:"6",N:"6",O:"6",P:"7",Q:"7",R:"7",S:"7",T:"8",U:"8",V:"8",W:"9",X:"9",Y:"9",Z:"9"},Sa=/[\d]+(?:[~\u2053\u223C\uFF5E][\d]+)?/,Ta=RegExp("[+\uff0b]+"),M=RegExp("^[+\uff0b]+"),Ua=RegExp("([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9])"),Va=RegExp("[+\uff0b0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]"),Wa=/[\\\/] *x/,Xa=RegExp("[^0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9A-Za-z#]+$"),Ya=/(?:.*?[A-Za-z]){3}.*/,Za=RegExp("(?:;ext=([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{1,7})|[ \u00a0\\t,]*(?:e?xt(?:ensi(?:o\u0301?|\u00f3))?n?|\uff45?\uff58\uff54\uff4e?|[;,x\uff58#\uff03~\uff5e]|int|anexo|\uff49\uff4e\uff54)[:\\.\uff0e]?[ \u00a0\\t,-]*([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{1,7})#?|[- ]+([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{1,5})#)$",
"i"),$a=RegExp("^[0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{2}$|^[+\uff0b]*(?:[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e*]*[0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]){3,}[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e*A-Za-z0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]*(?:;ext=([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{1,7})|[ \u00a0\\t,]*(?:e?xt(?:ensi(?:o\u0301?|\u00f3))?n?|\uff45?\uff58\uff54\uff4e?|[;,x\uff58#\uff03~\uff5e]|int|anexo|\uff49\uff4e\uff54)[:\\.\uff0e]?[ \u00a0\\t,-]*([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{1,7})#?|[- ]+([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{1,5})#)?$",
"i"),ab=/(\$\d)/,bb=/\$NP/,cb=/\$FG/,db=/\$CC/,eb=/^\(?\$1\)?$/;function fb(a){var b=a.search(Va);0<=b?(a=a.substring(b),a=a.replace(Xa,""),b=a.search(Wa),0<=b&&(a=a.substring(0,b))):a="";return a}function gb(a){return 2>a.length?!1:N($a,a)}function hb(a){return N(Ya,a)?O(a,Ra):O(a,L)}function ib(a){var b=hb(a.toString());C(a);a.a(b)}function kb(a){return!!a&&(1!=y(a,9)||-1!=w(a,9)[0])}
function O(a,b){for(var c=new B,d,e=a.length,f=0;f<e;++f)d=a.charAt(f),d=b[d.toUpperCase()],null!=d&&c.a(d);return c.toString()}function lb(a){return null!=a&&isNaN(a)&&a.toUpperCase()in Pa}function Q(a,b,c){if(0==u(b,2)&&t(b,5)){var d=x(b,5);if(0<d.length)return d}var d=x(b,1),e=R(b);if(0==c)return S(d,0,e,"");if(!(d in J))return e;a=T(a,d,U(d));b=mb(b,a,c);e=nb(e,a,c);return S(d,c,e,b)}
function ob(a,b,c){var d=x(b,1),e=R(b);if(!(d in J))return e;a=T(a,d,U(d));b=mb(b,a,2);c=nb(e,a,2,c);return S(d,2,c,b)}function T(a,b,c){return"001"==c?V(a,""+b):V(a,c)}
function pb(a,b,c){if(!lb(c))return Q(a,b,1);var d=x(b,1),e=R(b);if(!(d in J))return e;if(1==d){if(null!=c&&0<=p(J[1],c.toUpperCase()))return d+" "+Q(a,b,2)}else if(d==qb(a,c))return Q(a,b,2);var f=V(a,c),g=x(f,11);c="";N(Sa,g)?c=g:t(f,17)&&(c=x(f,17));a=T(a,d,U(d));e=nb(e,a,1);b=mb(b,a,1);return 0<c.length?c+" "+d+" "+e+b:S(d,1,e,b)}
function rb(a,b,c){var d;if(d=t(b,5)){if(d=t(b,4))d=x(b,1),d=T(a,d,U(d)),d=!(d&&x(d,26));if(!d){d=x(b,1);if(d=T(a,d,U(d))){var e=R(b);d=!!sb(w(d,19),e)}else d=!1;d=!d}}if(d)return x(b,5);if(!t(b,6))return Q(a,b,2);switch(u(b,6)){case 1:a=Q(a,b,1);break;case 5:a=pb(a,b,c);break;case 10:a=Q(a,b,1).substring(1);break;default:d=U(x(b,1));var f;(c=V(a,d))?(c=x(c,12),f=c.length?c=c.replace("~",""):null):f=null;c=Q(a,b,2);if(null!=f&&f.length){var g;a:{e=x(b,5);e=O(e,L);if(!e.lastIndexOf(f,0))try{g=tb(a,
ub(a,e.substring(f.length),d,!1));break a}catch(h){}g=!1}if(g)a=c;else if(g=V(a,d),d=R(b),g=sb(w(g,19),d))if(d=x(g,4),e=d.indexOf("$1"),0>=e)a=c;else if(d=d.substring(0,e),d=O(d,L),d.length)if(g=g.clone(),Ga(g,4),d=[g],g=x(b,1),c=R(b),g in J){a=T(a,g,U(g));if(e=sb(d,c))d=e.clone(),e=x(e,4),0<e.length&&(f=x(a,12),0<f.length?(e=e.replace(bb,f).replace(cb,"$1"),v(d,4,e)):Ga(d,4)),c=vb(c,d,2);a=mb(b,a,2);a=S(g,2,c,a)}else a=c;else a=c;else a=c}else a=c}b=x(b,5);null!=a&&0<b.length&&(g=O(a,Qa),c=O(b,Qa),
g!=c&&(a=b));return a}function R(a){var b=""+u(a,2);return t(a,4)&&u(a,4)&&0<x(a,8)?Array(x(a,8)+1).join("0")+b:b}function S(a,b,c,d){switch(b){case 0:return"+"+a+c+d;case 1:return"+"+a+" "+c+d;case 3:return"tel:+"+a+"-"+c+d;default:return c+d}}function nb(a,b,c,d){b=w(b,20).length&&2!=c?w(b,20):w(b,19);return(b=sb(b,a))?vb(a,b,c,d):a}function sb(a,b){for(var c,d=a.length,e=0;e<d;++e){c=a[e];var f=y(c,3);if(!f||!b.search(u(c,3,f-1)))if(f=new RegExp(u(c,1)),N(f,b))return c}return null}
function vb(a,b,c,d){var e=x(b,2),f=new RegExp(u(b,1)),g=x(b,5);2==c&&null!=d&&0<d.length&&0<g.length?(b=g.replace(db,d),e=e.replace(ab,b),a=a.replace(f,e)):(b=x(b,4),a=2==c&&null!=b&&0<b.length?a.replace(f,e.replace(ab,b)):a.replace(f,e));3==c&&(a=a.replace(RegExp("^[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]+"),""),a=a.replace(RegExp("[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]+",
"g"),"-"));return a}function mb(a,b,c){return t(a,3)&&u(a,3).length?3==c?";ext="+u(a,3):t(b,13)?u(b,13)+x(a,3):" ext. "+x(a,3):""}function wb(a,b){switch(b){case 4:return u(a,5);case 3:return u(a,4);case 1:return u(a,3);case 0:case 2:return u(a,2);case 5:return u(a,6);case 6:return u(a,8);case 7:return u(a,7);case 8:return u(a,21);case 9:return u(a,25);case 10:return u(a,28);default:return u(a,1)}}
function xb(a,b){return W(a,u(b,1))?W(a,u(b,5))?4:W(a,u(b,4))?3:W(a,u(b,6))?5:W(a,u(b,8))?6:W(a,u(b,7))?7:W(a,u(b,21))?8:W(a,u(b,25))?9:W(a,u(b,28))?10:W(a,u(b,2))?u(b,18)||W(a,u(b,3))?2:0:!u(b,18)&&W(a,u(b,3))?1:-1:-1}function V(a,b){if(null==b)return null;b=b.toUpperCase();var c=a.a[b];if(!c){c=Pa[b];if(!c)return null;c=(new H).f(G.h(),c);a.a[b]=c}return c}function W(a,b){var c=a.length;return 0<y(b,9)&&-1==p(w(b,9),c)?!1:N(x(b,2),a)}function tb(a,b){var c=yb(a,b);return zb(a,b,c)}
function zb(a,b,c){var d=x(b,1),e=T(a,d,c);if(!e||"001"!=c&&d!=qb(a,c))return!1;a=R(b);return-1!=xb(a,e)}function yb(a,b){if(!b)return null;var c=x(b,1);if(c=J[c])if(1==c.length)c=c[0];else a:{for(var d=R(b),e,f=c.length,g=0;g<f;g++){e=c[g];var h=V(a,e);if(t(h,23)){if(!d.search(u(h,23))){c=e;break a}}else if(-1!=xb(d,h)){c=e;break a}}c=null}else c=null;return c}function U(a){return(a=J[a])?a[0]:"ZZ"}function qb(a,b){var c=V(a,b);if(!c)throw Error("Invalid region code: "+b);return x(c,10)}
function Ab(a,b,c,d){var e=wb(c,d),f=y(e,9)?w(e,9):w(u(c,1),9),e=w(e,10);if(2==d)if(kb(wb(c,0)))a=wb(c,1),kb(a)&&(f=f.concat(y(a,9)?w(a,9):w(u(c,1),9)),ha(f),e.length?(e=e.concat(w(a,10)),ha(e)):e=w(a,10));else return Ab(a,b,c,1);if(-1==f[0])return 5;b=b.length;if(-1<p(e,b))return 0;c=f[0];return c==b?0:c>b?2:f[f.length-1]<b?3:-1<p(f,b,1)?0:3}function Bb(a,b){var c=R(b),d=x(b,1);if(!(d in J))return 1;d=T(a,d,U(d));return Ab(a,c,d,-1)}
function Cb(a,b){var c=a.toString();if(!c.length||"0"==c.charAt(0))return 0;for(var d,e=c.length,f=1;3>=f&&f<=e;++f)if(d=parseInt(c.substring(0,f),10),d in J)return b.a(c.substring(f)),d;return 0}
function Db(a,b,c,d,e,f){if(!b.length)return 0;b=new B(b);var g;c&&(g=u(c,11));null==g&&(g="NonMatch");var h=b.toString();if(h.length)if(M.test(h))h=h.replace(M,""),C(b),b.a(hb(h)),g=1;else{h=new RegExp(g);ib(b);g=b.toString();if(g.search(h))g=!1;else{var h=g.match(h)[0].length,m=g.substring(h).match(Ua);m&&null!=m[1]&&0<m[1].length&&"0"==O(m[1],L)?g=!1:(C(b),b.a(g.substring(h)),g=!0)}g=g?5:20}else g=20;e&&v(f,6,g);if(20!=g){if(2>=b.b.length)throw Error("Phone number too short after IDD");if(a=Cb(b,
d))return v(f,1,a),a;throw Error("Invalid country calling code");}if(c&&(g=x(c,10),h=""+g,m=b.toString(),!m.lastIndexOf(h,0)&&(h=new B(m.substring(h.length)),m=u(c,1),m=new RegExp(x(m,2)),Eb(h,c,null),h=h.toString(),!N(m,b.toString())&&N(m,h)||3==Ab(a,b.toString(),c,-1))))return d.a(h),e&&v(f,6,10),v(f,1,g),g;v(f,1,0);return 0}
function Eb(a,b,c){var d=a.toString(),e=d.length,f=u(b,15);if(e&&null!=f&&f.length){var g=new RegExp("^(?:"+f+")");if(e=g.exec(d)){var f=new RegExp(x(u(b,1),2)),h=N(f,d),m=e.length-1;b=u(b,16);if(null!=b&&b.length&&null!=e[m]&&e[m].length){if(d=d.replace(g,b),!h||N(f,d))c&&0<m&&c.a(e[1]),a.set(d)}else if(!h||N(f,d.substring(e[0].length)))c&&0<m&&null!=e[m]&&c.a(e[1]),a.set(d.substring(e[0].length))}}}
function ub(a,b,c,d){if(null==b)throw Error("The string supplied did not seem to be a phone number");if(250<b.length)throw Error("The string supplied is too long to be a phone number");var e=new B,f=b.indexOf(";phone-context=");if(0<f){var g=f+15;if("+"==b.charAt(g)){var h=b.indexOf(";",g);0<h?e.a(b.substring(g,h)):e.a(b.substring(g))}g=b.indexOf("tel:");e.a(b.substring(0<=g?g+4:0,f))}else e.a(fb(b));f=e.toString();g=f.indexOf(";isub=");0<g&&(C(e),e.a(f.substring(0,g)));if(!gb(e.toString()))throw Error("The string supplied did not seem to be a phone number");
f=e.toString();if(!(lb(c)||null!=f&&0<f.length&&M.test(f)))throw Error("Invalid country calling code");f=new I;d&&v(f,5,b);a:{b=e.toString();g=b.search(Za);if(0<=g&&gb(b.substring(0,g)))for(var h=b.match(Za),m=h.length,E=1;E<m;++E)if(null!=h[E]&&0<h[E].length){C(e);e.a(b.substring(0,g));b=h[E];break a}b=""}0<b.length&&v(f,3,b);b=V(a,c);g=new B;h=0;m=e.toString();try{h=Db(a,m,b,g,d,f)}catch(P){if("Invalid country calling code"==P.message&&M.test(m)){if(m=m.replace(M,""),h=Db(a,m,b,g,d,f),!h)throw P;
}else throw P;}h?(e=U(h),e!=c&&(b=T(a,h,e))):(ib(e),g.a(e.toString()),null!=c?(h=x(b,10),v(f,1,h)):d&&Ga(f,6));if(2>g.b.length)throw Error("The string supplied is too short to be a phone number");b&&(c=new B,e=new B(g.toString()),Eb(e,b,c),2!=Ab(a,e.toString(),b,-1)&&(g=e,d&&0<c.toString().length&&v(f,7,c.toString())));a=g.toString();d=a.length;if(2>d)throw Error("The string supplied is too short to be a phone number");if(17<d)throw Error("The string supplied is too long to be a phone number");if(1<
a.length&&"0"==a.charAt(0)){v(f,4,!0);for(d=1;d<a.length-1&&"0"==a.charAt(d);)d++;1!=d&&v(f,8,d)}v(f,2,parseInt(a,10));return f}function N(a,b){var c="string"==typeof a?b.match("^(?:"+a+")$"):b.match(a);return c&&c[0].length==b.length?!0:!1};function Fb(a){this.ca=RegExp("\u2008");this.ea="";this.m=new B;this.w="";this.i=new B;this.v=new B;this.j=!0;this.$=this.o=this.ga=!1;this.da=K.a();this.s=0;this.b=new B;this.aa=!1;this.l="";this.a=new B;this.f=[];this.fa=a;this.g=Gb(this,this.fa)}var Hb=new G;v(Hb,11,"NA");
var Ib=/\[([^\[\]])*\]/g,Jb=/\d(?=[^,}][^,}])/g,Kb=RegExp("^[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]*(\\$\\d[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]*)+$"),Lb=/[- ]/;function Gb(a,b){var c=lb(b)?qb(a.da,b):0;return(c=V(a.da,U(c)))?c:Hb}
function Mb(a){for(var b=a.f.length,c=0;c<b;++c){var d=a.f[c],e=x(d,1);if(a.w==e)return!1;var f;f=a;var g=d,h=x(g,1);if(-1!=h.indexOf("|"))f=!1;else{h=h.replace(Ib,"\\d");h=h.replace(Jb,"\\d");C(f.m);var m;m=f;var g=x(g,2),E="999999999999999".match(h)[0];E.length<m.a.b.length?m="":(m=E.replace(new RegExp(h,"g"),g),m=m.replace(RegExp("9","g"),"\u2008"));0<m.length?(f.m.a(m),f=!0):f=!1}if(f)return a.w=e,a.aa=Lb.test(u(d,4)),a.s=0,!0}return a.j=!1}
function Nb(a,b){for(var c=[],d=b.length-3,e=a.f.length,f=0;f<e;++f){var g=a.f[f];y(g,3)?(g=u(g,3,Math.min(d,y(g,3)-1)),b.search(g)||c.push(a.f[f])):c.push(a.f[f])}a.f=c}function Ob(a,b){a.ea=Pb(a,b);return a.ea}
function Pb(a,b){a.i.a(b);var c=b;if(Ua.test(c)||1==a.i.b.length&&Ta.test(c)){var c=b,d;"+"==c?(d=c,a.v.a(c)):(d=L[c],a.v.a(d),a.a.a(d));b=d}else a.j=!1,a.ga=!0;if(!a.j){if(!a.ga)if(Qb(a)){if(Rb(a))return Sb(a)}else if(0<a.l.length&&(c=a.a.toString(),C(a.a),a.a.a(a.l),a.a.a(c),c=a.b.toString(),d=c.lastIndexOf(a.l),C(a.b),a.b.a(c.substring(0,d))),a.l!=Tb(a))return a.b.a(" "),Sb(a);return a.i.toString()}switch(a.v.b.length){case 0:case 1:case 2:return a.i.toString();case 3:if(Qb(a))a.$=!0;else return a.l=
Tb(a),Ub(a);default:if(a.$)return Rb(a)&&(a.$=!1),a.b.toString()+a.a.toString();if(0<a.f.length){c=Vb(a,b);d=Wb(a);if(0<d.length)return d;Nb(a,a.a.toString());return Mb(a)?Xb(a):a.j?Yb(a,c):a.i.toString()}return Ub(a)}}function Sb(a){a.j=!0;a.$=!1;a.f=[];a.s=0;C(a.m);a.w="";return Ub(a)}function Wb(a){for(var b=a.a.toString(),c=a.f.length,d=0;d<c;++d){var e=a.f[d],f=x(e,1);if((new RegExp("^(?:"+f+")$")).test(b))return a.aa=Lb.test(u(e,4)),b=b.replace(new RegExp(f,"g"),u(e,2)),Yb(a,b)}return""}
function Yb(a,b){var c=a.b.b.length;return a.aa&&0<c&&" "!=a.b.toString().charAt(c-1)?a.b+" "+b:a.b+b}function Ub(a){var b=a.a.toString();if(3<=b.length){for(var c=a.o&&0<y(a.g,20)?w(a.g,20):w(a.g,19),d=c.length,e=0;e<d;++e){var f=c[e],g;(g=!t(a.g,12)||a.o||u(f,6))||(g=x(f,4),g=!g.length||eb.test(g));g&&Kb.test(x(f,2))&&a.f.push(f)}Nb(a,b);b=Wb(a);return 0<b.length?b:Mb(a)?Xb(a):a.i.toString()}return Yb(a,b)}
function Xb(a){var b=a.a.toString(),c=b.length;if(0<c){for(var d="",e=0;e<c;e++)d=Vb(a,b.charAt(e));return a.j?Yb(a,d):a.i.toString()}return a.b.toString()}
function Tb(a){var b=a.a.toString(),c=0,d;1!=u(a.g,10)?d=!1:(d=a.a.toString(),d="1"==d.charAt(0)&&"0"!=d.charAt(1)&&"1"!=d.charAt(1));d?(c=1,a.b.a("1").a(" "),a.o=!0):t(a.g,15)&&(d=new RegExp("^(?:"+u(a.g,15)+")"),(d=b.match(d))&&null!=d[0]&&0<d[0].length&&(a.o=!0,c=d[0].length,a.b.a(b.substring(0,c))));C(a.a);a.a.a(b.substring(c));return b.substring(0,c)}
function Qb(a){var b=a.v.toString(),c=new RegExp("^(?:\\+|"+u(a.g,11)+")");return(c=b.match(c))&&null!=c[0]&&0<c[0].length?(a.o=!0,c=c[0].length,C(a.a),a.a.a(b.substring(c)),C(a.b),a.b.a(b.substring(0,c)),"+"!=b.charAt(0)&&a.b.a(" "),!0):!1}function Rb(a){if(!a.a.b.length)return!1;var b=new B,c=Cb(a.a,b);if(!c)return!1;C(a.a);a.a.a(b.toString());b=U(c);"001"==b?a.g=V(a.da,""+c):b!=a.fa&&(a.g=Gb(a,b));a.b.a(""+c).a(" ");a.l="";return!0}
function Vb(a,b){var c=a.m.toString();if(0<=c.substring(a.s).search(a.ca)){var d=c.search(a.ca),c=c.replace(a.ca,b);C(a.m);a.m.a(c);a.s=d;return c.substring(0,a.s+1)}1==a.f.length&&(a.j=!1);a.w="";return a.i.toString()};function Zb(){var a=q("phoneNumber").value,b=q("defaultCountry").value,c=q("carrierCode").value,d=new B;try{var e=K.a(),f;if(!lb(b)&&0<a.length&&"+"!=a.charAt(0))throw Error("Invalid country calling code");f=ub(e,a,b,!0);d.a("****Parsing Result:****\n");d.a(la((new A(1)).g(f)));d.a("\n\n****Validation Results:****");var g=0==Bb(e,f);d.a("\nResult from isPossibleNumber(): ");d.a(g);if(g){var h=tb(e,f);d.a("\nResult from isValidNumber(): ");d.a(h);h&&b&&"ZZ"!=b&&(d.a("\nResult from isValidNumberForRegion(): "),
d.a(zb(e,f,b)));d.a("\nPhone Number region: ");d.a(yb(e,f));d.a("\nResult from getNumberType(): ");var m;var E=yb(e,f),P=T(e,x(f,1),E);if(P){var ac=R(f);m=xb(ac,P)}else m=-1;switch(m){case 0:d.a("FIXED_LINE");break;case 1:d.a("MOBILE");break;case 2:d.a("FIXED_LINE_OR_MOBILE");break;case 3:d.a("TOLL_FREE");break;case 4:d.a("PREMIUM_RATE");break;case 5:d.a("SHARED_COST");break;case 6:d.a("VOIP");break;case 7:d.a("PERSONAL_NUMBER");break;case 8:d.a("PAGER");break;case 9:d.a("UAN");break;case -1:d.a("UNKNOWN")}}else{d.a("\nResult from isPossibleNumberWithReason(): ");
switch(Bb(e,f)){case 1:d.a("INVALID_COUNTRY_CODE");break;case 2:d.a("TOO_SHORT");break;case 3:d.a("TOO_LONG")}d.a("\nNote: numbers that are not possible have type UNKNOWN, an unknown region, and are considered invalid.")}d.a("\n\n****Formatting Results:**** ");d.a("\nE164 format: ");d.a(h?Q(e,f,0):"invalid");d.a("\nOriginal format: ");d.a(rb(e,f,b));d.a("\nNational format: ");d.a(Q(e,f,2));d.a("\nInternational format: ");d.a(h?Q(e,f,1):"invalid");d.a("\nOut-of-country format from US: ");d.a(h?pb(e,
f,"US"):"invalid");d.a("\nOut-of-country format from Switzerland: ");d.a(h?pb(e,f,"CH"):"invalid");0<c.length&&(d.a("\nNational format with carrier code: "),d.a(ob(e,f,c)));d.a("\n\n****AsYouTypeFormatter Results****");for(var bc=new Fb(b),cc=a.length,b=0;b<cc;++b){var jb=a.charAt(b);d.a("\nChar entered: ");d.a(jb);d.a(" Output: ");d.a(Ob(bc,jb))}}catch(dc){d.a("\n"+dc.toString())}q("output").value=d.toString();return!1}var X=["phoneNumberParser"],Y=this;
X[0]in Y||!Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());){var $b;if($b=!X.length)$b=void 0!==Zb;$b?Y[Z]=Zb:Y[Z]?Y=Y[Z]:Y=Y[Z]={}};})();
"i"),ab=/(\$\d)/,bb=/\$NP/,cb=/\$FG/,db=/\$CC/,eb=/^\(?\$1\)?$/;function fb(a){var b=a.search(Va);0<=b?(a=a.substring(b),a=a.replace(Xa,""),b=a.search(Wa),0<=b&&(a=a.substring(0,b))):a="";return a}function gb(a){return 2>a.length?!1:N($a,a)}function hb(a){return N(Ya,a)?O(a,Ra):O(a,L)}function ib(a){var b=hb(a.toString());D(a);a.a(b)}function lb(a){return!!a&&(1!=z(a,9)||-1!=w(a,9)[0])}
function O(a,b){for(var c=new C,d,e=a.length,f=0;f<e;++f)d=a.charAt(f),d=b[d.toUpperCase()],null!=d&&c.a(d);return c.toString()}function mb(a){return null!=a&&isNaN(a)&&a.toUpperCase()in Pa}function P(a,b,c){if(0==u(b,2)&&t(b,5)){var d=y(b,5);if(0<d.length)return d}var d=y(b,1),e=Q(b);if(0==c)return R(d,0,e,"");if(!(d in J))return e;a=S(a,d,T(d));b=nb(b,a,c);e=ob(e,a,c);return R(d,c,e,b)}
function pb(a,b,c){var d=y(b,1),e=Q(b);if(!(d in J))return e;a=S(a,d,T(d));b=nb(b,a,2);c=ob(e,a,2,c);return R(d,2,c,b)}function S(a,b,c){return"001"==c?U(a,""+b):U(a,c)}
function qb(a,b,c){if(!mb(c))return P(a,b,1);var d=y(b,1),e=Q(b);if(!(d in J))return e;if(1==d){if(null!=c&&0<=p(J[1],c.toUpperCase()))return d+" "+P(a,b,2)}else if(d==rb(a,c))return P(a,b,2);var f=U(a,c),g=y(f,11);c="";N(Sa,g)?c=g:t(f,17)&&(c=y(f,17));a=S(a,d,T(d));e=ob(e,a,1);b=nb(b,a,1);return 0<c.length?c+" "+d+" "+e+b:R(d,1,e,b)}
function sb(a,b,c){var d;if(d=t(b,5)){if(d=t(b,4))d=y(b,1),d=S(a,d,T(d)),d=!(d&&y(d,26));if(!d){d=y(b,1);if(d=S(a,d,T(d))){var e=Q(b);d=!!tb(w(d,19),e)}else d=!1;d=!d}}if(d)return y(b,5);if(!t(b,6))return P(a,b,2);switch(u(b,6)){case 1:a=P(a,b,1);break;case 5:a=qb(a,b,c);break;case 10:a=P(a,b,1).substring(1);break;default:d=T(y(b,1));var f;(c=U(a,d))?(c=y(c,12),f=c.length?c=c.replace("~",""):null):f=null;c=P(a,b,2);if(null!=f&&f.length){var g;a:{e=y(b,5);e=O(e,L);if(!e.lastIndexOf(f,0))try{g=ub(a,
vb(a,e.substring(f.length),d,!1));break a}catch(h){}g=!1}if(g)a=c;else if(g=U(a,d),d=Q(b),g=tb(w(g,19),d))if(d=y(g,4),e=d.indexOf("$1"),0>=e)a=c;else if(d=d.substring(0,e),d=O(d,L),d.length)if(g=g.clone(),Ga(g,4),d=[g],g=y(b,1),c=Q(b),g in J){a=S(a,g,T(g));if(e=tb(d,c))d=e.clone(),e=y(e,4),0<e.length&&(f=y(a,12),0<f.length?(e=e.replace(bb,f).replace(cb,"$1"),v(d,4,e)):Ga(d,4)),c=wb(c,d,2);a=nb(b,a,2);a=R(g,2,c,a)}else a=c;else a=c;else a=c}else a=c}b=y(b,5);null!=a&&0<b.length&&(g=O(a,Qa),c=O(b,Qa),
g!=c&&(a=b));return a}function Q(a){var b=""+u(a,2);return t(a,4)&&u(a,4)&&0<y(a,8)?Array(y(a,8)+1).join("0")+b:b}function R(a,b,c,d){switch(b){case 0:return"+"+a+c+d;case 1:return"+"+a+" "+c+d;case 3:return"tel:+"+a+"-"+c+d;default:return c+d}}function ob(a,b,c,d){b=w(b,20).length&&2!=c?w(b,20):w(b,19);return(b=tb(b,a))?wb(a,b,c,d):a}function tb(a,b){for(var c,d=a.length,e=0;e<d;++e){c=a[e];var f=z(c,3);if(!f||!b.search(u(c,3,f-1)))if(f=new RegExp(u(c,1)),N(f,b))return c}return null}
function wb(a,b,c,d){var e=y(b,2),f=new RegExp(u(b,1)),g=y(b,5);2==c&&null!=d&&0<d.length&&0<g.length?(b=g.replace(db,d),e=e.replace(ab,b),a=a.replace(f,e)):(b=y(b,4),a=2==c&&null!=b&&0<b.length?a.replace(f,e.replace(ab,b)):a.replace(f,e));3==c&&(a=a.replace(RegExp("^[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]+"),""),a=a.replace(RegExp("[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]+",
"g"),"-"));return a}function nb(a,b,c){return t(a,3)&&u(a,3).length?3==c?";ext="+u(a,3):t(b,13)?u(b,13)+y(a,3):" ext. "+y(a,3):""}function xb(a,b){switch(b){case 4:return u(a,5);case 3:return u(a,4);case 1:return u(a,3);case 0:case 2:return u(a,2);case 5:return u(a,6);case 6:return u(a,8);case 7:return u(a,7);case 8:return u(a,21);case 9:return u(a,25);case 10:return u(a,28);default:return u(a,1)}}
function yb(a,b){return W(a,u(b,1))?W(a,u(b,5))?4:W(a,u(b,4))?3:W(a,u(b,6))?5:W(a,u(b,8))?6:W(a,u(b,7))?7:W(a,u(b,21))?8:W(a,u(b,25))?9:W(a,u(b,28))?10:W(a,u(b,2))?u(b,18)||W(a,u(b,3))?2:0:!u(b,18)&&W(a,u(b,3))?1:-1:-1}function U(a,b){if(null==b)return null;b=b.toUpperCase();var c=a.a[b];if(!c){c=Pa[b];if(!c)return null;c=(new H).f(G.h(),c);a.a[b]=c}return c}function W(a,b){var c=a.length;return 0<z(b,9)&&-1==p(w(b,9),c)?!1:N(y(b,2),a)}function ub(a,b){var c=zb(a,b);return Ab(a,b,c)}
function Ab(a,b,c){var d=y(b,1),e=S(a,d,c);if(!e||"001"!=c&&d!=rb(a,c))return!1;a=Q(b);return-1!=yb(a,e)}function zb(a,b){if(!b)return null;var c=y(b,1);if(c=J[c])if(1==c.length)c=c[0];else a:{for(var d=Q(b),e,f=c.length,g=0;g<f;g++){e=c[g];var h=U(a,e);if(t(h,23)){if(!d.search(u(h,23))){c=e;break a}}else if(-1!=yb(d,h)){c=e;break a}}c=null}else c=null;return c}function T(a){return(a=J[a])?a[0]:"ZZ"}function rb(a,b){var c=U(a,b);if(!c)throw Error("Invalid region code: "+b);return y(c,10)}
function Bb(a,b,c,d){var e=xb(c,d),f=z(e,9)?w(e,9):w(u(c,1),9),e=w(e,10);if(2==d)if(lb(xb(c,0)))a=xb(c,1),lb(a)&&(f=f.concat(z(a,9)?w(a,9):w(u(c,1),9)),ha(f),e.length?(e=e.concat(w(a,10)),ha(e)):e=w(a,10));else return Bb(a,b,c,1);if(-1==f[0])return 5;b=b.length;if(-1<p(e,b))return 4;c=f[0];return c==b?0:c>b?2:f[f.length-1]<b?3:-1<p(f,b,1)?0:5}function Cb(a,b){var c=Q(b),d=y(b,1);if(!(d in J))return 1;d=S(a,d,T(d));return Bb(a,c,d,-1)}
function Db(a,b){var c=a.toString();if(!c.length||"0"==c.charAt(0))return 0;for(var d,e=c.length,f=1;3>=f&&f<=e;++f)if(d=parseInt(c.substring(0,f),10),d in J)return b.a(c.substring(f)),d;return 0}
function Eb(a,b,c,d,e,f){if(!b.length)return 0;b=new C(b);var g;c&&(g=u(c,11));null==g&&(g="NonMatch");var h=b.toString();if(h.length)if(M.test(h))h=h.replace(M,""),D(b),b.a(hb(h)),g=1;else{h=new RegExp(g);ib(b);g=b.toString();if(g.search(h))g=!1;else{var h=g.match(h)[0].length,l=g.substring(h).match(Ua);l&&null!=l[1]&&0<l[1].length&&"0"==O(l[1],L)?g=!1:(D(b),b.a(g.substring(h)),g=!0)}g=g?5:20}else g=20;e&&v(f,6,g);if(20!=g){if(2>=b.b.length)throw Error("Phone number too short after IDD");if(a=Db(b,
d))return v(f,1,a),a;throw Error("Invalid country calling code");}if(c&&(g=y(c,10),h=""+g,l=b.toString(),!l.lastIndexOf(h,0)&&(h=new C(l.substring(h.length)),l=u(c,1),l=new RegExp(y(l,2)),Fb(h,c,null),h=h.toString(),!N(l,b.toString())&&N(l,h)||3==Bb(a,b.toString(),c,-1))))return d.a(h),e&&v(f,6,10),v(f,1,g),g;v(f,1,0);return 0}
function Fb(a,b,c){var d=a.toString(),e=d.length,f=u(b,15);if(e&&null!=f&&f.length){var g=new RegExp("^(?:"+f+")");if(e=g.exec(d)){var f=new RegExp(y(u(b,1),2)),h=N(f,d),l=e.length-1;b=u(b,16);if(null!=b&&b.length&&null!=e[l]&&e[l].length){if(d=d.replace(g,b),!h||N(f,d))c&&0<l&&c.a(e[1]),a.set(d)}else if(!h||N(f,d.substring(e[0].length)))c&&0<l&&null!=e[l]&&c.a(e[1]),a.set(d.substring(e[0].length))}}}
function vb(a,b,c,d){if(null==b)throw Error("The string supplied did not seem to be a phone number");if(250<b.length)throw Error("The string supplied is too long to be a phone number");var e=new C,f=b.indexOf(";phone-context=");if(0<f){var g=f+15;if("+"==b.charAt(g)){var h=b.indexOf(";",g);0<h?e.a(b.substring(g,h)):e.a(b.substring(g))}g=b.indexOf("tel:");e.a(b.substring(0<=g?g+4:0,f))}else e.a(fb(b));f=e.toString();g=f.indexOf(";isub=");0<g&&(D(e),e.a(f.substring(0,g)));if(!gb(e.toString()))throw Error("The string supplied did not seem to be a phone number");
f=e.toString();if(!(mb(c)||null!=f&&0<f.length&&M.test(f)))throw Error("Invalid country calling code");f=new I;d&&v(f,5,b);a:{b=e.toString();g=b.search(Za);if(0<=g&&gb(b.substring(0,g)))for(var h=b.match(Za),l=h.length,x=1;x<l;++x)if(null!=h[x]&&0<h[x].length){D(e);e.a(b.substring(0,g));b=h[x];break a}b=""}0<b.length&&v(f,3,b);b=U(a,c);g=new C;h=0;l=e.toString();try{h=Eb(a,l,b,g,d,f)}catch(V){if("Invalid country calling code"==V.message&&M.test(l)){if(l=l.replace(M,""),h=Eb(a,l,b,g,d,f),!h)throw V;
}else throw V;}h?(e=T(h),e!=c&&(b=S(a,h,e))):(ib(e),g.a(e.toString()),null!=c?(h=y(b,10),v(f,1,h)):d&&Ga(f,6));if(2>g.b.length)throw Error("The string supplied is too short to be a phone number");b&&(c=new C,e=new C(g.toString()),Fb(e,b,c),2!=Bb(a,e.toString(),b,-1)&&(g=e,d&&0<c.toString().length&&v(f,7,c.toString())));a=g.toString();d=a.length;if(2>d)throw Error("The string supplied is too short to be a phone number");if(17<d)throw Error("The string supplied is too long to be a phone number");if(1<
a.length&&"0"==a.charAt(0)){v(f,4,!0);for(d=1;d<a.length-1&&"0"==a.charAt(d);)d++;1!=d&&v(f,8,d)}v(f,2,parseInt(a,10));return f}function N(a,b){var c="string"==typeof a?b.match("^(?:"+a+")$"):b.match(a);return c&&c[0].length==b.length?!0:!1};function Gb(a){this.ca=RegExp("\u2008");this.ea="";this.m=new C;this.w="";this.i=new C;this.v=new C;this.j=!0;this.$=this.o=this.ga=!1;this.da=K.a();this.s=0;this.b=new C;this.aa=!1;this.l="";this.a=new C;this.f=[];this.fa=a;this.g=Hb(this,this.fa)}var Ib=new G;v(Ib,11,"NA");
var Jb=/\[([^\[\]])*\]/g,Kb=/\d(?=[^,}][^,}])/g,Lb=RegExp("^[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]*(\\$\\d[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]*)+$"),Mb=/[- ]/;function Hb(a,b){var c=mb(b)?rb(a.da,b):0;return(c=U(a.da,T(c)))?c:Ib}
function Nb(a){for(var b=a.f.length,c=0;c<b;++c){var d=a.f[c],e=y(d,1);if(a.w==e)return!1;var f;f=a;var g=d,h=y(g,1);if(-1!=h.indexOf("|"))f=!1;else{h=h.replace(Jb,"\\d");h=h.replace(Kb,"\\d");D(f.m);var l;l=f;var g=y(g,2),x="999999999999999".match(h)[0];x.length<l.a.b.length?l="":(l=x.replace(new RegExp(h,"g"),g),l=l.replace(RegExp("9","g"),"\u2008"));0<l.length?(f.m.a(l),f=!0):f=!1}if(f)return a.w=e,a.aa=Mb.test(u(d,4)),a.s=0,!0}return a.j=!1}
function Ob(a,b){for(var c=[],d=b.length-3,e=a.f.length,f=0;f<e;++f){var g=a.f[f];z(g,3)?(g=u(g,3,Math.min(d,z(g,3)-1)),b.search(g)||c.push(a.f[f])):c.push(a.f[f])}a.f=c}function Pb(a,b){a.ea=Qb(a,b);return a.ea}
function Qb(a,b){a.i.a(b);var c=b;if(Ua.test(c)||1==a.i.b.length&&Ta.test(c)){var c=b,d;"+"==c?(d=c,a.v.a(c)):(d=L[c],a.v.a(d),a.a.a(d));b=d}else a.j=!1,a.ga=!0;if(!a.j){if(!a.ga)if(Rb(a)){if(Sb(a))return Tb(a)}else if(0<a.l.length&&(c=a.a.toString(),D(a.a),a.a.a(a.l),a.a.a(c),c=a.b.toString(),d=c.lastIndexOf(a.l),D(a.b),a.b.a(c.substring(0,d))),a.l!=Ub(a))return a.b.a(" "),Tb(a);return a.i.toString()}switch(a.v.b.length){case 0:case 1:case 2:return a.i.toString();case 3:if(Rb(a))a.$=!0;else return a.l=
Ub(a),Vb(a);default:if(a.$)return Sb(a)&&(a.$=!1),a.b.toString()+a.a.toString();if(0<a.f.length){c=Wb(a,b);d=Xb(a);if(0<d.length)return d;Ob(a,a.a.toString());return Nb(a)?Yb(a):a.j?Zb(a,c):a.i.toString()}return Vb(a)}}function Tb(a){a.j=!0;a.$=!1;a.f=[];a.s=0;D(a.m);a.w="";return Vb(a)}function Xb(a){for(var b=a.a.toString(),c=a.f.length,d=0;d<c;++d){var e=a.f[d],f=y(e,1);if((new RegExp("^(?:"+f+")$")).test(b))return a.aa=Mb.test(u(e,4)),b=b.replace(new RegExp(f,"g"),u(e,2)),Zb(a,b)}return""}
function Zb(a,b){var c=a.b.b.length;return a.aa&&0<c&&" "!=a.b.toString().charAt(c-1)?a.b+" "+b:a.b+b}function Vb(a){var b=a.a.toString();if(3<=b.length){for(var c=a.o&&0<z(a.g,20)?w(a.g,20):w(a.g,19),d=c.length,e=0;e<d;++e){var f=c[e],g;(g=!t(a.g,12)||a.o||u(f,6))||(g=y(f,4),g=!g.length||eb.test(g));g&&Lb.test(y(f,2))&&a.f.push(f)}Ob(a,b);b=Xb(a);return 0<b.length?b:Nb(a)?Yb(a):a.i.toString()}return Zb(a,b)}
function Yb(a){var b=a.a.toString(),c=b.length;if(0<c){for(var d="",e=0;e<c;e++)d=Wb(a,b.charAt(e));return a.j?Zb(a,d):a.i.toString()}return a.b.toString()}
function Ub(a){var b=a.a.toString(),c=0,d;1!=u(a.g,10)?d=!1:(d=a.a.toString(),d="1"==d.charAt(0)&&"0"!=d.charAt(1)&&"1"!=d.charAt(1));d?(c=1,a.b.a("1").a(" "),a.o=!0):t(a.g,15)&&(d=new RegExp("^(?:"+u(a.g,15)+")"),(d=b.match(d))&&null!=d[0]&&0<d[0].length&&(a.o=!0,c=d[0].length,a.b.a(b.substring(0,c))));D(a.a);a.a.a(b.substring(c));return b.substring(0,c)}
function Rb(a){var b=a.v.toString(),c=new RegExp("^(?:\\+|"+u(a.g,11)+")");return(c=b.match(c))&&null!=c[0]&&0<c[0].length?(a.o=!0,c=c[0].length,D(a.a),a.a.a(b.substring(c)),D(a.b),a.b.a(b.substring(0,c)),"+"!=b.charAt(0)&&a.b.a(" "),!0):!1}function Sb(a){if(!a.a.b.length)return!1;var b=new C,c=Db(a.a,b);if(!c)return!1;D(a.a);a.a.a(b.toString());b=T(c);"001"==b?a.g=U(a.da,""+c):b!=a.fa&&(a.g=Hb(a,b));a.b.a(""+c).a(" ");a.l="";return!0}
function Wb(a,b){var c=a.m.toString();if(0<=c.substring(a.s).search(a.ca)){var d=c.search(a.ca),c=c.replace(a.ca,b);D(a.m);a.m.a(c);a.s=d;return c.substring(0,a.s+1)}1==a.f.length&&(a.j=!1);a.w="";return a.i.toString()};function $b(){var a=q("phoneNumber").value,b=q("defaultCountry").value,c=q("carrierCode").value,d=new C;try{var e=K.a(),f;if(!mb(b)&&0<a.length&&"+"!=a.charAt(0))throw Error("Invalid country calling code");f=vb(e,a,b,!0);d.a("****Parsing Result:****\n");d.a(la((new B(1)).g(f)));d.a("\n\n****Validation Results:****");var g,h=Cb(e,f);g=0==h||4==h;d.a("\nResult from isPossibleNumber(): ");d.a(g);if(g){var l=ub(e,f);d.a("\nResult from isValidNumber(): ");d.a(l);l&&b&&"ZZ"!=b&&(d.a("\nResult from isValidNumberForRegion(): "),
d.a(Ab(e,f,b)));d.a("\nPhone Number region: ");d.a(zb(e,f));d.a("\nResult from getNumberType(): ");var x;var V=zb(e,f),jb=S(e,y(f,1),V);if(jb){var bc=Q(f);x=yb(bc,jb)}else x=-1;switch(x){case 0:d.a("FIXED_LINE");break;case 1:d.a("MOBILE");break;case 2:d.a("FIXED_LINE_OR_MOBILE");break;case 3:d.a("TOLL_FREE");break;case 4:d.a("PREMIUM_RATE");break;case 5:d.a("SHARED_COST");break;case 6:d.a("VOIP");break;case 7:d.a("PERSONAL_NUMBER");break;case 8:d.a("PAGER");break;case 9:d.a("UAN");break;case -1:d.a("UNKNOWN")}}else{d.a("\nResult from isPossibleNumberWithReason(): ");
switch(Cb(e,f)){case 1:d.a("INVALID_COUNTRY_CODE");break;case 2:d.a("TOO_SHORT");break;case 3:d.a("TOO_LONG")}d.a("\nNote: numbers that are not possible have type UNKNOWN, an unknown region, and are considered invalid.")}d.a("\n\n****Formatting Results:**** ");d.a("\nE164 format: ");d.a(l?P(e,f,0):"invalid");d.a("\nOriginal format: ");d.a(sb(e,f,b));d.a("\nNational format: ");d.a(P(e,f,2));d.a("\nInternational format: ");d.a(l?P(e,f,1):"invalid");d.a("\nOut-of-country format from US: ");d.a(l?qb(e,
f,"US"):"invalid");d.a("\nOut-of-country format from Switzerland: ");d.a(l?qb(e,f,"CH"):"invalid");0<c.length&&(d.a("\nNational format with carrier code: "),d.a(pb(e,f,c)));d.a("\n\n****AsYouTypeFormatter Results****");for(var cc=new Gb(b),dc=a.length,b=0;b<dc;++b){var kb=a.charAt(b);d.a("\nChar entered: ");d.a(kb);d.a(" Output: ");d.a(Pb(cc,kb))}}catch(ec){d.a("\n"+ec.toString())}q("output").value=d.toString();return!1}var X=["phoneNumberParser"],Y=this;
X[0]in Y||!Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());){var ac;if(ac=!X.length)ac=void 0!==$b;ac?Y[Z]=$b:Y[Z]?Y=Y[Z]:Y=Y[Z]={}};})();

+ 52
- 36
javascript/i18n/phonenumbers/phonenumberutil.js View File

@ -3277,7 +3277,13 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isAlphaNumber = function(number) {
/**
* Convenience wrapper around {@link #isPossibleNumberWithReason}. Instead of
* returning the reason for failure, this method returns a boolean value.
* returning the reason for failure, this method returns true if the number is
* either a possible fully-qualified number (containing the area code and
* country code), or if the number could be a possible local number (with a
* country code, but missing an area code). Local numbers are considered
* possible if they could be possibly dialled in this format: if the area code
* is needed for a call to connect, the number is not considered possible
* without it.
*
* @param {i18n.phonenumbers.PhoneNumber} number the number that needs to be
* checked
@ -3285,16 +3291,24 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isAlphaNumber = function(number) {
*/
i18n.phonenumbers.PhoneNumberUtil.prototype.isPossibleNumber =
function(number) {
return this.isPossibleNumberWithReason(number) ==
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.IS_POSSIBLE;
/** @type {!i18n.phonenumbers.PhoneNumberUtil.ValidationResult} */
var result = this.isPossibleNumberWithReason(number);
return result ==
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.IS_POSSIBLE ||
result ==
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY;
};
/**
* Convenience wrapper around {@link #isPossibleNumberForTypeWithReason}.
* Instead of returning the reason for failure, this method returns a boolean
* value.
* Instead of returning the reason for failure, this method returns true if the
* number is either a possible fully-qualified number (containing the area code
* and country code), or if the number could be a possible local number (with a
* country code, but missing an area code). Local numbers are considered
* possible if they could be possibly dialled in this format: if the area code
* is needed for a call to connect, the number is not considered possible
* without it.
*
* @param {i18n.phonenumbers.PhoneNumber} number the number that needs to be
* checked
@ -3303,9 +3317,12 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isPossibleNumber =
*/
i18n.phonenumbers.PhoneNumberUtil.prototype.isPossibleNumberForType =
function(number, type) {
return this.isPossibleNumberForTypeWithReason(number, type) ==
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.IS_POSSIBLE;
/** @type {!i18n.phonenumbers.PhoneNumberUtil.ValidationResult} */
var result = this.isPossibleNumberForTypeWithReason(number, type);
return result ==
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.IS_POSSIBLE ||
result ==
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY;
};
@ -3376,8 +3393,9 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.testNumberLengthForType_ =
// array, it doesn't edit possibleLengths in place, so we don't need a
// copy.
// Note that when adding the possible lengths from mobile, we have
// to again check they aren't empty since if they are this indicates they
// are the same as the general desc and should be obtained from there.
// to again check they aren't empty since if they are this indicates
// they are the same as the general desc and should be obtained from
// there.
possibleLengths = possibleLengths.concat(
mobileDesc.possibleLengthCount() == 0 ?
metadata.getGeneralDesc().possibleLengthArray() :
@ -3404,8 +3422,11 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.testNumberLengthForType_ =
}
var actualLength = number.length;
// This is safe because there is never an overlap beween the possible lengths
// and the local-only lengths; this is checked at build time.
if (goog.array.indexOf(localLengths, actualLength) > -1) {
return i18n.phonenumbers.PhoneNumberUtil.ValidationResult.IS_POSSIBLE;
return i18n.phonenumbers.PhoneNumberUtil.ValidationResult
.IS_POSSIBLE_LOCAL_ONLY;
}
var minimumLength = possibleLengths[0];
if (minimumLength == actualLength) {
@ -3415,15 +3436,10 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.testNumberLengthForType_ =
} else if (possibleLengths[possibleLengths.length - 1] < actualLength) {
return i18n.phonenumbers.PhoneNumberUtil.ValidationResult.TOO_LONG;
}
// Note that actually the number is not too long if possible_lengths does not
// contain the length: we know it is less than the highest possible number
// length, and higher than the lowest possible number length. However, we
// don't currently have an enum to express this, so we return TOO_LONG in the
// short-term.
// We skip the first element since we've already checked it.
return (goog.array.indexOf(possibleLengths, actualLength, 1) > -1) ?
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.IS_POSSIBLE :
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.TOO_LONG;
i18n.phonenumbers.PhoneNumberUtil.ValidationResult.INVALID_LENGTH;
};
@ -3436,15 +3452,15 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.testNumberLengthForType_ =
* <li>It doesn't attempt to figure out the type of the number, but uses general
* rules which applies to all types of phone numbers in a region. Therefore, it
* is much faster than isValidNumber.
* <li>For fixed line numbers, many regions have the concept of area code, which
* together with subscriber number constitute the national significant number.
* It is sometimes okay to dial only the subscriber number when dialing in the
* same area. This function will return true if the subscriber-number-only
* version is passed in. On the other hand, because isValidNumber validates
* using information on both starting digits (for fixed line numbers, that would
* most likely be area codes) and length (obviously includes the length of area
* codes for fixed line numbers), it will return false for the
* subscriber-number-only version.
* <li>For some numbers (particularly fixed-line), many regions have the concept
* of area code, which together with subscriber number constitute the national
* significant number. It is sometimes okay to dial only the subscriber number
* when dialing in the same area. This function will return
* IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is passed in. On
* the other hand, because isValidNumber validates using information on both
* starting digits (for fixed line numbers, that would most likely be area
* codes) and length (obviously includes the length of area codes for fixed line
* numbers), it will return false for the subscriber-number-only version.
* </ol>
*
* @param {i18n.phonenumbers.PhoneNumber} number the number that needs to be
@ -3465,15 +3481,15 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isPossibleNumberWithReason =
* <ol>
* <li>It only checks the length of phone numbers. In particular, it doesn't
* check starting digits of the number.
* <li>For fixed line numbers, many regions have the concept of area code, which
* together with subscriber number constitute the national significant number.
* It is sometimes okay to dial only the subscriber number when dialing in the
* same area. This function will return true if the subscriber-number-only
* version is passed in. On the other hand, because isValidNumber validates
* using information on both starting digits (for fixed line numbers, that would
* most likely be area codes) and length (obviously includes the length of area
* codes for fixed line numbers), it will return false for the
* subscriber-number-only version.
* <li>For some numbers (particularly fixed-line), many regions have the concept
* of area code, which together with subscriber number constitute the national
* significant number. It is sometimes okay to dial only the subscriber number
* when dialing in the same area. This function will return
* IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is passed in. On
* the other hand, because isValidNumber validates using information on both
* starting digits (for fixed line numbers, that would most likely be area
* codes) and length (obviously includes the length of area codes for fixed line
* numbers), it will return false for the subscriber-number-only version.
* </ol>
*
* @param {i18n.phonenumbers.PhoneNumber} number the number that needs to be


+ 8
- 10
javascript/i18n/phonenumbers/phonenumberutil_test.js View File

@ -30,8 +30,8 @@ goog.require('goog.string.StringBuffer');
goog.require('goog.testing.jsunit');
goog.require('i18n.phonenumbers.NumberFormat');
goog.require('i18n.phonenumbers.PhoneMetadata');
goog.require('i18n.phonenumbers.PhoneNumberDesc');
goog.require('i18n.phonenumbers.PhoneNumber');
goog.require('i18n.phonenumbers.PhoneNumberDesc');
goog.require('i18n.phonenumbers.PhoneNumberUtil');
goog.require('i18n.phonenumbers.RegionCode');
@ -1930,7 +1930,7 @@ function testIsPossibleNumberWithReason() {
assertEquals(VR.IS_POSSIBLE,
phoneUtil.isPossibleNumberWithReason(US_NUMBER));
assertEquals(VR.IS_POSSIBLE,
assertEquals(VR.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberWithReason(US_LOCAL_NUMBER));
assertEquals(VR.TOO_LONG,
@ -2049,9 +2049,9 @@ function testIsPossibleNumberForTypeWithReason_LocalOnly() {
// Here we test a number length which matches a local-only length.
number.setCountryCode(49);
number.setNationalNumber(12);
assertEquals(VR.IS_POSSIBLE,
assertEquals(VR.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PNT.UNKNOWN));
assertEquals(VR.IS_POSSIBLE,
assertEquals(VR.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PNT.FIXED_LINE));
// Mobile numbers must be 10 or 11 digits, and there are no local-only
// lengths.
@ -2071,10 +2071,10 @@ function testIsPossibleNumberForTypeWithReason_DataMissingForSizeReasons() {
number.setCountryCode(55);
number.setNationalNumber(12345678);
assertEquals(
VR.IS_POSSIBLE,
VR.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PNT.UNKNOWN));
assertEquals(
VR.IS_POSSIBLE,
VR.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(number, PNT.FIXED_LINE));
// Normal-length number.
@ -2101,7 +2101,7 @@ function testIsPossibleNumberForTypeWithReason_NumberTypeNotSupportedForRegion()
phoneUtil.isPossibleNumberForTypeWithReason(number, PNT.MOBILE));
// This matches a fixed-line length though.
assertEquals(
VR.IS_POSSIBLE,
VR.IS_POSSIBLE_LOCAL_ONLY,
phoneUtil.isPossibleNumberForTypeWithReason(
number, PNT.FIXED_LINE_OR_MOBILE));
// This is too short for fixed-line, and no mobile numbers exist.
@ -2178,10 +2178,8 @@ function testIsPossibleNumberForTypeWithReason_FixedLineOrMobile() {
assertEquals(
VR.TOO_LONG,
phoneUtil.isPossibleNumberForTypeWithReason(number, PNT.MOBILE));
// This will change to INVALID_LENGTH once we start returning this type in the
// main isPossibleNumberWithReason API.
assertEquals(
VR.TOO_LONG,
VR.INVALID_LENGTH,
phoneUtil.isPossibleNumberForTypeWithReason(
number, PNT.FIXED_LINE_OR_MOBILE));


+ 3
- 0
pending_code_changes.txt View File

@ -1,3 +1,6 @@
Code changes:
- Changing isPossibleWithReason to return the enums INVALID_LENGTH and
IS_POSSIBLE_LOCAL_ONLY, where these apply. isPossibleNumber continues to
consider IS_POSSIBLE or IS_POSSIBLE_LOCAL_ONLY numbers as possible to dial.
- Doc updates for getRegionCodeForNumber to clarify that it does not
work for short-codes or invalid numbers.

Loading…
Cancel
Save