From 2881b86206f01bdc50fb5c9e171189b42ea55ebf Mon Sep 17 00:00:00 2001 From: Lionel Elie Mamane Date: Wed, 28 Oct 2015 18:24:14 +0100 Subject: [PATCH 001/572] Fix problem with check_vies_approx() --- stdnum/eu/vat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdnum/eu/vat.py b/stdnum/eu/vat.py index 94525d57..5421f631 100644 --- a/stdnum/eu/vat.py +++ b/stdnum/eu/vat.py @@ -154,6 +154,6 @@ def check_vies_approx(number, requester): # pragma: no cover # network access for the tests and unnecessarily load the VIES website number = compact(number) requester = compact(requester) - return _get_client.checkVatApprox( + return _get_client().checkVatApprox( countryCode=number[:2], vatNumber=number[2:], requesterCountryCode=requester[:2], requesterVatNumber=requester[2:]) From 96c8151e07e5800f8396d10778615024e61abc6f Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Wed, 28 Oct 2015 22:12:28 +0100 Subject: [PATCH 002/572] Fix SOAP client re-use This fixes a bug when checking re-use of the global SOAP client object. The object could not be evaluated in boolean context so is no explicitly compared to None. For suds a MethodNotFound exception would be raised for __nonzero__() (which Python uses for boolean comparison). --- stdnum/eu/vat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdnum/eu/vat.py b/stdnum/eu/vat.py index 5421f631..2c6728ec 100644 --- a/stdnum/eu/vat.py +++ b/stdnum/eu/vat.py @@ -117,7 +117,7 @@ def _get_client(): # pragma: no cover (no tests for this function) # this function isn't automatically tested because the functions using # it are not automatically tested global _vies_client - if not _vies_client: + if _vies_client is None: try: from urllib import getproxies except ImportError: From 0061564e7718e8ea3e881030d71736822a3166da Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Fri, 30 Oct 2015 18:58:37 +0100 Subject: [PATCH 003/572] Integrate information from the wiki This adds the information that was previously in the Trac wiki into the source docstrings because the Trac instance is being phased out. This also includes small updates to the ISIL module. --- stdnum/dk/cpr.py | 20 ++++++++++++++------ stdnum/iban.py | 6 +++++- stdnum/imei.py | 10 +++++++--- stdnum/isbn.py | 21 ++++++++++++++++++--- stdnum/isil.py | 45 +++++++++++++++++++++++++++++++-------------- stdnum/issn.py | 12 ++++++++++-- stdnum/nl/bsn.py | 12 +++++++++--- stdnum/us/ssn.py | 21 +++++++++++++++++++-- stdnum/verhoeff.py | 36 +++++++++++++++++++++++------------- 9 files changed, 136 insertions(+), 47 deletions(-) diff --git a/stdnum/dk/cpr.py b/stdnum/dk/cpr.py index 4bf4a449..bdbbbb95 100644 --- a/stdnum/dk/cpr.py +++ b/stdnum/dk/cpr.py @@ -19,13 +19,21 @@ """CPR (personnummer, the Danish citizen number). -The CPR is the national number to identify Danish citizens. The number +The CPR is the national number to identify Danish citizens and is stored in +the Det Centrale Personregister (Civil Registration System). The number consists of 10 digits in the format DDMMYY-SSSS where the first part -represents the birth date and the second a sequence number. The first -digit of the sequence number indicates the century. - -The numbers used to validate using a checksum but since the sequence -numbers ran out this was abandoned in 2007. +represents the birth date and the second a sequence number. The first digit +of the sequence number indicates the century. + +The numbers used to validate using a checksum but since the sequence numbers +ran out this was abandoned in 2007. It is also not possible to use the +checksum only for numbers that have a birth date before that because the +numbers are also assigned to immigrants. + +More information: + https://en.wikipedia.org/wiki/Personal_identification_number_(Denmark) + https://da.wikipedia.org/wiki/CPR-nummer + https://cpr.dk/ >>> validate('211062-5629') '2110625629' diff --git a/stdnum/iban.py b/stdnum/iban.py index ee717862..ff33cddc 100644 --- a/stdnum/iban.py +++ b/stdnum/iban.py @@ -1,6 +1,6 @@ # iban.py - functions for handling International Bank Account Numbers (IBANs) # -# Copyright (C) 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2011-2015 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -27,6 +27,10 @@ Some countries may also use checksum algorithms within their number but this is currently not checked by this number. +More information: + https://en.wikipedia.org/wiki/International_Bank_Account_Number + https://www.swift.com/products_services/bic_and_iban_format_registration_iban_format_r + >>> validate('GR16 0110 1050 0000 1054 7023 795') 'GR1601101050000010547023795' >>> validate('BE31435411161155') diff --git a/stdnum/imei.py b/stdnum/imei.py index 35f76e1e..8c0c1a0f 100644 --- a/stdnum/imei.py +++ b/stdnum/imei.py @@ -1,7 +1,7 @@ # imei.py - functions for handling International Mobile Equipment Identity # (IMEI) numbers # -# Copyright (C) 2010, 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2010-2015 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -20,8 +20,12 @@ """IMEI (International Mobile Equipment Identity). -The IMEI is used to identify mobile phones. The IMEI may optionally -include a check digit which is validated using the Luhn algorithm. +The IMEI is used to identify mobile phones. An IMEI is 14, 15 (when the +check digit is included) or 16 digits (IMEISV) long. The check digit is +validated using the Luhn algorithm. + +More information: + https://en.wikipedia.org/wiki/International_Mobile_Equipment_Identity >>> validate('35686800-004141-20') '3568680000414120' diff --git a/stdnum/isbn.py b/stdnum/isbn.py index a49d9d70..6b9233b5 100644 --- a/stdnum/isbn.py +++ b/stdnum/isbn.py @@ -1,6 +1,6 @@ # isbn.py - functions for handling ISBNs # -# Copyright (C) 2010, 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2010-2015 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -20,8 +20,23 @@ """ISBN (International Standard Book Number). The ISBN is the International Standard Book Number, used to identify -publications. This module supports both numbers in ISBN-10 (10-digit) and -ISBN-13 (13-digit) format. +publications. An ISBN is used to identify books. Numbers can either have 10 +digits (in ISBN-10 format) or 13 digits (in ISBN-13, EAN compatible format). +An ISBN has the following components: + +* 3-digit (only in ISBN-13) Bookland code +* 1 to 5-digit group identifier (identifies country or language) +* 1 to 7-digit publisher code +* 1 to 8-digit item number (identifies the book) +* a check digit + +More information: + https://en.wikipedia.org/wiki/International_Standard_Book_Number + https://www.isbn-international.org/range_file_generation + +This module also offers functions for converting to ISBN-13 and formatting +based on how the number should be split into a bookland code, group +identifier, publisher code, item number and check digit. >>> validate('978-9024538270') '9789024538270' diff --git a/stdnum/isil.py b/stdnum/isil.py index b0ee905b..219e89ee 100644 --- a/stdnum/isil.py +++ b/stdnum/isil.py @@ -1,7 +1,7 @@ # isil.py - functions for handling identifiers for libraries and related # organizations # -# Copyright (C) 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2011-2015 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -20,8 +20,27 @@ """ISIL (International Standard Identifier for Libraries). -The ISIL is the International Standard Identifier for -Libraries and Related Organizations. +The ISIL is the International Standard Identifier for Libraries and Related +Organizations (ISO 15511) used to uniquely identify libraries, archives, +museums, and similar organisations. + +The identifier can be up to 15 characters that may use digits, +letters (case insensitive) hyphens, colons and slashes. The non-alphanumeric +characters are part of the identifier and are not just for readability. + +The identifier consists of two parts separated by a hyphen. The first part is +either a two-letter ISO 3166 country code or a (not two-letter) non-national +prefix that identifies the agency that issued the ISIL. The second part is +the is the identifier issued by that agency. + +Only the first part can be validated since it is registered globally. There +may be some validation possible with the second parts (some agencies provide +web services for validation) but there is no common format to these services. + +More information: + https://en.wikipedia.org/wiki/ISBT_128 + http://biblstandard.dk/isil/ + http://www.iso.org/iso/catalogue_detail?csnumber=57332 >>> validate('IT-RM0267') 'IT-RM0267' @@ -46,7 +65,8 @@ # the valid characters in an ISIL -_alphabet = set('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-:/') +_alphabet = set( + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-:/') def compact(number): @@ -55,7 +75,7 @@ def compact(number): return clean(number, '').strip() -def _known_agency(agency): +def _is_known_agency(agency): """Checks whether the specified agency is valid.""" # look it up in the db from stdnum import numdb @@ -65,22 +85,19 @@ def _known_agency(agency): def validate(number): - """Checks to see if the number provided is a valid isil (or isilSV) - number.""" + """Checks to see if the number provided is a valid ISIL.""" number = compact(number) - for n in number: - if n not in _alphabet: - raise InvalidFormat() + if not all(x in _alphabet for x in number): + raise InvalidFormat() if len(number) > 15: raise InvalidLength() - if not _known_agency(number.split('-')[0]): + if not _is_known_agency(number.split('-')[0]): raise InvalidComponent() return number def is_valid(number): - """Checks to see if the number provided is a valid isil (or isilSV) - number.""" + """Checks to see if the number provided is a valid ISIL.""" try: return bool(validate(number)) except ValidationError: @@ -91,6 +108,6 @@ def format(number): """Reformat the passed number to the standard format.""" number = compact(number) parts = number.split('-') - if len(parts) > 1 and _known_agency(parts[0]): + if len(parts) > 1 and _is_known_agency(parts[0]): parts[0] = parts[0].upper() return '-'.join(parts) diff --git a/stdnum/issn.py b/stdnum/issn.py index 6cfabbf1..8be1f2cc 100644 --- a/stdnum/issn.py +++ b/stdnum/issn.py @@ -1,6 +1,6 @@ # issn.py - functions for handling ISSNs # -# Copyright (C) 2010, 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2010-2015 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,15 @@ """ISSN (International Standard Serial Number). The ISSN (International Standard Serial Number) is the standard code to -identify periodical publications. It has a checksum similar to ISBN-10. +identify periodical publications (e.g. magazines). + +An ISSN has 8 digits and is formatted in two pairs of 4 digits separated by a +hyphen. The last digit is a check digit and may be 0-9 or X (similar to +ISBN-10). + +More information: + https://en.wikipedia.org/wiki/International_Standard_Serial_Number + http://www.issn.org/ >>> validate('0024-9319') '00249319' diff --git a/stdnum/nl/bsn.py b/stdnum/nl/bsn.py index b8926c99..280cc9bd 100644 --- a/stdnum/nl/bsn.py +++ b/stdnum/nl/bsn.py @@ -1,6 +1,6 @@ # bsn.py - functions for handling BSNs # -# Copyright (C) 2010, 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2010-2015 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,8 +19,14 @@ """BSN (Burgerservicenummer, Dutch national identification number). -The BSN is a number with up to 9 digits (the leading 0's are commonly left -out) which is used as the Dutch national identification number. +The BSN is a unique personal identifier and has been introduced as the +successor to the sofinummer. The number consists of up to 9 digits (the +leading 0's are commonly left out) and contains a simple checksum. + +More information: + https://en.wikipedia.org/wiki/National_identification_number#Netherlands + https://nl.wikipedia.org/wiki/Burgerservicenummer + http://www.burgerservicenummer.nl/ >>> validate('1112.22.333') '111222333' diff --git a/stdnum/us/ssn.py b/stdnum/us/ssn.py index d4df8348..d4058bf6 100644 --- a/stdnum/us/ssn.py +++ b/stdnum/us/ssn.py @@ -1,6 +1,6 @@ # ssn.py - functions for handling SSNs # -# Copyright (C) 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2011-2015 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,24 @@ """SSN (U.S. Social Security Number). The Social Security Number is used to identify individuals for taxation -purposes. +purposes. It is a 9-digit number that consists of a 3-digit area number, a +2-digit group number and a 4-digit serial number. The number does not use a +check digit. + +Some validation options are available but with the introduction of Social +Security Number Randomization it is no longer possible to validate using the +High Group History List. Some areas, groups and ranges can be blacklisted +though. + +There are several on-line verification facilities available, either for +Employers or at a fee but validation requires more information than just the +number (e.g. name, date of birth, etc). Another means of validation is the +Death Master File which can be ordered on DVD. + +More information: + https://en.wikipedia.org/wiki/Social_Security_number + https://www.ssa.gov/employer/verifySSN.htm + https://en.wikipedia.org/wiki/Death_Master_File >>> validate('536-90-4399') '536904399' diff --git a/stdnum/verhoeff.py b/stdnum/verhoeff.py index 00037e0f..5d6fb150 100644 --- a/stdnum/verhoeff.py +++ b/stdnum/verhoeff.py @@ -1,6 +1,6 @@ # verhoeff.py - functions for performing the Verhoeff checksum # -# Copyright (C) 2010, 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2010-2015 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,8 +19,18 @@ """The Verhoeff algorithm. -The Verhoeff algorithm uses two tables for permutations and -multiplications to calculate a checksum. +The Verhoeff algorithm is a checksum algorithm that should catch most common +(typing) errors in numbers. The algorithm uses two tables for permutations +and multiplications and as a result is more complex than the Luhn algorithm. + +More information: + https://en.wikipedia.org/wiki/Verhoeff_algorithm + https://en.wikibooks.org/wiki/Algorithm_Implementation/Checksums/Verhoeff_Algorithm + +The module provides the checksum() function to calculate the Verhoeff +checksum a calc_check_digit() function to generate a check digit that can be +append to an existing number to result in a number with a valid checksum and +validation functions. >>> validate('1234') Traceback (most recent call last): @@ -41,16 +51,16 @@ # Verhoeff algorithm. _multiplication_table = ( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], - [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], - [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], - [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], - [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], - [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], - [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], - [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], - [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], - [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]) + (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), + (1, 2, 3, 4, 0, 6, 7, 8, 9, 5), + (2, 3, 4, 0, 1, 7, 8, 9, 5, 6), + (3, 4, 0, 1, 2, 8, 9, 5, 6, 7), + (4, 0, 1, 2, 3, 9, 5, 6, 7, 8), + (5, 9, 8, 7, 6, 0, 4, 3, 2, 1), + (6, 5, 9, 8, 7, 1, 0, 4, 3, 2), + (7, 6, 5, 9, 8, 2, 1, 0, 4, 3), + (8, 7, 6, 5, 9, 3, 2, 1, 0, 4), + (9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) _permutation_table = ( (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), From 64577342c86a759a6c72905774ca269bf1820f03 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Thu, 3 Mar 2016 22:44:46 +0100 Subject: [PATCH 004/572] Update database files This also updates the getcnloc and getiban scripts to use new URLs. --- getcnloc.py | 4 +- getiban.py | 4 +- stdnum/cn/loc.dat | 2 +- stdnum/iban.dat | 6 +- stdnum/imsi.dat | 454 ++++++++++++++++++++-------------------------- stdnum/isbn.dat | 18 +- stdnum/isil.dat | 2 +- 7 files changed, 217 insertions(+), 273 deletions(-) diff --git a/getcnloc.py b/getcnloc.py index 136cbf25..c0aac874 100755 --- a/getcnloc.py +++ b/getcnloc.py @@ -3,7 +3,7 @@ # getcnloc.py - script to fetch data from the CN Open Data community # # Copyright (C) 2014-2015 Jiangge Zhang -# Copyright (C) 2015 Arthur de Jong +# Copyright (C) 2015-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -54,7 +54,7 @@ def fetch_data(): data_collection = OrderedDict() for revision in data_revisions: - response = requests.get('%s/raw/master/%s.txt' % (data_url, revision)) + response = requests.get('%s/raw/release/%s.txt' % (data_url, revision)) if response.ok: print('%s is fetched' % revision, file=sys.stderr) else: diff --git a/getiban.py b/getiban.py index e026293e..44d9f19e 100755 --- a/getiban.py +++ b/getiban.py @@ -2,7 +2,7 @@ # getiban.py - script to donwload and parse data from the IBAN registry # -# Copyright (C) 2011-2015 Arthur de Jong +# Copyright (C) 2011-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -28,7 +28,7 @@ # The place where the current version of IBAN_Registry.txt can be downloaded. -download_url = 'http://www.swift.com/dsp/resources/documents/IBAN_Registry.txt' +download_url = 'https://www.swift.com/node/11971' def clean_row(row): diff --git a/stdnum/cn/loc.dat b/stdnum/cn/loc.dat index 1fcb87be..f7b1a79e 100644 --- a/stdnum/cn/loc.dat +++ b/stdnum/cn/loc.dat @@ -1,6 +1,6 @@ # generated from National Bureau of Statistics of the People's # Republic of China, downloaded from https://github.com/cn/GB2260 -# 2015-10-11 10:02:20.899770 +# 2016-03-02 22:38:33.696025 110101 county="东城区" prefecture="市辖区" province="北京市" 110102 county="西城区" prefecture="市辖区" province="北京市" 110103 county="崇文区" prefecture="市辖区" province="北京市" diff --git a/stdnum/iban.dat b/stdnum/iban.dat index 69710fa2..e9fce125 100644 --- a/stdnum/iban.dat +++ b/stdnum/iban.dat @@ -1,5 +1,5 @@ # generated from IBAN_Registry.txt, downloaded from -# http://www.swift.com/dsp/resources/documents/IBAN_Registry.txt +# https://www.swift.com/node/11971 AL country="Albania" bban="8!n16!c" AD country="Andorra" bban="4!n4!n12!c" AT country="Austria" bban="5!n11!n" @@ -54,11 +54,12 @@ PL country="Poland" bban="8!n16!n" PT country="Portugal" bban="4!n4!n11!n2!n" QA country="Qatar" bban="4!a21!c" RO country="Romania" bban="4!a16!c" -LC country="Saint Lucia" bban="4!a24n" +LC country="Saint Lucia" bban="4!a24!n" SM country="San Marino" bban="1!a5!n5!n12!c" ST country="Sao Tome And Principe" bban="8!n11!n2!n" SA country="Saudi Arabia" bban="2!n18!c" RS country="Serbia" bban="3!n13!n2!n" +SC country="Seychelles" bban="4a!2n!2n!16n!3a!" SK country="Slovak Republic" bban="4!n6!n10!n" SI country="Slovenia" bban="5!n8!n2!n" ES country="Spain" bban="4!n4!n1!n1!n10!n" @@ -67,6 +68,7 @@ CH country="Switzerland" bban="5!n12!c" TL country="Timor-Leste" bban="3!n14!n2!n" TN country="Tunisia" bban="2!n3!n13!n2!n" TR country="Turkey" bban="5!n1!n16!c" +UA country="Ukraine" bban="6!n19!c" AE country="United Arab Emirates" bban="3!n16!n" GB country="United Kingdom" bban="4!a6!n8!n" VG country="Virgin Islands, British" bban="4!a16!n" diff --git a/stdnum/imsi.dat b/stdnum/imsi.dat index fa0f5c30..f665ff84 100644 --- a/stdnum/imsi.dat +++ b/stdnum/imsi.dat @@ -100,15 +100,15 @@ 30 bands="" cc="fr" country="France" operator="Symacom" status="" 31 bands="MVNO" brand="Vectone Mobile" cc="fr" country="France" operator="Mundio Mobile" status="Operational" 88 bands="GSM 900 / GSM 1800" brand="Bouygues" cc="fr" country="France" operator="Bouygues Telecom" status="Operational" - 89 bands="" cc="fr" country="France" operator="Omer Telecom Ltd" status="Not operational" + 89 bands="" cc="fr" country="France" operator="Fondation b-com" status="" 90 bands="" cc="fr" country="France" operator="Images & Réseaux" status="" 91 bands="" cc="fr" country="France" operator="Orange S.A." status="" 92 bands="TD-LTE 2300 / LTE 2600" brand="Com4Innov" cc="fr" country="France" operator="Association Plate-forme Télécom" status="Operational" - 93 bands="" cc="fr" country="France" operator="TDF" status="" + 93 bands="" cc="fr" country="France" operator="TDF" status="Not operational" 94 bands="" cc="fr" country="France" operator="Halys" status="" 00-99 212 - 01 bands="GSM 1800 / UMTS 2100 / LTE 2600" brand="Office des Telephones" cc="mc" country="Monaco" operator="Monaco Telecom" status="Operational" + 01 bands="GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="Office des Telephones" cc="mc" country="Monaco" operator="Monaco Telecom" status="Operational" 00-99 213 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Mobiland" cc="ad" country="Andorra" operator="Servei De Tele. DAndorra" status="Operational" @@ -150,8 +150,9 @@ 51 bands="GSM-R" brand="ADIF" cc="es" country="Spain" operator="Administrador de Infraestructuras Ferroviarias" status="Operational" 00-99 216 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Telenor" cc="hu" country="Hungary" operator="Telenor Magyarország Zrt." status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Telenor Hungary" cc="hu" country="Hungary" operator="Telenor Magyarország Zrt." status="Operational" 02 bands="" cc="hu" country="Hungary" operator="MVM Net Ltd." status="" + 03 bands="1800" brand="DIGI" cc="hu" country="Hungary" operator="DIGI Telecommunication Ltd." status="" 30 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="T-Mobile" cc="hu" country="Hungary" operator="Magyar Telekom Plc" status="Operational" 70 bands="GSM 900 / GSM 1800 / UMTS 2100 / UMTS 900" brand="Vodafone" cc="hu" country="Hungary" operator="Vodafone Magyarország Zrt." status="Operational" 71 bands="MVNO" brand="UPC Hungary" cc="hu" country="Hungary" operator="UPC Hungary Ltd." status="Operational" @@ -177,27 +178,27 @@ 07 bands="CDMA 450" cc="rs" country="Serbia" operator="Orion Telekom" status="Operational" 00-99 222 - 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="TIM" cc="it" country="Italy" operator="Telecom Italia SpA" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="TIM" cc="it" country="Italy" operator="Telecom Italia S.p.A" status="Operational" 02 bands="Satellite (Globalstar)" brand="Elsacom" cc="it" country="Italy" status="Not operational" 04 bands="" brand="Intermatica" cc="it" country="Italy" status="" 05 bands="" brand="Telespazio" cc="it" country="Italy" status="" - 06 bands="" brand="Vodafone" cc="it" country="Italy" operator="Vodafone Omnitel B.V." status="" + 06 bands="" brand="Vodafone" cc="it" country="Italy" operator="Vodafone Italia S.p.A." status="" 07 bands="MVNO" brand="Nòverca" cc="it" country="Italy" operator="Nòverca Italia" status="Not operational" - 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Vodafone" cc="it" country="Italy" operator="Vodafone Omnitel B.V." status="Operational" + 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Vodafone" cc="it" country="Italy" operator="Vodafone Italia S.p.A." status="Operational" 30 bands="GSM-R 900" brand="RFI" cc="it" country="Italy" operator="Rete Ferroviaria Italiana" status="Operational" - 33 bands="MVNO" brand="Poste Mobile" cc="it" country="Italy" operator="Poste Mobile SpA" status="Operational" + 33 bands="MVNO" brand="Poste Mobile" cc="it" country="Italy" operator="Poste Mobile S.p.A." status="Operational" 34 bands="MVNO" brand="BT Italia" cc="it" country="Italy" operator="British Telecom Italia" status="Reserved" - 35 bands="MVNO" brand="Lyca Italy" cc="it" country="Italy" operator="Lycamobile" status="Operational" + 35 bands="MVNO" brand="Lycamobile" cc="it" country="Italy" operator="Lycamobile" status="Operational" 36 bands="" brand="Digi Mobil" cc="it" country="Italy" operator="Digi Italy S.r.l." status="" - 37 bands="" brand="3 Italia" cc="it" country="Italy" operator="Hutchison 3G" status="" - 38 bands="" brand="LINKEM" cc="it" country="Italy" operator="Linkem SpA" status="" + 37 bands="" brand="3 Italia" cc="it" country="Italy" operator="H3G S.p.A." status="" + 38 bands="" brand="LINKEM" cc="it" country="Italy" operator="Linkem S.p.A." status="" 39 bands="" brand="SMS Italia" cc="it" country="Italy" operator="SMS Italia S.r.l." status="" - 43 bands="" brand="TIM" cc="it" country="Italy" operator="Telecom Italia SpA" status="" - 48 bands="" brand="TIM" cc="it" country="Italy" operator="Telecom Italia SpA" status="" + 43 bands="" brand="TIM" cc="it" country="Italy" operator="Telecom Italia S.p.A." status="" + 48 bands="" brand="TIM" cc="it" country="Italy" operator="Telecom Italia S.p.A." status="" 77 bands="UMTS 2100" brand="IPSE 2000" cc="it" country="Italy" status="Not operational" - 88 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="Wind" cc="it" country="Italy" operator="Wind Telecomunicazioni SpA" status="Operational" - 98 bands="GSM 900" brand="BLU s.p.a" cc="it" country="Italy" operator="BLU s.p.a" status="Not operational" - 99 bands="UMTS 900 / UMTS 2100 / LTE 1800" brand="3 Italia" cc="it" country="Italy" operator="Hutchison 3G" status="Operational" + 88 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="Wind" cc="it" country="Italy" operator="Wind Telecomunicazioni S.p.A." status="Operational" + 98 bands="GSM 900" brand="BLU" cc="it" country="Italy" operator="BLU S.p.A." status="Not operational" + 99 bands="UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="3 Italia" cc="it" country="Italy" operator="H3G S.p.A." status="Operational" 00-99 226 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / TD-LTE 2600" brand="Vodafone" cc="ro" country="Romania" operator="Vodafone România" status="Operational" @@ -220,15 +221,17 @@ 07 bands="GSM 1800" brand="IN&Phone" cc="ch" country="Switzerland" operator="IN&Phone SA" status="Not operational" 08 bands="GSM 1800" brand="Tele4u" cc="ch" country="Switzerland" operator="TelCommunication Services AG" status="Operational" 09 bands="" cc="ch" country="Switzerland" operator="Comfone AG" status="" - 12 cc="ch" country="Switzerland" operator="Sunrise" status="Inactive" + 12 brand="Sunrise" cc="ch" country="Switzerland" operator="Sunrise Communications AG" status="Inactive" 50 bands="UMTS 2100" cc="ch" country="Switzerland" operator="3G Mobile AG" status="Not operational" 51 bands="MVNO" cc="ch" country="Switzerland" operator="BebbiCell AG" status="Operational" 52 brand="Barablu" cc="ch" country="Switzerland" operator="Barablu" status="Not operational" 53 bands="MVNO" cc="ch" country="Switzerland" operator="UPC Cablecom GmbH" status="Operational" 54 bands="MVNO" cc="ch" country="Switzerland" operator="Lycamobile AG" status="Operational" 55 bands="" cc="ch" country="Switzerland" operator="WeMobile SA" status="" - 56 bands="" cc="ch" country="Switzerland" operator="SMSRelay AG" status="" + 56 bands="" cc="ch" country="Switzerland" operator="SMSRelay AG" status="Not operational" 57 bands="" cc="ch" country="Switzerland" operator="Mitto AG" status="" + 58 bands="MVNO" cc="ch" country="Switzerland" operator="Beeone Communications SA" status="Operational" + 60 bands="" brand="Sunrise" cc="ch" country="Switzerland" operator="Sunrise Communications AG" status="" 99 cc="ch" country="Switzerland" operator="Swisscom" status="" 00-99 230 @@ -237,8 +240,8 @@ 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100" brand="Vodafone" cc="cz" country="Czech Republic" operator="Vodafone Czech Republic" status="Operational" 04 bands="CDMA2000 410 - 430" brand="U:fon" cc="cz" country="Czech Republic" operator="Air Telecom a. s." status="Operational" 05 bands="" cc="cz" country="Czech Republic" operator="TRAVEL TELEKOMMUNIKATION, s.r.o." status="Not operational" - 06 bands="" cc="cz" country="Czech Republic" operator="OSNO TELECOMUNICATION, s.r.o." status="" - 07 bands="MVNO" cc="cz" country="Czech Republic" operator="ASTELNET, s.r.o." status="Operational" + 06 bands="" cc="cz" country="Czech Republic" operator="OSNO TELECOMUNICATION, s.r.o." status="Not operational" + 07 bands="MVNO" cc="cz" country="Czech Republic" operator="ASTELNET, s.r.o." status="Not operational" 08 bands="" cc="cz" country="Czech Republic" operator="Compatel s.r.o." status="" 09 bands="MVNO" cc="cz" country="Czech Republic" operator="Mundio Distribution Czech Republic s.r.o." status="" 98 bands="GSM-R 900" cc="cz" country="Czech Republic" operator="Správa železniční dopravní cesty, s.o." status="Operational" @@ -275,18 +278,18 @@ 19 bands="" cc="at" country="Austria" operator="Tele2 Telecommunication GmbH" status="" 20 bands="" cc="at" country="Austria" operator="MTEL Austrija GmbH" status="" 91 bands="GSM-R" brand="GSM-R A" cc="at" country="Austria" operator="ÖBB" status="Operational" - 92 bands="" cc="at" country="Austria" operator="ArgoNET GmbH" status="" + 92 bands="CDMA 450" brand="ArgoNET" cc="at" country="Austria" operator="ArgoNET GmbH" status="Operational" 00-99 234 00 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="BT" cc="gb" country="United Kingdom" operator="BT Group" status="Operational" - 01 bands="GSM 1800" brand="Vectone Mobile" cc="gb" country="United Kingdom" operator="Mundio Mobile Limited" status="Operational" + 01 bands="MVNO" brand="Vectone Mobile" cc="gb" country="United Kingdom" operator="Mundio Mobile Limited" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800" brand="O2 (UK)" cc="gb" country="United Kingdom" operator="Telefónica Europe" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel-Vodafone" cc="gb" country="United Kingdom" operator="Jersey Airtel Limited" status="Operational" 04 bands="GSM 1800" brand="FMS Solutions Ltd" cc="gb" country="United Kingdom" operator="FMS Solutions Ltd" status="Reserved" 05 cc="gb" country="United Kingdom" operator="COLT Mobile Telecommunications Limited" status="" 06 cc="gb" country="United Kingdom" operator="Internet Computer Bureau Limited" status="" - 07 bands="GSM 1800" cc="gb" country="United Kingdom" operator="Cable & Wireless Worldwide" status="Operational" - 08 cc="gb" country="United Kingdom" operator="OnePhone (UK) Ltd" status="" + 07 bands="GSM 1800" cc="gb" country="United Kingdom" operator="Vodafone" status="Operational" + 08 cc="gb" country="United Kingdom" operator="BT OnePhone (UK) Ltd" status="" 09 cc="gb" country="United Kingdom" operator="Tismi BV" status="" 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800" brand="O2 (UK)" cc="gb" country="United Kingdom" operator="Telefónica Europe" status="Operational" 11 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800" brand="O2 (UK)" cc="gb" country="United Kingdom" operator="Telefónica Europe" status="Operational" @@ -317,14 +320,18 @@ 36 bands="GSM 900 / GSM 1800 / LTE" brand="Sure Mobile" cc="gb" country="United Kingdom" operator="Sure (Isle of Man) Limited" status="Operational" 37 bands="" cc="gb" country="United Kingdom" operator="Synectiv Ltd" status="" 38 bands="" brand="Virgin Mobile UK" cc="gb" country="United Kingdom" operator="Virgin Media" status="" - 39 bands="" cc="gb" country="United Kingdom" operator="SSE Energy Supply Limited" status="" + 39 bands="" cc="gb" country="United Kingdom" operator="Gamma Telecom Holdings Ltd." status="" 50 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="JT" cc="gb" country="United Kingdom" operator="JT Group Limited" status="Operational" 51 bands="TD-LTE 3500 / TD-LTE 3700" brand="UK Broadband" cc="gb" country="United Kingdom" operator="UK Broadband Limited" status="Operational" 52 bands="" cc="gb" country="United Kingdom" operator="Shyam Telecom UK Ltd" status="" - 53 bands="" cc="gb" country="United Kingdom" operator="Limitless Mobile Ltd" status="" + 53 bands="MVNO" cc="gb" country="United Kingdom" operator="Limitless Mobile Ltd" status="Operational" 54 bands="" cc="gb" country="United Kingdom" operator="The Carphone Warehouse Limited" status="" 55 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Sure Mobile" cc="gb" country="United Kingdom" operator="Sure (Guernsey) Limited" status="Operational" + 56 bands="" cc="gb" country="United Kingdom" operator="CESG" status="" + 57 bands="" cc="gb" country="United Kingdom" operator="Sky UK Limited" status="" 58 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Pronto GSM" cc="gb" country="United Kingdom" operator="Manx Telecom" status="Operational" + 59 bands="MVNO" cc="gb" country="United Kingdom" operator="Limitless Mobile Ltd" status="Operational" + 70 bands="" cc="gb" country="United Kingdom" operator="AMSUK Ltd." status="" 76 bands="GSM 900 / GSM 1800" brand="BT" cc="gb" country="United Kingdom" operator="BT Group" status="Operational" 78 bands="TETRA" brand="Airwave" cc="gb" country="United Kingdom" operator="Airwave Solutions Ltd" status="Operational" 86 bands="" cc="gb" country="United Kingdom" operator="EE" status="" @@ -336,7 +343,7 @@ 03 bands="" brand="UK Broadband" cc="gb" country="United Kingdom" operator="UK Broadband Limited" status="" 77 brand="BT" cc="gb" country="United Kingdom" operator="BT Group" status="" 91 cc="gb" country="United Kingdom" operator="Vodafone United Kingdom" status="" - 92 cc="gb" country="United Kingdom" operator="Cable & Wireless UK" status="" + 92 cc="gb" country="United Kingdom" operator="Vodafone United Kingdom" status="" 94 cc="gb" country="United Kingdom" operator="Hutchison 3G UK Ltd" status="" 95 cc="gb" country="United Kingdom" operator="Network Rail Infrastructure Limited" status="" 00-99 @@ -375,7 +382,7 @@ 06 bands="UMTS 2100" brand="Telenor" cc="se" country="Sweden" operator="Telenor Sverige AB" status="Operational" 07 bands="UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600" brand="Tele2" cc="se" country="Sweden" operator="Tele2 Sverige AB" status="Operational" 08 bands="GSM 900 / GSM 1800" brand="Telenor" cc="se" country="Sweden" operator="Telenor Sverige AB" status="Not operational" - 09 bands="MVNO" brand="djuice" cc="se" country="Sweden" operator="Telenor Mobile Sweden AS" status="Not operational" + 09 bands="" cc="se" country="Sweden" operator="Communication for Devices in Sweden AB" status="" 10 brand="Spring Mobil" cc="se" country="Sweden" operator="Spring Mobil AB" status="Operational" 11 bands="" cc="se" country="Sweden" operator="Lindholmen Science Park AB" status="Not operational" 12 bands="MVNO" brand="Lycamobile" cc="se" country="Sweden" operator="Lycamobile Sweden Limited" status="Operational" @@ -393,7 +400,7 @@ 24 bands="GSM 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600" brand="Sweden 2G" cc="se" country="Sweden" operator="Net4Mobility HB" status="Operational" 25 bands="" cc="se" country="Sweden" operator="Digitel Mobile Srl" status="Not operational" 26 bands="GSM" cc="se" country="Sweden" operator="Beepsend AB" status="Operational" - 27 bands="MVNO" cc="se" country="Sweden" operator="Fogg Mobile AB" status="Operational" + 27 bands="MVNO" cc="se" country="Sweden" operator="GlobeTouch AB" status="Operational" 28 bands="" cc="se" country="Sweden" operator="CoolTEL Aps" status="" 29 bands="" cc="se" country="Sweden" operator="Mercury International Carrier Services" status="" 30 bands="" cc="se" country="Sweden" operator="NextGen Mobile Ltd." status="" @@ -435,42 +442,47 @@ 00-99 244 03 bands="GSM 1800" brand="DNA" cc="fi" country="Finland" operator="DNA Oy" status="Operational" - 04 bands="MVNO" brand="AINA" cc="fi" country="Finland" operator="DNA Oy / Aina Oyj" status="Operational" + 04 bands="MVNO" brand="AINA" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj / Aina Oyj" status="Not operational" 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Elisa" cc="fi" country="Finland" operator="Elisa Oyj" status="Operational" 07 bands="GSM 900 / GSM 1800" brand="Nokia" cc="fi" country="Finland" operator="Nokia Test Network" status="Not operational" 08 bands="GSM 1800 / UMTS 2100" brand="Nokia" cc="fi" country="Finland" operator="Nokia Test Network" status="Not operational" 09 bands="GSM 900" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Not operational" - 10 bands="" cc="fi" country="Finland" operator="Viestintävirasto" status="" - 11 bands="MVNO" brand="Vectone Mobile" cc="fi" country="Finland" operator="Mundio Mobile Oy" status="Operational" + 10 bands="MVNO" cc="fi" country="Finland" operator="Viestintävirasto" status="Not operational" + 11 bands="MVNO" cc="fi" country="Finland" operator="Viestintävirasto" status="Not operational" 12 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="DNA" cc="fi" country="Finland" operator="DNA Oy" status="Operational" 13 bands="GSM 900 / GSM 1800" brand="DNA" cc="fi" country="Finland" operator="DNA Oy" status="Not operational" 14 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Ålcom" cc="fi" country="Finland" operator="Ålands Telekommunikation Ab" status="Operational" 15 bands="GSM 1800" brand="SAMK" cc="fi" country="Finland" operator="Satakunta University of Applied Sciences" status="Not operational" 16 bands="MVNO" brand="Tele2" cc="fi" country="Finland" operator="Oy Finland Tele2 AB" status="Not operational" - 17 bands="GSM-R" brand="RHK" cc="fi" country="Finland" operator="Finnish Transport Agency" status="Operational" + 17 bands="GSM-R" brand="Corenet" cc="fi" country="Finland" operator="Corenet Oy / Finnish Transport Agency" status="Operational" 21 bands="MVNO" brand="Elisa- Saunalahti" cc="fi" country="Finland" operator="Elisa Oyj" status="Operational" 25 bands="CDMA" brand="Datame" cc="fi" country="Finland" operator="Datame Oy" status="Not operational" 26 bands="MVNO" brand="Compatel" cc="fi" country="Finland" operator="Compatel Ltd" status="Operational" 27 bands="" cc="fi" country="Finland" operator="VTT Technical Research Centre of Finland" status="" 29 bands="MVNO" cc="fi" country="Finland" operator="SCNL Truphone" status="Not operational" - 30 bands="MVNO" brand="Vectone Mobile" cc="fi" country="Finland" operator="Mundio Mobile Oy" status="Operational" + 30 bands="MVNO" brand="Vectone Mobile" cc="fi" country="Finland" operator="Mundio Mobile Oy" status="Not Operational" 31 bands="MVNO" brand="Kuiri" cc="fi" country="Finland" operator="Ukko Mobile Oy" status="Operational" 32 bands="MVNO" brand="Voxbone" cc="fi" country="Finland" operator="Voxbone SA" status="Operational" 33 bands="TETRA" brand="VIRVE" cc="fi" country="Finland" operator="Virve Tuotteet ja Palvelut Oy" status="Operational" - 34 bands="" brand="Elektrobit Wireless" cc="fi" country="Finland" operator="Elektrobit Wireless Communications Oy" status="Operational" + 34 bands="MVNO" brand="Bittium Wireless" cc="fi" country="Finland" operator="Bittium Wireless Oy" status="Operational" 35 bands="LTE 450" brand="Ukko Mobile" cc="fi" country="Finland" operator="Ukkoverkot Oy" status="Operational" - 36 bands="" brand="Sonera" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj" status="" + 36 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Sonera / DNA" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj / Suomen Yhteisverkko Oy" status="Operational" + 37 bands="MVNO" brand="Tismi" cc="fi" country="Finland" operator="Tismi BV" status="Operational" + 38 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Operational" + 39 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Operational" + 40 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Operational" + 41 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Operational" 91 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Sonera" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj" status="Operational" 00-99 246 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Omnitel" cc="lt" country="Lithuania" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="BITĖ" cc="lt" country="Lithuania" operator="UAB Bitė Lietuva" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Tele 2" cc="lt" country="Lithuania" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="Omnitel" cc="lt" country="Lithuania" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="BITĖ" cc="lt" country="Lithuania" operator="UAB Bitė Lietuva" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Tele 2" cc="lt" country="Lithuania" status="Operational" 04 bands="" cc="lt" country="Lithuania" operator="Ministry of the Interior)" status="" 05 bands="GSM-R 900" brand="LitRail" cc="lt" country="Lithuania" operator="Lietuvos geležinkeliai (Lithuanian Railways)" status="Operational" - 06 bands="GSM 1800" brand="Mediafon" cc="lt" country="Lithuania" operator="UAB Mediafon" status="Operational" + 06 bands="" brand="Mediafon" cc="lt" country="Lithuania" operator="UAB Mediafon" status="Operational" 07 bands="" cc="lt" country="Lithuania" operator="Compatel Ltd." status="" - 08 bands="WiMAX 3500" brand="MEZON" cc="lt" country="Lithuania" operator="Lietuvos radijo ir televizijos centras" status="Operational" + 08 bands="WiMAX 3500 / LTE 3500" brand="MEZON" cc="lt" country="Lithuania" operator="Lietuvos radijo ir televizijos centras" status="Operational" 00-99 247 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="LMT" cc="lv" country="Latvia" operator="Latvian Mobile Telephone" status="Operational" @@ -484,13 +496,13 @@ 09 bands="MVNO" brand="Camel Mobile" cc="lv" country="Latvia" operator="Camel Mobile" status="Operational" 00-99 248 - 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="EMT" cc="ee" country="Estonia" operator="Estonian Mobile Telecom" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telia" cc="ee" country="Estonia" operator="Estonian Mobile Telecom" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Elisa" cc="ee" country="Estonia" operator="Elisa Eesti" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Tele 2" cc="ee" country="Estonia" operator="Tele 2 Eesti" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600" brand="Tele 2" cc="ee" country="Estonia" operator="Tele 2 Eesti" status="Operational" 04 bands="MVNO" cc="ee" country="Estonia" operator="OY Top Connect" status="Operational" 05 bands="" cc="ee" country="Estonia" operator="AS Bravocom Mobiil" status="" 06 bands="UMTS 2100" cc="ee" country="Estonia" operator="Progroup Holding" status="Operational" - 07 bands="" cc="ee" country="Estonia" operator="Televõrgu AS" status="" + 07 bands="CDMA2000 450" brand="Kou" cc="ee" country="Estonia" operator="Televõrgu AS" status="Not operational" 08 bands="MVNO" brand="VIVEX" cc="ee" country="Estonia" operator="VIVEX OU" status="Operational" 09 bands="" cc="ee" country="Estonia" operator="Bravo Telecom" status="" 10 bands="" cc="ee" country="Estonia" operator="Telcotrade OÜ" status="" @@ -499,7 +511,7 @@ 250 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / TD-LTE 2600" brand="MTS" cc="ru" country="Russian Federation" operator="Mobile TeleSystems" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="MegaFon" cc="ru" country="Russian Federation" operator="MegaFon OJSC - previously known as North-West GSM" status="Operational" - 03 bands="GSM 900 / GSM 1800" brand="NCC" cc="ru" country="Russian Federation" operator="Nizhegorodskaya Cellular Communications" status="Operational" + 03 bands="GSM 900 / GSM 1800" brand="NCC" cc="ru" country="Russian Federation" operator="Nizhegorodskaya Cellular Communications (purchased Tele2)" status="Operational" 04 bands="GSM 900" brand="Sibchallenge" cc="ru" country="Russian Federation" operator="Sibchallenge" status="Not operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / CDMA2000 450" brand="ETK" cc="ru" country="Russian Federation" operator="Yeniseytelecom" status="Operational" 06 bands="CDMA2000 450" brand="Skylink" cc="ru" country="Russian Federation" operator="CJSC Saratov System of Cellular Communications" status="Operational" @@ -520,6 +532,7 @@ 23 bands="GSM 900 / GSM 1800" brand="Mobicom - Novosibirsk" cc="ru" country="Russian Federation" operator="Mobicom - Novosibirsk" status="Not operational" 28 bands="GSM 900" brand="Beeline" cc="ru" country="Russian Federation" operator="Beeline" status="Not operational" 32 bands="GSM 900 / GSM 1800" brand="Win Mobile" cc="ru" country="Russian Federation" operator="K-Telecom" status="Operational" + 34 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Krymtelekom" cc="ru" country="Russian Federation" operator="Krymtelekom" status="Operational" 35 bands="GSM 1800 / LTE 1800" brand="MOTIV" cc="ru" country="Russian Federation" operator="EKATERINBURG-2000" status="Operational" 38 bands="GSM 900 / GSM 1800" brand="Tambov GSM" cc="ru" country="Russian Federation" operator="Central Telecommunication Company" status="Operational" 39 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / TD-LTE 2300 / LTE 2600" brand="Rostelecom" cc="ru" country="Russian Federation" operator="ROSTELECOM" status="Operational" @@ -533,12 +546,12 @@ 99 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="Beeline" cc="ru" country="Russian Federation" operator="OJSC Vimpel-Communications" status="Operational" 00-99 255 - 01 bands="GSM 900 / GSM 1800 / CDMA 450 / UMTS 2100" brand="MTS" cc="ua" country="Ukraine" operator="MTS Ukraine" status="Operational" + 01 bands="GSM 900 / GSM 1800 / CDMA 450 / UMTS 2100" brand="Vodafone" cc="ua" country="Ukraine" operator="MTS Ukraine" status="Operational" 02 bands="GSM 900 / GSM 1800" brand="Beeline" cc="ua" country="Ukraine" operator="Kyivstar GSM JSC" status="Not operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Kyivstar" cc="ua" country="Ukraine" operator="Kyivstar GSM JSC" status="Operational" 04 bands="CDMA 800" brand="IT" cc="ua" country="Ukraine" operator="Intertelecom" status="Operational" 05 bands="GSM 1800" brand="Golden Telecom" cc="ua" country="Ukraine" operator="Kyivstar GSM JSC" status="Not operational" - 06 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="life:)" cc="ua" country="Ukraine" operator="Astelit" status="Operational" + 06 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="lifecell" cc="ua" country="Ukraine" operator="Astelit" status="Operational" 07 bands="UMTS 2100" brand="3Mob" cc="ua" country="Ukraine" operator="3Mob (Ukrtelecom UMTS )" status="Operational" 21 bands="CDMA 800" brand="PEOPLEnet" cc="ua" country="Ukraine" operator="Telesystems of Ukraine" status="Operational" 23 bands="CDMA 800" brand="CDMA Ukraine" cc="ua" country="Ukraine" operator="Intertelecom" status="Not operational" @@ -558,7 +571,7 @@ 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Moldcell" cc="md" country="Moldova" status="Operational" 03 bands="CDMA 450" brand="Unité" cc="md" country="Moldova" operator="Moldtelecom" status="Operational" 04 bands="GSM 900 / GSM 1800" brand="Eventis" cc="md" country="Moldova" operator="Eventis Telecom" status="Not operational" - 05 bands="UMTS 900 / UMTS 2100" brand="Unité" cc="md" country="Moldova" operator="Moldtelecom" status="Operational" + 05 bands="UMTS 900 / UMTS 2100 / LTE 1800" brand="Unité" cc="md" country="Moldova" operator="Moldtelecom" status="Operational" 99 bands="UMTS 2100" brand="Unité" cc="md" country="Moldova" operator="Moldtelecom" status="Operational" 00-99 260 @@ -624,7 +637,7 @@ 16 bands="MVNO" cc="de" country="Germany" operator="Telogic Germany GmbH" status="Not operational" 17 bands="" brand="E-Plus" cc="de" country="Germany" operator="E-Plus Mobilfunk" status="" 18 bands="MVNO" cc="de" country="Germany" operator="NetCologne" status="Operational" - 19 bands="" cc="de" country="Germany" operator="Inquam Deutschland" status="" + 19 bands="CDMA 450" cc="de" country="Germany" operator="Inquam Deutschland" status="" 20 bands="GSM" brand="OnePhone" cc="de" country="Germany" operator="E-Plus Mobilfunk" status="Operational" 33 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="simquadrat" cc="de" country="Germany" operator="sipgate GmbH" status="Operational" 41 bands="" cc="de" country="Germany" operator="First Telecom GmbH" status="" @@ -691,7 +704,7 @@ 22 bands="" cc="is" country="Iceland" operator="Landhelgisgæslan (Icelandic Coast Guard)" status="" 00-99 276 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="AMC" cc="al" country="Albania" operator="Albanian Mobile Communications" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Telekom.al" cc="al" country="Albania" operator="Telekom Albania" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100 /LTE 1800 / LTE 2600" brand="Vodafone" cc="al" country="Albania" operator="Vodafone Albania" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Eagle Mobile" cc="al" country="Albania" operator="Eagle Mobile" status="Operational" 04 bands="GSM 900 / GSM 1800" brand="Plus Communication" cc="al" country="Albania" operator="Plus Communication" status="Operational" @@ -730,7 +743,7 @@ 284 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="M-Tel" cc="bg" country="Bulgaria" operator="Mobiltel" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Vivacom" cc="bg" country="Bulgaria" operator="BTC" status="Operational" - 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Telenor" cc="bg" country="Bulgaria" operator="Telenor (Bulgaria)" status="Operational" + 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Telenor" cc="bg" country="Bulgaria" operator="Telenor (Bulgaria)" status="Operational" 07 bands="GSM-R" brand="НКЖИ" cc="bg" country="Bulgaria" operator="НАЦИОНАЛНА КОМПАНИЯ ЖЕЛЕЗОПЪТНА ИНФРАСТРУКТУРА" status="Operational" 09 bands="" cc="bg" country="Bulgaria" operator="COMPATEL LIMITED" status="Not operational" 11 bands="LTE 1800" cc="bg" country="Bulgaria" operator="Bulsatcom" status="Not operational" @@ -739,8 +752,8 @@ 286 01 bands="GSM 900 / UMTS 2100" brand="Turkcell" cc="tr" country="Turkey" operator="Turkcell Iletisim Hizmetleri A.S." status="Operational" 02 bands="GSM 900 / UMTS 2100" brand="Vodafone" cc="tr" country="Turkey" operator="Vodafone Turkey" status="Operational" - 03 bands="GSM 1800 / UMTS 2100" brand="Avea" cc="tr" country="Turkey" status="Operational" - 04 bands="GSM 1800" cc="tr" country="Turkey" operator="Aycell" status="Not operational" + 03 bands="GSM 1800 / UMTS 2100" brand="Türk Telekom" cc="tr" country="Turkey" operator="Türk Telekom" status="Operational" + 04 bands="GSM 1800" brand="Aycell" cc="tr" country="Turkey" operator="Aycell" status="Not operational" 00-99 288 01 bands="GSM 900 / UMTS 900 / UMTS 2100" brand="Faroese Telecom" cc="fo" country="Faroe Islands (Denmark)" operator="Faroese Telecom" status="Operational" @@ -855,7 +868,7 @@ 013 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" 014 bands="" cc="us" country="United States of America" status="" 015 bands="iDEN" brand="Southern LINC" cc="us" country="United States of America" operator="Southern Communications" status="" - 016 bands="CDMA2000 1900 / CDMA2000 1700" brand="Cricket Wireless" cc="us" country="United States of America" operator="Cricket Communications" status="Operational" + 016 bands="CDMA2000 1900 / CDMA2000 1700" brand="Cricket Wireless" cc="us" country="United States of America" operator="Cricket Communications" status="Not operational" 017 bands="iDEN" brand="ProxTel" cc="us" country="United States of America" operator="North Sight Communications Inc." status="" 020 bands="GSM 850 / GSM 1900 / UMTS" brand="Union Wireless" cc="us" country="United States of America" operator="Union Telephone Company" status="Operational" 030 bands="GSM 850" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" @@ -872,12 +885,12 @@ 070 bands="GSM 850" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 080 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 090 bands="GSM 1900" brand="Cricket Wireless" cc="us" country="United States of America" operator="Cricket Communications" status="Operational" - 100 bands="GSM 850 / UMTS 850 / UMTS AWS" brand="Plateau Wireless" cc="us" country="United States of America" operator="New Mexico RSA 4 East LP" status="Operational" + 100 bands="GSM 850 / UMTS 850 / UMTS 1700" brand="Plateau Wireless" cc="us" country="United States of America" operator="New Mexico RSA 4 East LP" status="Operational" 110 bands="CDMA / GSM 850 / LTE 700" brand="IT&E Wireless" cc="us" country="United States of America" operator="PTI Pacifica Inc." status="Operational" 120 bands="CDMA2000 1900 / LTE 850 / LTE 1900" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="Operational" 130 bands="CDMA2000 1900" brand="Carolina West Wireless" cc="us" country="United States of America" operator="Carolina West Wireless" status="Operational" 140 bands="GSM 850 / GSM 1900 / UMTS 850 / LTE 1700" brand="GTA Wireless" cc="us" country="United States of America" operator="Teleguam Holdings, LLC" status="Operational" - 150 bands="GSM 850 / UMTS 850 / UMTS 1900" brand="Cricket Wireless" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" + 150 bands="GSM 850 / UMTS 850 / UMTS 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 160 bands="GSM 1900" brand="T-Mobile" cc="us" country="United States of America" operator="T-Mobile US" status="Operational" 170 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 180 bands="GSM 850 / UMTS 850 / UMTS 1900" brand="West Central" cc="us" country="United States of America" operator="West Central Wireless" status="Operational" @@ -891,71 +904,78 @@ 260 bands="GSM 1900 / UMTS 1900 / UMTS 1700 / LTE 700 / LTE 1900 / LTE 1700" brand="T-Mobile USA" cc="us" country="United States of America" operator="T-Mobile USA" status="Operational" 270 bands="GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Not operational" 280 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Not Operational" - 290 bands="GSM 1900" brand="nep" cc="us" country="United States of America" operator="NEP Cellcorp Inc." status="Operational" + 290 bands="GSM 1900" brand="nep" cc="us" country="United States of America" operator="NEP Cellcorp Inc." status="Not operational" 300 bands="GSM 1900" brand="Big Sky Mobile" cc="us" country="United States of America" operator="iSmart Mobile, LLC" status="Operational" 310 bands="GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Not operational" - 311 bands="GSM 1900" cc="us" country="United States of America" operator="Farmers Wireless" status="Operational" - 320 bands="GSM 850 / GSM 1900" brand="Cellular One" cc="us" country="United States of America" operator="Smith Bagley, Inc." status="Operational" + 311 bands="GSM 1900" cc="us" country="United States of America" operator="Farmers Wireless" status="Not operational" + 320 bands="GSM 850 / GSM 1900 / UMTS" brand="Cellular One" cc="us" country="United States of America" operator="Smith Bagley, Inc." status="Operational" 330 bands="CDMA" brand="Alltel" cc="us" country="United States of America" operator="Allied Wireless Communications Corporation (AWCC)" status="Not operational" 340 bands="GSM 1900" brand="Westlink Communications" cc="us" country="United States of America" operator="High Plains Midwest LLC" status="Not operational" 350 bands="CDMA" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" 360 bands="CDMA" brand="Pioneer Cellular" cc="us" country="United States of America" operator="Cellular Network Partnership" status="Operational" 370 bands="GSM 1900 / UMTS 850 / LTE 700" brand="Docomo" cc="us" country="United States of America" operator="NTT Docomo Pacific" status="Operational" 380 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Not operational" - 390 bands="GSM 850" brand="Cellular One of East Texas" cc="us" country="United States of America" operator="TX-11 Acquisition, LLC" status="Operational" - 400 bands="GSM 1900" brand="i CAN_GSM" cc="us" country="United States of America" operator="Wave Runner LLC (Guam)" status="Operational" + 390 bands="GSM 850 / LTE 700 / CDMA" brand="Cellular One of East Texas" cc="us" country="United States of America" operator="TX-11 Acquisition, LLC" status="Operational" + 400 bands="GSM 1900 / UMTS 1900 / LTE 700" brand="iConnect" cc="us" country="United States of America" operator="Wave Runner LLC" status="Operational" 410 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 420 bands="GSM 1900 / UMTS 1700" brand="Cincinnati Bell" cc="us" country="United States of America" operator="Cincinnati Bell Wireless" status="Not operational" - 430 bands="GSM 1900" cc="us" country="United States of America" operator="Alaska Digitel" status="Operational" - 440 bands="GSM 1900" brand="Cellular One" cc="us" country="United States of America" status="" - 450 bands="GSM 850 / GSM 1900" brand="Viaero" cc="us" country="United States of America" operator="Viaero Wireless" status="Operational" - 460 bands="GSM 1900" brand="Simmetry" cc="us" country="United States of America" operator="TMP Corporation" status="Not operational" + 430 bands="GSM 1900 / UMTS 1900" brand="GCI" cc="us" country="United States of America" operator="GCI Communications Corp." status="Operational" + 440 bands="MVNO" cc="us" country="United States of America" operator="Numerex" status="Operational" + 450 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="Viaero" cc="us" country="United States of America" operator="Viaero Wireless" status="Operational" + 460 bands="GSM 1900" brand="NewCore" cc="us" country="United States of America" operator="NewCore Wireless LLC" status="Operational" 470 bands="CDMA2000 1900" brand="nTelos" cc="us" country="United States of America" operator="nTelos Communications, Inc." status="Operational" - 480 bands="" cc="us" country="United States of America" operator="Choice Phone" status="Operational" - 490 bands="GSM 850 / GSM 1900" brand="T-Mobile" cc="us" country="United States of America" status="Operational" - 500 bands="CDMA2000 800 / CDMA2000 1900" brand="Alltel" cc="us" country="United States of America" status="Operational" - 510 bands="" brand="Airtel" cc="us" country="United States of America" operator="Airtel Wireless" status="Operational" - 520 bands="" brand="VeriSign" cc="us" country="United States of America" status="" - 530 bands="" cc="us" country="United States of America" operator="West Virginia Wireless" status="Operational" - 540 bands="GSM 1900" brand="Oklahoma Western" cc="us" country="United States of America" operator="Oklahoma Western Telephone Company" status="Operational" + 480 bands="iDEN" brand="Instant Connect" cc="us" country="United States of America" operator="Wave Runner LLC" status="Operational" + 490 bands="GSM 850 / GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Operational" + 500 bands="CDMA2000 850 / CDMA2000 1900" brand="Alltel" cc="us" country="United States of America" operator="Public Service Cellular Inc." status="Operational" + 510 bands="" brand="Cellcom" cc="us" country="United States of America" operator="Nsighttel Wireless LLC" status="" + 520 bands="" brand="TNS" cc="us" country="United States of America" operator="Transaction Network Services" status="" + 530 bands="" brand="iWireless" cc="us" country="United States of America" operator="Iowa Wireless Services LLC" status="" + 540 bands="GSM 850 / GSM 1900" brand="Phoenix" cc="us" country="United States of America" operator="Oklahoma Western Telephone Company" status="Operational" + 550 bands="" cc="us" country="United States of America" operator="Syniverse Technologies" status="" 560 bands="GSM 850" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 570 bands="GSM 850 / LTE 700" brand="Cellular One" cc="us" country="United States of America" operator="TX-10, LLC and Central Louisiana Cellular, LLC (MTPCS)" status="Operational" - 580 bands="" brand="T-Mobile" cc="us" country="United States of America" status="Not operational" + 580 bands="CDMA2000" cc="us" country="United States of America" operator="Inland Cellular Telephone Company" status="Operational" 59 bands="CDMA" brand="Cellular One" cc="bm" country="Bermuda" status="Operational" - 590 bands="GSM 850 / GSM 1900" brand="Alltel" cc="us" country="United States of America" operator="Alltel Communications Inc" status="Operational" - 600 bands="CDMA 850 / CDMA 1900 / LTE 700" brand="Cellcom" cc="us" country="United States of America" operator="New-Cell Inc." status="Operational" - 610 bands="GSM 1900" brand="Epic Touch" cc="us" country="United States of America" operator="Elkhart Telephone Co." status="Operational" - 620 bands="GSM 1900" brand="Coleman County Telecom" cc="us" country="United States of America" operator="Coleman County Telecommunications" status="Operational" + 590 bands="GSM 850 / GSM 1900" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 600 bands="CDMA2000 850 / CDMA2000 1900 / LTE 700" brand="Cellcom" cc="us" country="United States of America" operator="New-Cell Inc." status="Operational" + 610 bands="GSM 1900" brand="Epic PCS" cc="us" country="United States of America" operator="Elkhart Telephone Co." status="Not operational" + 620 bands="" brand="Cellcom" cc="us" country="United States of America" operator="Nsighttel Wireless LLC" status="" 630 bands="LTE 700" brand="miSpot" cc="us" country="United States of America" operator="Agri-Valley Communications" status="Not operational" - 640 bands="GSM 1900" brand="AirFire" cc="us" country="United States of America" operator="Airadigm Communications" status="Not Operational" - 650 bands="GSM 850" brand="Jasper" cc="us" country="United States of America" operator="Jasper Wireless, Inc." status="Operational" + 640 bands="MVNO" cc="us" country="United States of America" operator="Numerex" status="Operational" + 650 bands="MVNO" brand="Jasper" cc="us" country="United States of America" operator="Jasper Technologies" status="Operational" 660 bands="GSM 1900" brand="T-Mobile" cc="us" country="United States of America" status="Not operational" - 670 bands="" brand="Northstar" cc="us" country="United States of America" status="Operational" + 670 bands="" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="" 680 bands="GSM 850 / GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 690 bands="GSM 1900" brand="Limitless Mobile" cc="us" country="United States of America" operator="Limitless Mobile, LLC" status="Operational" + 700 bands="GSM" brand="Bigfoot Cellular" cc="us" country="United States of America" operator="Cross Valiant Cellular Partnership" status="" + 710 bands="GSM 850" brand="ASTAC" cc="us" country="United States of America" operator="Arctic Slope Telephone Association Cooperative" status="Operational" + 720 bands="" cc="us" country="United States of America" operator="Syniverse Technologies" status="" 730 bands="" brand="U.S. Cellular" cc="us" country="United States of America" operator="U.S. Cellular" status="" - 740 bands="" brand="Convey" cc="us" country="United States of America" operator="Convey Communications Inc." status="Operational" + 740 bands="" cc="us" country="United States of America" operator="Green Eagle Communications, Inc." status="" 750 bands="CDMA2000 850 / CDMA2000 1900" brand="Appalachian Wireless" cc="us" country="United States of America" operator="East Kentucky Network, LLC" status="Operational" 760 bands="" cc="us" country="United States of America" operator="Lynch 3G Communications Corporation" status="Not operational" - 770 bands="GSM 1900" brand="i wireless" cc="us" country="United States of America" operator="Iowa Wireless Services" status="Operational" - 780 bands="GSM 1900" cc="us" country="United States of America" operator="Airlink PCS" status="Not operational" - 790 bands="GSM 1900" brand="PinPoint" cc="us" country="United States of America" operator="PinPoint Communications" status="Operational" + 770 bands="GSM 1900 / UMTS 1700 / LTE 1700 / LTE 1900" brand="iWireless" cc="us" country="United States of America" operator="Iowa Wireless Services" status="Operational" + 780 bands="iDEN" brand="Dispatch Direct" cc="us" country="United States of America" operator="D. D. Inc." status="Operational" + 790 bands="GSM 1900 / UMTS / LTE" brand="BLAZE" cc="us" country="United States of America" operator="PinPoint Communications Inc." status="Operational" 800 bands="GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Not operational" - 830 bands="GSM 850" brand="Caprock" cc="us" country="United States of America" operator="Caprock Cellular" status="Operational" - 840 bands="GSM 1900" brand="telna Mobile" cc="us" country="United States of America" operator="Telecom North America Mobile, Inc." status="Operational" - 850 bands="CDMA2000 850 / CDMA2000 1900 / GSM 850 / GSM 1900" brand="Aeris" cc="us" country="United States of America" operator="Aeris Communications, Inc." status="Operational" + 810 bands="1900" cc="us" country="United States of America" operator="LCFR LLC" status="" + 820 bands="" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 830 bands="" cc="us" country="United States of America" operator="Clearwire Corporation" status="" + 840 bands="MVNO" brand="telna Mobile" cc="us" country="United States of America" operator="Telecom North America Mobile, Inc." status="Operational" + 850 bands="MVNO" brand="Aeris" cc="us" country="United States of America" operator="Aeris Communications, Inc." status="Operational" 860 bands="CDMA" brand="Five Star Wireless" cc="us" country="United States of America" operator="TX RSA 15B2, LP" status="Operational" - 870 bands="GSM 850" brand="PACE" cc="us" country="United States of America" operator="Kaplan Telephone Company" status="Operational" - 880 bands="GSM 850" brand="DTC Wireless" cc="us" country="United States of America" operator="Advantage Cellular Systems" status="Operational" - 890 bands="GSM 850 / GSM 1900" brand="Unicel" cc="us" country="United States of America" operator="Rural Cellular Corporation" status="Operational" + 870 bands="MVNO" brand="PACE" cc="us" country="United States of America" operator="Kaplan Telephone Company" status="Operational" + 880 bands="GSM 850" brand="DTC Wireless" cc="us" country="United States of America" operator="Advantage Cellular Systems, Inc." status="Operational" + 890 bands="GSM 850 / GSM 1900" cc="us" country="United States of America" operator="Verizon Wireless" status="" 900 bands="CDMA2000 850 / CDMA2000 1900" brand="Mid-Rivers Wireless" cc="us" country="United States of America" operator="Cable & Communications Corporation" status="Operational" - 910 bands="GSM 850" brand="First Cellular" cc="us" country="United States of America" operator="First Cellular of Southern Illinois" status="Operational" + 910 bands="GSM 850" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 920 bands="CDMA" cc="us" country="United States of America" operator="James Valley Wireless, LLC" status="Operational" 930 bands="CDMA" cc="us" country="United States of America" operator="Copper Valley Wireless" status="Operational" - 940 bands="" cc="us" country="United States of America" operator="Iris Wireless LLC" status="Operational" - 950 bands="GSM 850" brand="XIT Wireless" cc="us" country="United States of America" operator="Texas RSA 1 dba XIT Cellular" status="Operational" - 960 bands="CDMA / LTE 700" cc="us" country="United States of America" operator="Strata Networks" status="Operational" - 970 bands="Satellite" brand="Telemedicine Wireless" cc="us" country="United States of America" operator="Telemedicine Wireless (USA) Telecommunications,Inc" status="Operational" - 980 bands="CDMA / LTE 700" brand="Peoples Telephone Cooperative, Inc." cc="us" country="United States of America" operator="Texas RSA 7B3" status="Operational" + 940 bands="MVNO" cc="us" country="United States of America" operator="Iris Wireless LLC" status="" + 950 bands="GSM 850" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" + 960 bands="CDMA / LTE 700" brand="STRATA" cc="us" country="United States of America" operator="UBET Wireless" status="Operational" + 970 bands="Satellite" cc="us" country="United States of America" operator="Globalstar" status="Operational" + 980 bands="CDMA / LTE 700" brand="Peoples Telephone" cc="us" country="United States of America" operator="Texas RSA 7B3" status="Not operational" 990 bands="LTE 700" brand="Evolve Broadband" cc="us" country="United States of America" operator="Worldcall Interconnect Inc." status="Operational" 000-999 311 @@ -972,7 +992,7 @@ 090 bands="GSM 1900" brand="Long Lines Wireless" cc="us" country="United States of America" operator="Long Lines Wireless LLC" status="Operational" 100 bands="GSM 1900" cc="us" country="United States of America" operator="High Plains Wireless" status="Operational" 110 bands="GSM 1900" cc="us" country="United States of America" operator="High Plains Wireless" status="Operational" - 120 bands="" cc="us" country="United States of America" operator="Choice Phone" status="Operational" + 120 bands="" brand="iConnect" cc="us" country="United States of America" operator="Wave Runner LLC" status="Operational" 130 bands="GSM 850" cc="us" country="United States of America" operator="Cell One Amarillo" status="Operational" 140 bands="CDMA" brand="Sprocket Wireless" cc="us" country="United States of America" operator="Cross Telephone / MBO Wireless" status="Operational" 150 bands="GSM 850" cc="us" country="United States of America" operator="Wilkes Cellular" status="Operational" @@ -983,7 +1003,7 @@ 210 bands="GSM 1900 / UMTS 2100" cc="us" country="United States of America" operator="Emery Telcom Wireless" status="Operational" 220 bands="CDMA" brand="U.S. Cellular" cc="us" country="United States of America" operator="U.S. Cellular" status="Operational" 230 bands="CDMA 850 / CDMA 1900 / LTE 1900 / LTE 1700" brand="C Spire Wireless" cc="us" country="United States of America" operator="Cellular South Inc." status="Operational" - 250 bands="iDEN / GSM 1900 / LTE 700" brand="iConnect" cc="gu" country="Guam (United States of America)" operator="Wave Runner LLC / Choice Phone LLC" status="Operational" + 250 bands="" brand="iConnect" cc="us" country="United States of America" operator="Wave Runner LLC" status="Operational" 330 bands="" brand="Bug Tussel Wireless" cc="us" country="United States of America" operator="Bug Tussel Wireless" status="Operational" 360 bands="UMTS 1700" cc="us" country="United States of America" operator="Stelera Wireless" status="Not operational" 370 bands="LTE 1700" brand="GCI Wireless" cc="us" country="United States of America" operator="General Communication Inc." status="Operational" @@ -994,7 +1014,7 @@ 481 cc="us" country="United States of America" 490 bands="LTE 850 / LTE 1900 / TD-LTE 2500" brand="Sprint Corporation" cc="us" country="United States of America" operator="Sprint" status="Operational" 500 bands="UMTS / LTE 700 / LTE 1700" cc="us" country="United States of America" operator="Mosaic Telecom" status="Operational" - 530 bands="" cc="us" country="United States of America" operator="Newcore Wireless" status="Operational" + 530 bands="GSM 1900" brand="NewCore" cc="us" country="United States of America" operator="NewCore Wireless LLC" status="Operational" 570 bands="UMTS 1700 / LTE 1700" cc="us" country="United States of America" operator="BendBroadband" status="Not operational" 580 bands="LTE 700 / LTE 850" brand="U.S. Cellular" cc="us" country="United States of America" operator="U.S. Cellular" status="Operational" 630 bands="" brand="C Spire Wireless" cc="us" country="United States of America" operator="Cellular South Inc." status="" @@ -1002,6 +1022,7 @@ 650 bands="CDMA / LTE 700 / WiMAX 3700" brand="United Wireless" cc="us" country="United States of America" operator="United Wireless" status="Operational" 660 bands="CDMA2000 1900 / CDMA 2000 1700 / LTE 1700" brand="metroPCS" cc="us" country="United States of America" operator="metroPCS" status="Operational" 750 bands="LTE" cc="us" country="United States of America" operator="NetAmerica Alliance" status="Operational" + 790 bands="" cc="us" country="United States of America" operator="Coleman County Telephone Cooperative, Inc." status="" 810 bands="CDMA / LTE 700" brand="Bluegrass Wireless" cc="us" country="United States of America" operator="Bluegrass Wireless" status="Operational" 830 bands="LTE 700" cc="us" country="United States of America" operator="Thumb Cellular LP" status="Operational" 870 bands="MVNO" brand="Boost" cc="us" country="United States of America" operator="Boost Mobile" status="Operational" @@ -1023,6 +1044,7 @@ 130 bands="LTE 700" brand="Appalachian Wireless" cc="us" country="United States of America" operator="East Kentucky Network, LLC" status="Operational" 180 bands="" cc="us" country="United States of America" operator="Limiteless Mobile LLC" status="" 220 bands="LTE 700" cc="us" country="United States of America" operator="Chariton Valley Telephone" status="Operational" + 260 bands="LTE 1900" brand="NewCore" cc="us" country="United States of America" operator="Central LTE Holdings" status="Operational" 270 bands="LTE 700" brand="Pioneer Cellular" cc="us" country="United States of America" operator="Cellular Network Partnership" status="Operational" 280 bands="LTE 700" brand="Pioneer Cellular" cc="us" country="United States of America" operator="Cellular Network Partnership" status="Operational" 330 bands="LTE 700" brand="Nemont" cc="us" country="United States of America" operator="Sagebrush Cellular" status="Operational" @@ -1072,8 +1094,8 @@ 020 bands="" brand="LIME" cc="jm" country="Jamaica" operator="LIME (Cable & Wireless)" status="Not operational" 050 bands="GSM 900 / GSM 1800 / GSM 1900" brand="Digicel" cc="tc" country="Turks and Caicos Islands" operator="Digicel (Turks & Caicos) Limited" status="Operational" 070 bands="GSM / UMTS / CDMA" brand="Claro" cc="jm" country="Jamaica" operator="Oceanic Digital Jamaica Limited" status="Not operational" - 110 bands="" brand="LIME" cc="jm" country="Jamaica" operator="LIME (Cable & Wireless)" status="Operational" - 180 bands="GSM 850 / GSM 1900 / UMTS 850" brand="LIME" cc="jm" country="Jamaica" operator="LIME (Cable & Wireless)" status="Operational" + 110 bands="" brand="FLOW" cc="jm" country="Jamaica" operator="Cable & Wireless Communications" status="Operational" + 180 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="FLOW" cc="jm" country="Jamaica" operator="Cable & Wireless Communications" status="Operational" 000-999 340 01 bands="GSM 900 / UMTS 2100" brand="Orange" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="Orange Caraïbe Mobiles" status="Operational" @@ -1320,7 +1342,7 @@ 043 bands="CDMA 2000 / GSM 1800 / UMTS 2100" brand="TATA DOCOMO" cc="in" country="India" operator="Rajasthan" status="Operational" 044 bands="CDMA 2000 / GSM 1800" brand="TATA DOCOMO" cc="in" country="India" operator="Tamil Nadu including Chennai" status="Operational" 045 bands="CDMA 2000 / GSM 1800" brand="TATA DOCOMO" cc="in" country="India" operator="Uttar Pradesh (E)" status="Operational" - 046 bands="CDMA 2000 / GSM 1800 / UMTS 2100" brand="TATA DOCOMO" cc="in" country="India" operator="Uttar Pradesh (W) & Uttarkhand" status="Operational" + 046 bands="CDMA 2000 / GSM 1800 / UMTS 2100" brand="TATA DOCOMO" cc="in" country="India" operator="Uttar Pradesh (W) & Uttarakhand" status="Operational" 047 bands="CDMA 2000 / GSM 1800" brand="TATA DOCOMO" cc="in" country="India" operator="West Bengal" status="Operational" 05 bands="GSM 1800" brand="Reliance" cc="in" country="India" operator="Delhi & NCR" status="Operational" 06 bands="GSM 1800" brand="Reliance" cc="in" country="India" operator="Gujarat" status="Operational" @@ -1389,7 +1411,7 @@ 851 bands="GSM 1800" brand="IDEA" cc="in" country="India" operator="Punjab" status="Operational" 852 bands="GSM 1800" brand="IDEA" cc="in" country="India" operator="Tamil Nadu" status="Operational" 853 bands="GSM 1800" brand="IDEA" cc="in" country="India" operator="West Bengal" status="Operational" - 854 bands="" brand="Jio" cc="in" country="India" operator="Andra Pradesh" status="Reserved" + 854 bands="" brand="Jio" cc="in" country="India" operator="Andhra Pradesh" status="Reserved" 855 bands="" brand="Jio" cc="in" country="India" operator="Assam" status="Reserved" 856 bands="" brand="Jio" cc="in" country="India" operator="Bihar" status="Reserved" 857 bands="" brand="Jio" cc="in" country="India" operator="Gujarat" status="Reserved" @@ -1451,13 +1473,14 @@ 08 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Hutch" cc="lk" country="Sri Lanka" operator="Hutchison Telecommunications Lanka (Pvt) Ltd" status="Operational" 00-99 414 - 01 bands="GSM 900 / UMTS 2100" brand="MPT" cc="mm" country="Myanmar" operator="Myanmar Post and Telecommunication" status="Operational" + 01 bands="GSM 900 / UMTS 2100" brand="MPT" cc="mm" country="Myanmar" operator="Myanmar Posts and Telecommunications" status="Operational" + 03 bands="CDMA 800" brand="CDMA800" cc="mm" country="Myanmar" operator="Myanmar Economic Corporation" status="Operational" 05 bands="UMTS 900 / UMTS 2100" brand="Ooredoo" cc="mm" country="Myanmar" operator="Ooredoo Myanmar" status="Operational" 06 bands="GSM 900 / UMTS 2100" brand="Telenor Myanmar" cc="mm" country="Myanmar" operator="Telenor Myanmar (Comcel Myanmar)" status="Operational" 00-99 415 01 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Alfa" cc="lb" country="Lebanon" operator="MIC 1" status="Operational" - 03 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="mtc touch" cc="lb" country="Lebanon" operator="MIC 2" status="Operational" + 03 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="touch" cc="lb" country="Lebanon" operator="MIC 2" status="Operational" 05 bands="GSM 900" brand="Ogero Mobile" cc="lb" country="Lebanon" operator="Ogero Telecom" status="Operational" 00-99 416 @@ -1472,6 +1495,7 @@ 09 bands="" cc="sy" country="Syria" operator="Syrian Telecom" status="" 00-99 418 + 00 bands="GSM 900" brand="Asia Cell" cc="iq" country="Iraq" operator="Asia Cell Telecommunications Company" status="Operational" 05 bands="GSM 900" brand="Asia Cell" cc="iq" country="Iraq" operator="Asia Cell Telecommunications Company" status="Operational" 08 bands="GSM 900" brand="SanaTel" cc="iq" country="Iraq" status="Operational" 20 bands="GSM 900 / GSM 1800" brand="Zain" cc="iq" country="Iraq" operator="Zain Iraq" status="Operational" @@ -1509,13 +1533,13 @@ 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="du" cc="ae" country="United Arab Emirates" operator="Emirates Integrated Telecommunications Company" status="Operational" 00-99 425 - 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Orange" cc="il" country="Israel" operator="Partner Communications Company Ltd." status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Partner" cc="il" country="Israel" operator="Partner Communications Company Ltd." status="Operational" 02 bands="GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800" brand="Cellcom" cc="il" country="Israel" operator="Cellcom Israel Ltd." status="Operational" 03 bands="CDMA 800 / UMTS 850 / UMTS 2100 / LTE 1800" brand="Pelephone" cc="il" country="Israel" operator="Pelephone Communications Ltd." status="Operational" 04 bands="" cc="il" country="Israel" operator="Globalsim Ltd" status="" 05 bands="GSM 900" brand="Jawwal" cc="ps" country="Palestine" operator="Palestine Cellular Communications, Ltd." status="Operational" 06 bands="GSM 900 / GSM 1800" brand="Wataniya" cc="ps" country="Palestine" operator="Wataniya Palestine Mobile Telecommunications Company" status="Operational" - 07 bands="iDEN 800 / UMTS 2100" brand="Hot Mobile" cc="il" country="Israel" operator="Hot Mobile Ltd. (Former Mirs Communications)" status="Operational" + 07 bands="iDEN 800 / UMTS 2100" brand="Hot Mobile" cc="il" country="Israel" operator="Hot Mobile Ltd." status="Operational" 08 bands="UMTS 2100 / LTE 1800" brand="Golan Telecom" cc="il" country="Israel" operator="Golan Telecom Ltd" status="Operational" 11 bands="MVNO" cc="il" country="Israel" operator="365 Telecom" status="" 12 bands="MVNO" cc="il" country="Israel" operator="Free Telecom" status="" @@ -1531,6 +1555,7 @@ 23 bands="" cc="il" country="Israel" operator="Beezz Communication Solutions Ltd." status="" 24 bands="MVNO" brand="012 Telecom" cc="il" country="Israel" operator="Partner Communications Company Ltd." status="Operational" 25 bands="LTE" brand="IMOD" cc="il" country="Israel" operator="Israel Ministry of Defense" status="Not operational" + 28 bands="LTE 1800" cc="il" country="Israel" operator="PHI Networks" status="" 00-99 426 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Batelco" cc="bh" country="Bahrain" operator="Bahrain Telecommunications Company" status="Operational" @@ -1558,10 +1583,10 @@ 04 bands="GSM 900" brand="SmartCell" cc="np" country="Nepal" operator="Smart Telecom Pvt. Ltd." status="Operational" 00-99 432 - 11 bands="GSM 900 / GSM 1800 / UMTS" brand="IR-MCI (Hamrahe Avval)" cc="ir" country="Iran" operator="Mobile Communications Company of Iran" status="Operational" + 11 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="IR-MCI (Hamrahe Avval)" cc="ir" country="Iran" operator="Mobile Communications Company of Iran" status="Operational" 14 bands="GSM 900" brand="TKC" cc="ir" country="Iran" operator="Telecommunication Kish Company" status="Operational" 19 bands="GSM 900" brand="MTCE (Espadan)" cc="ir" country="Iran" operator="Mobile Telecommunications Company of Esfahan" status="Operational" - 20 bands="UMTS" brand="Rightel" cc="ir" country="Iran" status="Operational" + 20 bands="UMTS 900 / UMTS 2100 / LTE 1800" brand="Rightel" cc="ir" country="Iran" status="Operational" 32 bands="GSM 900 / GSM 1800" brand="Taliya" cc="ir" country="Iran" operator="Rafsanjan Industrial Complex" status="Operational" 35 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="MTN Irancell" cc="ir" country="Iran" operator="MTN Irancell Telecommunications Services Company" status="Operational" 70 bands="GSM 900 / GSM 1800" brand="TCI" cc="ir" country="Iran" operator="Telephone Communications Company of Iran" status="Operational" @@ -1580,8 +1605,8 @@ 436 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Tcell" cc="tj" country="Tajikistan" operator="JV Somoncom" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Tcell" cc="tj" country="Tajikistan" operator="Indigo Tajikistan" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Megafon Tajikistan" cc="tj" country="Tajikistan" operator="TT Mobile" status="Operational" - 04 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100" brand="Babilon-M" cc="tj" country="Tajikistan" operator="Babilon-Mobile" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Megafon Tajikistan" cc="tj" country="Tajikistan" operator="TT Mobile" status="Operational" + 04 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100" brand="Babilon-M" cc="tj" country="Tajikistan" operator="Babilon-Mobile" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Beeline" cc="tj" country="Tajikistan" operator="Tacom" status="Operational" 12 bands="UMTS 2100" brand="Tcell" cc="tj" country="Tajikistan" operator="Indigo" status="" 00-99 @@ -1597,125 +1622,31 @@ 03 bands="CDMA 450" brand="AGTS CDMA" cc="tm" country="Turkmenistan" operator="AŞTU" status="Operational" 00-99 440 - 00 bands="UMTS 1700" brand="Y!Mobile" cc="jp" country="Japan" operator="EMOBILE Limited" status="Operational" - 01 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 02 bands="UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT DoCoMo - Kansai" status="Operational" - 03 bands="UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT DoCoMo - Hokuriku" status="Operational" - 04 bands="UMTS 900 / UMTS 2100" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 06 bands="UMTS 900 / UMTS 2100" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 07 bands="CDMA2000 / 1X EV-DO Rev.A" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 08 bands="CDMA2000" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 09 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Kansai" status="Operational" - 10 bands="UMTS 800 / UMTS 1700 / UMTS 2100 / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 11 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Tokai" status="Operational" - 12 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 13 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 14 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Tohoku" status="Operational" - 15 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 16 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 17 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 18 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Tokai" status="Operational" - 19 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Hokkaido" status="Operational" - 20 bands="UMTS 900 / UMTS 2100" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 21 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 22 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Kansai" status="Operational" - 23 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Tokai" status="Operational" - 24 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Chugoku" status="Operational" - 25 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Hokkaido" status="Operational" - 26 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Kyushu" status="Operational" - 27 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Tohoku" status="Operational" - 28 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Shikoku" status="Operational" - 29 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 30 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 31 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Kansai" status="Operational" - 32 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo" status="Operational" - 33 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Tokai" status="Operational" - 34 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT docomo - Kyushu" status="Operational" - 35 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Kansai" status="Operational" - 36 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 37 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 38 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 39 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 40 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 41 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 42 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 43 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 44 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 45 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 46 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 47 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 48 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 49 bands="UMTS / HSDPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 50 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 51 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 52 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 53 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 54 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 55 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 56 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 58 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Kansai" status="Operational" - 60 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Kansai" status="Operational" - 61 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Chugoku" status="Operational" - 62 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Kyushu" status="Operational" - 63 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 64 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 65 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Shikoku" status="Operational" - 66 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 67 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Tohoku" status="Operational" - 68 bands="UMTS 800 / UMTS 1700 / UMTS 2100" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Kyushu" status="Operational" - 69 bands="UMTS / WCDMA / HSDPA / HSUPA / LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" - 70 bands="CDMA2000 800 / CDMA2000 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 71 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 72 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 73 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 74 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 75 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 76 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 77 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 78 bands="UMTS / HSDPA" cc="jp" country="Japan" operator="Okinawa Cellular Telephone" status="Operational" - 79 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 80 bands="GSM" brand="TU-KA" cc="jp" country="Japan" operator="TU-KA Cellular Tokyo" status="Not operational" - 81 bands="GSM" brand="TU-KA" cc="jp" country="Japan" operator="TU-KA Cellular Tokyo" status="Not operational" - 82 bands="GSM" brand="TU-KA" cc="jp" country="Japan" operator="TU-KA Phone Kansai" status="Not operational" - 83 bands="GSM" brand="TU-KA" cc="jp" country="Japan" operator="TU-KA Cellular Tokai" status="Not operational" - 84 bands="GSM" brand="TU-KA" cc="jp" country="Japan" operator="TU-KA Phone Kansai" status="Not operational" - 85 bands="GSM" brand="TU-KA" cc="jp" country="Japan" operator="TU-KA Cellular Tokai" status="Not operational" - 86 bands="GSM" brand="TU-KA" cc="jp" country="Japan" operator="TU-KA Cellular Tokyo" status="Not operational" - 87 bands="UMTS / HSDPA" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo - Chugoku" status="Operational" - 88 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 89 bands="WCDMA" brand="KDDI" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" - 90 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 92 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 93 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 94 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 95 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 96 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 97 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 98 bands="UMTS / HSPA+ / DC-HSDPA" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="Operational" - 99 bands="LTE (4G)" brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="Operational" + 00 bands="UMTS 1800" brand="Y!Mobile" cc="jp" country="Japan" operator="SoftBank Corp." status="Operational" + 01 bands="WiMAX 2500" brand="UQ WiMAX" cc="jp" country="Japan" operator="UQ Communications Inc." status="Operational" + 02 bands="WiMAX 2500" cc="jp" country="Japan" operator="Hanshin Cable Enginerring Co., Ltd." status="" + 05 bands="TD-LTE 2500" cc="jp" country="Japan" operator="Wireless City Planning Inc." status="Operational" + 10 bands="UMTS 850 / UMTS 1800 / UMTS 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT DoCoMo, Inc." status="Operational" + 20 bands="UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Corp." status="Operational" + 21 bands="UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Corp." status="Operational" + 50 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 51 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 52 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 53 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 54 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 70 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 71 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 72 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 73 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 74 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 75 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 76 bands="CDMA2000 850 / CDMA2000 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 2100" brand="au" cc="jp" country="Japan" operator="KDDI Corporation" status="Operational" + 78 bands="CDMA2000 850 / CDMA2000 2100" brand="au" cc="jp" country="Japan" operator="Okinawa Cellular Telephone" status="Operational" 00-99 441 - 40 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTTドコモ" status="" - 41 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTTドコモ" status="" - 42 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTTドコモ" status="" - 43 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTTドコモ" status="" - 44 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTTドコモ" status="" - 45 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTTドコモ" status="" - 50 brand="TU-KA" cc="jp" country="Japan" operator="KDDI" status="" - 51 brand="TU-KA" cc="jp" country="Japan" operator="KDDI" status="" - 61 brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="" - 62 brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="" - 63 brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="" - 64 brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="" - 65 brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Mobile Corp" status="" - 70 brand="KDDI" cc="jp" country="Japan" operator="KDDI" status="" - 90 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="" - 91 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="" - 92 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="" - 93 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="" - 94 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="" - 98 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="" - 99 brand="NTT DoCoMo" cc="jp" country="Japan" operator="NTT DoCoMo" status="" + 00 bands="TD-LTE 2500" cc="jp" country="Japan" operator="Wireless City Planning Inc." status="Operational" + 01 bands="UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Corp." status="Operational" + 10 bands="WiMAX 2500" brand="UQ WiMAX" cc="jp" country="Japan" operator="UQ Communications Inc." status="Operational" 00-99 450 02 bands="CDMA2000 1800" brand="KT" cc="kr" country="South Korea" operator="KT" status="Discontinued" @@ -1894,6 +1825,7 @@ 30 bands="" cc="au" country="Australia" operator="Compatel Limited" status="" 31 bands="" cc="au" country="Australia" operator="BHP Billiton" status="" 32 bands="" cc="au" country="Australia" operator="Thales Australia" status="" + 33 bands="" cc="au" country="Australia" operator="CLX Networks Pty Ltd" status="" 38 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Crazy John's" cc="au" country="Australia" operator="Vodafone Hutchison Australia Proprietary Limited" status="Operational" 62 bands="LTE 2300" brand="NBN" cc="au" country="Australia" operator="National Broadband Network Co." status="" 68 bands="LTE 2300" brand="NBN" cc="au" country="Australia" operator="National Broadband Network Co." status="" @@ -1905,17 +1837,17 @@ 00-99 510 00 bands="Satellite" brand="PSN" cc="id" country="Indonesia" operator="PT Pasifik Satelit Nusantara (ACeS)" status="Operational" - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800" brand="INDOSAT" cc="id" country="Indonesia" operator="PT Indonesian Satellite Corporation Tbk (INDOSAT)" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800" brand="Indosat Ooredoo" cc="id" country="Indonesia" operator="PT Indonesian Satellite Corporation Tbk (INDOSAT)" status="Operational" 03 bands="CDMA 800" brand="StarOne" cc="id" country="Indonesia" operator="PT Indosat Tbk" status="Not operational" 07 bands="CDMA 800" brand="TelkomFlexi" cc="id" country="Indonesia" operator="PT Telkom" status="Operational" - 08 bands="GSM 1800 / UMTS 2100" brand="AXIS" cc="id" country="Indonesia" operator="PT Natrindo Telepon Seluler" status="Operational" - 09 bands="CDMA 800 / CDMA 1900 / LTE 850 / LTE 1800 / TD-LTE 2300" brand="Smartfren" cc="id" country="Indonesia" operator="PT Smart Telecom" status="Operational" + 08 bands="GSM 1800 / UMTS 2100" brand="AXIS" cc="id" country="Indonesia" operator="PT Natrindo Telepon Seluler" status="Not operational" + 09 bands="CDMA 800 / CDMA 1900 / LTE 850 / TD-LTE 2300" brand="Smartfren" cc="id" country="Indonesia" operator="PT Smart Telecom" status="Operational" 10 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800" brand="Telkomsel" cc="id" country="Indonesia" operator="PT Telekomunikasi Selular" status="Operational" 11 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800" brand="XL" cc="id" country="Indonesia" operator="PT XL Axiata Tbk" status="Operational" 20 bands="GSM 1800" brand="TELKOMMobile" cc="id" country="Indonesia" operator="PT Telkom Indonesia Tbk" status="Not operational" 21 bands="GSM 1800" brand="IM3" cc="id" country="Indonesia" operator="PT Indonesian Satellite Corporation Tbk (INDOSAT)" status="Not operational" 27 bands="CDMA 450" brand="Ceria" cc="id" country="Indonesia" operator="PT Sampoerna Telekomunikasi Indonesia" status="Operational" - 28 bands="CDMA 800" brand="Fren/Hepi" cc="id" country="Indonesia" operator="PT Mobile-8 Telecom" status="Operational" + 28 bands="CDMA 800 LTE 850 / TD-LTE 2300" brand="Fren/Hepi" cc="id" country="Indonesia" operator="PT Mobile-8 Telecom" status="Operational" 88 bands="TD-LTE 2300" brand="BOLT! Super 4G" cc="id" country="Indonesia" operator="PT Internux" status="Operational" 89 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="3" cc="id" country="Indonesia" operator="PT Hutchison CP Telecommunications" status="Operational" 99 bands="CDMA 800" brand="Esia" cc="id" country="Indonesia" operator="PT Bakrie Telecom" status="Operational" @@ -1937,23 +1869,24 @@ 00-99 520 00 bands="UMTS 850" brand="my by CAT" cc="th" country="Thailand" operator="CAT Telecom" status="Operational" - 01 bands="GSM 900 / UMTS 900" brand="AIS" cc="th" country="Thailand" operator="Advanced Info Service" status="Operational" - 02 bands="CDMA 800" brand="CAT CDMA" cc="th" country="Thailand" operator="CAT Telecom" status="Operational" - 03 bands="UMTS 2100" brand="AIS 3G" cc="th" country="Thailand" operator="AWN" status="Operational" - 04 bands="UMTS 2100 / LTE 2100" brand="truemove H 4G LTE" cc="th" country="Thailand" operator="Real Future" status="Operational" - 05 bands="UMTS 2100 / LTE 2100" brand="dtac TriNet" cc="th" country="Thailand" operator="DTN" status="Operational" - 15 bands="UMTS 2100" brand="TOT 3G" cc="th" country="Thailand" operator="Telephone Organization of Thailand (TOT)" status="Operational" - 18 bands="GSM 1800 / UMTS 850 / LTE 1800" brand="dtac" cc="th" country="Thailand" operator="Total Access Communication" status="Operational" - 23 bands="GSM 1800" brand="AIS GSM 1800" cc="th" country="Thailand" operator="AIS)" status="Not operational" + 01 bands="GSM 900" brand="AIS" cc="th" country="Thailand" operator="Advanced Info Service" status="Operational" + 02 bands="CDMA 800" brand="CAT CDMA" cc="th" country="Thailand" operator="CAT Telecom" status="Not operational" + 03 bands="UMTS 2100 / LTE 1800" brand="AIS" cc="th" country="Thailand" operator="Advanced Wireless Network Company Ltd." status="Operational" + 04 bands="UMTS 2100 / LTE 1800 / LTE 2100" brand="TrueMove H 4G LTE" cc="th" country="Thailand" operator="Real Future Company Ltd." status="Operational" + 05 bands="UMTS 850 / UMTS 2100 / LTE 1800 / LTE 2100" brand="dtac TriNet" cc="th" country="Thailand" operator="DTAC Network Company Ltd." status="Operational" + 15 bands="UMTS 2100" brand="TOT 3G" cc="th" country="Thailand" operator="TOT Public Company Limited" status="Operational" + 18 bands="GSM 1800" brand="dtac" cc="th" country="Thailand" operator="Total Access Communications Public Company Ltd." status="Operational" + 20 bands="Satellite" brand="ACeS" cc="th" country="Thailand" operator="ACeS" status="" + 23 bands="GSM 1800" brand="AIS GSM 1800" cc="th" country="Thailand" operator="Digital Phone Company Ltd." status="Not operational" 25 bands="PHS 1900" brand="WE PCT" cc="th" country="Thailand" operator="True Corporation" status="Operational" 47 bands="" cc="th" country="Thailand" operator="Telephone Organization of Thailand (TOT)" status="" - 99 bands="GSM 1800" brand="truemove" cc="th" country="Thailand" operator="True Corporation" status="Operational" + 99 bands="GSM 1800" brand="TrueMove" cc="th" country="Thailand" operator="True Corporation" status="Not operational" 00-99 525 - 01 bands="GSM 900/1800, UMTS 900/2100, LTE 1800/2600" brand="SingTel" cc="sg" country="Singapore" operator="Singapore Telecom" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600" brand="SingTel" cc="sg" country="Singapore" operator="Singapore Telecom" status="Operational" 02 bands="GSM 1800" brand="SingTel-G18" cc="sg" country="Singapore" operator="Singapore Telecom" status="Operational" - 03 bands="GSM 900/1800, UMTS 900/2100, LTE 1800/2600" brand="M1" cc="sg" country="Singapore" operator="M1 Limited" status="Operational" - 05 bands="GSM 1800, UMTS 900/2100, LTE 1800" brand="StarHub" cc="sg" country="Singapore" operator="StarHub Mobile" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="M1" cc="sg" country="Singapore" operator="M1 Limited" status="Operational" + 05 bands="GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="StarHub" cc="sg" country="Singapore" operator="StarHub Mobile" status="Operational" 06 bands="" brand="StarHub" cc="sg" country="Singapore" operator="StarHub Mobile" status="" 07 bands="" brand="SingTel" cc="sg" country="Singapore" operator="Singapore Telecom" status="" 12 bands="iDEN 800" brand="Grid" cc="sg" country="Singapore" operator="GRID Communications Pte Ltd." status="Operational" @@ -2126,7 +2059,7 @@ 03 bands="GSM 900" brand="Moov" cc="tg" country="Togo" operator="Moov Togo" status="Operational" 00-99 616 - 01 bands="GSM 900 / GSM 1800" brand="Libercom" cc="bj" country="Benin" operator="Benin Telecoms Mobile" status="Operational" + 01 bands="GSM 900 / GSM 1800 / LTE 1800 / CDMA / WiMAX" brand="Libercom" cc="bj" country="Benin" operator="Benin Telecoms Mobile" status="Operational" 02 bands="GSM 900 / UMTS" brand="Moov" cc="bj" country="Benin" operator="Telecel Benin" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="MTN" cc="bj" country="Benin" operator="Spacetel Benin" status="Operational" 04 bands="GSM 900 / GSM 1800" brand="BBCOM" cc="bj" country="Benin" operator="Bell Benin Communications" status="Operational" @@ -2341,7 +2274,7 @@ 647 00 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Orange" cc="re" country="Réunion (France)" operator="Orange La Réunion" status="Operational" 01 bands="" cc="re" country="Réunion (France)" operator="BJT Partners" status="" - 02 bands="GSM 900 / GSM 1800" brand="Outremer" cc="re" country="Réunion (France)" operator="Outremer Telecom" status="Operational" + 02 bands="GSM 900 / GSM 1800" brand="only" cc="re" country="Réunion (France)" operator="Telco OI" status="Operational" 10 bands="GSM 900" brand="SFR Reunion" cc="re" country="Réunion (France)" operator="Societe Reunionnaise de Radiotelephone" status="Operational" 00-99 648 @@ -2354,6 +2287,7 @@ 02 bands="CDMA2000 800" brand="switch" cc="na" country="Namibia" operator="Telecom Namibia" status="Operational" 03 bands="GSM 900 / GSM 1800 / LTE 1800" brand="TN Mobile" cc="na" country="Namibia" operator="Telecom Namibia" status="Operational" 04 bands="WiMAX 2500" cc="na" country="Namibia" operator="Paratus Telecommunications (Pty)" status="Operational" + 05 bands="" cc="na" country="Namibia" operator="Demshi Investments CC" status="" 00-99 650 01 bands="GSM 900 / GSM 1800" brand="TNM" cc="mw" country="Malawi" operator="Telecom Network Malawi" status="Operational" @@ -2390,6 +2324,7 @@ 17 bands="" cc="za" country="South Africa" operator="Sishen Iron Ore Company (Ltd) Pty" status="" 19 bands="" brand="iBurst" cc="za" country="South Africa" operator="Wireless Business Solutions (Pty) Ltd" status="Operational" 21 bands="TETRA 410" cc="za" country="South Africa" operator="Cape Town Metropolitan Council" status="Operational" + 24 bands="" cc="za" country="South Africa" operator="SMS Portal (Pty) Ltd." status="" 25 bands="" cc="za" country="South Africa" operator="Wirels Connect" status="" 27 bands="" cc="za" country="South Africa" operator="A to Z Vaal Industrial Supplies Pty Ltd" status="" 30 bands="" cc="za" country="South Africa" operator="Bokamoso Consortium" status="Operational" @@ -2399,6 +2334,7 @@ 34 bands="" cc="za" country="South Africa" operator="Bokone Telecoms Pty Ltd" status="" 35 bands="" cc="za" country="South Africa" operator="Kingdom Communications Pty Ltd" status="" 36 bands="" cc="za" country="South Africa" operator="Amatole Telecommunications Pty Ltd" status="" + 38 bands="" brand="iBurst" cc="za" country="South Africa" operator="Wireless Business Solutions (Pty) Ltd" status="" 41 bands="" cc="za" country="South Africa" operator="South African Police Service" status="" 50 bands="" cc="za" country="South Africa" operator="Ericsson South Africa (Pty) Ltd" status="" 51 bands="" cc="za" country="South Africa" operator="Integrat (Pty) Ltd" status="" @@ -2410,10 +2346,10 @@ 01 bands="GSM" brand="Sure" cc="sh" country="Saint Helena, Ascension and Tristan da Cunha" operator="Sure South Atlantic Ltd." status="Operational" 00-99 659 - 02 bands="GSM 900/1800, UMTS 2100" brand="MTN" cc="ss" country="South Sudan" operator="MTN South Sudan" status="Operational" - 03 bands="GSM 900/1800" brand="Gemtel" cc="ss" country="South Sudan" operator="Gemtel" status="Operational" - 04 bands="GSM 900/1800" brand="Vivacell" cc="ss" country="South Sudan" operator="Network of the World (NOW)" status="Operational" - 06 bands="GSM 900/1800" brand="Zain" cc="ss" country="South Sudan" operator="Zain South Sudan" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="MTN" cc="ss" country="South Sudan" operator="MTN South Sudan" status="Operational" + 03 bands="GSM 900 / GSM 1800" brand="Gemtel" cc="ss" country="South Sudan" operator="Gemtel" status="Operational" + 04 bands="GSM 900 / GSM 1800" brand="Vivacell" cc="ss" country="South Sudan" operator="Network of the World (NOW)" status="Operational" + 06 bands="GSM 900 / GSM 1800" brand="Zain" cc="ss" country="South Sudan" operator="Zain South Sudan" status="Operational" 07 bands="CDMA" brand="Sudani" cc="ss" country="South Sudan" operator="Sudani" status="Operational" 00-99 702 @@ -2547,8 +2483,8 @@ 734 01 bands="GSM 900" brand="Digitel" cc="ve" country="Venezuela" operator="Corporacion Digitel C.A." status="Not operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / LTE 1800" brand="Digitel GSM" cc="ve" country="Venezuela" operator="Corporacion Digitel C.A." status="Operational" - 03 bands="GSM 900" brand="Digitel" cc="ve" country="Venezuela" operator="Corporacion Digitel C.A." status="Not operational" - 04 bands="GSM 850 / GSM 1900 / UMTS 1900" brand="movistar" cc="ve" country="Venezuela" operator="Telefónica Móviles Venezuela" status="Operational" + 03 bands="LTE 2600" brand="DirecTV" cc="ve" country="Venezuela" operator="Galaxy Entertainment de Venezuela C.A." status="" + 04 bands="GSM 850 / GSM 1900 / UMTS 1900 / LTE AWS" brand="movistar" cc="ve" country="Venezuela" operator="Telefónica Móviles Venezuela" status="Operational" 06 bands="CDMA2000 850 / GSM 850 / UMTS 1900" brand="Movilnet" cc="ve" country="Venezuela" operator="Telecomunicaciones Movilnet" status="Operational" 00-99 736 @@ -2559,11 +2495,13 @@ 738 01 bands="GSM 900" brand="Digicel" cc="gy" country="Guyana" operator="U-Mobile (Cellular) Inc." status="Operational" 02 bands="GSM 900" brand="GT&T Cellink Plus" cc="gy" country="Guyana" operator="Guyana Telephone & Telegraph Co." status="Operational" + 03 bands="TD-LTE" cc="gy" country="Guyana" operator="Quark Communications Inc." status="" + 05 bands="" cc="gy" country="Guyana" operator="eGovernment Unit, Ministry of the Presidency" status="" 00-99 740 00 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1900" brand="Movistar" cc="ec" country="Ecuador" operator="Otecel S.A." status="Operational" 01 bands="GSM 850 / UMTS 850 / UMTS 1900" brand="Claro" cc="ec" country="Ecuador" operator="CONECEL S.A." status="Operational" - 02 bands="GSM 850 / UMTS / LTE 1700" brand="CNT Mobile" cc="ec" country="Ecuador" operator="Corporación Nacional de Telecomunicaciones (CNT EP)" status="Operational" + 02 bands="GSM 850 / UMTS 1900 / LTE 1700" brand="CNT Mobile" cc="ec" country="Ecuador" operator="Corporación Nacional de Telecomunicaciones (CNT EP)" status="Operational" 00-99 744 01 bands="GSM 1900 / UMTS 900" brand="VOX" cc="py" country="Paraguay" operator="Hola Paraguay S.A" status="Operational" @@ -2590,7 +2528,7 @@ 001 bands="GSM 900" brand="sure" cc="fk" country="Falkland Islands (United Kingdom)" operator="Batelco" status="Operational" 000-999 901 - 01 bands="Satellite" brand="ICO" country="International operators" operator="ICO Satellite Management" status="Operational" + 01 bands="Satellite" brand="ICO" country="International operators" operator="ICO Satellite Management" status="Not operational" 02 bands="" country="International operators" operator="Unassigned" status="Returned spare" 03 bands="Satellite" brand="Iridium" country="International operators" status="Operational" 04 bands="Satellite" country="International operators" operator="Unassigned" status="Returned spare" @@ -2599,7 +2537,7 @@ 07 bands="" country="International operators" operator="Unassigned" status="Returned spare" 08 bands="" country="International operators" operator="Unassigned" status="Returned spare" 09 bands="" country="International operators" operator="Unassigned" status="Returned spare" - 10 bands="Satellite" brand="ACeS" country="International operators" status="Operational" + 10 bands="Satellite" brand="ACeS" country="International operators" status="Not operational" 11 bands="Satellite" brand="Inmarsat" country="International operators" status="Operational" 12 bands="GSM 1800" brand="Telenor" country="International operators" operator="Maritime Communications Partner AS (MCP)" status="Operational" 13 bands="GSM 1800" brand="GSM.AQ" country="International operators" operator="BebbiCell AG" status="Operational" @@ -2607,7 +2545,7 @@ 15 bands="GSM 1800" brand="OnAir" country="International operators" operator="OnAir Switzerland Sarl" status="Operational" 16 bands="" country="International operators" operator="Jasper Systems" status="Operational" 17 bands="GSM 1800" brand="Navitas" country="International operators" operator="JT Group Limited" status="Not operational" - 18 bands="GSM 900 / GSM 1900 / CDMA2000 1900" brand="Cellular @Sea" country="International operators" operator="AT&T Mobility" status="Operational" + 18 bands="GSM 900 / GSM 1900 / CDMA2000 1900 / UMTS 1900" brand="Cellular @Sea" country="International operators" operator="AT&T Mobility" status="Operational" 19 bands="GSM 900 / GSM 1800 / UMTS 2100" country="International operators" operator="Vodafone Malta Maritime" status="Operational" 20 bands="" country="International operators" operator="Intermatica" status="" 21 bands="GSM 1800" country="International operators" operator="Wins Limited" status="Operational" @@ -2637,5 +2575,9 @@ 45 bands="" country="International operators" operator="Advanced Wireless Network Company Limited" status="" 46 bands="MVNO" country="International operators" operator="Telecom26 AG" status="Operational" 47 bands="" country="International operators" operator="Ooredoo" status="" + 48 bands="" country="International operators" operator="Communication for Devices in Sweden AB" status="" + 49 bands="" country="International operators" operator="Zain Kuwait" status="" + 50 bands="Satellite" country="International operators" operator="EchoStar Mobile" status="" + 51 bands="" country="International operators" operator="VisionNG" status="" 88 bands="" country="International operators" operator="UN Office for the Coordination of Humanitarian Affairs (OCHA)" status="" 00-99 diff --git a/stdnum/isbn.dat b/stdnum/isbn.dat index 7bd86c46..103e27a9 100644 --- a/stdnum/isbn.dat +++ b/stdnum/isbn.dat @@ -1,7 +1,7 @@ # generated from RangeMessage.xml, downloaded from # https://www.isbn-international.org/export_rangemessage.xml -# file serial e055fb55-2661-4102-a6dc-6885d2dab806 -# file date Thu, 3 Sep 2015 12:56:52 CEST +# file serial 91da4d76-b504-4412-94e1-741f2d6bbbe8 +# file date Wed, 2 Mar 2016 17:53:37 CET 978 0-5,600-649,7-7,80-94,950-989,9900-9989,99900-99999 0 agency="English language" @@ -28,8 +28,8 @@ 00-19,200-699,7000-7999,80000-84999,85-99 602 agency="Indonesia" 00-07,0800-0899,0900-1099,1100-1199,1200-1399,14000-14999,1500-1699 - 17000-17999,18000-18999,19000-19999,200-674,6750-6999,70000-74999 - 7500-7999,8000-9499,95000-99999 + 17000-17999,18000-18999,19000-19999,200-619,6200-6749,6750-6999 + 70000-74999,7500-7999,8000-9499,95000-99999 603 agency="Saudi Arabia" 00-04,05-49,500-799,8000-8999,90000-99999 604 agency="Vietnam" @@ -37,7 +37,7 @@ 605 agency="Turkey" 01-02,030-039,04-09,100-399,4000-5999,60000-89999,9000-9999 606 agency="Romania" - 0-0,10-49,500-799,8000-9199,92000-99999 + 0-0,10-49,500-799,8000-9099,910-919,92000-97499,975-999 607 agency="Mexico" 00-39,400-749,7500-9499,95000-99999 608 agency="Macedonia" @@ -112,8 +112,8 @@ 954 agency="Bulgaria" 00-28,2900-2999,300-799,8000-8999,90000-92999,9300-9999 955 agency="Sri Lanka" - 0000-1999,20-40,41000-43999,44000-44999,4500-4999,50000-54999,550-749 - 7500-7999,8000-9499,95000-99999 + 0000-1999,20-38,3900-4099,41000-43999,44000-44999,4500-4999,50000-54999 + 550-749,7500-7999,8000-9499,95000-99999 956 agency="Chile" 00-19,200-699,7000-9999 957 agency="Taiwan" @@ -140,8 +140,8 @@ 00-12,130-139,14-14,1500-1699,170-199,2000-2789,279-289,2900-2999 300-699,7000-8999,90000-90999,910-949,95000-97999,980-999 967 agency="Malaysia" - 00-00,0100-0999,10000-19999,300-499,5000-5999,60-89,900-989,9900-9989 - 99900-99999 + 00-00,0100-0999,10000-19999,2000-2499,300-499,5000-5999,60-89,900-989 + 9900-9989,99900-99999 968 agency="Mexico" 01-39,400-499,5000-7999,800-899,9000-9999 969 agency="Pakistan" diff --git a/stdnum/isil.dat b/stdnum/isil.dat index f507d5e0..79859301 100644 --- a/stdnum/isil.dat +++ b/stdnum/isil.dat @@ -28,7 +28,7 @@ NZ$ country="New Zealand" ra_url="http://natlib.govt.nz/" ra="National Library o QA$ country="Qatar" ra_url="http://www.qnl.qa/" ra="Qatar National Library (QNL)" RU$ country="Russian Federation" ra_url="http://english.gpntb.ru/" ra="Russian National Public Library for Science and Technology" SI$ country="The Republic of Slovenia" ra_url="http://www.nuk.uni-lj.si/nukeng3.asp?id=311364382" ra="National and University Library" -SK$ country="Slovak Republic" ra_url="http://www.snk.sk" ra="Slovak National Library" +SK$ country="Slovak Republic" ra_url="http://www.snk.sk/en/information-for/libraries-and-librarians/isil.html" ra="Slovak National Library" O$ ra="See OCLC" OCLC$ country="WorldCat Symbol" ra_url="http://www.oclc.org" ra="OCLC" ZDB$ country="Staatsbibliothek zu Berlin - Zeitschriftendatenbank" ra="Staatsbibliothek zu Berlin" From 41cecb5f2714d75a09e35385fd45b15fb8a03d29 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 5 Mar 2016 23:42:43 +0100 Subject: [PATCH 005/572] Get files ready for 1.3 release --- ChangeLog | 59 ++++++++++++++++++++++++++++++++++++++++++++++ NEWS | 9 +++++++ getnumlist.py | 4 ++-- setup.py | 2 +- stdnum/__init__.py | 4 ++-- 5 files changed, 73 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9307465d..a78944c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,62 @@ +2016-03-03 Arthur de Jong + + * [6457734] getcnloc.py, getiban.py, stdnum/cn/loc.dat, + stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: + Update database files + + This also updates the getcnloc and getiban scripts to use new URLs. + +2015-10-30 Arthur de Jong + + * [0061564] stdnum/dk/cpr.py, stdnum/iban.py, stdnum/imei.py, + stdnum/isbn.py, stdnum/isil.py, stdnum/issn.py, stdnum/nl/bsn.py, + stdnum/us/ssn.py, stdnum/verhoeff.py: Integrate information from + the wiki + + This adds the information that was previously in the Trac wiki + into the source docstrings because the Trac instance is being + phased out. + + This also includes small updates to the ISIL module. + +2015-10-28 Arthur de Jong + + * [96c8151] stdnum/eu/vat.py: Fix SOAP client re-use + + This fixes a bug when checking re-use of the global SOAP client + object. The object could not be evaluated in boolean context + so is no explicitly compared to None. For suds a MethodNotFound + exception would be raised for __nonzero__() (which Python uses + for boolean comparison). + +2015-10-28 Lionel Elie Mamane + + * [2881b86] stdnum/eu/vat.py: Fix problem with check_vies_approx() + +2015-10-15 Ronald Paloschi + + * [fb0efe0] stdnum/iso6346.py, tests/test_iso6346.doctest: Fix + for when ISO 6346 checksum is 10 + + Bug fix for when the checksum is 10, it was compared to 0 and + failed. New doctest exposing the bug that passes after the fix + is applied. + + See: https://github.com/arthurdejong/python-stdnum/pull/30 + +2015-10-11 Arthur de Jong + + * [1361817] ChangeLog, MANIFEST.in, NEWS, README, docs/index.rst, + docs/stdnum.at.businessid.rst, docs/stdnum.br.cnpj.rst, + docs/stdnum.ch.uid.rst, docs/stdnum.ch.vat.rst, + docs/stdnum.cusip.rst, docs/stdnum.de.wkn.rst, + docs/stdnum.ee.ik.rst, docs/stdnum.fi.associationid.rst, + docs/stdnum.fi.ytunnus.rst, docs/stdnum.gb.sedol.rst, + docs/stdnum.imo.rst, docs/stdnum.isin.rst, docs/stdnum.mx.rfc.rst, + docs/stdnum.pl.pesel.rst, docs/stdnum.pl.regon.rst, + docs/stdnum.ru.inn.rst, setup.py, stdnum/__init__.py: Get files + ready for 1.2 release + 2015-10-11 Arthur de Jong * [1327045] getcnloc.py, stdnum/cn/loc.dat, stdnum/iban.dat, diff --git a/NEWS b/NEWS index f40fdee6..50e94c4a 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,12 @@ +changes from 1.2 to 1.3 +----------------------- + +* fix ISO 6346 check digit calculation (thanks Ronald Paloschi) +* fix problem with check_vies_approx() (thanks Lionel Elie Mamane) +* fix problem with SOAP client when using suds +* include documentation that was previously on the Trac wiki + + changes from 1.1 to 1.2 ----------------------- diff --git a/getnumlist.py b/getnumlist.py index 97c91bcf..4c74479d 100755 --- a/getnumlist.py +++ b/getnumlist.py @@ -2,7 +2,7 @@ # getnumlist.py - script to get a list of number formats in stdnum # -# Copyright (C) 2012, 2013 Arthur de Jong +# Copyright (C) 2012-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -57,7 +57,7 @@ def get_number_modules(): for module in get_number_modules(): print ' %s' % module.__name__.replace('stdnum.', '') print '' - print 'For index.xml:' + print 'For formats.xml:' print '' for module in get_number_modules(): print '
  • %s
  • ' % util.get_module_name(module) diff --git a/setup.py b/setup.py index 2562691f..d91a7a93 100755 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ # setup.py - python-stdnum installation script # -# Copyright (C) 2010-2015 Arthur de Jong +# Copyright (C) 2010-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/stdnum/__init__.py b/stdnum/__init__.py index 78c033dd..8da7c353 100644 --- a/stdnum/__init__.py +++ b/stdnum/__init__.py @@ -1,7 +1,7 @@ # __init__.py - main module # coding: utf-8 # -# Copyright (C) 2010-2015 Arthur de Jong +# Copyright (C) 2010-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -153,4 +153,4 @@ # the version number of the library -__version__ = '1.2' +__version__ = '1.3' From 095dcbb11f6fc9f5ddee90c27b4d466c4a75a7ed Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Fri, 1 Apr 2016 22:06:17 +0200 Subject: [PATCH 006/572] Document accuracy of RFC check digit test There is an online service that allows validating RFC numbers. It seems there are a lot of numbers that do not match the check digit algorithm which confirms disabling the check digit test by default is a good idea. Also see https://github.com/arthurdejong/python-stdnum/issues/32 --- stdnum/mx/rfc.py | 8 ++++++-- tests/test_mx_rfc.doctest | 9 +++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/stdnum/mx/rfc.py b/stdnum/mx/rfc.py index 72084e6c..2e47238d 100644 --- a/stdnum/mx/rfc.py +++ b/stdnum/mx/rfc.py @@ -31,13 +31,17 @@ The first two check digits are calculated based on the person's or company's full name. The last check digit is calculated over all the preceding digits -in the number. However, it seems a lot of numbers are in use with invalid -check digits so this test is disabled by default. +in the number. However, it seems a lot of numbers (estimated at around 1.5% +of all numbers) are in use with invalid check digits so this test is disabled +by default. More information can be found at: http://www.sisi.org.mx/jspsi/documentos/2005/seguimiento/06101/0610100162005_065.doc https://es.wikipedia.org/wiki/Registro_Federal_de_Contribuyentes_(M%C3%A9xico) +An online validation service is available at: + https://portalsat.plataforma.sat.gob.mx/ConsultaRFC/ + >>> validate('GODE 561231 GR8') # personal number 'GODE561231GR8' >>> validate('MAB-930714-8T4') # company number diff --git a/tests/test_mx_rfc.doctest b/tests/test_mx_rfc.doctest index 57cb54b0..2d5e2f30 100644 --- a/tests/test_mx_rfc.doctest +++ b/tests/test_mx_rfc.doctest @@ -416,7 +416,9 @@ numbers all have valid check digits (also see the list below). The following numbers were also found online, and while they appear to be in use and referencing existing persons or organisations, the check digit does -not validate. +not validate. All of these have been checked to be valid on +https://portalsat.plataforma.sat.gob.mx/ConsultaRFC/ +(note that this website expects ISO-8859-1 encoded numbers) >>> numbers = ''' ... @@ -461,7 +463,6 @@ not validate. ... EQU810430193 ... FAE8509042W7 ... FIS0008226ZA -... FISL7809158A0 ... FME9305279N0 ... FSA080813655 ... FSI900505I74 @@ -484,12 +485,10 @@ not validate. ... LMI0811119C5 ... LOCB6410225K0 ... LOMM8110052J4 -... MAEE620525S14 ... MALC721019EV6 ... MDI931014D37 ... MFA840320DX0 ... MGR070820G78 -... MOJO6101239H7 ... MPT000824LH7 ... MSA850111TE1 ... NIÑ7409256U1 @@ -499,7 +498,6 @@ not validate. ... OMD100907CJ4 ... OPP010927SA5 ... OTM090818KS6 -... PAC8608084O8 ... PEJE480914ES9 ... PERL640914HY9 ... PPA100118E37 @@ -523,7 +521,6 @@ not validate. ... TPT890516JP5 ... VAME720111AA4 ... WME000218GK3 -... YLO031113IP4 ... YME9610251W6 ... ... ''' From 619b097dfe1a549808f2ae6c0072cd6006107052 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 9 Apr 2016 20:14:09 +0200 Subject: [PATCH 007/572] Add Turkish personal identification number --- stdnum/tr/__init__.py | 0 stdnum/tr/tckimlik.py | 85 ++++++++++++ tests/test_tr_tckimlik.doctest | 234 +++++++++++++++++++++++++++++++++ 3 files changed, 319 insertions(+) create mode 100644 stdnum/tr/__init__.py create mode 100644 stdnum/tr/tckimlik.py create mode 100644 tests/test_tr_tckimlik.doctest diff --git a/stdnum/tr/__init__.py b/stdnum/tr/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/stdnum/tr/tckimlik.py b/stdnum/tr/tckimlik.py new file mode 100644 index 00000000..940024a6 --- /dev/null +++ b/stdnum/tr/tckimlik.py @@ -0,0 +1,85 @@ +# tckimlik.py - functions for handling T.C. Kimlik No. +# coding: utf-8 +# +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""T.C. Kimlik No. (Turkish personal identification number) + +The Turkish Identification Number (Türkiye Cumhuriyeti Kimlik Numarası) is a +unique personal identification number assigned to every citizen of Turkey. +The number consists of 11 digits and the last two digits are check digits. + +More information can be found at: + https://en.wikipedia.org/wiki/Turkish_Identification_Number + https://tckimlik.nvi.gov.tr/ + +>>> validate('17291716060') +'17291716060' +>>> validate('17291716050') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> validate('1729171606') +Traceback (most recent call last): + ... +InvalidLength: ... +>>> validate('07291716092') # number must not start with a 0 +Traceback (most recent call last): + ... +InvalidFormat: ... +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number).strip() + + +def calc_check_digits(number): + """Calculate the check digits for the specified number. The number + passed should not have the check digit included.""" + check1 = (10 - sum((3 - 2 * (i % 2)) * int(n) + for i, n in enumerate(number[:9]))) % 10 + check2 = (check1 + sum(int(n) for n in number[:9])) % 10 + return '%d%d' % (check1, check2) + + +def validate(number): + """Checks to see if the number provided is a valid .C. Kimlik No.. + This checks the length and check digits""" + number = compact(number) + if not number.isdigit() or number[0] == '0': + raise InvalidFormat() + if len(number) != 11: + raise InvalidLength() + if calc_check_digits(number) != number[-2:]: + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid .C. Kimlik No.. + This checks the length and check digits""" + try: + return bool(validate(number)) + except ValidationError: + return False diff --git a/tests/test_tr_tckimlik.doctest b/tests/test_tr_tckimlik.doctest new file mode 100644 index 00000000..c3cb4a2a --- /dev/null +++ b/tests/test_tr_tckimlik.doctest @@ -0,0 +1,234 @@ +test_tr_tckimlik.doctest - more detailed doctests for stdnum.tr.tckimlik + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.tr.tckimlik +module. + +>>> from stdnum.tr import tckimlik + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 10010405214 +... 10036951702 +... 10048987300 +... 10211782428 +... 10328097460 +... 10406257588 +... 10634889650 +... 10942702016 +... 10945940248 +... 10964454474 +... 11015620602 +... 11051965132 +... 11272211322 +... 11510943206 +... 11521565534 +... 11629545766 +... 11678091474 +... 11678588622 +... 11856036426 +... 12245687724 +... 12254905536 +... 12281024156 +... 12629254764 +... 12668958814 +... 12691048056 +... 12743195844 +... 12790164022 +... 12797231260 +... 13159065448 +... 13195732540 +... 13267669224 +... 13331822036 +... 13466947000 +... 13481622074 +... 13649294334 +... 13684258322 +... 13700315886 +... 13789534246 +... 13796225410 +... 14693160156 +... 14834750260 +... 14953629638 +... 15038532782 +... 15076154212 +... 16130649606 +... 16168925222 +... 16412902252 +... 16834076296 +... 16910960518 +... 17311901384 +... 17690240920 +... 18164076700 +... 18535119968 +... 18563796476 +... 18737290298 +... 18766481124 +... 18986317036 +... 19261708150 +... 19304490066 +... 19315991200 +... 19594888024 +... 19649559862 +... 19736210324 +... 19946754342 +... 20923453974 +... 21289134606 +... 22508375282 +... 22514314664 +... 22645425550 +... 22850263862 +... 23128444884 +... 23761367960 +... 23776369980 +... 23803533490 +... 23812308782 +... 23893394292 +... 23945549168 +... 24118906764 +... 24721853608 +... 25171067942 +... 25175346104 +... 25262304970 +... 26465047138 +... 26912437970 +... 27085445038 +... 27352676660 +... 27806346354 +... 27977266680 +... 28040246264 +... 28196469500 +... 28423494398 +... 29008505256 +... 29449926498 +... 29458830458 +... 29660083116 +... 29663288082 +... 29717351038 +... 30229834674 +... 30517382986 +... 30547067204 +... 30713063856 +... 30841564102 +... 31177269242 +... 31261062360 +... 31378085252 +... 31666319410 +... 31972018304 +... 32080659878 +... 32191139436 +... 32276435798 +... 32362147840 +... 32383033566 +... 32806023532 +... 32986865670 +... 33163817956 +... 33370005450 +... 33632324534 +... 33869149092 +... 34399824114 +... 34411781920 +... 34837267190 +... 35209878136 +... 35389844082 +... 35467790720 +... 35740345494 +... 35927206914 +... 35944794678 +... 36412601542 +... 36799571254 +... 37474709214 +... 37561226518 +... 37708357112 +... 37987046004 +... 38065982832 +... 38312029198 +... 38491580480 +... 38818946524 +... 39346988482 +... 39433505530 +... 39488099268 +... 39556079970 +... 39872148282 +... 40285129270 +... 40429332580 +... 41116624858 +... 41314615566 +... 41537123152 +... 41740577612 +... 42529353182 +... 42568749892 +... 42679341534 +... 43198351554 +... 43282542684 +... 43609945662 +... 43846057142 +... 43879752656 +... 44815212906 +... 45358790944 +... 45577460604 +... 46162064740 +... 46186184424 +... 46786024366 +... 47248345760 +... 47353662028 +... 48064083294 +... 48637402194 +... 48637792714 +... 48883810224 +... 49432850678 +... 49636373966 +... 49879800274 +... 50035230828 +... 50479247086 +... 51508004946 +... 51532505860 +... 51865395732 +... 53320726198 +... 53728014842 +... 54439040694 +... 54508382038 +... 54541189670 +... 54781681538 +... 55996400266 +... 56698147152 +... 57025178016 +... 57061155224 +... 59020072634 +... 59464150004 +... 59599009130 +... 59605521564 +... 61579176350 +... 61957262828 +... 62077362474 +... 62224350880 +... 62512131214 +... 63352195206 +... 64756048358 +... 68536141048 +... 69844021374 +... 71467095762 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not tckimlik.is_valid(x)] +[] From feab9177256f77da9413a397016691fad177be79 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 9 Apr 2016 21:51:47 +0200 Subject: [PATCH 008/572] Implement online TC Kimlik check This refactors out the SOAP client function that was implemented for VIES to the stdnum.utils module. --- stdnum/eu/vat.py | 15 ++------------- stdnum/tr/tckimlik.py | 34 +++++++++++++++++++++++++++++++++- stdnum/util.py | 20 +++++++++++++++++++- 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/stdnum/eu/vat.py b/stdnum/eu/vat.py index 2c6728ec..88d97efb 100644 --- a/stdnum/eu/vat.py +++ b/stdnum/eu/vat.py @@ -40,7 +40,7 @@ """ from stdnum.exceptions import * -from stdnum.util import clean, get_vat_module +from stdnum.util import clean, get_vat_module, get_soap_client country_codes = set([ @@ -118,18 +118,7 @@ def _get_client(): # pragma: no cover (no tests for this function) # it are not automatically tested global _vies_client if _vies_client is None: - try: - from urllib import getproxies - except ImportError: - from urllib.request import getproxies - # try suds first - try: - from suds.client import Client - _vies_client = Client(vies_wsdl, proxy=getproxies()).service - except ImportError: - # fall back to using pysimplesoap - from pysimplesoap.client import SoapClient - _vies_client = SoapClient(wsdl=vies_wsdl, proxy=getproxies()) + _vies_client = get_soap_client(vies_wsdl) return _vies_client diff --git a/stdnum/tr/tckimlik.py b/stdnum/tr/tckimlik.py index 940024a6..a465cf32 100644 --- a/stdnum/tr/tckimlik.py +++ b/stdnum/tr/tckimlik.py @@ -45,7 +45,15 @@ """ from stdnum.exceptions import * -from stdnum.util import clean +from stdnum.util import clean, get_soap_client + + +tckimlik_wsdl = 'https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL' +"""The WSDL URL of the T.C. Kimlik validation service.""" + + +# a cached version of the SOAP client for Kimlik validation +_tckimlik_client = None def compact(number): @@ -83,3 +91,27 @@ def is_valid(number): return bool(validate(number)) except ValidationError: return False + + +def _get_client(): # pragma: no cover (no tests for this function) + """Get a SOAP client for performing T.C. Kimlik validation.""" + # this function isn't automatically tested because the functions using + # it are not automatically tested + global _tckimlik_client + if _tckimlik_client is None: + _tckimlik_client = get_soap_client(tckimlik_wsdl) + return _tckimlik_client + + +def check_kps(number, name, surname, birth_year): # pragma: no cover + """Queries the online T.C. Kimlik validation service run by the + Directorate of Population and Citizenship Affairs. This returns a boolean + but may raise a SOAP exception for missing or invalid values.""" + # this function isn't automatically tested because it would require + # network access for the tests and unnecessarily load the online service + number = compact(number) + result = _get_client().TCKimlikNoDogrula( + TCKimlikNo=number, Ad=name, Soyad=surname, DogumYili=birth_year) + if hasattr(result, 'get'): + return result.get('TCKimlikNoDogrulaResult') + return result diff --git a/stdnum/util.py b/stdnum/util.py index efaa5ca2..266b2927 100644 --- a/stdnum/util.py +++ b/stdnum/util.py @@ -1,7 +1,7 @@ # util.py - common utility functions # coding: utf-8 # -# Copyright (C) 2012, 2013, 2015 Arthur de Jong +# Copyright (C) 2012-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -178,3 +178,21 @@ def get_vat_module(cc): cc = cc.lower() cc = _cc_translations.get(cc, cc) return __import__('stdnum.%s' % cc, globals(), locals(), ['vat']).vat + + +def get_soap_client(wsdlurl): # pragma: no cover (no tests for this function) + """Get a SOAP client for performing requests.""" + # this function isn't automatically tested because the functions using + # it are not automatically tested + try: + from urllib import getproxies + except ImportError: + from urllib.request import getproxies + # try suds first + try: + from suds.client import Client + return Client(wsdlurl, proxy=getproxies()).service + except ImportError: + # fall back to using pysimplesoap + from pysimplesoap.client import SoapClient + return SoapClient(wsdl=wsdlurl, proxy=getproxies()) From e28b5e10acc6050f016c1171c35b10354927a8b2 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 11 Apr 2016 22:58:17 +0200 Subject: [PATCH 009/572] Make more information links consistent Also fix a docstring in stdnum.nl.bsn and add a pointer to stdnum.nl.onderwijsnummer. --- stdnum/ch/uid.py | 7 ++++--- stdnum/ch/vat.py | 7 ++++--- stdnum/cusip.py | 5 +++-- stdnum/dk/cpr.py | 7 ++++--- stdnum/iban.py | 5 +++-- stdnum/imei.py | 3 ++- stdnum/isbn.py | 5 +++-- stdnum/isil.py | 7 ++++--- stdnum/isin.py | 3 ++- stdnum/issn.py | 5 +++-- stdnum/mx/rfc.py | 10 ++++++---- stdnum/nl/bsn.py | 9 +++++---- stdnum/nl/onderwijsnummer.py | 4 ++++ stdnum/pl/regon.py | 9 +++++---- stdnum/tr/tckimlik.py | 7 ++++--- stdnum/us/ssn.py | 7 ++++--- stdnum/verhoeff.py | 5 +++-- 17 files changed, 63 insertions(+), 42 deletions(-) diff --git a/stdnum/ch/uid.py b/stdnum/ch/uid.py index 6622f50b..62800bc1 100644 --- a/stdnum/ch/uid.py +++ b/stdnum/ch/uid.py @@ -27,9 +27,10 @@ This module only supports the "new" format that was introduced in 2011 which completely replaced the "old" 6-digit format in 2014. -More information is available at: - https://www.uid.admin.ch/ - https://de.wikipedia.org/wiki/Unternehmens-Identifikationsnummer +More information: + +* https://www.uid.admin.ch/ +* https://de.wikipedia.org/wiki/Unternehmens-Identifikationsnummer >>> validate('CHE-100.155.212') 'CHE100155212' diff --git a/stdnum/ch/vat.py b/stdnum/ch/vat.py index a61c49e2..6e32ea72 100644 --- a/stdnum/ch/vat.py +++ b/stdnum/ch/vat.py @@ -28,9 +28,10 @@ This module only supports the "new" format that was introduced in 2011 which completely replaced the "old" 6-digit format in 2014. -More information is available at: - https://www.ch.ch/en/value-added-tax-number-und-business-identification-number/ - https://www.uid.admin.ch/ +More information: + +* https://www.ch.ch/en/value-added-tax-number-und-business-identification-number/ +* https://www.uid.admin.ch/ >>> validate('CHE-107.787.577 IVA') 'CHE107787577IVA' diff --git a/stdnum/cusip.py b/stdnum/cusip.py index acd27d1a..f6858802 100644 --- a/stdnum/cusip.py +++ b/stdnum/cusip.py @@ -25,8 +25,9 @@ followed by two digits that identify and a check digit. More information: - https://en.wikipedia.org/wiki/CUSIP - https://www.cusip.com/ + +* https://en.wikipedia.org/wiki/CUSIP +* https://www.cusip.com/ >>> validate('DUS0421C5') 'DUS0421C5' diff --git a/stdnum/dk/cpr.py b/stdnum/dk/cpr.py index bdbbbb95..2566c641 100644 --- a/stdnum/dk/cpr.py +++ b/stdnum/dk/cpr.py @@ -31,9 +31,10 @@ numbers are also assigned to immigrants. More information: - https://en.wikipedia.org/wiki/Personal_identification_number_(Denmark) - https://da.wikipedia.org/wiki/CPR-nummer - https://cpr.dk/ + +* https://en.wikipedia.org/wiki/Personal_identification_number_(Denmark) +* https://da.wikipedia.org/wiki/CPR-nummer +* https://cpr.dk/ >>> validate('211062-5629') '2110625629' diff --git a/stdnum/iban.py b/stdnum/iban.py index ff33cddc..ae01a02d 100644 --- a/stdnum/iban.py +++ b/stdnum/iban.py @@ -28,8 +28,9 @@ this is currently not checked by this number. More information: - https://en.wikipedia.org/wiki/International_Bank_Account_Number - https://www.swift.com/products_services/bic_and_iban_format_registration_iban_format_r + +* https://en.wikipedia.org/wiki/International_Bank_Account_Number +* https://www.swift.com/products_services/bic_and_iban_format_registration_iban_format_r >>> validate('GR16 0110 1050 0000 1054 7023 795') 'GR1601101050000010547023795' diff --git a/stdnum/imei.py b/stdnum/imei.py index 8c0c1a0f..f0300713 100644 --- a/stdnum/imei.py +++ b/stdnum/imei.py @@ -25,7 +25,8 @@ validated using the Luhn algorithm. More information: - https://en.wikipedia.org/wiki/International_Mobile_Equipment_Identity + +* https://en.wikipedia.org/wiki/International_Mobile_Equipment_Identity >>> validate('35686800-004141-20') '3568680000414120' diff --git a/stdnum/isbn.py b/stdnum/isbn.py index 6b9233b5..b511c4c8 100644 --- a/stdnum/isbn.py +++ b/stdnum/isbn.py @@ -31,8 +31,9 @@ * a check digit More information: - https://en.wikipedia.org/wiki/International_Standard_Book_Number - https://www.isbn-international.org/range_file_generation + +* https://en.wikipedia.org/wiki/International_Standard_Book_Number +* https://www.isbn-international.org/range_file_generation This module also offers functions for converting to ISBN-13 and formatting based on how the number should be split into a bookland code, group diff --git a/stdnum/isil.py b/stdnum/isil.py index 219e89ee..30dea53d 100644 --- a/stdnum/isil.py +++ b/stdnum/isil.py @@ -38,9 +38,10 @@ web services for validation) but there is no common format to these services. More information: - https://en.wikipedia.org/wiki/ISBT_128 - http://biblstandard.dk/isil/ - http://www.iso.org/iso/catalogue_detail?csnumber=57332 + +* https://en.wikipedia.org/wiki/ISBT_128 +* http://biblstandard.dk/isil/ +* http://www.iso.org/iso/catalogue_detail?csnumber=57332 >>> validate('IT-RM0267') 'IT-RM0267' diff --git a/stdnum/isin.py b/stdnum/isin.py index c6e93d53..135326ae 100644 --- a/stdnum/isin.py +++ b/stdnum/isin.py @@ -28,7 +28,8 @@ security identifier part (e.g. when it is a CUSIP). More information: - https://en.wikipedia.org/wiki/International_Securities_Identification_Number + +* https://en.wikipedia.org/wiki/International_Securities_Identification_Number >>> validate('US0378331005') 'US0378331005' diff --git a/stdnum/issn.py b/stdnum/issn.py index 8be1f2cc..4fa113d0 100644 --- a/stdnum/issn.py +++ b/stdnum/issn.py @@ -27,8 +27,9 @@ ISBN-10). More information: - https://en.wikipedia.org/wiki/International_Standard_Serial_Number - http://www.issn.org/ + +* https://en.wikipedia.org/wiki/International_Standard_Serial_Number +* http://www.issn.org/ >>> validate('0024-9319') '00249319' diff --git a/stdnum/mx/rfc.py b/stdnum/mx/rfc.py index 2e47238d..10da251a 100644 --- a/stdnum/mx/rfc.py +++ b/stdnum/mx/rfc.py @@ -35,12 +35,14 @@ of all numbers) are in use with invalid check digits so this test is disabled by default. -More information can be found at: - http://www.sisi.org.mx/jspsi/documentos/2005/seguimiento/06101/0610100162005_065.doc - https://es.wikipedia.org/wiki/Registro_Federal_de_Contribuyentes_(M%C3%A9xico) +More information: + +* http://www.sisi.org.mx/jspsi/documentos/2005/seguimiento/06101/0610100162005_065.doc +* https://es.wikipedia.org/wiki/Registro_Federal_de_Contribuyentes_(M%C3%A9xico) An online validation service is available at: - https://portalsat.plataforma.sat.gob.mx/ConsultaRFC/ + +* https://portalsat.plataforma.sat.gob.mx/ConsultaRFC/ >>> validate('GODE 561231 GR8') # personal number 'GODE561231GR8' diff --git a/stdnum/nl/bsn.py b/stdnum/nl/bsn.py index 280cc9bd..c9e6f570 100644 --- a/stdnum/nl/bsn.py +++ b/stdnum/nl/bsn.py @@ -24,9 +24,10 @@ leading 0's are commonly left out) and contains a simple checksum. More information: - https://en.wikipedia.org/wiki/National_identification_number#Netherlands - https://nl.wikipedia.org/wiki/Burgerservicenummer - http://www.burgerservicenummer.nl/ + +* https://en.wikipedia.org/wiki/National_identification_number#Netherlands +* https://nl.wikipedia.org/wiki/Burgerservicenummer +* http://www.burgerservicenummer.nl/ >>> validate('1112.22.333') '111222333' @@ -56,7 +57,7 @@ def compact(number): def checksum(number): """Calculate the checksum over the number. A valid number should have - a check digit of 0.""" + a checksum of 0.""" return (sum((9 - i) * int(n) for i, n in enumerate(number[:-1])) - int(number[-1])) % 11 diff --git a/stdnum/nl/onderwijsnummer.py b/stdnum/nl/onderwijsnummer.py index 0fbb3fc3..b8d32c47 100644 --- a/stdnum/nl/onderwijsnummer.py +++ b/stdnum/nl/onderwijsnummer.py @@ -23,6 +23,10 @@ national identification number) for students without a BSN. It uses a checksum mechanism similar to the BSN. +More information: + +* https://nl.wikipedia.org/wiki/Onderwijsnummer + >>> validate('1012.22.331') '101222331' >>> validate('100252333') diff --git a/stdnum/pl/regon.py b/stdnum/pl/regon.py index ac8cffbe..82af03a8 100644 --- a/stdnum/pl/regon.py +++ b/stdnum/pl/regon.py @@ -25,10 +25,11 @@ number for businesses. National entities are assigned a 9-digit number, while local units append 5 digits to form a 14-digit number. -More information can be found at: - http://bip.stat.gov.pl/en/regon/ - http://www.stat.gov.pl/bip/regon_ENG_HTML.htm - https://wyszukiwarkaregon.stat.gov.pl/appBIR/index.aspx +More information: + +* http://bip.stat.gov.pl/en/regon/ +* http://www.stat.gov.pl/bip/regon_ENG_HTML.htm +* https://wyszukiwarkaregon.stat.gov.pl/appBIR/index.aspx >>> validate('192598184') '192598184' diff --git a/stdnum/tr/tckimlik.py b/stdnum/tr/tckimlik.py index a465cf32..4083229f 100644 --- a/stdnum/tr/tckimlik.py +++ b/stdnum/tr/tckimlik.py @@ -24,9 +24,10 @@ unique personal identification number assigned to every citizen of Turkey. The number consists of 11 digits and the last two digits are check digits. -More information can be found at: - https://en.wikipedia.org/wiki/Turkish_Identification_Number - https://tckimlik.nvi.gov.tr/ +More information: + +* https://en.wikipedia.org/wiki/Turkish_Identification_Number +* https://tckimlik.nvi.gov.tr/ >>> validate('17291716060') '17291716060' diff --git a/stdnum/us/ssn.py b/stdnum/us/ssn.py index d4058bf6..d08bd9af 100644 --- a/stdnum/us/ssn.py +++ b/stdnum/us/ssn.py @@ -35,9 +35,10 @@ Death Master File which can be ordered on DVD. More information: - https://en.wikipedia.org/wiki/Social_Security_number - https://www.ssa.gov/employer/verifySSN.htm - https://en.wikipedia.org/wiki/Death_Master_File + +* https://en.wikipedia.org/wiki/Social_Security_number +* https://www.ssa.gov/employer/verifySSN.htm +* https://en.wikipedia.org/wiki/Death_Master_File >>> validate('536-90-4399') '536904399' diff --git a/stdnum/verhoeff.py b/stdnum/verhoeff.py index 5d6fb150..02559d3f 100644 --- a/stdnum/verhoeff.py +++ b/stdnum/verhoeff.py @@ -24,8 +24,9 @@ and multiplications and as a result is more complex than the Luhn algorithm. More information: - https://en.wikipedia.org/wiki/Verhoeff_algorithm - https://en.wikibooks.org/wiki/Algorithm_Implementation/Checksums/Verhoeff_Algorithm + +* https://en.wikipedia.org/wiki/Verhoeff_algorithm +* https://en.wikibooks.org/wiki/Algorithm_Implementation/Checksums/Verhoeff_Algorithm The module provides the checksum() function to calculate the Verhoeff checksum a calc_check_digit() function to generate a check digit that can be From 21269472475774e94faf6dea72cc3fcc700d69b8 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 9 May 2016 19:39:18 +0200 Subject: [PATCH 010/572] Read numdb files in context manager This ensures that the file is explicitly closed in the function to avoid "unclosed file" warnings. See: https://github.com/arthurdejong/python-stdnum/issues/33 --- stdnum/numdb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdnum/numdb.py b/stdnum/numdb.py index 0a2e1550..c8cbc3c3 100644 --- a/stdnum/numdb.py +++ b/stdnum/numdb.py @@ -199,6 +199,6 @@ def get(name): if name not in _open_databases: import codecs reader = codecs.getreader('utf-8') - db = read(reader(resource_stream(__name__, name + '.dat'))) - _open_databases[name] = db + with reader(resource_stream(__name__, name + '.dat')) as fp: + _open_databases[name] = db = read(fp) return _open_databases[name] From 0a2f39e34e0ea19efc61ce5eb54e5c46012d858d Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 9 May 2016 19:52:43 +0200 Subject: [PATCH 011/572] Add United Kingdom NHS number Add module for United Kingdom National Health Service patient identifier. --- stdnum/gb/nhs.py | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 stdnum/gb/nhs.py diff --git a/stdnum/gb/nhs.py b/stdnum/gb/nhs.py new file mode 100644 index 00000000..3773afcb --- /dev/null +++ b/stdnum/gb/nhs.py @@ -0,0 +1,85 @@ +# nhs.py - functions for handling United Kingdom NHS numbers +# +# Copyright (C) 2012-2015 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""NHS (United Kingdom National Health Service patient identifier). + +The NHS number is used by the NHS (National Health Service) and its partners +to uniquely identify patients. The number is used in England, Wales and the +Isle of Man. The number is assigned at birth and consists of 10 digits where +the final digit is a check digit. + +More information: + +* https://en.wikipedia.org/wiki/NHS_number +* http://www.nhs.uk/NHSEngland/thenhs/records/nhs-number/ +* http://systems.hscic.gov.uk/nhsnumber +* http://www.datadictionary.nhs.uk/data_dictionary/attributes/n/nhs/nhs_number_de.asp + +>>> validate('943-476-5870') +'9434765870' +>>> validate('9434765871') # invalid check digit +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> format('9434765870') +'943 476 5870' +""" + +from stdnum.util import clean +from stdnum.exceptions import * + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' -').strip() + + +def checksum(number): + """Calculate the checksum. The checksum is only used for the 9 digits + of the number and the result can either be 0 or 42.""" + return sum(i * int(n) for i, n in enumerate(reversed(number), 1)) % 11 + + +def validate(number): + """Checks to see if the number provided is valid. This checks the length + and check digit.""" + number = compact(number) + if not number.isdigit(): + raise InvalidFormat() + if len(number) != 10: + raise InvalidLength() + if checksum(number) != 0: + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is valid. This checks the length + and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number, separator=' '): + """Reformat the passed number to the standard format.""" + number = compact(number) + return separator.join((number[0:3], number[3:6], number[6:])) From a1afa76b39de86d76be947be07b846d44ea59ce9 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Date: Sun, 22 May 2016 19:39:18 +0200 Subject: [PATCH 012/572] Add French NIR Add module for NIR also known as social security number. --- stdnum/fr/nir.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 stdnum/fr/nir.py diff --git a/stdnum/fr/nir.py b/stdnum/fr/nir.py new file mode 100644 index 00000000..bd9ce802 --- /dev/null +++ b/stdnum/fr/nir.py @@ -0,0 +1,80 @@ +# nir.py - functions for handling French NIR numbers +# +# Copyright (C) 2016 Dimitri Papadopoulos +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""NIR (French personal identification number). + +The NIR (Numero d'Inscription au Repertoire national d'identification +des personnes physiques) is a 15 digit number used to identify persons +in France. All persons born in France are registered in the Repertoire +national d'identification des personnes physiques (RNIPP) and assigned +a NIR which consists of 15 digits where the two final digits are check +digits. The NIR is used by French social security and is popularly known +as the "social security number". + +More information: + +* http://www.insee.fr/en/methodes/default.asp?page=definitions/nir.htm + +>>> validate('2 95 10 99 126 111 93') +'295109912611193' +>>> validate('295109912611199') # invalid check digit +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> format('295109912611193') +'2 95 10 99 126 111 93' +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' .').strip() + + +def validate(number): + """Checks to see if the number provided is valid. This checks the length + and check digit.""" + number = compact(number) + if not number.isdigit(): + raise InvalidFormat() + if len(number) != 15: + raise InvalidLength() + if (97 - (int(number[:13]) % 97)) != int(number[13:]): + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is valid. This checks the length + and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number, separator=' '): + """Reformat the passed number to the standard format.""" + number = compact(number) + return separator.join((number[:1], number[1:3], number[3:5], number[5:7], + number[7:10], number[10:13], number[13:])) From d85b27f9b03b0ccb25e6e40b6c4179a2ab51ba75 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 28 May 2016 11:29:34 +0200 Subject: [PATCH 013/572] Fix get_module_description() This fixes the initial implementation in 3f6d52a. --- stdnum/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdnum/util.py b/stdnum/util.py index 266b2927..21307baf 100644 --- a/stdnum/util.py +++ b/stdnum/util.py @@ -162,7 +162,7 @@ def get_module_description(module): """Return a description of the number.""" doc = pydoc.splitdoc(pydoc.getdoc(module))[1] # remove the doctests - return _strip_doctest_re.sub('', doc[1]).strip(), + return _strip_doctest_re.sub('', doc).strip() def get_module_list(): From b5397ed3ed77bc8a75f65197309a928158fab138 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 28 May 2016 11:47:57 +0200 Subject: [PATCH 014/572] Small improvements to tests This includes a formatting fix and removes an unused variable from a test. --- tests/test_robustness.doctest | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/test_robustness.doctest b/tests/test_robustness.doctest index b38ff973..8e2c4be2 100644 --- a/tests/test_robustness.doctest +++ b/tests/test_robustness.doctest @@ -1,6 +1,6 @@ test_robustness.doctest - test is_valid() functions to not break -Copyright (C) 2011, 2012 Arthur de Jong +Copyright (C) 2011-2016 Arthur de Jong This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,12 +22,11 @@ This file contains some tests for modules in the stdnum package to check whether all provided is_valid() functions can handle clearly invalid junk. ->>> testvalues = ( None, '*&^%$', '', 0, False, object(), 'Q', 'QQ', '3') +>>> testvalues = (None, '*&^%$', '', 0, False, object(), 'Q', 'QQ', '3') >>> from stdnum.util import get_number_modules Go over each module and try every value. ->>> badmodules = [] >>> for mod in get_number_modules(): ... results = [ x for x in testvalues if mod.is_valid(x) != False ] ... if results: From f3c2491c45c39e2052be3e7ee769248f40aacb58 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 28 May 2016 13:17:52 +0200 Subject: [PATCH 015/572] Fix bug in Irish VAT number validation The last digits of the number that should be letters were not tested to be letters which could result in ValueError being raised for certain validations. This also clarifies the documentation and adds a convert() function to convert numbers from the old format (where the second character would be a letter or symbol) to the new format (7 digits followed by 1 or 2 letters). --- stdnum/ie/vat.py | 35 ++++++++++++++++++++-------- tests/test_ie_vat.doctest | 48 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 tests/test_ie_vat.doctest diff --git a/stdnum/ie/vat.py b/stdnum/ie/vat.py index c3740e7f..215480a3 100644 --- a/stdnum/ie/vat.py +++ b/stdnum/ie/vat.py @@ -1,6 +1,6 @@ # vat.py - functions for handling Irish VAT numbers # -# Copyright (C) 2012, 2013 Arthur de Jong +# Copyright (C) 2012-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -17,10 +17,11 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA -"""VAT (Irish VAT number). +"""VAT (Irish tax reference number). -The Irish VAT number consists of 8 digits. The last digit is a check -letter, the second digit may be a number, a letter, "+" or "*". +The Irish VAT number consists of 8 or 9 digits. The number is either 7 digits +and 1 letter (optionally followed by a W for married women), 7 digits and 2 +letters, or 6 digits and 2 letters or symbols (in second and last position). >>> validate('IE 6433435F') # pre-2013 format '6433435F' @@ -36,6 +37,8 @@ Traceback (most recent call last): ... InvalidFormat: ... +>>> convert('1F23456T') +'0234561T' """ from stdnum.exceptions import * @@ -51,14 +54,16 @@ def compact(number): return number +_alphabet = 'WABCDEFGHIJKLMNOPQRSTUV' + + def calc_check_digit(number): """Calculate the check digit. The number passed should not have the check digit included.""" - alphabet = 'WABCDEFGHIJKLMNOPQRSTUV' number = compact(number).zfill(7) - return alphabet[( + return _alphabet[( sum((8 - i) * int(n) for i, n in enumerate(number[:7])) + - 9 * alphabet.index(number[7:])) % 23] + 9 * _alphabet.index(number[7:])) % 23] def validate(number): @@ -67,14 +72,16 @@ def validate(number): number = compact(number) if not number[:1].isdigit() or not number[2:7].isdigit(): raise InvalidFormat() + if not all(x in _alphabet for x in number[7:]): + raise InvalidFormat() if len(number) not in (8, 9): raise InvalidLength() if number[:7].isdigit(): - # new system + # new system (7 digits followed by 1 or 2 letters) if number[7] != calc_check_digit(number[:7] + number[8:]): raise InvalidChecksum() elif number[1] in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ+*': - # old system + # old system (second character is a letter or symbol) if number[7] != calc_check_digit(number[2:7] + number[0]): raise InvalidChecksum() else: @@ -89,3 +96,13 @@ def is_valid(number): return bool(validate(number)) except ValidationError: return False + + +def convert(number): + """Convert an "old" style 8-digit VAT number where the second character + is a letter to the new 8-digit format where only the last digit is a + character.""" + number = compact(number) + if len(number) == 8 and not number[1].isdigit(): + number = '0' + number[2:7] + number[0] + number[7:] + return number diff --git a/tests/test_ie_vat.doctest b/tests/test_ie_vat.doctest new file mode 100644 index 00000000..cbdf9589 --- /dev/null +++ b/tests/test_ie_vat.doctest @@ -0,0 +1,48 @@ +test_ie_vat.doctest - more detailed doctests for stdnum.ie.vat module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.ie.vat module. It +tries to cover more corner cases and detailed functionality that is not +really useful as module documentation. + +>>> from stdnum.ie import vat + + +Extra tests for length checking and corner cases: + +>>> vat.validate('111222333') # check digits should be letters +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> vat.validate('1234567ABC') # too long +Traceback (most recent call last): + ... +InvalidLength: ... + + +The convert() function should leave invalid or already converted values +alone. + +>>> vat.convert('IE8D79739I') +'0797398I' +>>> vat.convert('IE 632 3420 C') +'6323420C' +>>> vat.convert('123') +'123' From 9b74840002acc370d4de405a73dd35fc9df62187 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 28 May 2016 17:48:09 +0200 Subject: [PATCH 016/572] Fix bug in Swiss SSN validation The validation was delegated to the EAN module but the number is supposed to be an EAN-13 only and and EAN-8 was also accepted. This also reformats the docstring. --- stdnum/ch/ssn.py | 20 +++++++++++--------- tests/test_ch_ssn.doctest | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 tests/test_ch_ssn.doctest diff --git a/stdnum/ch/ssn.py b/stdnum/ch/ssn.py index 548ffa1a..78d72a22 100644 --- a/stdnum/ch/ssn.py +++ b/stdnum/ch/ssn.py @@ -1,6 +1,7 @@ # vat.py - functions for handling Swiss social security numbers # # Copyright (C) 2014 Denis Krienbuehl +# Copyright (C) 2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,12 +20,10 @@ """Swiss social security number ("Sozialversicherungsnummer"). -Also known as "Neue AHV Nummer". +Also known as "Neue AHV Nummer". The Swiss Sozialversicherungsnummer is used +to identify individuals for taxation and pension purposes. -The Swiss Sozialversicherungsnummer is used to identify indivduals for taxation -and pension purposes. - -The number is validated using EAN-13, though dashes are substitued for dots. +The number is validated using EAN-13, though dashes are substituted for dots. >>> compact('756.9217.0769.85') '7569217076985' @@ -40,8 +39,8 @@ InvalidChecksum: ... """ -from stdnum.exceptions import ValidationError from stdnum import ean +from stdnum.exceptions import * from stdnum.util import clean @@ -58,9 +57,12 @@ def format(number): def validate(number): - """Checks to see if the number provided is a valid - Swiss Sozialversicherungsnummer.""" - return ean.validate(compact(number)) + """Checks to see if the number provided is a valid Swiss + Sozialversicherungsnummer.""" + number = compact(number) + if len(number) != 13: + raise InvalidLength() + return ean.validate(number) def is_valid(number): diff --git a/tests/test_ch_ssn.doctest b/tests/test_ch_ssn.doctest new file mode 100644 index 00000000..2a496ca7 --- /dev/null +++ b/tests/test_ch_ssn.doctest @@ -0,0 +1,33 @@ +test_ch_ssn.doctest - more detailed doctests for stdnum.ch.ssn module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.ch.ssn module. It +tries to cover more corner cases and detailed functionality that is not +really useful as module documentation. + +>>> from stdnum.ch import ssn + + +Extra tests for length checking and corner cases: + +>>> ssn.validate('54165168') # valid EAN-8 but incorrect length +Traceback (most recent call last): + ... +InvalidLength: ... From 4a57d84935d45c78bcd407c2cca558bb74df5a54 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 29 May 2016 12:06:32 +0200 Subject: [PATCH 017/572] Fix formatting of bulleted list --- stdnum/us/tin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/stdnum/us/tin.py b/stdnum/us/tin.py index bdac205f..b2696b10 100644 --- a/stdnum/us/tin.py +++ b/stdnum/us/tin.py @@ -21,6 +21,7 @@ The Taxpayer Identification Number is used used for tax purposes in the United States. A TIN may be: + * a Social Security Number (SSN) * an Individual Taxpayer Identification Number (ITIN) * an Employer Identification Number (EIN) From dc708f044a78297f0a283c389930b5d8b3a378a9 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 29 May 2016 13:07:57 +0200 Subject: [PATCH 018/572] Add more ISIL tests This moves a few of the tests from the module to a dedicated test file and adds tests for a number of ISIL numbers found online. --- stdnum/isil.py | 6 - tests/test_isil.doctest | 404 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 404 insertions(+), 6 deletions(-) create mode 100644 tests/test_isil.doctest diff --git a/stdnum/isil.py b/stdnum/isil.py index 30dea53d..ec1afd6e 100644 --- a/stdnum/isil.py +++ b/stdnum/isil.py @@ -51,14 +51,8 @@ Traceback (most recent call last): ... InvalidComponent: ... ->>> validate('WW-RM026712423345334534512334534545') # too long -Traceback (most recent call last): - ... -InvalidLength: ... >>> format('it-RM0267') 'IT-RM0267' ->>> format('zz-RM0267') # unknown agencies are left alone -'zz-RM0267' """ from stdnum.exceptions import * diff --git a/tests/test_isil.doctest b/tests/test_isil.doctest new file mode 100644 index 00000000..1668563b --- /dev/null +++ b/tests/test_isil.doctest @@ -0,0 +1,404 @@ +test_isil.doctest - more detailed doctests for the stdnum.isil module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.isil module. It +tries to validate a number of numbers that have been found online. + +>>> from stdnum import isil +>>> from stdnum.exceptions import * + + +The number should start with a valid country code or prefix: + +>>> isil.validate('ZZ-1234') +Traceback (most recent call last): + ... +InvalidComponent: ... + + +The number should not be too long: + +>>> isil.validate('WW-RM026712423345334534512334534545') +Traceback (most recent call last): + ... +InvalidLength: ... + + +A number with an unknown agency should not be upper-cased: + +>>> isil.format('zz-RM0267') +'zz-RM0267' + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... AT-FHJ-BG +... AT-FHK +... AT-FHK-FE +... AT-FHS-K +... AT-GEOL +... AT-HGMW +... AT-KWPU +... AT-LAST +... AT-LBB +... AT-NMW-Z +... AT-NOeLB +... AT-OBV +... AT-OeAW-BA +... AT-PHK +... AT-PHS +... AT-PHST +... AT-PHT +... AT-PHV +... AT-STICHWORT +... AT-UBG-SH +... AT-UBGL +... AT-UBI-HB +... AT-UBL +... AT-UBMG-HB +... AT-UBMS +... AT-UBMS-MUS +... AT-UBMUL-FBG +... AT-UBMUL-HB +... AT-UBMUW-360 +... AT-UBMUW-400 +... AT-UBMW +... AT-UBTUG-HB +... AT-UBVUW-UB +... AT-UBW +... AT-UBWW +... AT-UBWW-874 +... AT-VMW +... AT-WBR +... AT-WHK +... AT-WSTLA-B +... +... AU-ABC:ARC +... AU-ABC:PL +... AU-ABC:RN +... AU-ANL:AJA +... AU-ANU:ADBO +... AU-ANU:IR +... AU-ANU:ON +... AU-NABC +... AU-NABM +... AU-NACON +... AU-NACU:AA +... AU-NAIM +... AU-NEF +... AU-NJHS +... AU-NNCU:A +... AU-NRNA +... AU-NU +... AU-NU:DF +... AU-NUWS +... AU-QMINT +... AU-QU +... AU-SMUA +... AU-SUSA +... AU-TS:RL +... AU-TU +... AU-VAAPM +... AU-VACMU +... AU-VAGH +... AU-VAHRI +... AU-VAMD +... AU-VANDS +... AU-VDU +... AU-VEMU +... AU-VLGA +... AU-VPM +... AU-VS:NAH +... AU-VSWT +... AU-VU +... AU-WAHB +... AU-XACA +... +... BE-A0510 +... BE-A3004 +... BE-A5000 +... BE-A5001 +... BE-A5002 +... BE-AAR00 +... BE-ALN00 +... BE-ANN03 +... BE-ANT01 +... BE-BDE00 +... BE-BEE00 +... BE-BRL06 +... BE-BRL07 +... BE-BRL10 +... BE-BUE01 +... BE-DIT00 +... BE-DNE00 +... BE-DPE00 +... BE-EKN00 +... BE-GAN00 +... BE-GET02 +... BE-HCT00 +... BE-HED00 +... BE-HEN00 +... BE-HES01 +... BE-JEE00 +... BE-KLT00 +... BE-KNE00 +... BE-KRG00 +... BE-LLE00 +... BE-LNL00 +... BE-LUK01 +... BE-LUN00 +... BE-MSE00 +... BE-NET00 +... BE-OSE00 +... BE-RIT00 +... BE-SJS01 +... BE-ZEE00 +... BE-ZUE00 +... +... CA-QMCB +... +... CH-000050-X +... CH-000051-7 +... CH-000084-8 +... CH-000190-0 +... CH-000244-3 +... CH-000422-7 +... CH-000423-4 +... CH-000425-9 +... CH-000560-3 +... CH-000886-6 +... CH-001008-0 +... CH-001010-9 +... CH-001057-5 +... CH-001059-X +... CH-001113-6 +... CH-001243-0 +... CH-001283-6 +... CH-001350-0 +... CH-001539-4 +... CH-001631-1 +... CH-001644-X +... CH-001645-7 +... CH-001646-4 +... CH-001648-9 +... CH-001649-6 +... CH-001654-6 +... CH-001666-7 +... CH-001669-9 +... CH-001760-9 +... CH-001800-6 +... CH-001815-9 +... CH-001821-6 +... CH-001824-8 +... CH-001825-5 +... CH-001832-X +... CH-001839-0 +... CH-001844-0 +... CH-001845-8 +... CH-001846-5 +... CH-001851-5 +... +... CY-02-CUT +... +... DE-101c +... DE-16-18 +... DE-1769 +... DE-1786 +... DE-180-1-2 +... DE-1834h +... DE-1834k +... DE-1869 +... DE-188-878 +... DE-188-e +... DE-1886 +... DE-1935 +... DE-1939 +... DE-1988 +... DE-1996 +... DE-2300 +... DE-2343 +... DE-360 +... DE-379 +... DE-38-230 +... DE-412 +... DE-416 +... DE-450 +... DE-465M-15 +... DE-469 +... DE-46a +... DE-570 +... DE-6-235 +... DE-6-271 +... DE-6-321 +... DE-7-040 +... DE-7-061 +... DE-718 +... DE-758 +... DE-781 +... DE-82-204 +... DE-82-219 +... DE-Bor4 +... DE-Kn184 +... DE-Tue120 +... +... GB-NiBfQU +... GB-StAlCLS +... GB-StDnUAD +... GB-StGlU +... GB-StPaUWSP +... GB-UK-AbCCL +... GB-UK-DhCL +... GB-UK-LoRCN +... GB-UK-WiU +... GB-UkBrCC +... GB-UkBsBC +... GB-UkCU-TRH +... GB-UkCmUG +... GB-UkCoI +... GB-UkCvUL +... GB-UkCyUK +... GB-UkElC +... GB-UkExU +... GB-UkFlBUFL +... GB-UkHsBUUC +... GB-UkIfBRL +... GB-UkLRCM +... GB-UkLUC +... GB-UkLoBS +... GB-UkLoMdU +... GB-UkLoSTAC +... GB-UkLuBC +... GB-UkMaUHSM +... GB-UkNrSTB +... GB-UkOlOLS +... GB-UkRlWC +... GB-UkSbWC-T +... GB-UkScaSH +... GB-UkSfCL +... GB-UkSfSSSH +... GB-UkSofDA +... GB-UkTeS +... GB-UkWbSWB +... GB-UkWfC +... GB-WlCaUW +... +... IT-RM0267 +... +... NL-04-0041-000 +... NL-AlSARM +... NL-AsdUvA +... NL-AsnDA +... NL-CoGC +... NL-DdvHVA +... NL-DtAD +... NL-DtHHD +... NL-EhvRHCE +... NL-EmnGE +... NL-FwGF +... NL-GnADNG +... NL-GnGRA +... NL-GnPG +... NL-GnUMG +... NL-HAMuscom +... NL-HaKV +... NL-HaNIMH +... NL-HaNRK +... NL-HlGH +... NL-HnWFA +... NL-HvsSAGV +... NL-KrdGA +... NL-LdnRMV +... NL-LnsGDM +... NL-LwPF +... NL-MpGM +... NL-MssHVM +... NL-MtmGM +... NL-NmRAN +... NL-OmnHKO +... NL-OmnOO +... NL-OmsVHO +... NL-RtEUR +... NL-RtSA +... NL-SelGV +... NL-SloGS +... NL-VbGALV +... NL-WtGAW +... NL-WtslGT +... NL-ZhGZ +... Nl-GdSAMH +... +... OCLC-ABI +... OCLC-ATNHK +... OCLC-ATQCO +... OCLC-ATVMV +... OCLC-BEMCH +... OCLC-BRI +... OCLC-CKI +... OCLC-CSF +... OCLC-DEKNV +... OCLC-EMSBC +... OCLC-ENC +... OCLC-EZU +... OCLC-FLNSW +... OCLC-FNL +... OCLC-GYR +... OCLC-I8S +... OCLC-IDT +... OCLC-ILW +... OCLC-JAKUC +... OCLC-JXE +... OCLC-JYY +... OCLC-KW5 +... OCLC-LABMH +... OCLC-MLBVL +... OCLC-MSL +... OCLC-NEZH8 +... OCLC-OME +... OCLC-QBA +... OCLC-QP7 +... OCLC-SMP +... OCLC-SVZ +... OCLC-TXCLY +... OCLC-TY7 +... OCLC-U9V +... OCLC-UDU +... OCLC-WK6 +... OCLC-WYEMB +... OCLC-XOH +... OCLC-YA6 +... OCLC-YEJ +... +... US-DLC +... US-InU-Mu +... US-MdBJ-W +... +... ''' +>>> [x for x in numbers.splitlines() if x and not isil.is_valid(x)] +[] + + +These have been found online but seem invalid: + +... OCLC-B#P +... OCLC-LT$ +... OCLC-RE# +... OCLC-RG$ From 5ba3a8796fccc44136d325f466ee99f6e1dfd96d Mon Sep 17 00:00:00 2001 From: Yoann Aubineau Date: Fri, 27 May 2016 16:43:53 +0200 Subject: [PATCH 019/572] Add French SIRET number MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a SIRET (Système d'Identification du Répertoire des ETablissements, a French company etablishment identification number) module. --- stdnum/fr/siret.py | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 stdnum/fr/siret.py diff --git a/stdnum/fr/siret.py b/stdnum/fr/siret.py new file mode 100644 index 00000000..ab7d59fd --- /dev/null +++ b/stdnum/fr/siret.py @@ -0,0 +1,97 @@ +# siret.py - functions for handling French SIRET numbers +# coding: utf-8 +# +# Copyright (C) 2016 Yoann Aubineau +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""SIRET (a French company establishment identification number). + +The SIRET (Système d'Identification du Répertoire des ETablissements) +is a 14 digit number used to identify French companies' establishments +and facilities. The Luhn checksum is used to validate the numbers. + +>>> validate('73282932000074') +'73282932000074' +>>> validate('73282932000079') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> to_siren('732 829 320 00074') +'732 829 320' +>>> to_siren('73282932000074') +'732829320' +>>> to_tva('732 829 320 00074') +'44 732 829 320' +>>> to_tva('73282932000074') +'44732829320' +""" + +from stdnum import luhn +from stdnum.exceptions import * +from stdnum.fr import siren +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' ').strip() + + +def validate(number): + """Checks to see if the number provided is a valid number. This checks + the length, formatting and check digit.""" + number = compact(number) + if not number.isdigit(): + raise InvalidFormat() + if len(number) != 14: + raise InvalidLength() + luhn.validate(number) + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid number. This checks + the length, formatting and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def to_siren(number): + """Return SIREN number from the given SIRET number. + + The SIREN number is the 9 first digits of the SIRET number. + """ + _siren = [] + digit_count = 0 + for char in number: + if digit_count < 9: + _siren.append(char) + if char.isdigit(): + digit_count += 1 + return ''.join(_siren) + + +def to_tva(number): + """Return TVA number from the given SIRET number. + + The TVA number is built from the SIREN number, prepended by two extra + error checking digits. + """ + return siren.to_tva(to_siren(number)) From fd9f9538c362aacf50e4ae32ae51b15ecaf79184 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 25 Jul 2016 16:23:54 +0200 Subject: [PATCH 020/572] Add extra tests for SIREN and SIRET This adds tests for a few numbers that have been found online and allows the dot as a seprator because those numbers were found. It also ensures that the SIREN validation is also called for SIRET and adds a SIRET formatting function. --- stdnum/fr/siren.py | 2 +- stdnum/fr/siret.py | 11 ++++- tests/test_fr_siren.doctest | 47 ++++++++++++++++++++ tests/test_fr_siret.doctest | 85 +++++++++++++++++++++++++++++++++++++ 4 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 tests/test_fr_siren.doctest create mode 100644 tests/test_fr_siret.doctest diff --git a/stdnum/fr/siren.py b/stdnum/fr/siren.py index f57b0fa1..543f4285 100644 --- a/stdnum/fr/siren.py +++ b/stdnum/fr/siren.py @@ -50,7 +50,7 @@ def compact(number): """Convert the number to the minimal representation. This strips the number of any valid separators and removes surrounding whitespace.""" - return clean(number, ' ').strip() + return clean(number, ' .').strip() def validate(number): diff --git a/stdnum/fr/siret.py b/stdnum/fr/siret.py index ab7d59fd..22efe208 100644 --- a/stdnum/fr/siret.py +++ b/stdnum/fr/siret.py @@ -38,6 +38,8 @@ '44 732 829 320' >>> to_tva('73282932000074') '44732829320' +>>> format('73282932000074') +'732 829 320 00074' """ from stdnum import luhn @@ -49,7 +51,7 @@ def compact(number): """Convert the number to the minimal representation. This strips the number of any valid separators and removes surrounding whitespace.""" - return clean(number, ' ').strip() + return clean(number, ' .').strip() def validate(number): @@ -61,6 +63,7 @@ def validate(number): if len(number) != 14: raise InvalidLength() luhn.validate(number) + siren.validate(number[:9]) return number @@ -95,3 +98,9 @@ def to_tva(number): error checking digits. """ return siren.to_tva(to_siren(number)) + + +def format(number, separator=' '): + """Reformat the passed number to the standard format.""" + number = compact(number) + return separator.join((number[0:3], number[3:6], number[6:9], number[9:])) diff --git a/tests/test_fr_siren.doctest b/tests/test_fr_siren.doctest new file mode 100644 index 00000000..2169ec99 --- /dev/null +++ b/tests/test_fr_siren.doctest @@ -0,0 +1,47 @@ +test_fr_siren.doctest - more detailed doctests for the stdnum.fr.siren module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.fr.siren module. + +>>> from stdnum.fr import siren +>>> from stdnum.exceptions import * + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 217601 145 +... 3 1 0 1 8 8 4 2 0 +... 350792008 +... 480318245 +... 500 674 056 +... 529290488 +... 738 205 269 +... 752136200 +... 752490334 +... 775 699 309 +... 775672272 +... 776 944 944 +... 820043784 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not siren.is_valid(x)] +[] diff --git a/tests/test_fr_siret.doctest b/tests/test_fr_siret.doctest new file mode 100644 index 00000000..699ac33b --- /dev/null +++ b/tests/test_fr_siret.doctest @@ -0,0 +1,85 @@ +test_fr_siret.doctest - more detailed doctests for the stdnum.fr.siret module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.fr.siret module. + +>>> from stdnum.fr import siret +>>> from stdnum.exceptions import * + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 0 5 7 8 1 3 1 3 1 0 0 0 2 6 +... 1 800 700 39 00 110 +... 2 00 03 00 13 000 11 +... 2 101 005 33 000 12 +... 2 777 000 43 000 15 +... 3 1 0 1 8 8 4 2 0 00 0 8 0 +... 3 12 494 529 000 34 +... 3 24 34 54 20 000 40 +... 30206838200050 +... 314 901 323 00043 +... 31719324100013 +... 32228438100017 +... 32650798500058 +... 32738082000032 +... 329.338.88300153 +... 32929695800039 +... 33770320100034 +... 34530016400018 +... 380 321 430 00023 +... 38446899700034 +... 38536958200023 +... 389 011 529 00036 +... 38981890700203 +... 39039475700020 +... 39102766100050 +... 4 0 0 9 0 8 5 0 5 0 0 0 11 +... 4 0 3 3 1 4 6 6 9 0 0 0 4 1 +... 4 0 9 0 8 5 2 1 4 0 0 0 2 4 +... 4 2 0 3 0 9 6 2 7 0 0 0 3 2 +... 4 4 3 4 8 9 2 7 3 0 0 0 1 3 +... 4 4 3 5 4 9 8 7 8 0 0 0 4 1 +... 4 8 2 7 8 1 9 11 0 0 0 11 +... 40300300700032 +... 44126652500019 +... 44142526100019 +... 44796433900017 +... 479 461 675 00049 +... 5 12 326 653 000 15 +... 5 17 758 173 000 10 +... 50397442000021 +... 513 133 637 000 35 +... 52524288900042 +... 542 097 324 0006 6 +... 652 059 213 00023 +... 7 7821 0526 00019 +... 775.563.232.00104 +... 778 239 798 000 11 +... 79068156300017 +... 8 1 0 2 4 7 3 8 7 0 0 0 1 4 +... 8 1002665800015 +... 8 21 114 55000014 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not siret.is_valid(x)] +[] From 879f2d3c8a777b4ae8a1b97fdd0629e90d7bc871 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Date: Sun, 29 May 2016 17:57:05 +0200 Subject: [PATCH 021/572] Improve French NIR validation Please note that the 7th character of the NIR might be 'A' or 'B'. Other than that the NIR contains digits only. --- stdnum/fr/nir.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/stdnum/fr/nir.py b/stdnum/fr/nir.py index bd9ce802..d8c26ee9 100644 --- a/stdnum/fr/nir.py +++ b/stdnum/fr/nir.py @@ -48,25 +48,34 @@ def compact(number): """Convert the number to the minimal representation. This strips the number of any valid separators and removes surrounding whitespace.""" - return clean(number, ' .').strip() + return clean(number, ' .').strip().upper() def validate(number): """Checks to see if the number provided is valid. This checks the length - and check digit.""" + and check digits.""" number = compact(number) - if not number.isdigit(): + if not (number.isdigit() or ( + number[:5].isdigit() and number[7:].isdigit() and + number[5:7] in ('2A', '2B'))): raise InvalidFormat() if len(number) != 15: raise InvalidLength() - if (97 - (int(number[:13]) % 97)) != int(number[13:]): + department = number[5:7] + if department == '2A': + s = number[:5] + '19' + number[7:13] + elif department == '2B': + s = number[:5] + '18' + number[7:13] + else: + s = number[:13] + if (97 - (int(s) % 97)) != int(number[13:]): raise InvalidChecksum() return number def is_valid(number): """Checks to see if the number provided is valid. This checks the length - and check digit.""" + and check digits.""" try: return bool(validate(number)) except ValidationError: From 43b58d331a8e61694a5a9b77fa0968fa326f52cc Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 02:33:16 +0200 Subject: [PATCH 022/572] Move NIR check digit calculation to function This also fixes a number of formatting issues, improves the module description and adds tests for the 2A and 2B departments. --- stdnum/fr/nir.py | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/stdnum/fr/nir.py b/stdnum/fr/nir.py index d8c26ee9..bf1206a7 100644 --- a/stdnum/fr/nir.py +++ b/stdnum/fr/nir.py @@ -1,6 +1,8 @@ # nir.py - functions for handling French NIR numbers +# coding: utf-8 # # Copyright (C) 2016 Dimitri Papadopoulos +# Copyright (C) 2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,17 +21,23 @@ """NIR (French personal identification number). -The NIR (Numero d'Inscription au Repertoire national d'identification -des personnes physiques) is a 15 digit number used to identify persons -in France. All persons born in France are registered in the Repertoire -national d'identification des personnes physiques (RNIPP) and assigned -a NIR which consists of 15 digits where the two final digits are check -digits. The NIR is used by French social security and is popularly known -as the "social security number". +The NIR (Numero d'Inscription au Repertoire national d'identification des +personnes physiques) is used to identify persons in France. It is popularly +known as the "social security number" and sometimes referred to as an INSEE +number. All persons born in France are registered in the Repertoire national +d'identification des personnes physiques (RNIPP) and assigned a NIR. + +The number consists of 15 digits: the first digit indicates the gender, +followed by 2 digits for the year or birth, 2 for the month of birth, 5 for +the location of birth (COG), 3 for a serial and 2 check digits. More information: * http://www.insee.fr/en/methodes/default.asp?page=definitions/nir.htm +* https://en.wikipedia.org/wiki/INSEE_code +* http://resoo.org/docs/_docs/regles-numero-insee.pdf +* https://fr.wikipedia.org/wiki/Numéro_de_sécurité_sociale_en_France +* http://xml.insee.fr/schema/nir.html >>> validate('2 95 10 99 126 111 93') '295109912611193' @@ -37,6 +45,10 @@ Traceback (most recent call last): ... InvalidChecksum: ... +>>> validate('253072B07300470') +'253072B07300470' +>>> validate('253072A07300443') +'253072A07300443' >>> format('295109912611193') '2 95 10 99 126 111 93' """ @@ -51,6 +63,16 @@ def compact(number): return clean(number, ' .').strip().upper() +def calc_check_digits(number): + """Calculate the check digits for the number.""" + department = number[5:7] + if department == '2A': + number = number[:5] + '19' + number[7:] + elif department == '2B': + number = number[:5] + '18' + number[7:] + return '%02d' % (97 - (int(number[:13]) % 97)) + + def validate(number): """Checks to see if the number provided is valid. This checks the length and check digits.""" @@ -61,14 +83,7 @@ def validate(number): raise InvalidFormat() if len(number) != 15: raise InvalidLength() - department = number[5:7] - if department == '2A': - s = number[:5] + '19' + number[7:13] - elif department == '2B': - s = number[:5] + '18' + number[7:13] - else: - s = number[:13] - if (97 - (int(s) % 97)) != int(number[13:]): + if calc_check_digits(number) != number[13:]: raise InvalidChecksum() return number From 2409ee943859b11539be67b11da078e15e2bdc0d Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Date: Sun, 22 May 2016 20:09:21 +0200 Subject: [PATCH 023/572] Add NIF - French tax identification number Add module for NIF also known as SPI number. --- stdnum/fr/nif.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 stdnum/fr/nif.py diff --git a/stdnum/fr/nif.py b/stdnum/fr/nif.py new file mode 100644 index 00000000..7d5a802a --- /dev/null +++ b/stdnum/fr/nif.py @@ -0,0 +1,75 @@ +# nif.py - functions for handling French tax identification numbers +# coding: utf-8 +# +# Copyright (C) 2016 Dimitri Papadopoulos +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""NIF (Numéro d'Immatriculation Fiscale, French tax identification number). + +The NIF (Numéro d'Immatriculation Fiscale, Numéro d'Identité Fiscale or +Numéro d'Identification Fiscale) also known as numéro fiscal de référence or +SPI (Simplification des Procédures d'Identification) is a 13-digit number +issued by the French tax authorities to people for tax reporting purposes. + +More information: + +* https://ec.europa.eu/taxation_customs/tin/tinByCountry.html +* https://fr.wikipedia.org/wiki/Num%C3%A9ro_d%27Immatriculation_Fiscale#France + +>>> validate('0701987765432') +'0701987765432' +>>> validate('070198776543') +Traceback (most recent call last): + ... +InvalidLength: ... +>>> format('295109912611193') +'2 95 10 99 126 111 93' +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' ').strip() + + +def validate(number): + """Checks the length to see if the number provided is valid.""" + number = compact(number) + if not number.isdigit(): + raise InvalidFormat() + if len(number) != 13: + raise InvalidLength() + return number + + +def is_valid(number): + """Checks the length to see if the number provided is valid.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join((number[:2], number[2:4], number[4:7], + number[7:10], number[10:])) From 011c0f0c4b1d2e08f2987de1cc9c2cfb16e39998 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 15:39:22 +0200 Subject: [PATCH 024/572] Fix copyright notice --- stdnum/gb/nhs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdnum/gb/nhs.py b/stdnum/gb/nhs.py index 3773afcb..c1367e3d 100644 --- a/stdnum/gb/nhs.py +++ b/stdnum/gb/nhs.py @@ -1,6 +1,6 @@ # nhs.py - functions for handling United Kingdom NHS numbers # -# Copyright (C) 2012-2015 Arthur de Jong +# Copyright (C) 2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public From cf428ac4c2f7f8d36042860e02e7d5b929b24b8f Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 17:19:58 +0200 Subject: [PATCH 025/572] Add pointer to ISO 6346 information --- stdnum/iso6346.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stdnum/iso6346.py b/stdnum/iso6346.py index 5b936fc4..fd6f1c95 100644 --- a/stdnum/iso6346.py +++ b/stdnum/iso6346.py @@ -28,6 +28,10 @@ as any operational marks. The standard is managed by the International Container Bureau (BIC). +More information: + +* http://en.wikipedia.org/wiki/ISO_6346 + >>> validate('csqu3054383') 'CSQU3054383' >>> validate('CSQU3054384') From 1907c67e756ce5f38422ab75fa1de98fd8368ddc Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 17:33:04 +0200 Subject: [PATCH 026/572] Add documentation to Brazillian CPF --- stdnum/br/cpf.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/stdnum/br/cpf.py b/stdnum/br/cpf.py index 742d4642..b8b4f6ed 100644 --- a/stdnum/br/cpf.py +++ b/stdnum/br/cpf.py @@ -1,7 +1,7 @@ # cpf.py - functions for handling CPF numbers # coding: utf-8 # -# Copyright (C) 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2011-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -20,6 +20,14 @@ """CPF (Cadastro de Pessoas Físicas, Brazillian national identifier). +The Cadastro de Pessoas Físicas is the Brazilian identification number +assigned to individuals for tax purposes. The number consists of 11 digits +and includes two check digits. + +More information: + +* https://en.wikipedia.org/wiki/Cadastro_de_Pessoas_Físicas + >>> validate('390.533.447-05') '39053344705' >>> validate('231.002.999-00') From 06e41651623798b0bffe37b141374e9ef56c8102 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 18:00:26 +0200 Subject: [PATCH 027/572] Improve validation to Swiss SSN number The EAN-13 number should start with 756. --- stdnum/ch/ssn.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/stdnum/ch/ssn.py b/stdnum/ch/ssn.py index 78d72a22..57e88cfd 100644 --- a/stdnum/ch/ssn.py +++ b/stdnum/ch/ssn.py @@ -1,4 +1,4 @@ -# vat.py - functions for handling Swiss social security numbers +# ssn.py - functions for handling Swiss social security numbers # # Copyright (C) 2014 Denis Krienbuehl # Copyright (C) 2016 Arthur de Jong @@ -25,10 +25,11 @@ The number is validated using EAN-13, though dashes are substituted for dots. ->>> compact('756.9217.0769.85') -'7569217076985' ->>> format('7569217076985') -'756.9217.0769.85' +More information: + +* https://en.wikipedia.org/wiki/National_identification_number#Switzerland +* https://de.wikipedia.org/wiki/Sozialversicherungsnummer#Versichertennummer + >>> validate('7569217076985') '7569217076985' >>> validate('756.9217.0769.85') @@ -37,6 +38,12 @@ Traceback (most recent call last): ... InvalidChecksum: ... +>>> validate('123.4567.8910.19') +Traceback (most recent call last): + ... +InvalidComponent: ... +>>> format('7569217076985') +'756.9217.0769.85' """ from stdnum import ean @@ -62,6 +69,8 @@ def validate(number): number = compact(number) if len(number) != 13: raise InvalidLength() + if not number.startswith('756'): + raise InvalidComponent() return ean.validate(number) From 411d0381331334dd6b739f8d0527b56af741a90a Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 18:03:02 +0200 Subject: [PATCH 028/572] Fix French NIF format test Fixes 2409ee9. --- stdnum/fr/nif.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stdnum/fr/nif.py b/stdnum/fr/nif.py index 7d5a802a..47715623 100644 --- a/stdnum/fr/nif.py +++ b/stdnum/fr/nif.py @@ -28,7 +28,7 @@ More information: * https://ec.europa.eu/taxation_customs/tin/tinByCountry.html -* https://fr.wikipedia.org/wiki/Num%C3%A9ro_d%27Immatriculation_Fiscale#France +* https://fr.wikipedia.org/wiki/Numéro_d%27Immatriculation_Fiscale#France >>> validate('0701987765432') '0701987765432' @@ -36,8 +36,8 @@ Traceback (most recent call last): ... InvalidLength: ... ->>> format('295109912611193') -'2 95 10 99 126 111 93' +>>> format('0701987765432') +'07 01 987 765 432' """ from stdnum.exceptions import * From aa1c298cf706eda127b07a2c2d6705fff423b569 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 21:38:15 +0200 Subject: [PATCH 029/572] Implement Damm algorithm This is a generic check digit algorithm. --- getnumlist.py | 5 ++- stdnum/damm.py | 93 +++++++++++++++++++++++++++++++++++++++++ tests/test_damm.doctest | 93 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 stdnum/damm.py create mode 100644 tests/test_damm.doctest diff --git a/getnumlist.py b/getnumlist.py index 4c74479d..c8b9b4da 100755 --- a/getnumlist.py +++ b/getnumlist.py @@ -28,7 +28,8 @@ # these are excluded -algortihms = ('stdnum.verhoeff', 'stdnum.luhn', 'stdnum.iso7064') +algortihms = ( + 'stdnum.verhoeff', 'stdnum.luhn', 'stdnum.iso7064', 'stdnum.damm') def get_number_modules(): @@ -36,7 +37,7 @@ def get_number_modules(): for module in util.get_number_modules(): if module.__name__ not in algortihms and \ not module.__name__.startswith('stdnum.iso7064'): - yield module + yield module if __name__ == '__main__': print 'For README:' diff --git a/stdnum/damm.py b/stdnum/damm.py new file mode 100644 index 00000000..dc93151a --- /dev/null +++ b/stdnum/damm.py @@ -0,0 +1,93 @@ +# damm.py - functions for performing the Damm checksum algorithm +# +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""The Damm algorithm. + +The Damm algorithm is a check digit algorithm that should detect all +single-digit errors and all adjacent transposition errors. Based on +anti-symmetric quasigroup of order 10 it uses a substitution table. + +This implementation uses the table from Wikipedia by default but a custom +table can be provided. + +More information: + +* https://en.wikipedia.org/wiki/Damm_algorithm + +>>> validate('572') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> calc_check_digit('572') +'4' +>>> validate('5724') +'5724' +""" + +from stdnum.exceptions import * + + +_operation_table = ( + (0, 3, 1, 7, 5, 9, 8, 6, 4, 2), + (7, 0, 9, 2, 1, 5, 4, 8, 6, 3), + (4, 2, 0, 6, 8, 7, 1, 3, 5, 9), + (1, 7, 5, 0, 9, 8, 3, 4, 2, 6), + (6, 1, 2, 3, 0, 4, 5, 9, 7, 8), + (3, 6, 7, 4, 2, 0, 9, 5, 8, 1), + (5, 8, 6, 9, 7, 2, 0, 1, 3, 4), + (8, 9, 4, 5, 3, 6, 2, 0, 1, 7), + (9, 4, 3, 8, 6, 1, 7, 2, 0, 5), + (2, 5, 8, 1, 4, 3, 6, 7, 9, 0)) + + +def checksum(number, table=None): + """Calculate the Damm checksum over the provided number. The checksum is + returned as an integer value and should be 0 when valid.""" + table = table or _operation_table + i = 0 + for n in str(number): + i = table[i][int(n)] + return i + + +def validate(number, table=None): + """Checks to see if the number provided passes the Damm algorithm.""" + if not bool(number): + raise InvalidFormat() + try: + valid = checksum(number, table=table) == 0 + except Exception: + raise InvalidFormat() + if not valid: + raise InvalidChecksum() + return number + + +def is_valid(number, table=None): + """Checks to see if the number provided passes the Damm algorithm.""" + try: + return bool(validate(number), table=table) + except ValidationError: + return False + + +def calc_check_digit(number, table=None): + """With the provided number, calculate the extra digit that should be + appended to make it pass the Damm check.""" + return str(checksum(number, table=table)) diff --git a/tests/test_damm.doctest b/tests/test_damm.doctest new file mode 100644 index 00000000..13d8c233 --- /dev/null +++ b/tests/test_damm.doctest @@ -0,0 +1,93 @@ +test_damm.doctest - more detailed doctests for stdnum.damm module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.damm module. It +tries to test more corner cases and detailed functionality that is not +really useful as module documentation. + +>>> from stdnum import damm + + +These are normal variations that should just work. Calculating checksums: + +>>> damm.checksum('572') +4 +>>> damm.checksum('5724') +0 +>>> damm.checksum('43881234567') +9 +>>> damm.checksum('438812345679') +0 + + +The same numbers but now simply ask for validation: + +>>> damm.validate('572') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> damm.validate('5724') +'5724' +>>> damm.validate('43881234567') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> damm.validate('438812345679') +'438812345679' + + +Adding a check digit to the numbers so they are all valid: + +>>> damm.calc_check_digit('572') +'4' +>>> damm.validate('5724') +'5724' +>>> damm.calc_check_digit('5724') +'0' +>>> damm.validate('57240') +'57240' +>>> damm.calc_check_digit('43881234567') +'9' +>>> damm.validate('438812345679') +'438812345679' +>>> damm.calc_check_digit('438812345679') +'0' +>>> damm.validate('4388123456790') +'4388123456790' + + +We can also use a different table if we really need to. This one is from +http://www.md-software.de/math/DAMM_Quasigruppen.txt + +>>> table = ( +... (0, 2, 3, 4, 5, 6, 7, 8, 9, 1), +... (2, 0, 4, 1, 7, 9, 5, 3, 8, 6), +... (3, 7, 0, 5, 2, 8, 1, 6, 4, 9), +... (4, 1, 8, 0, 6, 3, 9, 2, 7, 5), +... (5, 6, 2, 9, 0, 7, 4, 1, 3, 8), +... (6, 9, 7, 3, 1, 0, 8, 5, 2, 4), +... (7, 5, 1, 8, 4, 2, 0, 9, 6, 3), +... (8, 4, 6, 2, 9, 5, 3, 0, 1, 7), +... (9, 8, 5, 7, 3, 1, 6, 4, 0, 2), +... (1, 3, 9, 6, 8, 4, 2, 7, 5, 0)) +>>> damm.checksum('816', table=table) +9 +>>> damm.checksum('8169', table=table) +0 From 3e344d1e51b7abd8a68d3688973e7d0215ba55b5 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 21:56:08 +0200 Subject: [PATCH 030/572] Add formatting of ISO 6346 container codes --- stdnum/iso6346.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/stdnum/iso6346.py b/stdnum/iso6346.py index fd6f1c95..1956dfce 100644 --- a/stdnum/iso6346.py +++ b/stdnum/iso6346.py @@ -38,6 +38,8 @@ Traceback (most recent call last): ... InvalidChecksum: ... +>>> format('tasu117 000 0') +'TASU 117000 0' """ import re @@ -53,7 +55,7 @@ def compact(number): """Convert the number to the minimal representation. This strips the number of any valid separators and removes surrounding whitespace.""" - return clean(number).strip().upper() + return clean(number, ' ').strip().upper() def calc_check_digit(number): @@ -85,3 +87,9 @@ def is_valid(number): return bool(validate(number)) except ValidationError: return False + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join((number[:4], number[4:-1], number[-1:])) From 3e4e9e2c7682efb46d5bc25b7e640ab1cfd5f17e Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 23:08:54 +0200 Subject: [PATCH 031/572] Update database files This also updates the getmybp script to support the new layout. --- getmybp.py | 4 +- stdnum/cn/loc.dat | 2 +- stdnum/iban.dat | 2 +- stdnum/imsi.dat | 587 +++++++++++++++++++++++++--------------------- stdnum/isbn.dat | 16 +- stdnum/isil.dat | 5 +- 6 files changed, 330 insertions(+), 286 deletions(-) diff --git a/getmybp.py b/getmybp.py index 53da0157..f9dfa9cb 100755 --- a/getmybp.py +++ b/getmybp.py @@ -2,7 +2,7 @@ # getmybp.py - script to donwnload data from Malaysian government site # -# Copyright (C) 2013 Arthur de Jong +# Copyright (C) 2013-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -43,7 +43,7 @@ def parse(f): """Parse the specified file.""" soup = BeautifulSoup.BeautifulSoup(f, convertEntities='html') # find all table rows - for tr in soup.find('div', id='inner-main').findAll('tr'): + for tr in soup.find('div', {'class': 'box-content'}).findAll('tr'): # find the rows with four columns of text tds = [ clean(''.join(x.string for x in td.findAll(text=True))) diff --git a/stdnum/cn/loc.dat b/stdnum/cn/loc.dat index f7b1a79e..96003c76 100644 --- a/stdnum/cn/loc.dat +++ b/stdnum/cn/loc.dat @@ -1,6 +1,6 @@ # generated from National Bureau of Statistics of the People's # Republic of China, downloaded from https://github.com/cn/GB2260 -# 2016-03-02 22:38:33.696025 +# 2016-07-26 20:51:28.113057 110101 county="东城区" prefecture="市辖区" province="北京市" 110102 county="西城区" prefecture="市辖区" province="北京市" 110103 county="崇文区" prefecture="市辖区" province="北京市" diff --git a/stdnum/iban.dat b/stdnum/iban.dat index e9fce125..50d61cd9 100644 --- a/stdnum/iban.dat +++ b/stdnum/iban.dat @@ -54,7 +54,7 @@ PL country="Poland" bban="8!n16!n" PT country="Portugal" bban="4!n4!n11!n2!n" QA country="Qatar" bban="4!a21!c" RO country="Romania" bban="4!a16!c" -LC country="Saint Lucia" bban="4!a24!n" +LC country="Saint Lucia" bban="4!a24!c" SM country="San Marino" bban="1!a5!n5!n12!c" ST country="Sao Tome And Principe" bban="8!n11!n2!n" SA country="Saudi Arabia" bban="2!n18!c" diff --git a/stdnum/imsi.dat b/stdnum/imsi.dat index f665ff84..bc3bce1d 100644 --- a/stdnum/imsi.dat +++ b/stdnum/imsi.dat @@ -4,16 +4,21 @@ 01 bands="GSM 900 / GSM 1800" brand="TEST" country="Test networks" operator="Test Network" status="Operational" 00-99 202 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Cosmote" cc="gr" country="Greece" operator="COSMOTE - Mobile Telecommunications S.A." status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Cosmote" cc="gr" country="Greece" operator="COSMOTE - Mobile Telecommunications S.A." status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Cosmote" cc="gr" country="Greece" operator="COSMOTE - Mobile Telecommunications S.A." status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Cosmote" cc="gr" country="Greece" operator="COSMOTE - Mobile Telecommunications S.A." status="Operational" 03 bands="" cc="gr" country="Greece" operator="OTE" status="" - 04 bands="" cc="gr" country="Greece" operator="EDISY" status="" - 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Vodafone" cc="gr" country="Greece" operator="Vodafone Greece" status="Operational" - 06 bands="" cc="gr" country="Greece" operator="Cosmoline" status="" + 04 bands="GSM-R?" cc="gr" country="Greece" operator="OTE" status="" + 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Vodafone" cc="gr" country="Greece" operator="Vodafone Greece" status="Operational" + 06 bands="" cc="gr" country="Greece" operator="Cosmoline" status="Not operational" 07 bands="" cc="gr" country="Greece" operator="AMD Telecom" status="" 09 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Wind" cc="gr" country="Greece" operator="Wind Hellas Telecommunications S.A." status="Operational" 10 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Wind" cc="gr" country="Greece" operator="Wind Hellas Telecommunications S.A." status="Operational" + 11 bands="" cc="gr" country="Greece" operator="interConnect" status="" + 12 bands="MVNO" cc="gr" country="Greece" operator="Yuboto" status="Operational" + 13 bands="" cc="gr" country="Greece" operator="Compatel Limited" status="" 14 bands="MVNO" brand="Cyta Hellas" cc="gr" country="Greece" operator="CYTA" status="Operational" + 15 bands="" cc="gr" country="Greece" operator="BWS" status="" + 16 bands="MVNO" cc="gr" country="Greece" operator="Inter Telecom" status="Operational" 00-99 204 01 bands="" cc="nl" country="Netherlands" operator="RadioAccess Network Services BV" status="" @@ -21,7 +26,7 @@ 03 bands="MVNE / PrivateGSM 1800" brand="Voiceworks" cc="nl" country="Netherlands" operator="Voiceworks B.V." status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Vodafone" cc="nl" country="Netherlands" operator="Vodafone Libertel B.V." status="Operational" 05 bands="" cc="nl" country="Netherlands" operator="Elephant Talk Communications Premium Rate Services" status="" - 06 bands="MVNO" brand="Vectone Mobile / Delight Mobile" cc="nl" country="Netherlands" operator="Mundio Mobile (Netherlands) Ltd" status="Operational" + 06 bands="MVNO" brand="Vectone Mobile" cc="nl" country="Netherlands" operator="Mundio Mobile (Netherlands) Ltd" status="Operational" 07 bands="MVNE" cc="nl" country="Netherlands" operator="Teleena (MVNE)" status="Operational" 08 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="KPN" cc="nl" country="Netherlands" operator="KPN Mobile The Netherlands B.V." status="Operational" 09 bands="MVNO" brand="Lycamobile" cc="nl" country="Netherlands" operator="Lycamobile Netherlands Limited" status="Operational" @@ -33,7 +38,7 @@ 15 bands="LTE 2600" brand="Ziggo" cc="nl" country="Netherlands" operator="Ziggo B.V." status="Operational" 16 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="T-Mobile (BEN)" cc="nl" country="Netherlands" operator="T-Mobile Netherlands B.V" status="Operational" 17 bands="MVNE" brand="Intercity Zakelijk" cc="nl" country="Netherlands" operator="Intercity Mobile Communications B.V." status="Operational" - 18 bands="MVNO" cc="nl" country="Netherlands" operator="UPC Nederland B.V." status="Operational" + 18 bands="MVNO" brand="upc" cc="nl" country="Netherlands" operator="UPC Nederland B.V." status="Operational" 19 bands="" cc="nl" country="Netherlands" operator="Mixe Communication Solutions B.V." status="" 20 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="T-Mobile" cc="nl" country="Netherlands" operator="T-Mobile Netherlands B.V" status="Operational" 21 bands="GSM-R 900" cc="nl" country="Netherlands" operator="ProRail B.V." status="Operational" @@ -57,16 +62,16 @@ 00-99 206 00 bands="" brand="Proximus" cc="be" country="Belgium" operator="Belgacom Mobile" status="" - 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Proximus" cc="be" country="Belgium" operator="Belgacom Mobile" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Proximus" cc="be" country="Belgium" operator="Belgacom Mobile" status="Operational" 02 bands="GSM-R" cc="be" country="Belgium" operator="N.M.B.S." status="Operational" 05 bands="MVNO" brand="Telenet" cc="be" country="Belgium" operator="Telenet" status="Operational" 06 bands="MVNO" brand="Lycamobile" cc="be" country="Belgium" operator="Lycamobile sprl" status="Operational" 07 bands="MVNO" brand="Vectone Mobile" cc="be" country="Belgium" operator="Mundio Mobile Belgium nv" status="Reserved" 09 bands="MVNO" brand="Voxbone" cc="be" country="Belgium" operator="Voxbone mobile" status="Operational" - 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Mobistar" cc="be" country="Belgium" operator="Orange S.A." status="Operational" + 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Orange" cc="be" country="Belgium" operator="Orange S.A." status="Operational" 15 bands="" cc="be" country="Belgium" operator="Elephant Talk Communications Schweiz GmbH" status="Not operational" - 20 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="BASE" cc="be" country="Belgium" operator="KPN Group Belgium" status="Operational" - 40 bands="MVNO" cc="be" country="Belgium" operator="JOIN Experience (Belgium)" status="Operational" + 20 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="BASE" cc="be" country="Belgium" operator="Telenet" status="Operational" + 40 bands="MVNO" brand="JOIN" cc="be" country="Belgium" operator="JOIN Experience (Belgium)" status="Operational" 00-99 208 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="Orange" cc="fr" country="France" operator="Orange S.A." status="Operational" @@ -77,14 +82,14 @@ 06 bands="Satellite" cc="fr" country="France" operator="Globalstar Europe" status="Operational" 07 bands="Satellite" cc="fr" country="France" operator="Globalstar Europe" status="Operational" 08 bands="MVNO" brand="Completel Mobile" cc="fr" country="France" operator="Completel" status="Operational" - 09 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="SFR" cc="fr" country="France" operator="Vivendi" status="Operational" - 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="SFR" cc="fr" country="France" operator="Vivendi" status="Operational" - 11 bands="UMTS 2100" brand="SFR" cc="fr" country="France" operator="Vivendi" status="Operational" + 09 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="SFR" cc="fr" country="France" operator="Altice" status="Operational" + 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 LTE 2600" brand="SFR" cc="fr" country="France" operator="Altice" status="Operational" + 11 bands="UMTS 2100" brand="SFR" cc="fr" country="France" operator="Altice" status="Operational" 12 bands="" cc="fr" country="France" operator="Hewlett-Packard France" status="" - 13 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="SFR" cc="fr" country="France" operator="Vivendi" status="Operational" + 13 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="SFR" cc="fr" country="France" operator="Altice" status="Operational" 14 bands="GSM-R" brand="RFF" cc="fr" country="France" operator="RFF" status="Operational" - 15 bands="UMTS 900 / UMTS 2100 / LTE 2600" brand="Free Mobile" cc="fr" country="France" operator="Iliad" status="Operational" - 16 bands="UMTS 900 / UMTS 2100 / LTE 2600" brand="Free Mobile" cc="fr" country="France" operator="Iliad" status="Operational" + 15 bands="UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Free Mobile" cc="fr" country="France" operator="Iliad" status="Operational" + 16 bands="UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Free Mobile" cc="fr" country="France" operator="Iliad" status="Operational" 17 bands="" brand="LEGOS" cc="fr" country="France" operator="Local Exchange Global Operation Services" status="" 18 bands="MVNO" brand="Voxbone" cc="fr" country="France" operator="Voxbone mobile" status="Operational" 20 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Bouygues" cc="fr" country="France" operator="Bouygues Telecom" status="Operational" @@ -133,7 +138,7 @@ 18 bands="MVNO" brand="ONO" cc="es" country="Spain" operator="Cableuropa S.A.U." status="Operational" 19 bands="MVNO" brand="Simyo" cc="es" country="Spain" operator="E-PLUS Moviles Virtuales España S.L.U." status="Operational" 20 bands="MVNO" brand="Fonyou" cc="es" country="Spain" operator="Fonyou Telecom S.L." status="Operational" - 21 bands="MVNO" brand="Jazztel" cc="es" country="Spain" operator="Jazz Telecom S.A.U." status="Operational" + 21 bands="MVNO" brand="Jazztel" cc="es" country="Spain" operator="Orange S.A." status="Operational" 22 bands="MVNO" brand="DigiMobil" cc="es" country="Spain" operator="Best Spain Telecom" status="Operational" 23 bands="MVNO" brand="Barablu" cc="es" country="Spain" operator="Barablu Móvil España" status="" 24 bands="MVNO" brand="Eroski" cc="es" country="Spain" operator="Eroski Móvil España" status="Operational" @@ -147,6 +152,7 @@ 32 bands="MVNO" brand="Tuenti" cc="es" country="Spain" operator="Tuenti Technologies S.L." status="Operational" 33 bands="WiMAX" cc="es" country="Spain" operator="EURONA WIRELESS TELECOM, S.A." status="Operational" 34 bands="LTE 2600" cc="es" country="Spain" operator="Aire Networks del Mediterráneo, S.L.U." status="Operational" + 35 bands="MVNO" cc="es" country="Spain" operator="INGENIUM OUTSOURCING SERVICES, S.L." status="" 51 bands="GSM-R" brand="ADIF" cc="es" country="Spain" operator="Administrador de Infraestructuras Ferroviarias" status="Operational" 00-99 216 @@ -155,7 +161,7 @@ 03 bands="1800" brand="DIGI" cc="hu" country="Hungary" operator="DIGI Telecommunication Ltd." status="" 30 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="T-Mobile" cc="hu" country="Hungary" operator="Magyar Telekom Plc" status="Operational" 70 bands="GSM 900 / GSM 1800 / UMTS 2100 / UMTS 900" brand="Vodafone" cc="hu" country="Hungary" operator="Vodafone Magyarország Zrt." status="Operational" - 71 bands="MVNO" brand="UPC Hungary" cc="hu" country="Hungary" operator="UPC Hungary Ltd." status="Operational" + 71 bands="MVNO" brand="upc" cc="hu" country="Hungary" operator="UPC Hungary Ltd." status="Operational" 99 bands="GSM-R 900" brand="MAV GSM-R" cc="hu" country="Hungary" operator="Magyar Államvasutak" status="Planned" 00-99 218 @@ -164,13 +170,13 @@ 90 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="BH Mobile" cc="ba" country="Bosnia and Herzegovina" operator="BH Telecom" status="Operational" 00-99 219 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="T-Mobile" cc="hr" country="Croatia" operator="T-Mobile Croatia" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Tele2" cc="hr" country="Croatia" operator="Tele2" status="Operational" - 10 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Vip" cc="hr" country="Croatia" operator="Vipnet" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="T-Mobile" cc="hr" country="Croatia" operator="T-Hrvatski Telekom" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Tele2" cc="hr" country="Croatia" operator="Tele2" status="Operational" + 10 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Vip" cc="hr" country="Croatia" operator="Vipnet" status="Operational" 12 bands="MVNO" cc="hr" country="Croatia" operator="TELE FOCUS d.o.o." status="" 00-99 220 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Telenor" cc="rs" country="Serbia" operator="Telenor Serbia" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Telenor" cc="rs" country="Serbia" operator="Telenor Serbia" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Telenor" cc="rs" country="Serbia" operator="Telenor Montenegro" status="Not operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="mt:s" cc="rs" country="Serbia" operator="Telekom Srbija" status="Operational" 04 bands="GSM" brand="T-Mobile" cc="rs" country="Serbia" operator="T-Mobile Montenegro LLC" status="Not operational" @@ -209,7 +215,7 @@ 06 bands="UMTS 2100" brand="Telekom/Zapp" cc="ro" country="Romania" operator="Telekom Romania" status="Operational" 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Orange" cc="ro" country="Romania" operator="Orange România" status="Operational" 11 bands="MVNO" cc="ro" country="Romania" operator="Enigma-System" status="" - 15 bands="WiMAX" brand="Idilis" cc="ro" country="Romania" operator="Idilis" status="Operational" + 15 bands="WiMAX / TD-LTE 2600" brand="Idilis" cc="ro" country="Romania" operator="Idilis" status="Operational" 16 bands="MVNO" brand="Lycamobile" cc="ro" country="Romania" operator="Lycamobile Romania" status="Operational" 00-99 228 @@ -225,17 +231,17 @@ 50 bands="UMTS 2100" cc="ch" country="Switzerland" operator="3G Mobile AG" status="Not operational" 51 bands="MVNO" cc="ch" country="Switzerland" operator="BebbiCell AG" status="Operational" 52 brand="Barablu" cc="ch" country="Switzerland" operator="Barablu" status="Not operational" - 53 bands="MVNO" cc="ch" country="Switzerland" operator="UPC Cablecom GmbH" status="Operational" - 54 bands="MVNO" cc="ch" country="Switzerland" operator="Lycamobile AG" status="Operational" + 53 bands="MVNO" brand="upc cablecom" cc="ch" country="Switzerland" operator="UPC Cablecom GmbH" status="Operational" + 54 bands="MVNO" brand="Lycamobile" cc="ch" country="Switzerland" operator="Lycamobile AG" status="Operational" 55 bands="" cc="ch" country="Switzerland" operator="WeMobile SA" status="" 56 bands="" cc="ch" country="Switzerland" operator="SMSRelay AG" status="Not operational" 57 bands="" cc="ch" country="Switzerland" operator="Mitto AG" status="" - 58 bands="MVNO" cc="ch" country="Switzerland" operator="Beeone Communications SA" status="Operational" + 58 bands="MVNO" brand="beeone" cc="ch" country="Switzerland" operator="Beeone Communications SA" status="Operational" 60 bands="" brand="Sunrise" cc="ch" country="Switzerland" operator="Sunrise Communications AG" status="" 99 cc="ch" country="Switzerland" operator="Swisscom" status="" 00-99 230 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="T-Mobile" cc="cz" country="Czech Republic" operator="T-Mobile Czech Republic" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600" brand="T-Mobile" cc="cz" country="Czech Republic" operator="T-Mobile Czech Republic" status="Operational" 02 bands="CDMA 450 / GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="O2" cc="cz" country="Czech Republic" operator="O2 Czech Republic" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100" brand="Vodafone" cc="cz" country="Czech Republic" operator="Vodafone Czech Republic" status="Operational" 04 bands="CDMA2000 410 - 430" brand="U:fon" cc="cz" country="Czech Republic" operator="Air Telecom a. s." status="Operational" @@ -243,7 +249,7 @@ 06 bands="" cc="cz" country="Czech Republic" operator="OSNO TELECOMUNICATION, s.r.o." status="Not operational" 07 bands="MVNO" cc="cz" country="Czech Republic" operator="ASTELNET, s.r.o." status="Not operational" 08 bands="" cc="cz" country="Czech Republic" operator="Compatel s.r.o." status="" - 09 bands="MVNO" cc="cz" country="Czech Republic" operator="Mundio Distribution Czech Republic s.r.o." status="" + 09 bands="MVNO" brand="Vectone Mobile" cc="cz" country="Czech Republic" operator="Mundio Distribution Czech Republic s.r.o." status="" 98 bands="GSM-R 900" cc="cz" country="Czech Republic" operator="Správa železniční dopravní cesty, s.o." status="Operational" 99 bands="GSM 1800" brand="Vodafone" cc="cz" country="Czech Republic" operator="Vodafone Czech Republic" status="Operational" 00-99 @@ -259,17 +265,17 @@ 232 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600" brand="A1.net" cc="at" country="Austria" operator="A1 Telekom Austria" status="Operational" 02 cc="at" country="Austria" operator="A1 Telekom Austria" status="Reserved" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="T-Mobile AT" cc="at" country="Austria" operator="T-Mobile Austria" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="T-Mobile AT" cc="at" country="Austria" operator="T-Mobile Austria" status="Operational" 04 bands="" brand="T-Mobile AT" cc="at" country="Austria" operator="T-Mobile Austria Gmbh" status="" - 05 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Orange AT" cc="at" country="Austria" operator="Hutchison Drei Austria" status="Operational" + 05 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="3" cc="at" country="Austria" operator="Hutchison Drei Austria" status="Operational" 06 bands="" brand="Orange AT" cc="at" country="Austria" operator="Orange Austria GmbH" status="Not operational" 07 bands="MVNO" brand="tele.ring" cc="at" country="Austria" operator="T-Mobile Austria" status="Operational" 08 bands="MVNO" brand="Lycamobile" cc="at" country="Austria" operator="Lycamobile Austria" status="Operational" 09 bands="MVNO" brand="Tele2Mobil" cc="at" country="Austria" operator="A1 Telekom Austria" status="Operational" - 10 bands="UMTS 2100 / LTE 1800 / LTE 2600" brand="3AT" cc="at" country="Austria" operator="Hutchison Drei Austria" status="Operational" + 10 bands="UMTS 2100 / LTE 1800 / LTE 2600" brand="3" cc="at" country="Austria" operator="Hutchison Drei Austria" status="Operational" 11 bands="MVNO" brand="bob" cc="at" country="Austria" operator="A1 Telekom Austria" status="Operational" 12 bands="MVNO" brand="yesss!" cc="at" country="Austria" operator="A1 Telekom Austria" status="Operational" - 13 bands="MVNO" brand="UPC Mobile" cc="at" country="Austria" operator="UPC Austria" status="Operational" + 13 bands="MVNO" brand="upc" cc="at" country="Austria" operator="UPC Austria" status="Operational" 14 bands="" cc="at" country="Austria" operator="Hutchison Drei Austria" status="Reserved" 15 bands="MVNO" brand="Vectone Mobile" cc="at" country="Austria" operator="Mundio Mobile Austria" status="Operational" 16 bands="" cc="at" country="Austria" operator="Hutchison Drei Austria" status="Reserved" @@ -284,7 +290,7 @@ 00 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="BT" cc="gb" country="United Kingdom" operator="BT Group" status="Operational" 01 bands="MVNO" brand="Vectone Mobile" cc="gb" country="United Kingdom" operator="Mundio Mobile Limited" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800" brand="O2 (UK)" cc="gb" country="United Kingdom" operator="Telefónica Europe" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel-Vodafone" cc="gb" country="United Kingdom" operator="Jersey Airtel Limited" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel-Vodafone" cc="je" country="Jersey (United Kingdom)" operator="Jersey Airtel Limited" status="Operational" 04 bands="GSM 1800" brand="FMS Solutions Ltd" cc="gb" country="United Kingdom" operator="FMS Solutions Ltd" status="Reserved" 05 cc="gb" country="United Kingdom" operator="COLT Mobile Telecommunications Limited" status="" 06 cc="gb" country="United Kingdom" operator="Internet Computer Bureau Limited" status="" @@ -301,35 +307,35 @@ 17 cc="gb" country="United Kingdom" operator="FleXtel Limited" status="" 18 bands="MVNO" brand="Cloud9" cc="gb" country="United Kingdom" operator="Cloud9" status="Operational" 19 bands="GSM 1800" brand="Private Mobile Networks PMN" cc="gb" country="United Kingdom" operator="Teleware plc" status="Operational" - 20 bands="UMTS 2100 / LTE 1800" brand="3" cc="gb" country="United Kingdom" operator="Hutchison 3G UK Ltd" status="Operational" + 20 bands="UMTS 2100 / LTE 800 / LTE 1800" brand="3" cc="gb" country="United Kingdom" operator="Hutchison 3G UK Ltd" status="Operational" 21 bands="" cc="gb" country="United Kingdom" operator="LogicStar Ltd" status="Not operational" 22 bands="" cc="gb" country="United Kingdom" operator="Telesign Mobile Limited" status="" 23 bands="" cc="gb" country="United Kingdom" operator="Icron Network Limited" status="" - 24 bands="" brand="Greenfone" cc="gb" country="United Kingdom" operator="Stour Marine Limited" status="Operational" + 24 bands="MVNO" brand="Greenfone" cc="gb" country="United Kingdom" operator="Stour Marine Limited" status="Operational" 25 bands="MVNO" brand="Truphone" cc="gb" country="United Kingdom" operator="Truphone" status="Operational" 26 bands="MVNO" brand="Lycamobile" cc="gb" country="United Kingdom" operator="Lycamobile UK Limited" status="Operational" 27 bands="MVNE" cc="gb" country="United Kingdom" operator="Teleena UK Limited" status="Operational" 28 bands="MVNO" cc="gb" country="United Kingdom" operator="Marathon Telecom Limited" status="Operational" 29 bands="" brand="aql" cc="gb" country="United Kingdom" operator="(aq) Limited" status="" - 30 bands="GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="T-Mobile UK" cc="gb" country="United Kingdom" operator="EE" status="Operational" - 31 bands="MVNO" brand="Virgin Mobile UK" cc="gb" country="United Kingdom" operator="Virgin Media" status="Operational" - 32 bands="MVNO" brand="Virgin Mobile UK" cc="gb" country="United Kingdom" operator="Virgin Media" status="Operational" - 33 bands="GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Orange (UK)" cc="gb" country="United Kingdom" operator="EE" status="Operational" - 34 bands="GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Orange (UK)" cc="gb" country="United Kingdom" operator="EE" status="Operational" + 30 bands="GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="T-Mobile UK" cc="gb" country="United Kingdom" operator="EE" status="Operational" + 31 bands="MVNO" brand="Virgin Mobile" cc="gb" country="United Kingdom" operator="Virgin Media" status="Operational" + 32 bands="MVNO" brand="Virgin Mobile" cc="gb" country="United Kingdom" operator="Virgin Media" status="Operational" + 33 bands="GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Orange" cc="gb" country="United Kingdom" operator="EE" status="Operational" + 34 bands="GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Orange" cc="gb" country="United Kingdom" operator="EE" status="Operational" 35 bands="" cc="gb" country="United Kingdom" operator="JSC Ingenium (UK) Limited" status="Not operational" - 36 bands="GSM 900 / GSM 1800 / LTE" brand="Sure Mobile" cc="gb" country="United Kingdom" operator="Sure (Isle of Man) Limited" status="Operational" + 36 bands="GSM 900 / GSM 1800 / LTE" brand="Sure Mobile" cc="im" country="Isle of Man (United Kingdom)" operator="Sure Isle of Man Ltd." status="Operational" 37 bands="" cc="gb" country="United Kingdom" operator="Synectiv Ltd" status="" - 38 bands="" brand="Virgin Mobile UK" cc="gb" country="United Kingdom" operator="Virgin Media" status="" + 38 bands="" brand="Virgin Mobile" cc="gb" country="United Kingdom" operator="Virgin Media" status="" 39 bands="" cc="gb" country="United Kingdom" operator="Gamma Telecom Holdings Ltd." status="" 50 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="JT" cc="gb" country="United Kingdom" operator="JT Group Limited" status="Operational" 51 bands="TD-LTE 3500 / TD-LTE 3700" brand="UK Broadband" cc="gb" country="United Kingdom" operator="UK Broadband Limited" status="Operational" 52 bands="" cc="gb" country="United Kingdom" operator="Shyam Telecom UK Ltd" status="" 53 bands="MVNO" cc="gb" country="United Kingdom" operator="Limitless Mobile Ltd" status="Operational" 54 bands="" cc="gb" country="United Kingdom" operator="The Carphone Warehouse Limited" status="" - 55 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Sure Mobile" cc="gb" country="United Kingdom" operator="Sure (Guernsey) Limited" status="Operational" + 55 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Sure Mobile" cc="je" country="Jersey (United Kingdom)" operator="Sure (Jersey) Limited" status="Operational" 56 bands="" cc="gb" country="United Kingdom" operator="CESG" status="" 57 bands="" cc="gb" country="United Kingdom" operator="Sky UK Limited" status="" - 58 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Pronto GSM" cc="gb" country="United Kingdom" operator="Manx Telecom" status="Operational" + 58 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Pronto GSM" cc="im" country="Isle of Man (United Kingdom)" operator="Manx Telecom" status="Operational" 59 bands="MVNO" cc="gb" country="United Kingdom" operator="Limitless Mobile Ltd" status="Operational" 70 bands="" cc="gb" country="United Kingdom" operator="AMSUK Ltd." status="" 76 bands="GSM 900 / GSM 1800" brand="BT" cc="gb" country="United Kingdom" operator="BT Group" status="Operational" @@ -337,7 +343,7 @@ 86 bands="" cc="gb" country="United Kingdom" operator="EE" status="" 00-99 235 - 00 cc="gb" country="United Kingdom" operator="Mundio Mobile Limited" status="" + 00 brand="Vectone Mobile" cc="gb" country="United Kingdom" operator="Mundio Mobile Limited" status="" 01 bands="" cc="gb" country="United Kingdom" operator="EE" status="" 02 bands="" cc="gb" country="United Kingdom" operator="EE" status="" 03 bands="" brand="UK Broadband" cc="gb" country="United Kingdom" operator="UK Broadband Limited" status="" @@ -348,7 +354,7 @@ 95 cc="gb" country="United Kingdom" operator="Network Rail Infrastructure Limited" status="" 00-99 238 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="TDC" cc="dk" country="Denmark" operator="TDC A/S" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600" brand="TDC" cc="dk" country="Denmark" operator="TDC A/S" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telenor" cc="dk" country="Denmark" operator="Telenor Denmark" status="Operational" 03 bands="" cc="dk" country="Denmark" operator="MACH Connectivity" status="" 04 bands="" cc="dk" country="Denmark" operator="NextGen Mobile Ltd T/A CardBoardFish" status="" @@ -364,13 +370,14 @@ 15 bands="" cc="dk" country="Denmark" operator="Ice Danmark ApS" status="" 16 bands="" cc="dk" country="Denmark" operator="Tismi B.V." status="" 17 bands="MVNO" cc="dk" country="Denmark" operator="Naka AG" status="" + 18 bands="" cc="dk" country="Denmark" operator="Cubic Telecom" status="" 20 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telia" cc="dk" country="Denmark" operator="Telia" status="Operational" 23 bands="GSM-R" brand="GSM-R DK" cc="dk" country="Denmark" operator="Banedanmark" status="Operational" 28 bands="" cc="dk" country="Denmark" operator="CoolTEL ApS" status="" 30 bands="" cc="dk" country="Denmark" operator="Interactive digital media GmbH" status="" 40 bands="" cc="dk" country="Denmark" operator="Ericsson Danmark A/S" status="" 43 bands="" cc="dk" country="Denmark" operator="MobiWeb Limited" status="" - 66 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" cc="dk" country="Denmark" operator="TT-Netværket P/S" status="" + 66 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" cc="dk" country="Denmark" operator="TT-Netværket P/S" status="Operational" 77 bands="GSM 900 / GSM 1800" brand="Telenor" cc="dk" country="Denmark" operator="Telenor Denmark" status="Operational" 00-99 240 @@ -392,11 +399,11 @@ 16 bands="GSM" cc="se" country="Sweden" operator="42 Telecom AB" status="Operational" 17 bands="MVNO" brand="Gotanet" cc="se" country="Sweden" operator="Götalandsnätet AB" status="Operational" 18 bands="" cc="se" country="Sweden" operator="Generic Mobile Systems Sweden AB" status="" - 19 bands="MVNO" brand="Vectone Mobile / Delight Mobile" cc="se" country="Sweden" operator="Mundio Mobile (Sweden) Limited" status="Operational" + 19 bands="MVNO" brand="Vectone Mobile" cc="se" country="Sweden" operator="Mundio Mobile (Sweden) Limited" status="Operational" 20 bands="GSM" cc="se" country="Sweden" operator="Wireless Maingate Messaging Services AB" status="Operational" 21 bands="GSM-R 900" brand="MobiSir" cc="se" country="Sweden" operator="Trafikverket ICT" status="Operational" 22 bands="" cc="se" country="Sweden" operator="EuTel AB" status="" - 23 bands="" cc="se" country="Sweden" operator="Infobip Limited" status="Operational" + 23 bands="" cc="se" country="Sweden" operator="Infobip Limited" status="Not operational" 24 bands="GSM 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600" brand="Sweden 2G" cc="se" country="Sweden" operator="Net4Mobility HB" status="Operational" 25 bands="" cc="se" country="Sweden" operator="Digitel Mobile Srl" status="Not operational" 26 bands="GSM" cc="se" country="Sweden" operator="Beepsend AB" status="Operational" @@ -422,7 +429,7 @@ 00-99 242 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Telenor" cc="no" country="Norway" operator="Telenor Norge AS" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="NetCom" cc="no" country="Norway" operator="TeliaSonera Norge AS" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Telia" cc="no" country="Norway" operator="TeliaSonera Norge AS" status="Operational" 03 brand="Teletopia" cc="no" country="Norway" operator="Teletopia Gruppen AS" status="Not operational" 04 bands="MVNO" brand="Tele2" cc="no" country="Norway" operator="Tele2 (Mobile Norway AS)" status="Operational" 05 bands="GSM 900 / UMTS 900 / UMTS 2100" brand="Network Norway" cc="no" country="Norway" operator="Tele2 (Mobile Norway AS)" status="Operational" @@ -436,48 +443,53 @@ 14 bands="" cc="no" country="Norway" operator="ICE Communication Norge AS" status="" 20 bands="GSM-R 900" cc="no" country="Norway" operator="Jernbaneverket AS" status="Operational" 21 bands="GSM-R 900" cc="no" country="Norway" operator="Jernbaneverket AS" status="Operational" - 23 bands="MVNO" brand="Lyca" cc="no" country="Norway" operator="Lyca Mobile Ltd" status="Operational" + 23 bands="MVNO" brand="Lycamobile" cc="no" country="Norway" operator="Lyca Mobile Ltd" status="Operational" 24 bands="" cc="no" country="Norway" operator="Mobile Norway AS" status="" 25 bands="" cc="no" country="Norway" operator="Forsvarets kompetansesenter KKIS" status="" 00-99 244 03 bands="GSM 1800" brand="DNA" cc="fi" country="Finland" operator="DNA Oy" status="Operational" - 04 bands="MVNO" brand="AINA" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj / Aina Oyj" status="Not operational" + 04 bands="" brand="DNA" cc="fi" country="Finland" operator="DNA Oy" status="" 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Elisa" cc="fi" country="Finland" operator="Elisa Oyj" status="Operational" - 07 bands="GSM 900 / GSM 1800" brand="Nokia" cc="fi" country="Finland" operator="Nokia Test Network" status="Not operational" - 08 bands="GSM 1800 / UMTS 2100" brand="Nokia" cc="fi" country="Finland" operator="Nokia Test Network" status="Not operational" - 09 bands="GSM 900" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Not operational" - 10 bands="MVNO" cc="fi" country="Finland" operator="Viestintävirasto" status="Not operational" - 11 bands="MVNO" cc="fi" country="Finland" operator="Viestintävirasto" status="Not operational" + 06 bands="" brand="Elisa" cc="fi" country="Finland" operator="Elisa Oyj" status="Not operational" + 07 bands="GSM 900 / GSM 1800" brand="Nokia" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="" + 08 bands="GSM 1800 / UMTS 2100" brand="Nokia" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="" + 09 bands="GSM 900" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="" + 10 bands="" cc="fi" country="Finland" operator="Viestintävirasto" status="" + 11 bands="" cc="fi" country="Finland" operator="Viestintävirasto" status="" 12 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="DNA" cc="fi" country="Finland" operator="DNA Oy" status="Operational" 13 bands="GSM 900 / GSM 1800" brand="DNA" cc="fi" country="Finland" operator="DNA Oy" status="Not operational" - 14 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Ålcom" cc="fi" country="Finland" operator="Ålands Telekommunikation Ab" status="Operational" - 15 bands="GSM 1800" brand="SAMK" cc="fi" country="Finland" operator="Satakunta University of Applied Sciences" status="Not operational" + 14 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Ålcom" cc="fi" country="Finland" operator="Ålands Telekommunikation Ab" status="Operational" + 15 bands="GSM 1800" brand="SAMK" cc="fi" country="Finland" operator="Satakunnan ammattikorkeakoulu Oy" status="Not operational" 16 bands="MVNO" brand="Tele2" cc="fi" country="Finland" operator="Oy Finland Tele2 AB" status="Not operational" - 17 bands="GSM-R" brand="Corenet" cc="fi" country="Finland" operator="Corenet Oy / Finnish Transport Agency" status="Operational" + 17 bands="GSM-R" cc="fi" country="Finland" operator="Liikennevirasto" status="Operational" 21 bands="MVNO" brand="Elisa- Saunalahti" cc="fi" country="Finland" operator="Elisa Oyj" status="Operational" + 22 bands="" cc="fi" country="Finland" operator="EXFO Oy" status="" + 23 bands="" cc="fi" country="Finland" operator="EXFO Oy" status="" + 24 bands="" cc="fi" country="Finland" operator="TTY-säätiö" status="" 25 bands="CDMA" brand="Datame" cc="fi" country="Finland" operator="Datame Oy" status="Not operational" 26 bands="MVNO" brand="Compatel" cc="fi" country="Finland" operator="Compatel Ltd" status="Operational" - 27 bands="" cc="fi" country="Finland" operator="VTT Technical Research Centre of Finland" status="" + 27 bands="" cc="fi" country="Finland" operator="Teknologian tutkimuskeskus VTT Oy" status="" 29 bands="MVNO" cc="fi" country="Finland" operator="SCNL Truphone" status="Not operational" 30 bands="MVNO" brand="Vectone Mobile" cc="fi" country="Finland" operator="Mundio Mobile Oy" status="Not Operational" 31 bands="MVNO" brand="Kuiri" cc="fi" country="Finland" operator="Ukko Mobile Oy" status="Operational" 32 bands="MVNO" brand="Voxbone" cc="fi" country="Finland" operator="Voxbone SA" status="Operational" 33 bands="TETRA" brand="VIRVE" cc="fi" country="Finland" operator="Virve Tuotteet ja Palvelut Oy" status="Operational" 34 bands="MVNO" brand="Bittium Wireless" cc="fi" country="Finland" operator="Bittium Wireless Oy" status="Operational" - 35 bands="LTE 450" brand="Ukko Mobile" cc="fi" country="Finland" operator="Ukkoverkot Oy" status="Operational" + 35 bands="LTE 450 / LTE 2600" brand="Ukko Mobile" cc="fi" country="Finland" operator="Ukkoverkot Oy" status="Operational" 36 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Sonera / DNA" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj / Suomen Yhteisverkko Oy" status="Operational" 37 bands="MVNO" brand="Tismi" cc="fi" country="Finland" operator="Tismi BV" status="Operational" - 38 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Operational" - 39 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Operational" - 40 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Operational" - 41 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Operational" + 38 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Test Network" + 39 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Test Network" + 40 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Test Network" + 41 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Test Network" 91 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Sonera" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj" status="Operational" + 92 bands="" brand="Sonera" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj" status="" 00-99 246 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="Omnitel" cc="lt" country="Lithuania" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="BITĖ" cc="lt" country="Lithuania" operator="UAB Bitė Lietuva" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Tele 2" cc="lt" country="Lithuania" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Tele2" cc="lt" country="Lithuania" status="Operational" 04 bands="" cc="lt" country="Lithuania" operator="Ministry of the Interior)" status="" 05 bands="GSM-R 900" brand="LitRail" cc="lt" country="Lithuania" operator="Lietuvos geležinkeliai (Lithuanian Railways)" status="Operational" 06 bands="" brand="Mediafon" cc="lt" country="Lithuania" operator="UAB Mediafon" status="Operational" @@ -498,20 +510,20 @@ 248 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telia" cc="ee" country="Estonia" operator="Estonian Mobile Telecom" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Elisa" cc="ee" country="Estonia" operator="Elisa Eesti" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600" brand="Tele 2" cc="ee" country="Estonia" operator="Tele 2 Eesti" status="Operational" - 04 bands="MVNO" cc="ee" country="Estonia" operator="OY Top Connect" status="Operational" - 05 bands="" cc="ee" country="Estonia" operator="AS Bravocom Mobiil" status="" - 06 bands="UMTS 2100" cc="ee" country="Estonia" operator="Progroup Holding" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600" brand="Tele2" cc="ee" country="Estonia" operator="Tele2 Eesti" status="Operational" + 04 bands="MVNO" brand="Top Connect" cc="ee" country="Estonia" operator="OY Top Connect" status="Operational" + 05 bands="" cc="ee" country="Estonia" operator="AS Bravocom Mobiil" status="Not operational" + 06 bands="UMTS 2100" cc="ee" country="Estonia" operator="Progroup Holding" status="Not operational" 07 bands="CDMA2000 450" brand="Kou" cc="ee" country="Estonia" operator="Televõrgu AS" status="Not operational" 08 bands="MVNO" brand="VIVEX" cc="ee" country="Estonia" operator="VIVEX OU" status="Operational" - 09 bands="" cc="ee" country="Estonia" operator="Bravo Telecom" status="" - 10 bands="" cc="ee" country="Estonia" operator="Telcotrade OÜ" status="" + 09 bands="" cc="ee" country="Estonia" operator="Bravo Telecom" status="Not operational" + 10 bands="" cc="ee" country="Estonia" operator="Telcotrade OÜ" status="Not operational" 71 bands="" cc="ee" country="Estonia" operator="Siseministeerium (Ministry of Interior)" status="" 00-99 250 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / TD-LTE 2600" brand="MTS" cc="ru" country="Russian Federation" operator="Mobile TeleSystems" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="MegaFon" cc="ru" country="Russian Federation" operator="MegaFon OJSC - previously known as North-West GSM" status="Operational" - 03 bands="GSM 900 / GSM 1800" brand="NCC" cc="ru" country="Russian Federation" operator="Nizhegorodskaya Cellular Communications (purchased Tele2)" status="Operational" + 03 bands="GSM 900 / GSM 1800" brand="NCC" cc="ru" country="Russian Federation" operator="Nizhegorodskaya Cellular Communications (purchased by Tele2)" status="Operational" 04 bands="GSM 900" brand="Sibchallenge" cc="ru" country="Russian Federation" operator="Sibchallenge" status="Not operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / CDMA2000 450" brand="ETK" cc="ru" country="Russian Federation" operator="Yeniseytelecom" status="Operational" 06 bands="CDMA2000 450" brand="Skylink" cc="ru" country="Russian Federation" operator="CJSC Saratov System of Cellular Communications" status="Operational" @@ -531,7 +543,8 @@ 22 bands="TD-LTE 2300" cc="ru" country="Russian Federation" operator="Vainakh Telecom" status="Operational" 23 bands="GSM 900 / GSM 1800" brand="Mobicom - Novosibirsk" cc="ru" country="Russian Federation" operator="Mobicom - Novosibirsk" status="Not operational" 28 bands="GSM 900" brand="Beeline" cc="ru" country="Russian Federation" operator="Beeline" status="Not operational" - 32 bands="GSM 900 / GSM 1800" brand="Win Mobile" cc="ru" country="Russian Federation" operator="K-Telecom" status="Operational" + 32 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Win Mobile" cc="ru" country="Russian Federation" operator="K-Telecom" status="Operational" + 33 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Sevmobile" cc="ru" country="Russian Federation" operator="Sevtelekom" status="Operational" 34 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Krymtelekom" cc="ru" country="Russian Federation" operator="Krymtelekom" status="Operational" 35 bands="GSM 1800 / LTE 1800" brand="MOTIV" cc="ru" country="Russian Federation" operator="EKATERINBURG-2000" status="Operational" 38 bands="GSM 900 / GSM 1800" brand="Tambov GSM" cc="ru" country="Russian Federation" operator="Central Telecommunication Company" status="Operational" @@ -539,6 +552,7 @@ 44 bands="" cc="ru" country="Russian Federation" operator="Stavtelesot / North Caucasian GSM" status="Not operational" 50 bands="GSM 900 / GSM 1800" brand="MTS" cc="ru" country="Russian Federation" operator="Bezlimitno.ru" status="Operational" 54 bands="LTE 1800" brand="TTK" cc="ru" country="Russian Federation" operator="Tattelecom" status="Operational" + 60 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Volna mobile" cc="ru" country="Russian Federation" operator="KTK Telecom" status="Operational" 811 cc="ru" country="Russian Federation" operator="Votek Mobile" status="" 91 bands="GSM 1800" brand="Sonic Duo" cc="ru" country="Russian Federation" operator="Sonic Duo CJSC" status="Not operational" 92 bands="" cc="ru" country="Russian Federation" operator="Primtelefon" status="Not operational" @@ -563,7 +577,7 @@ 03 bands="CDMA 450" brand="DIALLOG" cc="by" country="Belarus" operator="BelCel" status="Not operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="life:)" cc="by" country="Belarus" operator="Belarusian Telecommunications Network" status="Operational" 05 bands="" cc="by" country="Belarus" operator="Beltelecom" status="" - 06 bands="" cc="by" country="Belarus" operator="Belorussian Cloud Technologies" status="" + 06 bands="LTE 1800" brand="beCloud" cc="by" country="Belarus" operator="Belorussian Cloud Technologies" status="Operational" 501 bands="" brand="BelCel JV" cc="by" country="Belarus" status="" 00-99 259 @@ -593,29 +607,36 @@ 16 bands="LTE 1800" brand="Mobyland" cc="pl" country="Poland" operator="Mobyland Sp. z o.o." status="Operational" 17 bands="UMTS 900 / TD-LTE 2600" brand="Aero2" cc="pl" country="Poland" operator="Aero 2 Sp. z o.o." status="Operational" 18 bands="" brand="AMD Telecom" cc="pl" country="Poland" operator="AMD Telecom S.A." status="" - 19 bands="" brand="Teleena" cc="pl" country="Poland" operator="Teleena Holding BV" status="" + 19 bands="" brand="Teleena" cc="pl" country="Poland" operator="Teleena Holding BV" status="Not operational" 20 bands="" brand="Mobile.Net" cc="pl" country="Poland" operator="Mobile.Net Sp. z o.o." status="" - 21 bands="" brand="Exteri" cc="pl" country="Poland" operator="Exteri Sp. z o.o." status="" + 21 bands="" brand="Exteri" cc="pl" country="Poland" operator="Exteri Sp. z o.o." status="Not operational" 22 bands="" brand="Arcomm" cc="pl" country="Poland" operator="Arcomm Sp. z o.o." status="" - 23 bands="" brand="Amicomm" cc="pl" country="Poland" operator="Amicomm Sp. z o.o." status="" - 24 bands="" brand="WideNet" cc="pl" country="Poland" operator="WideNet Sp. z o.o." status="" + 23 bands="" brand="Amicomm" cc="pl" country="Poland" operator="Amicomm Sp. z o.o." status="Not operational" + 24 bands="" brand="WideNet" cc="pl" country="Poland" operator="WideNet Sp. z o.o." status="Not operational" 25 bands="" brand="BS&T" cc="pl" country="Poland" operator="Best Solutions & Technology Experience Sp. z o.o." status="" - 26 bands="" brand="ATE" cc="pl" country="Poland" operator="Advanced Technology & Experience Sp. z o.o." status="" - 27 bands="" brand="Intertelcom" cc="pl" country="Poland" operator="Intertelcom Sp. z o.o." status="" - 28 bands="" brand="PhoneNet" cc="pl" country="Poland" operator="PhoneNet Sp. z o.o." status="" - 29 bands="" brand="Interfonica" cc="pl" country="Poland" operator="Interfonica Sp. z o.o." status="" - 30 bands="" brand="GrandTel" cc="pl" country="Poland" operator="GrandTel Sp. z o.o." status="" + 26 bands="" brand="ATE" cc="pl" country="Poland" operator="Advanced Technology & Experience Sp. z o.o." status="Not operational" + 27 bands="" brand="Intertelcom" cc="pl" country="Poland" operator="Intertelcom Sp. z o.o." status="Not operational" + 28 bands="" brand="PhoneNet" cc="pl" country="Poland" operator="PhoneNet Sp. z o.o." status="Not operational" + 29 bands="" brand="Interfonica" cc="pl" country="Poland" operator="Interfonica Sp. z o.o." status="Not operational" + 30 bands="" brand="GrandTel" cc="pl" country="Poland" operator="GrandTel Sp. z o.o." status="Not operational" 31 bands="" brand="Phone IT" cc="pl" country="Poland" operator="Phone IT Sp. z o.o." status="" 32 bands="" cc="pl" country="Poland" operator="Compatel Limited" status="" 33 bands="MVNO" brand="Truphone" cc="pl" country="Poland" operator="Truphone Poland Sp. z o.o." status="Operational" 34 bands="UMTS 900" brand="NetWorkS!" cc="pl" country="Poland" operator="T-Mobile Polska S.A." status="Operational" 35 bands="GSM-R" cc="pl" country="Poland" operator="PKP Polskie Linie Kolejowe S.A." status="Operational" - 36 bands="MVNO" brand="Vectone Mobile" cc="pl" country="Poland" operator="Mundio Mobile" status="Operational" + 36 bands="MVNO" brand="Vectone Mobile" cc="pl" country="Poland" operator="Mundio Mobile" status="Not operational" 37 bands="" cc="pl" country="Poland" operator="NEXTGEN MOBILE LTD" status="" 38 bands="" cc="pl" country="Poland" operator="CALLFREEDOM Sp. z o.o." status="" 39 bands="MVNO" brand="Voxbone" cc="pl" country="Poland" operator="VOXBONE SA" status="Operational" 40 bands="" cc="pl" country="Poland" operator="Interactive Digital Media GmbH" status="" 41 bands="" cc="pl" country="Poland" operator="EZ PHONE MOBILE Sp. z o.o." status="" + 42 bands="" cc="pl" country="Poland" operator="MobiWeb Telecom Limited" status="" + 43 bands="" cc="pl" country="Poland" operator="Smart Idea International Sp. z o.o." status="" + 44 bands="" cc="pl" country="Poland" operator="Rebtel Poland Sp. z o.o." status="" + 45 bands="MVNO" cc="pl" country="Poland" operator="Virgin Mobile Polska Sp. z o.o." status="Operational" + 46 bands="" cc="pl" country="Poland" operator="Terra Telekom Sp. z o.o." status="" + 47 bands="" cc="pl" country="Poland" operator="SMShighway Limited" status="" + 48 bands="" cc="pl" country="Poland" operator="AGILE TELECOM S.P.A." status="" 98 bands="LTE 1800" brand="Play" cc="pl" country="Poland" operator="P4 Sp. z o.o." status="Not Operational" 00-99 262 @@ -630,7 +651,7 @@ 09 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="Vodafone" cc="de" country="Germany" operator="Vodafone D2 GmbH" status="Operational" 10 bands="GSM-R" cc="de" country="Germany" operator="DB Netz AG" status="Operational" 11 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="O2" cc="de" country="Germany" operator="Telefónica Germany GmbH & Co. oHG" status="Reserved" - 12 bands=""full" MVNO / MVNE" brand="Dolphin Telecom" cc="de" country="Germany" operator="sipgate GmbH" status="Operational" + 12 bands="MVNO" brand="Dolphin Telecom" cc="de" country="Germany" operator="sipgate GmbH" status="Operational" 13 bands="UMTS 2100" cc="de" country="Germany" operator="Mobilcom Multimedia" status="Not operational" 14 bands="UMTS 2100" cc="de" country="Germany" operator="Group 3G UMTS" status="Not operational" 15 bands="TD-SCDMA" brand="Airdata" cc="de" country="Germany" status="Operational" @@ -638,16 +659,22 @@ 17 bands="" brand="E-Plus" cc="de" country="Germany" operator="E-Plus Mobilfunk" status="" 18 bands="MVNO" cc="de" country="Germany" operator="NetCologne" status="Operational" 19 bands="CDMA 450" cc="de" country="Germany" operator="Inquam Deutschland" status="" - 20 bands="GSM" brand="OnePhone" cc="de" country="Germany" operator="E-Plus Mobilfunk" status="Operational" - 33 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="simquadrat" cc="de" country="Germany" operator="sipgate GmbH" status="Operational" - 41 bands="" cc="de" country="Germany" operator="First Telecom GmbH" status="" + 20 bands="MVNO" brand="OnePhone" cc="de" country="Germany" operator="E-Plus Mobilfunk" status="Operational" + 21 bands="" cc="de" country="Germany" operator="Multiconnect GmbH" status="" + 22 bands="MVNO" cc="de" country="Germany" operator="sipgate Wireless GmbH" status="" + 33 bands="MVNO" brand="simquadrat" cc="de" country="Germany" operator="sipgate GmbH" status="Operational" + 41 bands="" cc="de" country="Germany" operator="First Telecom GmbH" status="Not operational" 42 bands="GSM 1800" brand="CCC Event" cc="de" country="Germany" operator="Chaos Computer Club" status="Temporary operational" - 43 bands="" brand="LYCA" cc="de" country="Germany" operator="Lycamobile" status="Operational" + 43 bands="MVNO" brand="Lycamobile" cc="de" country="Germany" operator="Lycamobile" status="Operational" 60 bands="GSM-R 900" cc="de" country="Germany" operator="DB Telematik" status="Operational" + 72 bands="" cc="de" country="Germany" operator="Ericsson GmbH" status="" + 73 bands="" cc="de" country="Germany" operator="Xantaro Deutschland GmbH" status="" + 74 bands="" cc="de" country="Germany" operator="Qualcomm CDMA Technologies GmbH" status="" + 75 cc="de" country="Germany" operator="Core Network Dynamics GmbH" status="Not operational" 76 bands="GSM 900" cc="de" country="Germany" operator="Siemens AG" status="Not operational" 77 bands="GSM 900" brand="E-Plus" cc="de" country="Germany" operator="E-Plus Mobilfunk" status="Operational" 78 bands="" brand="Telekom" cc="de" country="Germany" operator="Telekom Deutschland GmbH" status="" - 79 bands="" cc="de" country="Germany" operator="ng4T GmbH" status="" + 79 bands="" cc="de" country="Germany" operator="ng4T GmbH" status="Not operational" 901 bands="" brand="Debitel" cc="de" country="Germany" status="Operational" 92 bands="GSM 1800 / UMTS 2100" cc="de" country="Germany" operator="Nash Technologies" status="Operational" 00-99 @@ -663,7 +690,7 @@ 04 bands="MVNO" brand="LycaMobile" cc="pt" country="Portugal" operator="LycaMobile" status="Operational" 05 bands="UMTS 2100" cc="pt" country="Portugal" operator="Oniway - Inforcomunicaçôes, S.A." status="Not operational" 06 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="MEO" cc="pt" country="Portugal" operator="Telecomunicações Móveis Nacionais" status="Operational" - 07 bands="MVNO" brand="Vectone Mobile / Delight Mobile" cc="pt" country="Portugal" operator="Mundio Mobile (Portugal) Limited" status="Operational" + 07 bands="MVNO" brand="Vectone Mobile" cc="pt" country="Portugal" operator="Mundio Mobile (Portugal) Limited" status="Operational" 11 bands="" cc="pt" country="Portugal" operator="Compatel, Limited" status="" 12 bands="GSM-R" cc="pt" country="Portugal" operator="Refer Telecom - Serviços de Telecomunicações, S.A." status="Operational" 21 bands="CDMA2000 450" brand="Zapp" cc="pt" country="Portugal" operator="Zapp Portugal" status="Not operational" @@ -687,7 +714,7 @@ 09 bands="" cc="ie" country="Ireland" operator="Clever Communications" status="" 11 bands="MVNO" brand="Tesco Mobile" cc="ie" country="Ireland" operator="Liffey Telecom" status="Operational" 13 bands="MVNO" brand="Lycamobile" cc="ie" country="Ireland" operator="Lycamobile" status="Operational" - 15 bands="MVNO" brand="UPC Mobile" cc="ie" country="Ireland" operator="UPC" status="Operational" + 15 bands="MVNO" brand="Virgin Mobile" cc="ie" country="Ireland" operator="UPC" status="Operational" 16 bands="MVNO" brand="Carphone Warehouse" cc="ie" country="Ireland" operator="Carphone Warehouse" status="Operational" 00-99 274 @@ -705,8 +732,8 @@ 00-99 276 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Telekom.al" cc="al" country="Albania" operator="Telekom Albania" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100 /LTE 1800 / LTE 2600" brand="Vodafone" cc="al" country="Albania" operator="Vodafone Albania" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Eagle Mobile" cc="al" country="Albania" operator="Eagle Mobile" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Vodafone" cc="al" country="Albania" operator="Vodafone Albania" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Eagle Mobile" cc="al" country="Albania" operator="Albtelecom" status="Operational" 04 bands="GSM 900 / GSM 1800" brand="Plus Communication" cc="al" country="Albania" operator="Plus Communication" status="Operational" 00-99 278 @@ -714,18 +741,18 @@ 11 bands="MVNO" cc="mt" country="Malta" operator="YOM Ltd." status="Operational" 21 bands="GSM 1800 / UMTS 2100" brand="GO" cc="mt" country="Malta" operator="Mobile Communications Limited" status="Operational" 30 bands="" brand="GO" cc="mt" country="Malta" operator="Mobile Communications Limited" status="" - 77 bands="UMTS 2100" brand="Melita" cc="mt" country="Malta" operator="Melita Plc" status="Operational" + 77 bands="UMTS 2100" brand="Melita" cc="mt" country="Malta" operator="Melita" status="Operational" 00-99 280 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Cytamobile-Vodafone" cc="cy" country="Cyprus" operator="Cyprus Telecommunications Authority" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Cytamobile-Vodafone" cc="cy" country="Cyprus" operator="Cyprus Telecommunications Authority" status="Operational" 10 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="MTN" cc="cy" country="Cyprus" operator="MTN Group" status="Operational" 20 bands="LTE 1800" brand="PrimeTel" cc="cy" country="Cyprus" operator="PrimeTel PLC" status="Operational" 22 bands="MVNO" brand="lemontel" cc="cy" country="Cyprus" operator="Lemontel Ltd" status="Operational" - 23 bands="MVNO" cc="cy" country="Cyprus" operator="Mundio Mobile Cyprus Ltd." status="" + 23 bands="MVNO" brand="Vectone Mobile" cc="cy" country="Cyprus" operator="Mundio Mobile Cyprus Ltd." status="" 00-99 282 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Geocell" cc="ge" country="Georgia" operator="Geocell Limited" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="MagtiCom" cc="ge" country="Georgia" operator="Magticom GSM" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="MagtiCom" cc="ge" country="Georgia" operator="Magticom GSM" status="Operational" 03 bands="CDMA 450" brand="MagtiCom" cc="ge" country="Georgia" operator="Magtifix" status="Operational" 04 bands="GSM 1800 / LTE 800" brand="Beeline" cc="ge" country="Georgia" operator="Mobitel LLC" status="Operational" 05 bands="CDMA 800" brand="Silknet" cc="ge" country="Georgia" operator="JSC Silknet" status="Operational" @@ -741,12 +768,12 @@ 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Orange" cc="am" country="Armenia" operator="Orange S.A." status="Operational" 00-99 284 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="M-Tel" cc="bg" country="Bulgaria" operator="Mobiltel" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Vivacom" cc="bg" country="Bulgaria" operator="BTC" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="M-Tel" cc="bg" country="Bulgaria" operator="Mobiltel" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Vivacom" cc="bg" country="Bulgaria" operator="BTC" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Telenor" cc="bg" country="Bulgaria" operator="Telenor (Bulgaria)" status="Operational" 07 bands="GSM-R" brand="НКЖИ" cc="bg" country="Bulgaria" operator="НАЦИОНАЛНА КОМПАНИЯ ЖЕЛЕЗОПЪТНА ИНФРАСТРУКТУРА" status="Operational" 09 bands="" cc="bg" country="Bulgaria" operator="COMPATEL LIMITED" status="Not operational" - 11 bands="LTE 1800" cc="bg" country="Bulgaria" operator="Bulsatcom" status="Not operational" + 11 bands="LTE 1800" cc="bg" country="Bulgaria" operator="Bulsatcom" status="Operational" 13 bands="LTE 1800" brand="MAX" cc="bg" country="Bulgaria" operator="Max Telecom LTD" status="Operational" 00-99 286 @@ -777,12 +804,13 @@ 40 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Si.mobil" cc="si" country="Slovenia" operator="SI.MOBIL d.d." status="Operational" 41 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800" brand="Mobitel" cc="si" country="Slovenia" operator="Telekom Slovenije" status="Operational" 64 bands="UMTS 2100" brand="T-2" cc="si" country="Slovenia" operator="T-2 d.o.o." status="Operational" - 70 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Tušmobil" cc="si" country="Slovenia" operator="Tušmobil d.o.o." status="Operational" + 70 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Telemach" cc="si" country="Slovenia" operator="Tušmobil d.o.o." status="Operational" 00-99 294 01 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telekom.mk" cc="mk" country="Macedonia" operator="Makedonski Telekom" status="Operational" 02 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="ONE" cc="mk" country="Macedonia" operator="One" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Vip MK" cc="mk" country="Macedonia" operator="VIP Operator" status="Operational" + 04 bands="MVNO" brand="Lycamobile" cc="mk" country="Macedonia" operator="Lycamobile LLC" status="Operational" 10 bands="" cc="mk" country="Macedonia" operator="WTI Macedonia" status="" 11 bands="" cc="mk" country="Macedonia" operator="MOBIK TELEKOMUNIKACII DOOEL Skopje" status="" 00-99 @@ -790,9 +818,10 @@ 01 bands="GSM 900 / GSM 1800" brand="Swisscom" cc="li" country="Liechtenstein" operator="Swisscom Schweiz AG" status="Operational" 02 bands="GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="7acht" cc="li" country="Liechtenstein" operator="Salt Liechtenstein AG" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="FL1" cc="li" country="Liechtenstein" operator="Telecom Liechtenstein AG" status="Operational" - 06 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Cubic Telecom" cc="li" country="Liechtenstein" operator="Cubic Telecom AG" status="Operational" - 07 bands="" cc="li" country="Liechtenstein" operator="First Mobile AG" status="" + 06 bands="MVNO" brand="Cubic Telecom" cc="li" country="Liechtenstein" operator="Cubic Telecom AG" status="Operational" + 07 bands="MVNO" cc="li" country="Liechtenstein" operator="First Mobile AG" status="" 09 bands="MVNO" cc="li" country="Liechtenstein" operator="EMnify GmbH" status="" + 10 bands="MVNO" cc="li" country="Liechtenstein" operator="Soracom LI Ltd." status="" 77 bands="GSM 900" brand="Alpmobil" cc="li" country="Liechtenstein" operator="Alpcom AG" status="Not operational" 00-99 297 @@ -807,6 +836,7 @@ 250 bands="" brand="ALO" cc="ca" country="Canada" operator="ALO Mobile Inc." status="" 270 bands="UMTS 1700 / LTE 1700" brand="EastLink" cc="ca" country="Canada" operator="Bragg Communications" status="Operational" 290 bands="iDEN 900" brand="Airtel Wireless" cc="ca" country="Canada" operator="Airtel Wireless" status="Operational" + 300 bands="" cc="ca" country="Canada" operator="ECOTEL Inc." status="" 320 bands="UMTS 1700" brand="Mobilicity" cc="ca" country="Canada" operator="DAVE Wireless" status="Operational" 340 bands="MVNO" brand="Execulink" cc="ca" country="Canada" operator="Execulink" status="Operational" 350 bands="GSM 850" brand="FIRST" cc="ca" country="Canada" operator="FIRST Networks Operations" status="Not operational" @@ -878,7 +908,7 @@ 035 bands="" brand="ETEX Wireless" cc="us" country="United States of America" operator="ETEX Communications, LP" status="" 040 bands="CDMA" brand="MTA" cc="us" country="United States of America" operator="Matanuska Telephone Association, Inc." status="Operational" 050 bands="CDMA" brand="GCI" cc="us" country="United States of America" operator="Alaska Communications" status="Operational" - 053 bands="CDMA2000 1900" cc="us" country="United States of America" operator="Virgin Mobile US" status="Operational" + 053 bands="MVNO" brand="Virgin Mobile" cc="us" country="United States of America" operator="Sprint" status="Operational" 054 bands="" cc="us" country="United States of America" operator="Alltel US" status="Operational" 060 bands="" brand="CTEL" cc="us" country="United States of America" operator="Consolidated Telcom" status="" 066 bands="GSM / CDMA" brand="U.S. Cellular" cc="us" country="United States of America" operator="U.S. Cellular" status="Operational" @@ -962,7 +992,7 @@ 820 bands="" cc="us" country="United States of America" operator="Verizon Wireless" status="" 830 bands="" cc="us" country="United States of America" operator="Clearwire Corporation" status="" 840 bands="MVNO" brand="telna Mobile" cc="us" country="United States of America" operator="Telecom North America Mobile, Inc." status="Operational" - 850 bands="MVNO" brand="Aeris" cc="us" country="United States of America" operator="Aeris Communications, Inc." status="Operational" + 850 bands="CDMA" brand="Aeris" cc="us" country="United States of America" operator="Aeris Communications, Inc." status="Operational" 860 bands="CDMA" brand="Five Star Wireless" cc="us" country="United States of America" operator="TX RSA 15B2, LP" status="Operational" 870 bands="MVNO" brand="PACE" cc="us" country="United States of America" operator="Kaplan Telephone Company" status="Operational" 880 bands="GSM 850" brand="DTC Wireless" cc="us" country="United States of America" operator="Advantage Cellular Systems, Inc." status="Operational" @@ -979,17 +1009,17 @@ 990 bands="LTE 700" brand="Evolve Broadband" cc="us" country="United States of America" operator="Worldcall Interconnect Inc." status="Operational" 000-999 311 - 000 bands="CDMA2000 850 / CDMA2000 1900" cc="us" country="United States of America" operator="Mid-Tex Cellular" status="Operational" - 010 bands="GSM 1900" brand="Chariton Valley" cc="us" country="United States of America" operator="Chariton Valley Communications" status="Operational" + 000 bands="CDMA2000 850 / CDMA2000 1900" brand="West Central Wireless" cc="us" country="United States of America" operator="Mid-Tex Cellular Ltd." status="Operational" + 010 bands="CDMA2000 850 / CDMA2000 1900" brand="Chariton Valley" cc="us" country="United States of America" operator="Chariton Valley Communications" status="Operational" 012 bands="CDMA2000 850 / CDMA2000 1900" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Operational" - 020 bands="GSM 850" cc="us" country="United States of America" operator="Missouri RSA 5 Partnership" status="Operational" - 030 bands="GSM 1900" cc="us" country="United States of America" operator="Indigo Wireless" status="Operational" - 040 bands="GSM 850 / GSM 1900" cc="us" country="United States of America" operator="Commnet Wireless" status="Operational" - 050 bands="CDMA" cc="us" country="United States of America" operator="Thumb Cellular LP" status="Operational" + 020 bands="GSM 850" brand="Chariton Valley" cc="us" country="United States of America" operator="Missouri RSA 5 Partnership" status="Operational" + 030 bands="GSM 850 / GSM 1900 / UMTS 850" brand="Indigo Wireless" cc="us" country="United States of America" operator="Americell PA 3 Partnership" status="Operational" + 040 bands="GSM 850 / GSM 1900" brand="Choice Wireless" cc="us" country="United States of America" operator="Commnet Wireless" status="Operational" + 050 bands="CDMA2000 850" cc="us" country="United States of America" operator="Thumb Cellular LP" status="Operational" 060 bands="GSM 850 / GSM 1900" brand="Farmers Cellular" cc="us" country="United States of America" operator="Farmers Cellular Telephone" status="Operational" 070 bands="GSM 850" brand="Easterbrooke" cc="us" country="United States of America" operator="Easterbrooke Cellular Corporation" status="Operational" 080 bands="GSM 850 / LTE" brand="Pine Cellular" cc="us" country="United States of America" operator="Pine Telephone Company" status="Operational" - 090 bands="GSM 1900" brand="Long Lines Wireless" cc="us" country="United States of America" operator="Long Lines Wireless LLC" status="Operational" + 090 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 100 bands="GSM 1900" cc="us" country="United States of America" operator="High Plains Wireless" status="Operational" 110 bands="GSM 1900" cc="us" country="United States of America" operator="High Plains Wireless" status="Operational" 120 bands="" brand="iConnect" cc="us" country="United States of America" operator="Wave Runner LLC" status="Operational" @@ -1073,26 +1103,26 @@ 011 bands="iDEN 800" brand="Southern LINC" cc="us" country="United States of America" operator="Southern Communications Services" status="Operational" 000-999 330 - 00 bands="PCS 1900" brand="Open Mobile" cc="pr" country="Puerto Rico" operator="PR Wireless" status="Operational" + 000 bands="CDMA 1900" brand="Open Mobile" cc="pr" country="Puerto Rico" operator="PR Wireless" status="Operational" 110 bands="GSM 850 / GSM 1900 / UMTS 850 / LTE 700" brand="Claro Puerto Rico" cc="pr" country="Puerto Rico" operator="América Móvil" status="Operational" - 120 bands="LTE 700" brand="tmobile" cc="pr" country="Puerto Rico" operator="PR Wireless" status="Operational" - 00-99 + 120 bands="LTE 700" brand="Open Mobile" cc="pr" country="Puerto Rico" operator="PR Wireless" status="Operational" + 000-999 334 001 bands="" cc="mx" country="Mexico" operator="Comunicaciones Digitales Del Norte, S.A. de C.V." status="" - 010 bands="iDEN 800" brand="Nextel" cc="mx" country="Mexico" operator="Nextel México" status="Operational" + 010 bands="iDEN 800" brand="AT&T" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" 020 bands="TDMA 850 / GSM 1900 / UMTS 850 / LTE 1700" brand="Telcel" cc="mx" country="Mexico" operator="América Móvil" status="Operational" 030 bands="CDMA2000 800 / CDMA2000 1900 / GSM 1900 / UMTS 850 / LTE 1900" brand="movistar" cc="mx" country="Mexico" operator="Movistar - Telefónica Moviles" status="Operational" - 040 bands="CDMA2000 800 / CDMA2000 1900" brand="Iusacell / Unefon" cc="mx" country="Mexico" operator="Iusacell / Unefon" status="Operational" - 050 bands="GSM 850 / GSM 1900" brand="Iusacell" cc="mx" country="Mexico" operator="Iusacell" status="Operational" + 040 bands="CDMA2000 800 / CDMA2000 1900" brand="Unefon" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" + 050 bands="GSM 850 / GSM 1900" brand="AT&T" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" 060 bands="" cc="mx" country="Mexico" operator="Servicios de Acceso Inalambrico, S.A. de C.V." status="" 066 bands="" cc="mx" country="Mexico" operator="Telefonos de México, S.A.B. de C.V." status="" 070 bands="" cc="mx" country="Mexico" operator="Unefon" status="" 080 bands="" cc="mx" country="Mexico" operator="Unefon" status="" - 090 bands="UMTS 1700" brand="Nextel" cc="mx" country="Mexico" operator="Nextel México" status="Operational" + 090 bands="UMTS 1700" brand="AT&T" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" 000-999 338 - 020 bands="" brand="LIME" cc="jm" country="Jamaica" operator="LIME (Cable & Wireless)" status="Not operational" - 050 bands="GSM 900 / GSM 1800 / GSM 1900" brand="Digicel" cc="tc" country="Turks and Caicos Islands" operator="Digicel (Turks & Caicos) Limited" status="Operational" + 020 bands="" brand="FLOW" cc="jm" country="Jamaica" operator="LIME (Cable & Wireless)" status="Not operational" + 050 bands="GSM 900 / GSM 1800 / GSM 1900 / LTE 700" brand="Digicel" cc="tc" country="Turks and Caicos Islands" operator="Digicel (Turks & Caicos) Limited" status="Operational" 070 bands="GSM / UMTS / CDMA" brand="Claro" cc="jm" country="Jamaica" operator="Oceanic Digital Jamaica Limited" status="Not operational" 110 bands="" brand="FLOW" cc="jm" country="Jamaica" operator="Cable & Wireless Communications" status="Operational" 180 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="FLOW" cc="jm" country="Jamaica" operator="Cable & Wireless Communications" status="Operational" @@ -1108,51 +1138,51 @@ 20 bands="GSM 900 / UMTS 2100" brand="Digicel" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="DIGICEL Antilles Française Guyane" status="Operational" 00-99 342 - 600 bands="GSM 1900 / UMTS" brand="LIME" cc="bb" country="Barbados" operator="LIME (formerly known as Cable & Wireless)" status="Operational" + 600 bands="GSM 1900 / UMTS" brand="FLOW" cc="bb" country="Barbados" operator="LIME (formerly known as Cable & Wireless)" status="Operational" 750 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Digicel" cc="bb" country="Barbados" operator="Digicel (Barbados) Limited" status="Operational" 820 bands="" cc="bb" country="Barbados" operator="Sunbeach Communications" status="Reserved" 000-999 344 030 bands="GSM 1900" brand="APUA" cc="ag" country="Antigua and Barbuda" operator="Antigua Public Utilities Authority" status="Operational" 050 bands="GSM 900 / GSM 1900 / UMTS 850 / LTE 700" brand="Digicel" cc="ag" country="Antigua and Barbuda" operator="Antigua Wireless Ventures Limited" status="Operational" - 920 bands="GSM 850 / GSM 1800 / GSM 1900 / UMTS / LTE 1700" brand="LIME" cc="ag" country="Antigua and Barbuda" operator="Cable & Wireless Caribbean Cellular (Antigua) Limited" status="Operational" + 920 bands="GSM 850 / GSM 1800 / GSM 1900 / UMTS / LTE 1700" brand="FLOW" cc="ag" country="Antigua and Barbuda" operator="Cable & Wireless Caribbean Cellular (Antigua) Limited" status="Operational" 930 bands="" cc="ag" country="Antigua and Barbuda" operator="AT&T Wireless" status="" 000-999 346 050 bands="GSM 900 / GSM 1800 / UMTS / LTE 1800" brand="Digicel" cc="ky" country="Cayman Islands (United Kingdom)" operator="Digicel Cayman Ltd." status="Operational" - 140 bands="GSM 850 / GSM 1900 / UMTS / LTE 700" brand="LIME" cc="ky" country="Cayman Islands (United Kingdom)" operator="Cable & Wireless (Cayman Islands) Limited" status="Operational" + 140 bands="GSM 850 / GSM 1900 / UMTS / LTE 700" brand="FLOW" cc="ky" country="Cayman Islands (United Kingdom)" operator="Cable & Wireless (Cayman Islands) Limited" status="Operational" 000-999 348 - 170 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="LIME" cc="vg" country="British Virgin Islands" operator="Cable & Wireless" status="Operational" + 170 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="FLOW" cc="vg" country="British Virgin Islands" operator="Cable & Wireless" status="Operational" 370 bands="" cc="vg" country="British Virgin Islands" operator="BVI Cable TV Ltd" status="" 570 bands="GSM 900 / GSM 1900" brand="CCT Boatphone" cc="vg" country="British Virgin Islands" operator="Caribbean Cellular Telephone" status="Operational" 770 bands="GSM 1800 / GSM 1900 / UMTS" brand="Digicel" cc="vg" country="British Virgin Islands" operator="Digicel (BVI) Limited" status="Operational" 000-999 350 - 00 bands="GSM 1900 / UMTS 850" brand="CellOne" cc="bm" country="Bermuda" operator="Bermuda Digital Communications Ltd." status="Operational" + 00 bands="GSM 1900 / UMTS 850 / LTE 700 / LTE 1900" brand="CellOne" cc="bm" country="Bermuda" operator="Bermuda Digital Communications Ltd." status="Operational" 01 bands="GSM 1900" brand="Digicel Bermuda" cc="bm" country="Bermuda" operator="Telecommunications (Bermuda & West Indies) Ltd" status="Reserved" 02 bands="GSM 1900 / UMTS" brand="Mobility" cc="bm" country="Bermuda" operator="M3 Wireless" status="Operational" 00-99 352 030 bands="GSM 900 / GSM 1800" brand="Digicel" cc="gd" country="Grenada" operator="Digicel Grenada Ltd." status="Operational" - 110 bands="GSM 850" brand="Cable & Wireless" cc="gd" country="Grenada" operator="Cable & Wireless Grenada Ltd." status="Operational" + 110 bands="GSM 850" brand="FLOW" cc="gd" country="Grenada" operator="Cable & Wireless Grenada Ltd." status="Operational" 000-999 354 - 860 bands="GSM 850" brand="Cable & Wireless" cc="ms" country="Montserrat (United Kingdom)" operator="Cable & Wireless" status="Operational" + 860 bands="GSM 850" brand="FLOW" cc="ms" country="Montserrat (United Kingdom)" operator="Cable & Wireless" status="Operational" 000-999 356 050 bands="GSM 900 / GSM 1800" brand="Digicel" cc="kn" country="Saint Kitts and Nevis" operator="Wireless Ventures (St Kitts-Nevis) Limited" status="Operational" 070 brand="Chippie" cc="kn" country="Saint Kitts and Nevis" operator="UTS" status="Operational" - 110 bands="GSM 850 / GSM 1900" brand="LIME" cc="kn" country="Saint Kitts and Nevis" operator="Cable & Wireless St. Kitts & Nevis Ltd" status="Operational" + 110 bands="GSM 850 / GSM 1900" brand="FLOW" cc="kn" country="Saint Kitts and Nevis" operator="Cable & Wireless St. Kitts & Nevis Ltd" status="Operational" 000-999 358 050 bands="GSM 900 / GSM 1800 / GSM 1900" brand="Digicel" cc="lc" country="Saint Lucia" status="" - 110 bands="GSM 850" cc="lc" country="Saint Lucia" operator="Cable & Wireless" status="" + 110 bands="GSM 850" brand="FLOW" cc="lc" country="Saint Lucia" operator="Cable & Wireless" status="" 000-999 360 - 070 bands="GSM 900 / GSM 1800 / GSM 1900" brand="Digicel" cc="vc" country="Saint Vincent and the Grenadines" operator="Digicel (St. Vincent and the Grenadines) Limited" status="Operational" + 050 bands="GSM 900 / GSM 1800 / GSM 1900" brand="Digicel" cc="vc" country="Saint Vincent and the Grenadines" operator="Digicel (St. Vincent and the Grenadines) Limited" status="Operational" 100 bands="GSM 850" brand="Cingular Wireless" cc="vc" country="Saint Vincent and the Grenadines" status="" - 110 bands="GSM 850" brand="Lime" cc="vc" country="Saint Vincent and the Grenadines" operator="Cable & Wireless (St. Vincent & the Grenadines) Ltd" status="Operational" + 110 bands="GSM 850" brand="FLOW" cc="vc" country="Saint Vincent and the Grenadines" operator="Cable & Wireless (St. Vincent & the Grenadines) Ltd" status="Operational" 000-999 362 31 bands="GSM" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="Eutel N.V." status="" @@ -1180,11 +1210,11 @@ 000-999 365 010 bands="" cc="ai" country="Anguilla" operator="Weblinks Limited" status="Operational" - 840 bands="GSM 850 / UMTS" brand="LIME" cc="ai" country="Anguilla" operator="Cable & Wireless" status="Operational" + 840 bands="GSM 850 / UMTS / LTE 700" brand="FLOW" cc="ai" country="Anguilla" operator="Cable & Wireless" status="Operational" 000-999 366 020 bands="GSM 900 / GSM 1900 / UMTS" brand="Digicel" cc="dm" country="Dominica" operator="Digicel Group Limited" status="Operational" - 110 bands="GSM 850 / UMTS" brand="LIME" cc="dm" country="Dominica" operator="Cable & Wireless" status="Operational" + 110 bands="GSM 850 / UMTS" brand="FLOW" cc="dm" country="Dominica" operator="Cable & Wireless" status="Operational" 000-999 368 01 bands="GSM 900 / GSM 850" brand="CUBACEL" cc="cu" country="Cuba" operator="Empresa de Telecomunicaciones de Cuba, SA" status="Operational" @@ -1197,19 +1227,19 @@ 05 bands="TD-LTE 2600" brand="Wind" cc="do" country="Dominican Republic" operator="WIND Telecom, S.A" status="Operational" 00-99 372 - 01 bands="GSM 850" brand="Voila" cc="ht" country="Haiti" operator="Communication Cellulaire d'Haiti S.A." status="Operational" + 01 bands="GSM 850" brand="Voila" cc="ht" country="Haiti" operator="Communication Cellulaire d'Haiti S.A." status="Not operational" 02 bands="GSM 1800" brand="Digicel" cc="ht" country="Haiti" operator="Unigestion Holding S.A." status="Operational" 03 bands="GSM 900 / GSM 1800 / UTMS 2100" brand="Natcom" cc="ht" country="Haiti" operator="NATCOM S.A." status="Operational" 00-99 374 - 12 bands="GSM 850 / GSM 1900 / UMTS 1900" brand="bmobile" cc="tt" country="Trinidad and Tobago" operator="TSTT" status="Operational" + 12 bands="GSM 850 / GSM 1900 / UMTS 1900 / TD-LTE 2600" brand="bmobile" cc="tt" country="Trinidad and Tobago" operator="TSTT" status="Operational" 130 bands="GSM 850 / GSM 1900 / UMTS 1900" brand="Digicel" cc="tt" country="Trinidad and Tobago" operator="Digicel (Trinidad & Tobago) Limited" status="Operational" 140 bands="CDMA" cc="tt" country="Trinidad and Tobago" operator="LaqTel Ltd." status="Not operational" 00-99 376 - 350 bands="GSM 850" brand="C&W" cc="tc" country="Turks and Caicos Islands" operator="Cable & Wireless West Indies Ltd (Turks & Caicos)" status="Operational" - 352 bands="UMTS 850" brand="IslandCom" cc="tc" country="Turks and Caicos Islands" operator="IslandCom Telecommunications" status="Operational" - 360 bands="" brand="IslandCom" cc="tc" country="Turks and Caicos Islands" operator="IslandCom Telecommunications" status="" + 350 bands="GSM 850 / LTE 700" brand="FLOW" cc="tc" country="Turks and Caicos Islands" operator="Cable & Wireless West Indies Ltd (Turks & Caicos)" status="Operational" + 352 bands="UMTS 850" brand="FLOW" cc="tc" country="Turks and Caicos Islands" operator="Cable & Wireless West Indies Ltd (Turks & Caicos)" status="Operational" + 360 bands="" brand="FLOW" cc="tc" country="Turks and Caicos Islands" operator="Cable & Wireless West Indies Ltd (Turks & Caicos)" status="" 000-999 400 01 bands="GSM 900 / GSM 1800/ UMTS 2100 / LTE 1800" brand="Azercell" cc="az" country="Azerbaijan" status="Operational" @@ -1228,86 +1258,86 @@ 00-99 402 11 bands="GSM 900 / UMTS 850 / UMTS 2100 / LTE 1800" brand="B-Mobile" cc="bt" country="Bhutan" operator="B-Mobile / Bhutan Telecom Ltd." status="Operational" - 77 bands="GSM 900 / GSM 1800 / UMTS" brand="TashiCell" cc="bt" country="Bhutan" operator="Tashi InfoComm Limited" status="Operational" + 77 bands="GSM 900 / GSM 1800 / UMTS / LTE 700" brand="TashiCell" cc="bt" country="Bhutan" operator="Tashi InfoComm Limited" status="Operational" 00-99 404 - 01 bands="GSM 900" brand="Vodafone IN" cc="in" country="India" operator="Haryana" status="Operational" + 01 bands="GSM 900" brand="Vodafone India" cc="in" country="India" operator="Haryana" status="Operational" 02 bands="GSM 900" brand="AirTel" cc="in" country="India" operator="Punjab" status="Operational" 03 bands="GSM 900" brand="AirTel" cc="in" country="India" operator="Himachal Pradesh" status="Operational" 04 bands="GSM 1800" brand="IDEA" cc="in" country="India" operator="Delhi & NCR" status="Operational" - 05 bands="GSM 900" brand="Vodafone IN" cc="in" country="India" operator="Gujarat" status="Operational" + 05 bands="GSM 900" brand="Vodafone India" cc="in" country="India" operator="Gujarat" status="Operational" 07 bands="GSM 900" brand="IDEA" cc="in" country="India" operator="Andhra Pradesh and Telangana" status="Operational" 09 bands="GSM 900" brand="Reliance" cc="in" country="India" operator="Assam" status="Operational" 10 bands="GSM 900" brand="AirTel" cc="in" country="India" operator="Delhi & NCR" status="Operational" - 11 bands="GSM 900 / GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Delhi & NCR" status="Operational" + 11 bands="GSM 900 / GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Delhi & NCR" status="Operational" 12 bands="GSM 900" brand="IDEA" cc="in" country="India" operator="Haryana" status="Operational" - 13 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Andhra Pradesh and Telangana" status="Operational" + 13 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Andhra Pradesh and Telangana" status="Operational" 14 bands="GSM 900 / GSM 1800" brand="IDEA" cc="in" country="India" operator="Punjab" status="Operational" - 15 bands="GSM 900" brand="Vodafone IN" cc="in" country="India" operator="Uttar Pradesh (East)" status="Operational" + 15 bands="GSM 900" brand="Vodafone India" cc="in" country="India" operator="Uttar Pradesh (East)" status="Operational" 16 bands="GSM 900" brand="Airtel" cc="in" country="India" operator="North East" status="Operational" 17 bands="GSM 900 / GSM 1800" brand="AIRCEL" cc="in" country="India" operator="West Bengal" status="Operational" 18 bands="GSM 900" brand="Reliance" cc="in" country="India" operator="Himachal Pradesh" status="Operational" 19 bands="GSM 900 / GSM 1800" brand="IDEA" cc="in" country="India" operator="Kerala" status="Operational" - 20 bands="GSM 900 / UMTS 2100" brand="Vodafone IN" cc="in" country="India" operator="Mumbai" status="Operational" + 20 bands="GSM 900 / UMTS 2100" brand="Vodafone India" cc="in" country="India" operator="Mumbai" status="Operational" 21 bands="GSM 900" brand="Loop Mobile" cc="in" country="India" operator="Mumbai" status="Operational" 22 bands="GSM 900" brand="IDEA" cc="in" country="India" operator="Maharashtra & Goa" status="Operational" 24 bands="GSM 900" brand="IDEA" cc="in" country="India" operator="Gujarat" status="Operational" 25 bands="GSM 900 / GSM 1800" brand="AIRCEL" cc="in" country="India" operator="Bihar" status="Operational" - 27 bands="GSM 900" brand="Vodafone IN" cc="in" country="India" operator="Maharashtra & Goa" status="Operational" + 27 bands="GSM 900" brand="Vodafone India" cc="in" country="India" operator="Maharashtra & Goa" status="Operational" 28 bands="GSM 900" brand="AIRCEL" cc="in" country="India" operator="Orissa" status="Operational" 29 bands="GSM 900" brand="AIRCEL" cc="in" country="India" operator="Assam" status="Operational" - 30 bands="GSM 900 / GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Kolkata" status="Operational" + 30 bands="GSM 900 / GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Kolkata" status="Operational" 31 bands="GSM 900" brand="AirTel" cc="in" country="India" operator="Kolkata" status="Operational" - 34 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Haryana" status="Operational" + 34 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Haryana" status="Operational" 36 bands="GSM 900" brand="Reliance" cc="in" country="India" operator="Bihar & Jharkhand" status="Operational" 37 bands="GSM 900 / UMTS 2100" brand="Aircel" cc="in" country="India" operator="Jammu & Kashmir" status="Operational" - 38 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Assam" status="Operational" + 38 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Assam" status="Operational" 40 bands="" brand="AirTel" cc="in" country="India" operator="Chennai" status="Operational" 41 bands="GSM 900" brand="Aircel" cc="in" country="India" operator="Chennai" status="Operational" 42 bands="GSM 900" brand="Aircel" cc="in" country="India" operator="Tamil Nadu" status="Operational" - 43 bands="GSM 900" brand="Vodafone IN" cc="in" country="India" operator="Tamil Nadu" status="Operational" - 44 bands="GSM 900" brand="IDEA" cc="in" country="India" operator="Karnataka" status="Operational" - 45 bands="GSM" brand="Airtel" cc="in" country="India" operator="Karnataka" status="Operational" - 46 bands="GSM 900" brand="Vodafone IN" cc="in" country="India" operator="Kerala" status="Operational" + 43 bands="GSM 900" brand="Vodafone India" cc="in" country="India" operator="Tamil Nadu" status="Operational" + 44 bands="GSM 900 / LTE 1800" brand="IDEA" cc="in" country="India" operator="Karnataka" status="Operational" + 45 bands="GSM / TD-LTE 2300" brand="Airtel" cc="in" country="India" operator="Karnataka" status="Operational" + 46 bands="GSM 900" brand="Vodafone India" cc="in" country="India" operator="Kerala" status="Operational" 48 bands="GSM 900" brand="Dishnet Wireless" cc="in" country="India" operator="" status="Operational" 49 bands="GSM 900" brand="Airtel" cc="in" country="India" operator="Andhra Pradesh and Telangana" status="Operational" 50 bands="GSM 900" brand="Reliance" cc="in" country="India" operator="North East" status="Operational" - 51 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Himachal Pradesh" status="Operational" + 51 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Himachal Pradesh" status="Operational" 52 bands="GSM 900" brand="Reliance" cc="in" country="India" operator="Orissa" status="Operational" - 53 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Punjab" status="Operational" - 54 bands="GSM 900 / UTMS 2100" brand="CellOne" cc="in" country="India" operator="Uttar Pradesh (West)" status="Operational" - 55 bands="GSM 900 / UTMS 2100" brand="CellOne" cc="in" country="India" operator="Uttar Pradesh (East)" status="Operational" + 53 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Punjab" status="Operational" + 54 bands="GSM 900 / UTMS 2100" brand="cellone" cc="in" country="India" operator="Uttar Pradesh (West)" status="Operational" + 55 bands="GSM 900 / UTMS 2100" brand="cellone" cc="in" country="India" operator="Uttar Pradesh (East)" status="Operational" 56 bands="GSM 900" brand="IDEA" cc="in" country="India" operator="Uttar Pradesh (West)" status="Operational" - 57 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Gujarat" status="Operational" - 58 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Madhya Pradesh & Chhattisgarh" status="Operational" - 59 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Rajasthan" status="Operational" - 60 bands="GSM 900" brand="Vodafone IN" cc="in" country="India" operator="Rajasthan" status="Operational" - 62 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Jammu & Kashmir" status="Operational" - 64 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Chennai" status="Operational" - 66 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Maharashtra & Goa" status="Operational" + 57 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Gujarat" status="Operational" + 58 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Madhya Pradesh & Chhattisgarh" status="Operational" + 59 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Rajasthan" status="Operational" + 60 bands="GSM 900" brand="Vodafone India" cc="in" country="India" operator="Rajasthan" status="Operational" + 62 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Jammu & Kashmir" status="Operational" + 64 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Chennai" status="Operational" + 66 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Maharashtra & Goa" status="Operational" 67 bands="GSM 900 / UMTS 2100" brand="Reliance" cc="in" country="India" operator="Madhya Pradesh & Chhattisgarh" status="Operational" 68 bands="GSM 900 / UMTS 2100" brand="DOLPHIN" cc="in" country="India" operator="Delhi & NCR" status="Operational" 69 bands="GSM 900 / UMTS 2100" brand="DOLPHIN" cc="in" country="India" operator="Mumbai" status="Operational" 70 bands="" brand="AirTel" cc="in" country="India" operator="Rajasthan" status="Operational" - 71 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Karnataka (Bangalore)" status="Operational" - 72 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Kerala" status="Operational" - 73 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Andhra Pradesh and Telangana" status="Operational" - 74 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="West Bengal" status="Operational" - 75 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Bihar" status="Operational" - 76 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Orissa" status="Operational" - 77 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="North East" status="Operational" - 78 bands="GSM 900 / UMTS 2100" brand="Idea Cellular Ltd" cc="in" country="India" operator="Madhya Pradesh & Chattishgarh" status="Operational" - 79 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Andaman Nicobar" status="Operational" - 80 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Tamil Nadu" status="Operational" - 81 bands="GSM 900 / UMTS 2100" brand="CellOne" cc="in" country="India" operator="Kolkata" status="Operational" - 82 bands="" brand="Idea" cc="in" country="India" operator="Himachal Pradesh" status="Operational" + 71 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Karnataka (Bangalore)" status="Operational" + 72 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Kerala" status="Operational" + 73 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Andhra Pradesh and Telangana" status="Operational" + 74 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="West Bengal" status="Operational" + 75 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Bihar" status="Operational" + 76 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Orissa" status="Operational" + 77 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="North East" status="Operational" + 78 bands="GSM 900 / UMTS 2100" brand="IDEA" cc="in" country="India" operator="Madhya Pradesh & Chattishgarh" status="Operational" + 79 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Andaman Nicobar" status="Operational" + 80 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Tamil Nadu" status="Operational" + 81 bands="GSM 900 / UMTS 2100" brand="cellone" cc="in" country="India" operator="Kolkata" status="Operational" + 82 bands="" brand="IDEA" cc="in" country="India" operator="Himachal Pradesh" status="Operational" 83 bands="GSM 1800" brand="Reliance" cc="in" country="India" operator="Kolkata" status="Operational" - 84 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Chennai" status="Operational" + 84 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Chennai" status="Operational" 85 bands="GSM 1800" brand="Reliance" cc="in" country="India" operator="West Bengal" status="Operational" - 86 bands="GSM 900 / UMTS 2100" brand="Vodafone IN" cc="in" country="India" operator="Karnataka" status="Operational" + 86 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Vodafone India" cc="in" country="India" operator="Karnataka" status="Operational" 87 bands="" brand="IDEA" cc="in" country="India" operator="Rajasthan" status="Operational" - 88 bands="" brand="Vodafone IN" cc="in" country="India" operator="Vodafone Punjab" status="Operational" - 89 bands="" brand="Idea" cc="in" country="India" operator="Uttar Pradesh (East)" status="Operational" + 88 bands="" brand="Vodafone India" cc="in" country="India" operator="Vodafone Punjab" status="Operational" + 89 bands="" brand="IDEA" cc="in" country="India" operator="Uttar Pradesh (East)" status="Operational" 90 bands="GSM 1800" brand="AirTel" cc="in" country="India" operator="Maharashtra" status="Operational" 91 bands="GSM 900" brand="AIRCEL" cc="in" country="India" operator="Kolkata" status="Operational" 92 bands="GSM 1800 / UMTS 2100" brand="AirTel" cc="in" country="India" operator="Mumbai" status="Operational" @@ -1368,16 +1398,16 @@ 54 bands="GSM 900" brand="AirTel" cc="in" country="India" operator="Uttar Pradesh (East)" status="Operational" 55 bands="GSM 900 / UTMS 2100" brand="Airtel" cc="in" country="India" operator="Jammu & Kashmir" status="Operational" 56 bands="GSM 900 / GSM 1800" brand="AirTel" cc="in" country="India" operator="Assam" status="Operational" - 66 bands="GSM 900 / GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Uttar Pradesh (West)" status="Operational" - 67 bands="" brand="Vodafone IN" cc="in" country="India" operator="West Bengal" status="Operational" + 66 bands="GSM 900 / GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Uttar Pradesh (West)" status="Operational" + 67 bands="" brand="Vodafone India" cc="in" country="India" operator="West Bengal" status="Operational" 70 bands="GSM 1800" brand="IDEA" cc="in" country="India" operator="Bihar & Jharkhand" status="Operational" - 750 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Jammu & Kashmir" status="Operational" - 751 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Assam" status="Operational" - 752 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Bihar & Jharkhand" status="Operational" - 753 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Orissa" status="Operational" - 754 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Himachal Pradesh" status="Operational" - 755 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="North East" status="Operational" - 756 bands="GSM 1800" brand="Vodafone IN" cc="in" country="India" operator="Madhya Pradesh & Chhattisgarh" status="Operational" + 750 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Jammu & Kashmir" status="Operational" + 751 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Assam" status="Operational" + 752 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Bihar & Jharkhand" status="Operational" + 753 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Orissa" status="Operational" + 754 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Himachal Pradesh" status="Operational" + 755 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="North East" status="Operational" + 756 bands="GSM 1800" brand="Vodafone India" cc="in" country="India" operator="Madhya Pradesh & Chhattisgarh" status="Operational" 799 bands="GSM 900 / GSM 1800" brand="IDEA" cc="in" country="India" operator="Mumbai" status="Operational" 800 bands="GSM 1800" brand="AIRCEL" cc="in" country="India" operator="Delhi & NCR" status="Operational" 801 bands="GSM 1800" brand="AIRCEL" cc="in" country="India" operator="Andhra Pradesh and Telangana" status="Operational" @@ -1418,7 +1448,7 @@ 858 bands="" brand="Jio" cc="in" country="India" operator="Haryana" status="Reserved" 859 bands="" brand="Jio" cc="in" country="India" operator="Himachal Pradesh" status="Reserved" 860 bands="" brand="Jio" cc="in" country="India" operator="Jammu Kashmir" status="Reserved" - 861 bands="" brand="Jio" cc="in" country="India" operator="Karnataka" status="Reserved" + 861 bands="LTE 1800 / TD-LTE 2300" brand="Jio" cc="in" country="India" operator="Karnataka" status="Reserved" 862 bands="" brand="Jio" cc="in" country="India" operator="Kerala" status="Reserved" 863 bands="" brand="Jio" cc="in" country="India" operator="Madhyya Pradesh" status="Reserved" 864 bands="" brand="Jio" cc="in" country="India" operator="Maharashtra" status="Reserved" @@ -1476,7 +1506,7 @@ 01 bands="GSM 900 / UMTS 2100" brand="MPT" cc="mm" country="Myanmar" operator="Myanmar Posts and Telecommunications" status="Operational" 03 bands="CDMA 800" brand="CDMA800" cc="mm" country="Myanmar" operator="Myanmar Economic Corporation" status="Operational" 05 bands="UMTS 900 / UMTS 2100" brand="Ooredoo" cc="mm" country="Myanmar" operator="Ooredoo Myanmar" status="Operational" - 06 bands="GSM 900 / UMTS 2100" brand="Telenor Myanmar" cc="mm" country="Myanmar" operator="Telenor Myanmar (Comcel Myanmar)" status="Operational" + 06 bands="GSM 900 / UMTS 2100" brand="Telenor" cc="mm" country="Myanmar" operator="Telenor Myanmar" status="Operational" 00-99 415 01 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Alfa" cc="lb" country="Lebanon" operator="MIC 1" status="Operational" @@ -1584,11 +1614,12 @@ 00-99 432 11 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="IR-MCI (Hamrahe Avval)" cc="ir" country="Iran" operator="Mobile Communications Company of Iran" status="Operational" + 12 bands="LTE 800" brand="Avacell" cc="ir" country="Iran" operator="Dadeh Dostar asr Novin p.j.s. co & Information Technology Company of Iran" status="Operational" 14 bands="GSM 900" brand="TKC" cc="ir" country="Iran" operator="Telecommunication Kish Company" status="Operational" 19 bands="GSM 900" brand="MTCE (Espadan)" cc="ir" country="Iran" operator="Mobile Telecommunications Company of Esfahan" status="Operational" - 20 bands="UMTS 900 / UMTS 2100 / LTE 1800" brand="Rightel" cc="ir" country="Iran" status="Operational" - 32 bands="GSM 900 / GSM 1800" brand="Taliya" cc="ir" country="Iran" operator="Rafsanjan Industrial Complex" status="Operational" - 35 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="MTN Irancell" cc="ir" country="Iran" operator="MTN Irancell Telecommunications Services Company" status="Operational" + 20 bands="UMTS 900 / UMTS 2100 / LTE 1800" brand="Rightel" cc="ir" country="Iran" operator="Social Security Investment Co." status="Operational" + 32 bands="GSM 900 / GSM 1800" brand="Taliya" cc="ir" country="Iran" operator="TCI of Iran and Iran Mobin" status="Operational" + 35 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="MTN Irancell" cc="ir" country="Iran" operator="MTN Irancell Telecommunications Services Company" status="Operational" 70 bands="GSM 900 / GSM 1800" brand="TCI" cc="ir" country="Iran" operator="Telephone Communications Company of Iran" status="Operational" 93 bands="GSM 1800" brand="Iraphone" cc="ir" country="Iran" operator="Iraphone" status="Operational" 00-99 @@ -1605,7 +1636,7 @@ 436 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Tcell" cc="tj" country="Tajikistan" operator="JV Somoncom" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Tcell" cc="tj" country="Tajikistan" operator="Indigo Tajikistan" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Megafon Tajikistan" cc="tj" country="Tajikistan" operator="TT Mobile" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="MegaFon" cc="tj" country="Tajikistan" operator="TT Mobile" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100" brand="Babilon-M" cc="tj" country="Tajikistan" operator="Babilon-Mobile" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Beeline" cc="tj" country="Tajikistan" operator="Tacom" status="Operational" 12 bands="UMTS 2100" brand="Tcell" cc="tj" country="Tajikistan" operator="Indigo" status="" @@ -1624,7 +1655,7 @@ 440 00 bands="UMTS 1800" brand="Y!Mobile" cc="jp" country="Japan" operator="SoftBank Corp." status="Operational" 01 bands="WiMAX 2500" brand="UQ WiMAX" cc="jp" country="Japan" operator="UQ Communications Inc." status="Operational" - 02 bands="WiMAX 2500" cc="jp" country="Japan" operator="Hanshin Cable Enginerring Co., Ltd." status="" + 02 bands="WiMAX 2500" cc="jp" country="Japan" operator="Hanshin Cable Engineering Co., Ltd." status="" 05 bands="TD-LTE 2500" cc="jp" country="Japan" operator="Wireless City Planning Inc." status="Operational" 10 bands="UMTS 850 / UMTS 1800 / UMTS 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100" brand="NTT docomo" cc="jp" country="Japan" operator="NTT DoCoMo, Inc." status="Operational" 20 bands="UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100" brand="SoftBank" cc="jp" country="Japan" operator="SoftBank Corp." status="Operational" @@ -1675,7 +1706,7 @@ 04 bands="GSM 900 / GSM 1800" brand="3 (2G)" cc="hk" country="Hong Kong" operator="Hutchison Telecom" status="Operational" 05 bands="CDMA 800" brand="3 (CDMA)" cc="hk" country="Hong Kong" operator="Hutchison Telecom" status="Not operational" 06 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800 / LTE 2600" brand="SmarTone" cc="hk" country="Hong Kong" operator="SmarTone Mobile Communications Limited" status="Operational" - 07 bands="MVNO" cc="hk" country="Hong Kong" operator="China Unicom (Hong Kong) Limited" status="Operational" + 07 bands="MVNO" brand="China Unicom" cc="hk" country="Hong Kong" operator="China Unicom (Hong Kong) Limited" status="Operational" 08 bands="MVNO" brand="Truphone" cc="hk" country="Hong Kong" operator="Truphone Limited" status="Operational" 09 bands="MVNO" cc="hk" country="Hong Kong" operator="China Motion Telecom" status="Operational" 10 bands="GSM 1800" brand="New World Mobility" cc="hk" country="Hong Kong" operator="CSL Limited" status="Not Operational" @@ -1691,7 +1722,7 @@ 20 bands="" cc="hk" country="Hong Kong" operator="PCCW-HKT" status="" 21 bands="" cc="hk" country="Hong Kong" operator="21Vianet Mobile Ltd." status="" 22 bands="" cc="hk" country="Hong Kong" operator="Delcom (HK) Ltd" status="" - 23 bands="MVNO" cc="hk" country="Hong Kong" operator="Lycamobile Hong Kong Ltd" status="Operational" + 23 bands="MVNO" brand="Lycamobile" cc="hk" country="Hong Kong" operator="Lycamobile Hong Kong Ltd" status="Operational" 29 bands="CDMA 800" brand="PCCW Mobile (CDMA)" cc="hk" country="Hong Kong" operator="PCCW-HKT" status="Operational" 00-99 455 @@ -1705,19 +1736,19 @@ 07 bands="LTE" brand="China Telecom" cc="mo" country="Macau (China)" operator="China Telecom (Macau) Limitada" status="Operational" 00-99 456 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Cellcard ( Mobitel )" cc="kh" country="Cambodia" operator="The Royal Group" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Smart Axiata" cc="kh" country="Cambodia" operator="Smart Axiata Co. Ltd" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Cellcard" cc="kh" country="Cambodia" operator="CamGSM / The Royal Group" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Smart" cc="kh" country="Cambodia" operator="Smart Axiata Co. Ltd" status="Operational" 03 bands="GSM 1800 / UMTS 2100" brand="qb" cc="kh" country="Cambodia" operator="Cambodia Advance Communications Co. Ltd" status="Operational" 04 bands="GSM 1800 / UMTS 2100" brand="qb" cc="kh" country="Cambodia" operator="Cambodia Advance Communications Co. Ltd" status="Operational" - 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Smart Axiata" cc="kh" country="Cambodia" operator="Smart Axiata Co. Ltd" status="Operational" - 06 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Smart Axiata" cc="kh" country="Cambodia" operator="Smart Axiata Co. Ltd" status="Operational" + 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Smart" cc="kh" country="Cambodia" operator="Smart Axiata Co. Ltd" status="Operational" + 06 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Smart" cc="kh" country="Cambodia" operator="Smart Axiata Co. Ltd" status="Operational" 08 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Metfone" cc="kh" country="Cambodia" operator="Viettel" status="Operational" - 09 bands="GSM 900 / GSM 1800" brand="Beeline" cc="kh" country="Cambodia" operator="Sotelco Ltd." status="Operational" - 11 bands="CDMA2000" brand="Excell" cc="kh" country="Cambodia" status="Operational" + 09 bands="GSM 900 / GSM 1800" brand="Metfone" cc="kh" country="Cambodia" operator="Viettel" status="Operational" + 11 bands="LTE 850" brand="SEATEL" cc="kh" country="Cambodia" operator="SEATEL Cambodia" status="Operational" 18 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Cellcard" cc="kh" country="Cambodia" operator="The Royal Group" status="Operational" 00-99 457 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="LTC" cc="la" country="Laos" operator="Lao Telecom" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="LaoTel" cc="la" country="Laos" operator="Lao Telecom" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="ETL" cc="la" country="Laos" operator="Enterprise of Telecommunications Lao" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE" brand="Unitel" cc="la" country="Laos" operator="Star Telecom Co., Ltd" status="Operational" 08 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Beeline" cc="la" country="Laos" operator="VimpelCom Lao Ltd" status="Operational" @@ -1731,12 +1762,13 @@ 05 bands="CDMA2000 800 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2600" brand="China Telecom" cc="cn" country="China" operator="China Telecom" status="Not operational" 06 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="China Unicom" cc="cn" country="China" operator="China Unicom" status="Not operational" 07 bands="GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2600" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="Not operational" + 08 bands="" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="" 09 bands="" brand="China Unicom" cc="cn" country="China" operator="China Unicom" status="" 11 bands="" brand="China Telecom" cc="cn" country="China" operator="China Telecom" status="" 20 bands="GSM-R" brand="China Tietong" cc="cn" country="China" operator="China Tietong" status="Operational" 00-99 466 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800" brand="FarEasTone" cc="tw" country="Taiwan" operator="Far EasTone Telecommunications Co Ltd" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600" brand="FarEasTone" cc="tw" country="Taiwan" operator="Far EasTone Telecommunications Co Ltd" status="Operational" 02 bands="GSM 900" brand="FarEasTone" cc="tw" country="Taiwan" operator="Far EasTone Telecommunications Co Ltd" status="" 03 bands="UMTS 2100" brand="FarEasTone" cc="tw" country="Taiwan" operator="Far EasTone Telecommunications Co Ltd" status="" 05 bands="CDMA2000 800 / LTE 700" brand="APTG" cc="tw" country="Taiwan" operator="Asia Pacific Telecom" status="Operational" @@ -1758,7 +1790,8 @@ 00-99 467 05 bands="UMTS 2100" brand="Koryolink" cc="kp" country="North Korea" operator="Cheo Technology Jv Company" status="Operational" - 193 bands="GSM 900" brand="SunNet" cc="kp" country="North Korea" operator="Korea Posts and Telecommunications Corporation" status="Discontinued" + 06 bands="UMTS 2100" brand="Koryolink" cc="kp" country="North Korea" operator="Cheo Technology Jv Company" status="Operational" + 193 bands="GSM 900" brand="SunNet" cc="kp" country="North Korea" operator="Korea Posts and Telecommunications Corporation" status="Not operational" 00-99 470 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Grameenphone" cc="bd" country="Bangladesh" operator="GrameenPhone Ltd" status="Operational" @@ -1767,6 +1800,7 @@ 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="TeleTalk" cc="bd" country="Bangladesh" operator="Teletalk Bangladesh Limited" status="Operational" 05 bands="CDMA 800 / GSM 900 / GSM 1800" brand="Citycell" cc="bd" country="Bangladesh" operator="Pacific Bangladesh Telecom Limited" status="Operational" 07 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel" cc="bd" country="Bangladesh" operator="Bharti airtel Bangladesh Ltd." status="Operational" + 09 bands="LTE 800 / LTE 2600 / WiMAX" brand="ollo" cc="bd" country="Bangladesh" operator="Bangladesh Internet Exchange Limited (BIEL)" status="Operational" 00-99 472 01 bands="GSM 900 / UMTS 2100" brand="Dhiraagu" cc="mv" country="Maldives" operator="Dhivehi Raajjeyge Gulhun" status="Operational" @@ -1826,6 +1860,9 @@ 31 bands="" cc="au" country="Australia" operator="BHP Billiton" status="" 32 bands="" cc="au" country="Australia" operator="Thales Australia" status="" 33 bands="" cc="au" country="Australia" operator="CLX Networks Pty Ltd" status="" + 34 bands="" cc="au" country="Australia" operator="Santos Limited" status="" + 35 bands="" cc="au" country="Australia" operator="MessageBird Pty Ltd" status="" + 36 bands="" brand="Optus" cc="au" country="Australia" operator="Optus Mobile Pty. Ltd." status="" 38 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Crazy John's" cc="au" country="Australia" operator="Vodafone Hutchison Australia Proprietary Limited" status="Operational" 62 bands="LTE 2300" brand="NBN" cc="au" country="Australia" operator="National Broadband Network Co." status="" 68 bands="LTE 2300" brand="NBN" cc="au" country="Australia" operator="National Broadband Network Co." status="" @@ -1847,7 +1884,7 @@ 20 bands="GSM 1800" brand="TELKOMMobile" cc="id" country="Indonesia" operator="PT Telkom Indonesia Tbk" status="Not operational" 21 bands="GSM 1800" brand="IM3" cc="id" country="Indonesia" operator="PT Indonesian Satellite Corporation Tbk (INDOSAT)" status="Not operational" 27 bands="CDMA 450" brand="Ceria" cc="id" country="Indonesia" operator="PT Sampoerna Telekomunikasi Indonesia" status="Operational" - 28 bands="CDMA 800 LTE 850 / TD-LTE 2300" brand="Fren/Hepi" cc="id" country="Indonesia" operator="PT Mobile-8 Telecom" status="Operational" + 28 bands="CDMA 800 / LTE 850 / TD-LTE 2300" brand="Fren/Hepi" cc="id" country="Indonesia" operator="PT Mobile-8 Telecom" status="Operational" 88 bands="TD-LTE 2300" brand="BOLT! Super 4G" cc="id" country="Indonesia" operator="PT Internux" status="Operational" 89 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="3" cc="id" country="Indonesia" operator="PT Hutchison CP Telecommunications" status="Operational" 99 bands="CDMA 800" brand="Esia" cc="id" country="Indonesia" operator="PT Bakrie Telecom" status="Operational" @@ -1860,19 +1897,19 @@ 515 01 bands="GSM 900" brand="Islacom" cc="ph" country="Philippines" operator="Globe Telecom via Innove Communications" status="Not operational" 02 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Globe" cc="ph" country="Philippines" operator="Globe Telecom" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800" brand="Smart" cc="ph" country="Philippines" operator="PLDT via Smart Communications" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800" brand="SMART" cc="ph" country="Philippines" operator="PLDT via Smart Communications" status="Operational" 05 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="Sun" cc="ph" country="Philippines" operator="Digital Telecommunications Philippines" status="Operational" 11 bands="" cc="ph" country="Philippines" operator="PLDT via ACeS Philippines" status="" - 18 bands="GSM 900 / UMTS 2100 (defunct)" brand="Cure" cc="ph" country="Philippines" operator="PLDT via Smart's Connectivity Unlimited Resources Enterprise" status="Operational" + 18 bands="GSM 900 / UMTS 2100" brand="Cure" cc="ph" country="Philippines" operator="PLDT via Smart's Connectivity Unlimited Resources Enterprise" status="Not operational" 24 bands="" brand="ABS-CBN" cc="ph" country="Philippines" operator="ABS-CBN Convergence with Globe Telecom" status="Operational" 88 bands="" cc="ph" country="Philippines" operator="Nextel" status="" 00-99 520 00 bands="UMTS 850" brand="my by CAT" cc="th" country="Thailand" operator="CAT Telecom" status="Operational" - 01 bands="GSM 900" brand="AIS" cc="th" country="Thailand" operator="Advanced Info Service" status="Operational" + 01 bands="GSM 900 / UMTS 900" brand="AIS" cc="th" country="Thailand" operator="Advanced Info Service" status="Not operational" 02 bands="CDMA 800" brand="CAT CDMA" cc="th" country="Thailand" operator="CAT Telecom" status="Not operational" 03 bands="UMTS 2100 / LTE 1800" brand="AIS" cc="th" country="Thailand" operator="Advanced Wireless Network Company Ltd." status="Operational" - 04 bands="UMTS 2100 / LTE 1800 / LTE 2100" brand="TrueMove H 4G LTE" cc="th" country="Thailand" operator="Real Future Company Ltd." status="Operational" + 04 bands="UMTS 2100 / LTE 1800 / LTE 2100" brand="TrueMove H" cc="th" country="Thailand" operator="Real Future Company Ltd." status="Operational" 05 bands="UMTS 850 / UMTS 2100 / LTE 1800 / LTE 2100" brand="dtac TriNet" cc="th" country="Thailand" operator="DTAC Network Company Ltd." status="Operational" 15 bands="UMTS 2100" brand="TOT 3G" cc="th" country="Thailand" operator="TOT Public Company Limited" status="Operational" 18 bands="GSM 1800" brand="dtac" cc="th" country="Thailand" operator="Total Access Communications Public Company Ltd." status="Operational" @@ -1889,6 +1926,7 @@ 05 bands="GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="StarHub" cc="sg" country="Singapore" operator="StarHub Mobile" status="Operational" 06 bands="" brand="StarHub" cc="sg" country="Singapore" operator="StarHub Mobile" status="" 07 bands="" brand="SingTel" cc="sg" country="Singapore" operator="Singapore Telecom" status="" + 08 bands="" brand="StarHub" cc="sg" country="Singapore" operator="StarHub Mobile" status="" 12 bands="iDEN 800" brand="Grid" cc="sg" country="Singapore" operator="GRID Communications Pte Ltd." status="Operational" 00-99 528 @@ -1901,8 +1939,8 @@ 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600" brand="Vodafone" cc="nz" country="New Zealand" operator="Vodafone New Zealand" status="Operational" 02 bands="CDMA2000 800" brand="Telecom" cc="nz" country="New Zealand" operator="Telecom New Zealand" status="Not operational" 03 bands="UMTS-TDD 2000" brand="Woosh" cc="nz" country="New Zealand" operator="Woosh Wireless" status="Operational" - 04 bands="UMTS 2100" brand="TelstraClear" cc="nz" country="New Zealand" operator="TelstraClear New Zealand" status="Not operational" - 05 bands="UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600" brand="Spark NZ" cc="nz" country="New Zealand" operator="Spark New Zealand" status="Operational" + 04 bands="UMTS 2100" brand="Vodafone" cc="nz" country="New Zealand" operator="TelstraClear New Zealand" status="Not operational" + 05 bands="UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600" brand="Spark" cc="nz" country="New Zealand" operator="Spark New Zealand" status="Operational" 06 bands="MVNO" brand="Skinny" cc="nz" country="New Zealand" operator="Spark New Zealand" status="Operational" 07 bands="" cc="nz" country="New Zealand" operator="Bluereach Limited" status="" 24 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800" brand="2degrees" cc="nz" country="New Zealand" operator="2degrees" status="Operational" @@ -1912,7 +1950,7 @@ 00-99 537 01 bands="GSM 900 / UMTS 900" brand="bmobile" cc="pg" country="Papua New Guinea" operator="Bemobile Limited" status="Operational" - 02 bands="CDMA2000 450" cc="pg" country="Papua New Guinea" operator="Telikom PNG Ltd." status="Operational" + 02 bands="CDMA2000 450" brand="citifon" cc="pg" country="Papua New Guinea" operator="Telikom PNG Ltd." status="Operational" 03 bands="GSM 900 / UMTS 900 / LTE 700" brand="Digicel" cc="pg" country="Papua New Guinea" operator="Digicel PNG" status="Operational" 00-99 539 @@ -1978,7 +2016,7 @@ 01 bands="GSM 900" brand="Telecom Niue" cc="nu" country="Niue" operator="Telecom Niue" status="Operational" 00-99 602 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Mobinil" cc="eg" country="Egypt" operator="ECMS-Mobinil" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Orange" cc="eg" country="Egypt" operator="Orange Egypt" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Vodafone" cc="eg" country="Egypt" operator="Vodafone Egypt" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Etisalat" cc="eg" country="Egypt" operator="Etisalat Egypt" status="Operational" 00-99 @@ -1994,9 +2032,9 @@ 05 bands="GSM 900 / GSM 1800 / LTE 1800" brand="INWI (Telecommunications)" cc="ma" country="Morocco" operator="WANA - Groupe ONA" status="Operational" 00-99 605 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Orange" cc="tn" country="Tunisia" operator="Orange Tunisie" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Tunicell" cc="tn" country="Tunisia" operator="Tunisie Telecom" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="OOREDOO TN" cc="tn" country="Tunisia" operator="ooredoo Tunisiana" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Orange" cc="tn" country="Tunisia" operator="Orange Tunisie" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Tunicell" cc="tn" country="Tunisia" operator="Tunisie Telecom" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="OOREDOO TN" cc="tn" country="Tunisia" operator="ooredoo Tunisiana" status="Operational" 00-99 606 00 bands="GSM900 / GSM 1800 / UMTS 2100" brand="Libyana" cc="ly" country="Libya" operator="Libyana" status="Operational" @@ -2007,7 +2045,7 @@ 00-99 607 01 bands="GSM 900 / GSM 1900" brand="Gamcel" cc="gm" country="Gambia" operator="Gamcel" status="Operational" - 02 bands="GSM 900 / GSM 1900" brand="Africel" cc="gm" country="Gambia" operator="Africel" status="Operational" + 02 bands="GSM 900 / GSM 1900" brand="Africell" cc="gm" country="Gambia" operator="Africell" status="Operational" 03 bands="GSM 900 / GSM 1900" brand="Comium" cc="gm" country="Gambia" operator="Comium" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="QCell" cc="gm" country="Gambia" operator="QCell Gambia" status="Operational" 00-99 @@ -2027,7 +2065,7 @@ 02 bands="GSM 900" brand="Orange" cc="ml" country="Mali" operator="Orange Mali SA" status="Operational" 00-99 611 - 01 bands="GSM 900 / GSM 1800" brand="Orange S.A." cc="gn" country="Guinea" operator="Orange" status="Operational" + 01 bands="GSM 900 / GSM 1800" brand="Orange" cc="gn" country="Guinea" operator="Orange S.A." status="Operational" 02 bands="GSM 900" brand="Sotelgui" cc="gn" country="Guinea" operator="Sotelgui Lagui" status="Operational" 03 bands="GSM 900" brand="Telecel Guinee" cc="gn" country="Guinea" operator="INTERCEL Guinée" status="Operational" 04 bands="GSM 900 / GSM 1800" brand="MTN" cc="gn" country="Guinea" operator="Areeba Guinea" status="Operational" @@ -2073,9 +2111,9 @@ 00-99 618 01 bands="GSM 900" brand="Lonestar Cell" cc="lr" country="Liberia" operator="Lonestar Communications Corporation" status="Operational" - 02 bands="" brand="Libercell" cc="lr" country="Liberia" operator="Atlantic Wireless (Liberia) Inc." status="Operational" - 04 bands="GSM 900" brand="Comium" cc="lr" country="Liberia" operator="Comium Liberia" status="Operational" - 07 bands="GSM 900 / GSM 1800" brand="Cellcom" cc="lr" country="Liberia" operator="Cellcom Telecommunications, Inc" status="Operational" + 02 bands="" brand="Libercell" cc="lr" country="Liberia" operator="Atlantic Wireless (Liberia) Inc." status="Not operational" + 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Novafone" cc="lr" country="Liberia" operator="Novafone Inc." status="Operational" + 07 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE" brand="Cellcom" cc="lr" country="Liberia" operator="Cellcom Telecommunications, Inc." status="Operational" 20 bands="CDMA2000" brand="LIBTELCO" cc="lr" country="Liberia" operator="Liberia Telecommunications Corporation" status="Operational" 00-99 619 @@ -2091,8 +2129,8 @@ 50 bands="CDMA" cc="sl" country="Sierra Leone" operator="Datatel (SL) Ltd." status="" 00-99 620 - 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="MTN" cc="gh" country="Ghana" operator="MTN Group" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS" brand="Vodafone" cc="gh" country="Ghana" operator="Vodafone Group" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800" brand="MTN" cc="gh" country="Ghana" operator="MTN Group" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS / LTE 1800" brand="Vodafone" cc="gh" country="Ghana" operator="Vodafone Group" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS" brand="tiGO" cc="gh" country="Ghana" operator="Millicom Ghana" status="Operational" 04 bands="CDMA2000" brand="Expresso" cc="gh" country="Ghana" operator="Kasapa / Hutchison Telecom" status="Operational" 06 bands="GSM 900 / GSM 1800 / UMTS" brand="Airtel" cc="gh" country="Ghana" operator="Airtel" status="Operational" @@ -2108,15 +2146,15 @@ 25 bands="CDMA2000 800 / CDMA2000 1900" brand="Visafone" cc="ng" country="Nigeria" operator="Visafone Communications Ltd." status="Operational" 26 bands="TD-LTE 2300" cc="ng" country="Nigeria" operator="Swift" status="Operational" 27 bands="LTE 800" brand="Smile" cc="ng" country="Nigeria" operator="Smile Communications Nigeria" status="Operational" - 30 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="MTN" cc="ng" country="Nigeria" operator="MTN Nigeria Communications Limited" status="Operational" - 40 bands="GSM 900 / GSM 1800" brand="M-Tel" cc="ng" country="Nigeria" operator="Nigerian Mobile Telecommunications Limited" status="Not operational" + 30 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="MTN" cc="ng" country="Nigeria" operator="MTN Nigeria Communications Limited" status="Operational" + 40 bands="LTE 900 / LTE 1800" brand="Ntel" cc="ng" country="Nigeria" operator="Nigerian Mobile Telecommunications Limited" status="Operational" 50 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Glo" cc="ng" country="Nigeria" operator="Globacom Ltd" status="Operational" 60 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Etisalat" cc="ng" country="Nigeria" operator="Emerging Markets Telecommunication Services Ltd (Etisalat)" status="Operational" 00-99 622 01 bands="GSM 900 / UMTS" brand="Airtel" cc="td" country="Chad" operator="Bharti Airtel SA" status="Operational" 02 bands="CDMA2000" brand="Tawali" cc="td" country="Chad" operator="SotelTchad" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS" brand="Tigo" cc="td" country="Chad" operator="Millicom" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS / LTE 2600" brand="Tigo" cc="td" country="Chad" operator="Millicom" status="Operational" 07 bands="GSM 900 / GSM 1800" brand="Salam" cc="td" country="Chad" operator="SotelTchad" status="Operational" 00-99 623 @@ -2128,7 +2166,7 @@ 624 01 bands="GSM 900" brand="MTN Cameroon" cc="cm" country="Cameroon" operator="Mobile Telephone Network Cameroon Ltd" status="Operational" 02 bands="GSM 900" brand="Orange" cc="cm" country="Cameroon" operator="Orange Cameroun S.A." status="Operational" - 04 bands="" brand="Nexttel" cc="cm" country="Cameroon" operator="Nexttel" status="Operational" + 04 bands="" brand="Nexttel" cc="cm" country="Cameroon" operator="Nexttel" status="Not operational" 00-99 625 01 bands="GSM 900 / UMTS" brand="CVMOVEL" cc="cv" country="Cape Verde" operator="CVMóvel, S.A." status="Operational" @@ -2155,11 +2193,11 @@ 00-99 630 01 bands="GSM 900 / GSM 1800 / UMTS" brand="Vodacom" cc="cd" country="Democratic Republic of the Congo" operator="Vodacom Congo RDC sprl" status="Operational" - 02 bands="GSM 900 / UMTS" brand="airtel" cc="cd" country="Democratic Republic of the Congo" operator="Airtel sprl" status="Operational" + 02 bands="GSM 900 / UMTS" brand="Airtel" cc="cd" country="Democratic Republic of the Congo" operator="Airtel sprl" status="Operational" 04 bands="" cc="cd" country="Democratic Republic of the Congo" operator="Cellco" status="" 05 bands="GSM 900 / GSM 1800" brand="Supercell" cc="cd" country="Democratic Republic of the Congo" operator="Supercell SPRL" status="Operational" - 10 bands="" brand="Libertis Telecom" cc="cd" country="Democratic Republic of the Congo" status="Operational" - 86 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Orange" cc="cd" country="Democratic Republic of the Congo" operator="Orange RDC sarl" status="Operational" + 10 bands="GSM" brand="MTN" cc="cd" country="Democratic Republic of the Congo" status="Operational" + 86 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Orange S.A." cc="cd" country="Democratic Republic of the Congo" operator="Orange RDC sarl" status="Operational" 88 bands="GSM 900 / GSM 1800" brand="YTT" cc="cd" country="Democratic Republic of the Congo" operator="Yozma Timeturns sprl" status="Not operational" 89 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Tigo" cc="cd" country="Democratic Republic of the Congo" operator="OASIS sprl" status="Operational" 90 bands="GSM 900 / GSM 1800" brand="Africell" cc="cd" country="Democratic Republic of the Congo" operator="Africell RDC sprl" status="Operational" @@ -2180,10 +2218,10 @@ 10 bands="GSM 900 / UMTS 2100 / LTE 800" brand="Airtel" cc="sc" country="Seychelles" operator="Telecom Seychelles Ltd" status="Operational" 00-99 634 - 01 bands="GSM 900 / UMTS 2100" brand="Zain SD" cc="sd" country="Sudan" operator="Zain Group - Sudan" status="Operational" + 01 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Zain SD" cc="sd" country="Sudan" operator="Zain Group - Sudan" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="MTN" cc="sd" country="Sudan" operator="MTN Sudan" status="Operational" 03 bands="" brand="MTN" cc="sd" country="Sudan" operator="MTN Sudan" status="" - 05 bands="CDMA2000 450" brand="Canar Telecom" cc="sd" country="Sudan" status="Operational" + 05 bands="CDMA2000 450" brand="canar" cc="sd" country="Sudan" operator="Canar Telecom" status="Operational" 07 bands="GSM 1800 / UMTS 2100 / CDMA2000 800" brand="Sudani One" cc="sd" country="Sudan" operator="Sudatel Group" status="Operational" 09 brand="Privet Network" cc="sd" country="Sudan" operator="NEC" status="" 00-99 @@ -2196,7 +2234,7 @@ 17 bands="LTE 800" brand="Olleh" cc="rw" country="Rwanda" operator="Olleh Rwanda Networks" status="Operational" 00-99 636 - 01 bands="GSM 900 / GSM 1800 / UMTS 21000" brand="ETH-MTN" cc="et" country="Ethiopia" operator="Ethio Telecom" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="MTN" cc="et" country="Ethiopia" operator="Ethio Telecom" status="Operational" 00-99 637 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Telesom" cc="so" country="Somalia" operator="Telesom" status="Operational" @@ -2205,7 +2243,7 @@ 30 bands="GSM 900" brand="Golis" cc="so" country="Somalia" operator="Golis Telecom Somalia" status="Operational" 50 bands="GSM 900 / UMTS" brand="Hormuud" cc="so" country="Somalia" operator="Hormuud Telecom Somalia Inc" status="Operational" 57 bands="GSM 900 / GSM 1800" brand="UNITEL" cc="so" country="Somalia" operator="UNITEL S.a.r.l." status="Operational" - 60 bands="GSM 900 / GSM 1800" brand="Nationlink Telecom" cc="so" country="Somalia" operator="Nationlink Telecom" status="Operational" + 60 bands="GSM 900 / GSM 1800" brand="Nationlink" cc="so" country="Somalia" operator="Nationlink Telecom" status="Operational" 67 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Horntel Group" cc="so" country="Somalia" operator="HTG Group Somalia" status="Operational" 70 bands="" cc="so" country="Somalia" operator="Onkod Telecom Ltd." status="Not operational" 71 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Somtel" cc="so" country="Somalia" operator="Somtel" status="Operational" @@ -2222,9 +2260,9 @@ 00-99 640 01 bands="" cc="tz" country="Tanzania" operator="Rural NetCo Limited" status="" - 02 bands="GSM 900 / GSM 1800" brand="tiGO" cc="tz" country="Tanzania" operator="MIC Tanzania Limited" status="Operational" - 03 bands="GSM 900 / GSM 1800" brand="Zantel" cc="tz" country="Tanzania" operator="Zanzibar Telecom Ltd" status="Operational" - 04 bands="GSM 900 / GSM 1800" brand="Vodacom" cc="tz" country="Tanzania" operator="Vodacom Tanzania Limited" status="Operational" + 02 bands="GSM 900 / GSM 1800 / LTE 800" brand="tiGO" cc="tz" country="Tanzania" operator="MIC Tanzania Limited" status="Operational" + 03 bands="GSM 900 / GSM 1800 / LTE 1800" brand="Zantel" cc="tz" country="Tanzania" operator="Zanzibar Telecom Ltd" status="Operational" + 04 bands="GSM 900 / GSM 1800 / LTE 1800" brand="Vodacom" cc="tz" country="Tanzania" operator="Vodacom Tanzania Limited" status="Operational" 05 bands="GSM 900 / GSM 1800" brand="Airtel" cc="tz" country="Tanzania" operator="Bharti Airtel" status="Operational" 06 bands="CDMA" brand="Sasatel" cc="tz" country="Tanzania" operator="Dovetel Limited" status="Operational" 07 bands="CDMA 800" brand="TTCL Mobile" cc="tz" country="Tanzania" operator="Tanzania Telecommunication Company LTD (TTCL)" status="Operational" @@ -2237,7 +2275,7 @@ 01 bands="GSM 900 / UMTS 2100" brand="Airtel" cc="ug" country="Uganda" operator="Bharti Airtel" status="Operational" 06 bands="TD-LTE 2600" brand="Vodafone" cc="ug" country="Uganda" operator="Afrimax Uganda" status="Operational" 10 bands="GSM 900 / UMTS 900 / UMTS 2100 / TD-LTE 2600" brand="MTN" cc="ug" country="Uganda" operator="MTN Uganda" status="Operational" - 11 bands="GSM 900 / UMTS 2100" brand="UTL" cc="ug" country="Uganda" operator="Uganda Telecom Ltd." status="Operational" + 11 bands="GSM 900 / UMTS 2100" brand="Uganda Telecom" cc="ug" country="Uganda" operator="Uganda Telecom Ltd." status="Operational" 14 bands="GSM 900 / GSM 1800 / UMTS / LTE 800" brand="Africell" cc="ug" country="Uganda" operator="Africell Uganda" status="Operational" 18 bands="GSM 900 / GSM 1800" cc="ug" country="Uganda" operator="Suretelecom" status="Operational" 22 bands="GSM 900 / GSM 1800 / UMTS" brand="Airtel" cc="ug" country="Uganda" operator="Bharti Airtel" status="Operational" @@ -2249,7 +2287,7 @@ 00-99 642 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Spacetel" cc="bi" country="Burundi" operator="Econet Wireless Burundi PLC" status="Operational" - 02 bands="GSM 900" brand="Tempo" cc="bi" country="Burundi" operator="Africell PLC" status="Operational" + 02 bands="GSM 900" brand="Tempo" cc="bi" country="Burundi" operator="VTEL MEA" status="Not operational" 03 bands="GSM 900" brand="Onatel" cc="bi" country="Burundi" operator="Onatel" status="Operational" 07 bands="GSM 1800 / UMTS" brand="Smart Mobile" cc="bi" country="Burundi" operator="LACELL SU" status="Operational" 08 bands="" brand="HiTs Telecom" cc="bi" country="Burundi" operator="HiTs Telecom" status="Not operational" @@ -2257,12 +2295,12 @@ 00-99 643 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="mCel" cc="mz" country="Mozambique" operator="Mocambique Celular S.A." status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Movitel" cc="mz" country="Mozambique" operator="Movitel S.A." status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Movitel" cc="mz" country="Mozambique" operator="Movitel, SA" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Vodacom" cc="mz" country="Mozambique" operator="Vodacom Mozambique, S.A." status="Operational" 00-99 645 01 bands="GSM 900" brand="Airtel" cc="zm" country="Zambia" operator="Bharti Airtel" status="Operational" - 02 bands="GSM 900" brand="MTN" cc="zm" country="Zambia" operator="MTN Group" status="Operational" + 02 bands="GSM 900 / LTE 1800" brand="MTN" cc="zm" country="Zambia" operator="MTN Group" status="Operational" 03 bands="GSM 900" brand="ZAMTEL" cc="zm" country="Zambia" operator="Zambia Telecommunications Company Ltd" status="Operational" 00-99 646 @@ -2280,7 +2318,7 @@ 648 01 bands="GSM 900" brand="Net*One" cc="zw" country="Zimbabwe" operator="Net*One Cellular (Pvt) Ltd" status="Operational" 03 bands="GSM 900" brand="Telecel" cc="zw" country="Zimbabwe" operator="Telecel Zimbabwe (PVT) Ltd" status="Operational" - 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Econet" cc="zw" country="Zimbabwe" operator="Econet Wireless (Private) Limited" status="Operational" + 04 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Econet" cc="zw" country="Zimbabwe" operator="Econet Wireless" status="Operational" 00-99 649 01 bands="GSM 900 / GSM 1800 / LTE 1800" brand="MTC" cc="na" country="Namibia" operator="MTC Namibia" status="Operational" @@ -2294,12 +2332,12 @@ 10 bands="GSM 900" brand="Airtel" cc="mw" country="Malawi" operator="Bharti Airtel Limited" status="Operational" 00-99 651 - 01 bands="GSM 900" brand="Vodacom" cc="ls" country="Lesotho" operator="Vodacom Lesotho (Pty) Ltd" status="Operational" - 02 bands="" cc="ls" country="Lesotho" operator="Econet Ezi-cel" status="Operational" + 01 bands="GSM 900 / LTE 800" brand="Vodacom" cc="ls" country="Lesotho" operator="Vodacom Lesotho (Pty) Ltd" status="Operational" + 02 bands="GSM / UMTS" brand="Econet Telecom" cc="ls" country="Lesotho" operator="Econet Ezi-cel" status="Operational" 00-99 652 01 bands="GSM 900 / UMTS" brand="Mascom" cc="bw" country="Botswana" operator="Mascom Wireless (Pty) Limited" status="Operational" - 02 bands="GSM 900 / UMTS 2100" brand="Orange" cc="bw" country="Botswana" operator="Orange (Botswana) Pty Limited" status="Operational" + 02 bands="GSM 900" brand="Bip" cc="mg" country="Madagascar" operator="Bip Madagascar S.A." status="Operational" 04 bands="GSM 900 / GSM 1800" brand="BTC Mobile" cc="bw" country="Botswana" operator="Botswana Telecommunications Corporation" status="Operational" 00-99 653 @@ -2314,7 +2352,7 @@ 02 bands="GSM 1800 / UMTS 2100 / TD-LTE 2300" brand="Telkom" cc="za" country="South Africa" operator="Telkom SA Ltd" status="Operational" 04 bands="" cc="za" country="South Africa" operator="Sasol (Pty) Ltd." status="" 06 bands="" cc="za" country="South Africa" operator="Sentech (Pty) Ltd" status="Operational" - 07 bands="GSM 900 / GSM 1800 / UMTS 900" brand="Cell C" cc="za" country="South Africa" operator="Cell C (Pty) Ltd" status="Operational" + 07 bands="GSM 900 / GSM 1800 / UMTS 900 / LTE 1800 / LTE 2100" brand="Cell C" cc="za" country="South Africa" operator="Cell C (Pty) Ltd" status="Operational" 10 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800" brand="MTN" cc="za" country="South Africa" operator="MTN Group" status="Operational" 11 bands="TETRA 410" cc="za" country="South Africa" operator="South African Police Service Gauteng" status="Operational" 12 bands="" brand="MTN" cc="za" country="South Africa" operator="MTN Group" status="" @@ -2322,11 +2360,12 @@ 14 bands="LTE 1800" brand="Neotel" cc="za" country="South Africa" operator="Neotel Pty Ltd" status="Operational" 16 bands="" cc="za" country="South Africa" operator="Phoenix System Integration (Pty) Ltd" status="Not operational" 17 bands="" cc="za" country="South Africa" operator="Sishen Iron Ore Company (Ltd) Pty" status="" - 19 bands="" brand="iBurst" cc="za" country="South Africa" operator="Wireless Business Solutions (Pty) Ltd" status="Operational" + 19 bands="TD-LTE" brand="iBurst" cc="za" country="South Africa" operator="Wireless Business Solutions (Pty) Ltd" status="Operational" 21 bands="TETRA 410" cc="za" country="South Africa" operator="Cape Town Metropolitan Council" status="Operational" - 24 bands="" cc="za" country="South Africa" operator="SMS Portal (Pty) Ltd." status="" + 24 bands="" cc="za" country="South Africa" operator="SMSPortal (Pty) Ltd." status="" 25 bands="" cc="za" country="South Africa" operator="Wirels Connect" status="" 27 bands="" cc="za" country="South Africa" operator="A to Z Vaal Industrial Supplies Pty Ltd" status="" + 28 bands="" cc="za" country="South Africa" operator="Hymax Talking Solutions (Pty) Ltd" status="" 30 bands="" cc="za" country="South Africa" operator="Bokamoso Consortium" status="Operational" 31 bands="" cc="za" country="South Africa" operator="Karabo Telecoms (Pty) Ltd." status="Operational" 32 bands="" cc="za" country="South Africa" operator="Ilizwi Telecommunications" status="Operational" @@ -2379,14 +2418,14 @@ 710 21 bands="UMTS 850 / GSM 1900" brand="Claro" cc="ni" country="Nicaragua" operator="Empresa Nicaragüense de Telecomunicaciones, S.A. (ENITEL) (América Móvil)" status="Operational" 30 bands="UMTS 850 / GSM 850 / GSM 1900" brand="movistar" cc="ni" country="Nicaragua" operator="Telefonía Celular de Nicaragua, S.A. (Telefónica, S.A.)" status="Operational" - 73 bands="UMTS 850 / GSM 1900" brand="SERCOM" cc="ni" country="Nicaragua" operator="Servicios de Comunicaciones S.A." status="Operational" + 73 bands="UMTS 850 / GSM 1900" brand="Claro" cc="ni" country="Nicaragua" operator="Servicios de Comunicaciones S.A." status="Operational" 00-99 712 01 bands="GSM 1800 / UMTS 850 / LTE 2600" brand="Kolbi ICE" cc="cr" country="Costa Rica" operator="Instituto Costarricense de Electricidad" status="Operational" 02 bands="GSM 1800 / UMTS 850 / LTE 2600" brand="Kolbi ICE" cc="cr" country="Costa Rica" operator="Instituto Costarricense de Electricidad" status="Operational" 03 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="Claro" cc="cr" country="Costa Rica" operator="Claro CR Telecomunicaciones (Aló)" status="Operational" 04 bands="GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800" brand="movistar" cc="cr" country="Costa Rica" operator="Telefónica Móviles Costa Rica" status="Operational" - 20 bands="GSM 1800 / UMTS 850" brand="'full'móvil" cc="cr" country="Costa Rica" operator="Virtualis S.A." status="Operational" + 20 bands="GSM 1800 / UMTS 850" brand="fullmóvil" cc="cr" country="Costa Rica" operator="Virtualis S.A." status="Operational" 00-99 714 01 bands="GSM 850 / UMTS 850 / LTE 700" brand="Cable & Wireless" cc="pa" country="Panama" operator="Cable & Wireless Panama S.A." status="Operational" @@ -2396,10 +2435,10 @@ 00-99 716 06 bands="CDMA2000 850 / GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700" brand="Movistar" cc="pe" country="Peru" operator="Telefónica Móviles Perú" status="Operational" - 07 bands="iDEN / UMTS 1900" brand="NEXTEL" cc="pe" country="Peru" operator="Americatel Perú" status="Inactive" - 10 bands="GSM 1900 / UMTS 850 / LTE 1900" brand="Claro (TIM)" cc="pe" country="Peru" operator="América Móvil Perú" status="Operational" + 07 bands="iDEN" brand="Entel" cc="pe" country="Peru" operator="Americatel Perú" status="Operational" + 10 bands="GSM 1900 / UMTS 850 / LTE 1900" brand="Claro" cc="pe" country="Peru" operator="América Móvil Perú" status="Operational" 15 bands="GSM 1900 / UMTS 1900" brand="Viettel Mobile" cc="pe" country="Peru" operator="Viettel Peru S.A.C." status="Operational" - 17 bands="iDEN / UMTS 1900" brand="NEXTEL" cc="pe" country="Peru" operator="Americatel Perú" status="Operational" + 17 bands="UMTS 1900" brand="Entel" cc="pe" country="Peru" operator="Americatel Perú" status="Operational" 00-99 722 010 bands="GSM 850 / GSM 1900 / UMTS / LTE 1700" brand="Movistar" cc="ar" country="Argentina" operator="Telefónica Móviles Argentina S.A." status="Operational" @@ -2411,7 +2450,7 @@ 320 bands="GSM 850 / GSM 1900 / UMTS" brand="Claro" cc="ar" country="Argentina" operator="AMX Argentina S.A." status="Operational" 330 bands="GSM 850 / GSM 1900 / UMTS" brand="Claro" cc="ar" country="Argentina" operator="AMX Argentina S.A." status="Operational" 341 bands="GSM 850 / GSM 1900 / UMTS / LTE 1700" brand="Personal" cc="ar" country="Argentina" operator="Telecom Personal S.A." status="Operational" - 350 bands="GSM 900" brand="PORT-HABLE" cc="ar" country="Argentina" operator="Hutchison Telecommunications Argentina S.A." status="Operational" + 350 bands="GSM 900" brand="PORT-HABLE" cc="ar" country="Argentina" operator="Hutchison Telecommunications Argentina S.A." status="Not operational" 000-999 724 00 bands="iDEN 850" brand="Nextel" cc="br" country="Brazil" operator="NII Holdings, Inc." status="Operational" @@ -2419,13 +2458,13 @@ 02 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" - 05 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Claro BR" cc="br" country="Brazil" operator="Claro" status="Operational" + 05 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Claro" cc="br" country="Brazil" operator="Claro" status="Operational" 06 bands="GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Vivo" cc="br" country="Brazil" operator="Vivo S.A." status="Operational" 10 bands="GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Vivo" cc="br" country="Brazil" operator="Vivo S.A." status="Operational" 11 bands="GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Vivo" cc="br" country="Brazil" operator="Vivo S.A." status="Operational" 15 bands="GSM 900 / GSM 1800 / UMTS 850" brand="Sercomtel" cc="br" country="Brazil" operator="Sercomtel Celular" status="Operational" 16 bands="GSM 1800 / UMTS 2100" brand="Brasil Telecom GSM" cc="br" country="Brazil" operator="Brasil Telecom GSM" status="Not operational" - 18 bands="MVNO" cc="br" country="Brazil" operator="Datora (Vodafone)" status="Operational" + 18 bands="MVNO" brand="datora" cc="br" country="Brazil" operator="Datora (Vodafone)" status="Operational" 23 bands="GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Vivo" cc="br" country="Brazil" operator="Vivo S.A." status="Operational" 24 bands="" cc="br" country="Brazil" operator="Amazonia Celular" status="" 30 bands="" brand="Oi" cc="br" country="Brazil" operator="TNL PCS Oi" status="" @@ -2436,9 +2475,9 @@ 35 bands="" cc="br" country="Brazil" operator="Telcom Telecomunicações" status="" 36 bands="" cc="br" country="Brazil" operator="Options Telecomunicações" status="" 37 bands="" brand="aeiou" cc="br" country="Brazil" operator="Unicel" status="Not operational" - 38 bands="" brand="Claro BR" cc="br" country="Brazil" operator="Claro" status="" + 38 bands="" brand="Claro" cc="br" country="Brazil" operator="Claro" status="" 39 bands="UMTS 2100 / LTE 1800" brand="Nextel" cc="br" country="Brazil" operator="NII Holdings, Inc." status="Operational" - 54 bands="MVNO" cc="br" country="Brazil" operator="PORTO SEGURO TELECOMUNICAÇÔES" status="Operational" + 54 bands="MVNO" brand="Conecta" cc="br" country="Brazil" operator="PORTO SEGURO TELECOMUNICAÇÔES" status="Operational" 99 bands="" brand="Local" cc="br" country="Brazil" operator="Local ( purpose or usage)" status="" 00-99 730 @@ -2459,14 +2498,16 @@ 15 bands="" cc="cl" country="Chile" operator="Cibeles Telecom S.A." status="" 16 bands="MVNO" cc="cl" country="Chile" operator="Nomade Telecomunicaciones S.A." status="" 17 bands="" cc="cl" country="Chile" operator="COMPATEL Chile Limitada" status="" + 18 bands="" cc="cl" country="Chile" operator="Empresas Bunker S.A." status="" + 19 bands="MVNO" brand="móvil Falabella" cc="cl" country="Chile" operator="Sociedad Falabella Móvil SPA" status="Operational" 99 bands="GSM 1900 / UMTS 1900" brand="Will" cc="cl" country="Chile" operator="WILL Telefonía" status="Operational" 00-99 732 001 bands="" brand="movistar" cc="co" country="Colombia" operator="Colombia Telecomunicaciones S.A. ESP" status="Operational" - 002 bands="" brand="Edatel" cc="co" country="Colombia" operator="Edatel S.A. ESP" status="Operational" + 002 bands="" brand="Edatel" cc="co" country="Colombia" operator="Edatel S.A. ESP" status="" 003 bands="" cc="co" country="Colombia" operator="LLEIDA S.A.S." status="" 004 bands="" cc="co" country="Colombia" operator="COMPATEL COLOMBIA SAS" status="" - 020 bands="LTE 2600" brand="Une-EPM" cc="co" country="Colombia" operator="Une EPM Telecomunicaciones S.A. E.S.P." status="Operational" + 020 bands="LTE 2600" brand="Tigo" cc="co" country="Colombia" operator="Une EPM Telecomunicaciones S.A. E.S.P." status="Operational" 099 bands="GSM 900" brand="EMCALI" cc="co" country="Colombia" operator="Empresas Municipales de Cali" status="Operational" 101 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700 / LTE 2600" brand="Claro" cc="co" country="Colombia" operator="COMCEL S.A." status="Operational" 102 bands="GSM 850 / GSM 1900 / CDMA 850" cc="co" country="Colombia" operator="Bellsouth Colombia" status="Not operational" @@ -2475,10 +2516,10 @@ 123 bands="GSM 850 / GSM 1900 / UMTS / LTE 1700 / CDMA 850" brand="movistar" cc="co" country="Colombia" operator="Colombia Telecomunicaciones S.A. ESP" status="Operational" 130 bands="GSM 850 / iDEN / LTE 1700" brand="AVANTEL" cc="co" country="Colombia" operator="Avantel S.A.S" status="Operational" 142 bands="" cc="co" country="Colombia" operator="Une EPM Telecomunicaciones S.A. E.S.P." status="" - 154 bands="MVNO" cc="co" country="Colombia" operator="Virgin Mobile Colombia S.A.S." status="Operational" + 154 bands="MVNO" brand="Virgin Mobile" cc="co" country="Colombia" operator="Virgin Mobile Colombia S.A.S." status="Operational" 165 bands="" cc="co" country="Colombia" operator="Colombia Móvil S.A. ESP" status="" 176 bands="TD-LTE 2600" cc="co" country="Colombia" operator="DirecTV Colombia Ltda" status="Operational" - 187 bands="LTE 1700" cc="co" country="Colombia" operator="Empresa de Telecomunicaciones de Bogotá S.A. ESP" status="Operational" + 187 bands="LTE 1700" brand="eTb" cc="co" country="Colombia" operator="Empresa de Telecomunicaciones de Bogotá S.A. ESP" status="Operational" 000-999 734 01 bands="GSM 900" brand="Digitel" cc="ve" country="Venezuela" operator="Corporacion Digitel C.A." status="Not operational" @@ -2505,16 +2546,16 @@ 00-99 744 01 bands="GSM 1900 / UMTS 900" brand="VOX" cc="py" country="Paraguay" operator="Hola Paraguay S.A" status="Operational" - 02 bands="GSM 1900 / UMTS 1900" brand="Claro/Hutchison" cc="py" country="Paraguay" operator="AMX Paraguay S.A." status="Operational" + 02 bands="GSM 1900 / UMTS 1900 / LTE 1700" brand="Claro/Hutchison" cc="py" country="Paraguay" operator="AMX Paraguay S.A." status="Operational" 03 bands="" cc="py" country="Paraguay" operator="Compañia Privada de Comunicaciones S.A." status="" - 04 bands="GSM 850 / UMTS 850" brand="Tigo" cc="py" country="Paraguay" operator="Telefónica Celular Del Paraguay S.A. (Telecel)" status="Operational" + 04 bands="GSM 850 / UMTS 850 / LTE 1700" brand="Tigo" cc="py" country="Paraguay" operator="Telefónica Celular Del Paraguay S.A. (Telecel)" status="Operational" 05 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1900" brand="Personal" cc="py" country="Paraguay" operator="Núcleo S.A(TIM)" status="Operational" 06 bands="GSM 1800 / LTE 1700" brand="Copaco" cc="py" country="Paraguay" operator="Copaco S.A." status="Operational" 00-99 746 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Telesur" cc="sr" country="Suriname" operator="Telecommunications Company Suriname (Telesur)" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 850" brand="Digicel" cc="sr" country="Suriname" operator="Digicel Group Limited" status="Operational" - 04 bands="GSM 900 / UMTS" brand="Uniqa" cc="sr" country="Suriname" operator="Intelsur N.V. / UTS N.V." status="Operational" + 04 bands="GSM 900 / UMTS" brand="Digicel" cc="sr" country="Suriname" operator="Digicel Group Limited" status="Operational" 05 bands="CDMA 450" brand="Telesur" cc="sr" country="Suriname" operator="Telecommunications Company Suriname (Telesur)" status="" 00-99 748 diff --git a/stdnum/isbn.dat b/stdnum/isbn.dat index 103e27a9..49e57c3d 100644 --- a/stdnum/isbn.dat +++ b/stdnum/isbn.dat @@ -1,7 +1,7 @@ # generated from RangeMessage.xml, downloaded from # https://www.isbn-international.org/export_rangemessage.xml -# file serial 91da4d76-b504-4412-94e1-741f2d6bbbe8 -# file date Wed, 2 Mar 2016 17:53:37 CET +# file serial 06b89123-0e43-4b34-92ef-de9637e6f095 +# file date Mon, 25 Jul 2016 18:49:43 CEST 978 0-5,600-649,7-7,80-94,950-989,9900-9989,99900-99999 0 agency="English language" @@ -19,9 +19,9 @@ 00-19,200-699,7000-8499,85000-89999,900000-949999,9500000-9999999 5 agency="former U.S.S.R" 00000-00499,0050-0099,01-19,200-420,4210-4299,430-430,4310-4399,440-440 - 4410-4499,450-699,7000-8499,85000-89999,900000-909999,91000-91999 - 9200-9299,93000-94999,9500000-9500999,9501-9799,98000-98999 - 9900000-9909999,9910-9999 + 4410-4499,450-603,6040000-6049999,605-699,7000-8499,85000-89999 + 900000-909999,91000-91999,9200-9299,93000-94999,9500000-9500999 + 9501-9799,98000-98999,9900000-9909999,9910-9999 600 agency="Iran" 00-09,100-499,5000-8999,90000-99999 601 agency="Kazakhstan" @@ -79,8 +79,8 @@ 00-13,140-149,15000-19999,200-699,7000-8499,85000-89999,9000-9199 920000-923999,92400-92999,930000-949999,95000-96999,9700-9999 85 agency="Brazil" - 00-19,200-549,5500-5999,60000-69999,7000-8499,85000-89999,900000-959999 - 96-97,98000-99999 + 00-19,200-549,5500-5999,60000-69999,7000-8499,85000-89999,900000-924999 + 92500-94499,9450-9599,96-97,98000-99999 86 agency="former Yugoslavia" 00-29,300-599,6000-7999,80000-89999,900000-999999 87 agency="Denmark" @@ -473,6 +473,8 @@ 0-1,20-59,600-799 99977 agency="Rwanda" 0-1,40-69,700-799 + 99978 agency="Mongolia" + 0-4,50-79,800-999 979 10-12 10 agency="France" diff --git a/stdnum/isil.dat b/stdnum/isil.dat index 79859301..2d2dff2c 100644 --- a/stdnum/isil.dat +++ b/stdnum/isil.dat @@ -1,5 +1,6 @@ # generated from ISIL Registration Authority, downloaded from # http://biblstandard.dk/isil/ +O$ ra="See OCLC" US$ country="United States of America" ra_url="http://www.loc.gov/marc/organizations/" ra="Library of Congress" AR$ country="Argentine Republic" ra_url="http://www.iram.org.ar" ra="Argentine Standardization and Certification Institute (IRAM)" AT$ country="Austria" ra_url="http://www.obvsg.at" ra="Die Österreichische Bibliothekenverbund und Service GmbH" @@ -10,7 +11,7 @@ CA$ country="Canada" ra_url="http://www.collectionscanada.ca/ill/s16-206-e.html# CH$ country="Switzerland" ra_url="http://www.nb.admin.ch/slb/slb_professionnel/01540/index.html?lang=en" ra="Swiss National Library" CY$ country="Cyprus" ra_url="http://library.cut.ac.cy/en/isil" ra="Cyprus University of Technology Library" DE$ country="Germany" ra_url="http://sigel.staatsbibliothek-berlin.de/" ra="Staatsbibliothek zu Berlin" -DK$ country="Denmark" ra_url="http://www.kulturstyrelsen.dk/english/institutions/libraries/national-solutions/standards/danish-library-number/" ra="Danish Agency for Culture" +DK$ country="Denmark" ra_url="http://www.kulturstyrelsen.dk/english/institutions/libraries/national-solutions/standards/danish-library-number/" ra="Danish Agency for Culture and Palaces" EG$ country="Egypt" ra_url="http://www.sti.sci.eg/index.php?option=com_content&view=article&id=30:focal-point&catid=1:pages&Itemid=56" ra="Egyptian National Scientific and Technical Information Network (ENSTINET)" FI$ country="Finland" ra_url="http://www.nationallibrary.fi/libraries/standards/isil.html" ra="The National Library of Finland" FR$ country="France" ra_url="http://www.abes.fr" ra="Agence Bibliographique de l'Enseignement Superieur" @@ -29,6 +30,6 @@ QA$ country="Qatar" ra_url="http://www.qnl.qa/" ra="Qatar National Library (QNL) RU$ country="Russian Federation" ra_url="http://english.gpntb.ru/" ra="Russian National Public Library for Science and Technology" SI$ country="The Republic of Slovenia" ra_url="http://www.nuk.uni-lj.si/nukeng3.asp?id=311364382" ra="National and University Library" SK$ country="Slovak Republic" ra_url="http://www.snk.sk/en/information-for/libraries-and-librarians/isil.html" ra="Slovak National Library" -O$ ra="See OCLC" +EUR$ country="Code for common European organizations." ra_url="http://www.eui.eu/Research/HistoricalArchivesOfEU/FindingAidsAndResearch/HAEU-Non-national-ISIL-Allocation-Agency.aspx" ra="HAEU" OCLC$ country="WorldCat Symbol" ra_url="http://www.oclc.org" ra="OCLC" ZDB$ country="Staatsbibliothek zu Berlin - Zeitschriftendatenbank" ra="Staatsbibliothek zu Berlin" From 01a7f34edc5d09d800f43e4fee966b2e7ea6ad3e Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 26 Jul 2016 23:33:48 +0200 Subject: [PATCH 032/572] Get files ready for 1.4 release --- ChangeLog | 199 ++++++++++++++++++++++++++++++++++++ NEWS | 19 ++++ README | 10 +- docs/index.rst | 6 ++ docs/stdnum.damm.rst | 5 + docs/stdnum.fr.nif.rst | 5 + docs/stdnum.fr.nir.rst | 5 + docs/stdnum.fr.siret.rst | 5 + docs/stdnum.gb.nhs.rst | 5 + docs/stdnum.tr.tckimlik.rst | 5 + stdnum/__init__.py | 10 +- 11 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 docs/stdnum.damm.rst create mode 100644 docs/stdnum.fr.nif.rst create mode 100644 docs/stdnum.fr.nir.rst create mode 100644 docs/stdnum.fr.siret.rst create mode 100644 docs/stdnum.gb.nhs.rst create mode 100644 docs/stdnum.tr.tckimlik.rst diff --git a/ChangeLog b/ChangeLog index a78944c1..412b3ad4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,202 @@ +2016-07-26 Arthur de Jong + + * [3e4e9e2] getmybp.py, stdnum/cn/loc.dat, stdnum/iban.dat, + stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: Update + database files + + This also updates the getmybp script to support the new layout. + +2016-07-26 Arthur de Jong + + * [3e344d1] stdnum/iso6346.py: Add formatting of ISO 6346 container + codes + +2016-07-26 Arthur de Jong + + * [aa1c298] getnumlist.py, stdnum/damm.py, tests/test_damm.doctest: + Implement Damm algorithm + + This is a generic check digit algorithm. 2016-07-26 Arthur de +Jong + + * [411d038] stdnum/fr/nif.py: Fix French NIF format test + + Fixes 2409ee9. 2016-07-26 Arthur de Jong + + + * [06e4165] stdnum/ch/ssn.py: Improve validation to Swiss SSN number + + The EAN-13 number should start with 756. + +2016-07-26 Arthur de Jong + + * [1907c67] stdnum/br/cpf.py: Add documentation to Brazillian CPF + +2016-07-26 Arthur de Jong + + * [cf428ac] stdnum/iso6346.py: Add pointer to ISO 6346 information + +2016-07-26 Arthur de Jong + + * [011c0f0] stdnum/gb/nhs.py: Fix copyright notice + +2016-05-22 Dimitri Papadopoulos + + * [2409ee9] stdnum/fr/nif.py: Add NIF - French tax identification + number + + Add module for NIF also known as SPI number. + +2016-07-26 Arthur de Jong + + * [43b58d3] stdnum/fr/nir.py: Move NIR check digit calculation + to function + + This also fixes a number of formatting issues, improves the + module description and adds tests for the 2A and 2B departments. + +2016-05-29 Dimitri Papadopoulos + + * [879f2d3] stdnum/fr/nir.py: Improve French NIR validation + + Please note that the 7th character of the NIR might be 'A' or + 'B'. Other than that the NIR contains digits only. + +2016-07-25 Arthur de Jong + + * [fd9f953] stdnum/fr/siren.py, stdnum/fr/siret.py, + tests/test_fr_siren.doctest, tests/test_fr_siret.doctest: Add + extra tests for SIREN and SIRET + + This adds tests for a few numbers that have been found online + and allows the dot as a seprator because those numbers were found. + + It also ensures that the SIREN validation is also called for + SIRET and adds a SIRET formatting function. + +2016-05-27 Yoann Aubineau + + * [5ba3a87] stdnum/fr/siret.py: Add French SIRET number + + Add a SIRET (Système d'Identification du Répertoire des + ETablissements, a French company etablishment identification + number) module. + +2016-05-29 Arthur de Jong + + * [dc708f0] stdnum/isil.py, tests/test_isil.doctest: Add more + ISIL tests + + This moves a few of the tests from the module to a dedicated + test file and adds tests for a number of ISIL numbers found online. + +2016-05-29 Arthur de Jong + + * [4a57d84] stdnum/us/tin.py: Fix formatting of bulleted list + +2016-05-28 Arthur de Jong + + * [9b74840] stdnum/ch/ssn.py, tests/test_ch_ssn.doctest: Fix bug + in Swiss SSN validation + + The validation was delegated to the EAN module but the number + is supposed to be an EAN-13 only and and EAN-8 was also accepted. + + This also reformats the docstring. + +2016-05-28 Arthur de Jong + + * [f3c2491] stdnum/ie/vat.py, tests/test_ie_vat.doctest: Fix bug + in Irish VAT number validation + + The last digits of the number that should be letters were not + tested to be letters which could result in ValueError being + raised for certain validations. + + This also clarifies the documentation and adds a convert() + function to convert numbers from the old format (where the + second character would be a letter or symbol) to the new format + (7 digits followed by 1 or 2 letters). + +2016-05-28 Arthur de Jong + + * [b5397ed] tests/test_robustness.doctest: Small improvements + to tests + + This includes a formatting fix and removes an unused variable + from a test. + +2016-05-28 Arthur de Jong + + * [d85b27f] stdnum/util.py: Fix get_module_description() + + This fixes the initial implementation in 3f6d52a. + +2016-05-22 Dimitri Papadopoulos + + * [a1afa76] stdnum/fr/nir.py: Add French NIR + + Add module for NIR also known as social security number. + +2016-05-09 Arthur de Jong + + * [0a2f39e] stdnum/gb/nhs.py: Add United Kingdom NHS number + + Add module for United Kingdom National Health Service patient + identifier. + +2016-05-09 Arthur de Jong + + * [2126947] stdnum/numdb.py: Read numdb files in context manager + + This ensures that the file is explicitly closed in the function + to avoid "unclosed file" warnings. + + See: https://github.com/arthurdejong/python-stdnum/issues/33 + +2016-04-11 Arthur de Jong + + * [e28b5e1] stdnum/ch/uid.py, stdnum/ch/vat.py, stdnum/cusip.py, + stdnum/dk/cpr.py, stdnum/iban.py, stdnum/imei.py, stdnum/isbn.py, + stdnum/isil.py, stdnum/isin.py, stdnum/issn.py, stdnum/mx/rfc.py, + stdnum/nl/bsn.py, stdnum/nl/onderwijsnummer.py, stdnum/pl/regon.py, + stdnum/tr/tckimlik.py, stdnum/us/ssn.py, stdnum/verhoeff.py: + Make more information links consistent + + Also fix a docstring in stdnum.nl.bsn and add a pointer to + stdnum.nl.onderwijsnummer. + +2016-04-09 Arthur de Jong + + * [feab917] stdnum/eu/vat.py, stdnum/tr/tckimlik.py, stdnum/util.py: + Implement online TC Kimlik check + + This refactors out the SOAP client function that was implemented + for VIES to the stdnum.utils module. + +2016-04-09 Arthur de Jong + + * [619b097] stdnum/tr/__init__.py, stdnum/tr/tckimlik.py, + tests/test_tr_tckimlik.doctest: Add Turkish personal identification + number + +2016-04-01 Arthur de Jong + + * [095dcbb] stdnum/mx/rfc.py, tests/test_mx_rfc.doctest: Document + accuracy of RFC check digit test + + There is an online service that allows validating RFC numbers. It + seems there are a lot of numbers that do not match the check + digit algorithm which confirms disabling the check digit test + by default is a good idea. + + Also see https://github.com/arthurdejong/python-stdnum/issues/32 + +2016-03-05 Arthur de Jong + + * [41cecb5] ChangeLog, NEWS, getnumlist.py, setup.py, + stdnum/__init__.py: Get files ready for 1.3 release + 2016-03-03 Arthur de Jong * [6457734] getcnloc.py, getiban.py, stdnum/cn/loc.dat, diff --git a/NEWS b/NEWS index 50e94c4a..1f8261da 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,22 @@ +changes from 1.3 to 1.4 +----------------------- + +* add modules for the following number formats: + - NIF (Numéro d'Immatriculation Fiscale, French tax identification number) + provided by Dimitri Papadopoulos + - NIR (French personal identification number) provided by Dimitri + Papadopoulos + - SIRET (a French company establishment identification number) provided by + Yoann Aubineau + - NHS (United Kingdom National Health Service patient identifier) + - T.C. Kimlik No. (Turkish personal identification number) +* add an implementation of the Damm algorithm +* ensure data files are properly closed +* documentation improvements +* extend test suite +* a number of minor bug fixes and improvements + + changes from 1.2 to 1.3 ----------------------- diff --git a/README b/README index f9be19e0..4c8c8de0 100644 --- a/README +++ b/README @@ -50,8 +50,12 @@ Currently this package supports the following formats: * Finnish Association Identifier * HETU (Henkilötunnus, Finnish personal identity code) * Y-tunnus (Finnish business identifier) + * NIF (Numéro d'Immatriculation Fiscale, French tax identification number) + * NIR (French personal identification number) * SIREN (a French company identification number) + * SIRET (a French company establishment identification number) * n° TVA (taxe sur la valeur ajoutée, French VAT number) + * NHS (United Kingdom National Health Service patient identifier) * SEDOL number (Stock Exchange Daily Official List number) * VAT (United Kingdom (and Isle of Man) VAT registration number) * FPA, ΦΠΑ, ΑΦΜ (Αριθμός Φορολογικού Μητρώου, the Greek VAT number) @@ -60,7 +64,7 @@ Currently this package supports the following formats: * ANUM (Közösségi adószám, Hungarian VAT number) * IBAN (International Bank Account Number) * PPS No (Personal Public Service Number, Irish personal number) - * VAT (Irish VAT number) + * VAT (Irish tax reference number) * IMEI (International Mobile Equipment Identity) * IMO number (International Maritime Organization number) * IMSI (International Mobile Subscriber Identity) @@ -103,6 +107,7 @@ Currently this package supports the following formats: * IČ DPH (IČ pre daň z pridanej hodnoty, Slovak VAT number) * RČ (Rodné číslo, the Slovak birth number) * COE (Codice operatore economico, San Marino national tax number) + * T.C. Kimlik No. (Turkish personal identification number) * ATIN (U.S. Adoption Taxpayer Identification Number) * EIN (U.S. Employer Identification Number) * ITIN (U.S. Individual Taxpayer Identification Number) @@ -114,6 +119,7 @@ Currently this package supports the following formats: Furthermore a number of generic check digit algorithms are available: * the Verhoeff algorithm + * the Damm algorithm * the Luhn and Luhn mod N algorithms * some algorithms described in ISO/IEC 7064: Mod 11, 2, Mod 37, 2, Mod 97, 10, Mod 11, 10 and Mod 37, 36 @@ -152,7 +158,7 @@ also work with older versions of Python. Copyright --------- -Copyright (C) 2010-2015 Arthur de Jong and others +Copyright (C) 2010-2016 Arthur de Jong and others This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/docs/index.rst b/docs/index.rst index 59df1d5f..b85a8e0a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -74,6 +74,7 @@ Generic check digit algorithms .. autosummary:: :toctree: + damm iso7064 luhn verhoeff @@ -126,8 +127,12 @@ Available formats fi.associationid fi.hetu fi.ytunnus + fr.nif + fr.nir fr.siren + fr.siret fr.tva + gb.nhs gb.sedol gb.vat gr.vat @@ -179,6 +184,7 @@ Available formats sk.dph sk.rc sm.coe + tr.tckimlik us.atin us.ein us.itin diff --git a/docs/stdnum.damm.rst b/docs/stdnum.damm.rst new file mode 100644 index 00000000..e4bb8657 --- /dev/null +++ b/docs/stdnum.damm.rst @@ -0,0 +1,5 @@ +stdnum.damm +=========== + +.. automodule:: stdnum.damm + :members: \ No newline at end of file diff --git a/docs/stdnum.fr.nif.rst b/docs/stdnum.fr.nif.rst new file mode 100644 index 00000000..33b76ac3 --- /dev/null +++ b/docs/stdnum.fr.nif.rst @@ -0,0 +1,5 @@ +stdnum.fr.nif +============= + +.. automodule:: stdnum.fr.nif + :members: \ No newline at end of file diff --git a/docs/stdnum.fr.nir.rst b/docs/stdnum.fr.nir.rst new file mode 100644 index 00000000..13ee2e77 --- /dev/null +++ b/docs/stdnum.fr.nir.rst @@ -0,0 +1,5 @@ +stdnum.fr.nir +============= + +.. automodule:: stdnum.fr.nir + :members: \ No newline at end of file diff --git a/docs/stdnum.fr.siret.rst b/docs/stdnum.fr.siret.rst new file mode 100644 index 00000000..a54ea588 --- /dev/null +++ b/docs/stdnum.fr.siret.rst @@ -0,0 +1,5 @@ +stdnum.fr.siret +=============== + +.. automodule:: stdnum.fr.siret + :members: \ No newline at end of file diff --git a/docs/stdnum.gb.nhs.rst b/docs/stdnum.gb.nhs.rst new file mode 100644 index 00000000..f1d97d44 --- /dev/null +++ b/docs/stdnum.gb.nhs.rst @@ -0,0 +1,5 @@ +stdnum.gb.nhs +============= + +.. automodule:: stdnum.gb.nhs + :members: \ No newline at end of file diff --git a/docs/stdnum.tr.tckimlik.rst b/docs/stdnum.tr.tckimlik.rst new file mode 100644 index 00000000..fd9f38c5 --- /dev/null +++ b/docs/stdnum.tr.tckimlik.rst @@ -0,0 +1,5 @@ +stdnum.tr.tckimlik +================== + +.. automodule:: stdnum.tr.tckimlik + :members: \ No newline at end of file diff --git a/stdnum/__init__.py b/stdnum/__init__.py index 8da7c353..d12dcd47 100644 --- a/stdnum/__init__.py +++ b/stdnum/__init__.py @@ -66,8 +66,12 @@ * fi.associationid: Finnish Association Identifier * fi.hetu: HETU (Henkilötunnus, Finnish personal identity code) * fi.ytunnus: Y-tunnus (Finnish business identifier) +* fr.nif: NIF (Numéro d'Immatriculation Fiscale, French tax identification number) +* fr.nir: NIR (French personal identification number) * fr.siren: SIREN (a French company identification number) +* fr.siret: SIRET (a French company establishment identification number) * fr.tva: n° TVA (taxe sur la valeur ajoutée, French VAT number) +* gb.nhs: NHS (United Kingdom National Health Service patient identifier) * gb.sedol: SEDOL number (Stock Exchange Daily Official List number) * gb.vat: VAT (United Kingdom (and Isle of Man) VAT registration number) * gr.vat: FPA, ΦΠΑ, ΑΦΜ (Αριθμός Φορολογικού Μητρώου, the Greek VAT number) @@ -76,7 +80,7 @@ * hu.anum: ANUM (Közösségi adószám, Hungarian VAT number) * iban: IBAN (International Bank Account Number) * ie.pps: PPS No (Personal Public Service Number, Irish personal number) -* ie.vat: VAT (Irish VAT number) +* ie.vat: VAT (Irish tax reference number) * imei: IMEI (International Mobile Equipment Identity) * imo: IMO number (International Maritime Organization number) * imsi: IMSI (International Mobile Subscriber Identity) @@ -119,6 +123,7 @@ * sk.dph: IČ DPH (IČ pre daň z pridanej hodnoty, Slovak VAT number) * sk.rc: RČ (Rodné číslo, the Slovak birth number) * sm.coe: COE (Codice operatore economico, San Marino national tax number) +* tr.tckimlik: T.C. Kimlik No. (Turkish personal identification number) * us.atin: ATIN (U.S. Adoption Taxpayer Identification Number) * us.ein: EIN (U.S. Employer Identification Number) * us.itin: ITIN (U.S. Individual Taxpayer Identification Number) @@ -129,6 +134,7 @@ Furthermore a number of generic check digit algorithms are available: +* damm: The Damm algorithm * iso7064.mod_11_10: The ISO 7064 Mod 11, 10 algorithm * iso7064.mod_11_2: The ISO 7064 Mod 11, 2 algorithm * iso7064.mod_37_2: The ISO 7064 Mod 37, 2 algorithm @@ -153,4 +159,4 @@ # the version number of the library -__version__ = '1.3' +__version__ = '1.4' From d95382fddb759b7e8d81964cf446bc32ab274b42 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 28 Aug 2016 11:02:31 +0200 Subject: [PATCH 033/572] Properly print error message of exceptions This ensures that the message passed to the constructor is shown in the traceback while falling back to the class default. --- stdnum/exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdnum/exceptions.py b/stdnum/exceptions.py index 733b5250..029b95ef 100644 --- a/stdnum/exceptions.py +++ b/stdnum/exceptions.py @@ -32,7 +32,7 @@ class ValidationError(Exception): exception.""" def __str__(self): - return getattr(self, 'message', '') + return ''.join(self.args[:1]) or getattr(self, 'message', '') class InvalidFormat(ValidationError): From 466cec8b4022e7b6c11f7d387580d9d05f2e6f22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Garc=C3=ADa=20Garz=C3=B3n?= Date: Sun, 28 Aug 2016 11:31:20 +0200 Subject: [PATCH 034/572] Add Spanish CUPS code --- stdnum/es/cups.py | 113 +++++++++++++++++++++++++++++++++++++ tests/test_es_cups.doctest | 83 +++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 stdnum/es/cups.py create mode 100644 tests/test_es_cups.doctest diff --git a/stdnum/es/cups.py b/stdnum/es/cups.py new file mode 100644 index 00000000..5aa847a4 --- /dev/null +++ b/stdnum/es/cups.py @@ -0,0 +1,113 @@ +# cups.py - functions for handling Spanish CUPS code +# coding: utf-8 +# +# Copyright (C) 2016 David García Garzón +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""CUPS (Código Unificado de Punto de Suministro, Supply Point Unified Code) + +CUPS codes are used in Spain as unique identifier for energy supply points. +They are used both for electricity and pipelined gas. + +The format is set by the Energy Ministry, and individual codes are issued by +each local distribution company. The number consist or 20 or 22 digits and is +built up as follows: + +* LL: (letters) country (always 'ES' since it is a national code) +* DDDD: (numbers) distribution company code (numeric) +* CCCC CCCC CCCC: identifier within the distribution company (numeric) +* EE: (letters) check digits +* N: (number) border point sequence +* T: (letter) kind of border point + +More information: + +* https://es.wikipedia.org/wiki/Código_Unificado_de_Punto_de_Suministro + +>>> validate('ES 1234-123456789012-JY') +'ES1234123456789012JY' +>>> validate('ES 1234-123456789012-JY 1T') +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> validate('ES 1234-123456789012-XY 1F') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> format('ES1234123456789012JY1F') +'ES 1234 1234 5678 9012 JY 1F' +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' -').strip().upper() + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join(( + number[:2], + number[2:6], + number[6:10], + number[10:14], + number[14:18], + number[18:20], + number[20:], + )).strip() + + +def calc_check_digits(number): + """Calculate the check digits for the number.""" + alphabet = 'TRWAGMYFPDXBNJZSQVHLCKE' + check0, check1 = divmod(int(number[2:18]) % 529, 23) + return alphabet[check0] + alphabet[check1] + + +def validate(number): + """Check to see if the number provided is a valid CUPS. This checks + length, formatting and check digits.""" + number = compact(number) + if len(number) not in (20, 22): + raise InvalidLength() + if number[:2] != 'ES': + raise InvalidComponent() + if not number[2:18].isdigit(): + raise InvalidFormat() + if number[20:]: + pnumber, ptype = number[20:] + if not pnumber.isdigit(): + raise InvalidFormat() + if ptype not in 'FPRCXYZ': + raise InvalidFormat() + if calc_check_digits(number) != number[18:20]: + raise InvalidChecksum() + return number + + +def is_valid(number): + """Check to see if the number provided is a valid CUPS.""" + try: + return bool(validate(number)) + except ValidationError: + return False diff --git a/tests/test_es_cups.doctest b/tests/test_es_cups.doctest new file mode 100644 index 00000000..4779124a --- /dev/null +++ b/tests/test_es_cups.doctest @@ -0,0 +1,83 @@ +test_my_nric.doctest - more detailed doctests for stdnum.es.cups module + +Copyright (C) 2016 David García Garzón +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.es.cups. It +tries to cover more corner cases and detailed functionality that is not +really useful as module documentation. + +>>> from stdnum.es import cups +>>> from stdnum.exceptions import * + + +>>> cups.compact('ES 1234-123456789012-jy') +'ES1234123456789012JY' + +>>> cups.validate('ES 1234-123456789012-JY') +'ES1234123456789012JY' +>>> cups.validate('GB 1234-123456789012-JY') +Traceback (most recent call last): + ... +InvalidComponent: ... +>>> cups.validate('ES 1234-12X456789012-JY') +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> cups.validate('ES 1234-12345678901X-JY') +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> cups.validate('ES 1234-12456789012-JY') +Traceback (most recent call last): + ... +InvalidLength: ... +>>> cups.validate('ES 1234-123456789012-JY 1F') +'ES1234123456789012JY1F' +>>> cups.validate('ES 1234-123456789012-JY 1T') +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> cups.validate('ES 1234-123456789012-JY XF') +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> cups.validate('ES 1234-123456789012-XY 1F') +Traceback (most recent call last): + ... +InvalidChecksum: ... + +>>> cups.is_valid('ES 1234-123456789012-JY 1F') +True +>>> cups.is_valid('ES 1234-123456789012-XY 1F') +False + +>>> cups.format('ES1234123456789012JY') +'ES 1234 1234 5678 9012 JY' +>>> cups.format('ES1234123456789012JY1F') +'ES 1234 1234 5678 9012 JY 1F' + +>>> cups.validate('ES 0987 5432 1098 7654 ZF') +'ES0987543210987654ZF' +>>> cups.validate('ES 1234 1234 5678 9012 JY') +'ES1234123456789012JY' +>>> cups.validate('ES 9750 2109 8765 4321 CQ') +'ES9750210987654321CQ' +>>> cups.validate('ES 0999 1100 1234 5678 EK') +'ES0999110012345678EK' From 294f8721799f6562b7d7f3f31a68f25cb24c964f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Garc=C3=ADa=20Garz=C3=B3n?= Date: Wed, 31 Aug 2016 20:21:52 +0200 Subject: [PATCH 035/572] =?UTF-8?q?Add=20Spanish=20C=C3=B3digo=20Cuenta=20?= =?UTF-8?q?Corriente=20(CCC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stdnum/es/ccc.py | 116 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 stdnum/es/ccc.py diff --git a/stdnum/es/ccc.py b/stdnum/es/ccc.py new file mode 100644 index 00000000..3f69ff9e --- /dev/null +++ b/stdnum/es/ccc.py @@ -0,0 +1,116 @@ +# ccc.py - functions for handling Spanish CCC bank account code +# coding: utf-8 +# +# Copyright (C) 2016 David García Garzón +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""CCC (Código Cuenta Corriente, Spanish Bank Account Code) + +CCC code is the country-specific part in Spanish IBAN codes. In order to +fully validate an Spanish IBAN you have to validate as well the country +specific part as a valid CCC. It was used for home banking transactions until +February 1st 2014 when IBAN codes started to be used as an account ID. + +The CCC has 20 digits, all being numbers: EEEE OOOO DD NNNNNNNNNN + +* EEEE: banking entity +* OOOO: office +* DD: check digits +* NNNNN NNNNN: account identifier + +This module does not check if the bank code to exist. Existing bank codes are +published on the 'Registro de Entidades' by 'Banco de España' (Spanish +Central Bank). + +More information: + +* https://es.wikipedia.org/wiki/Código_cuenta_cliente +* http://www.bde.es/bde/es/secciones/servicios/Particulares_y_e/Registros_de_Ent/ + +>>> validate('1234-1234-16 1234567890') +'12341234161234567890' +>>> validate('134-1234-16 1234567890') # wrong length +Traceback (most recent call last): + ... +InvalidLength: ... +>>> validate('12X4-1234-16 1234567890') # non numbers +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> validate('1234-1234-00 1234567890') # invalid check digits +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> format('12341234161234567890') +'1234 1234 16 12345 67890' +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' -').strip().upper() + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join([ + number[0:4], + number[4:8], + number[8:10], + number[10:15], + number[15:20], + ]) + + +def _calc_check_digit(number): + """Calculate a single check digit on the provided part of the number.""" + check = sum(int(n) * 2 ** i for i, n in enumerate(number)) % 11 + return str(check if check < 2 else 11 - check) + + +def calc_check_digits(number): + """Calculate the check digits for the number. The supplied number should + have check digits included but are ignored.""" + number = compact(number) + return ( + _calc_check_digit('00' + number[:8]) + _calc_check_digit(number[10:])) + + +def validate(number): + """Checks to see if the number provided is a valid CCC.""" + number = compact(number) + if len(number) != 20: + raise InvalidLength() + if not number.isdigit(): + raise InvalidFormat() + if number[8:10] != calc_check_digits(number): + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid CCC.""" + try: + return bool(validate(number)) + except ValidationError: + return False From 7d969bee07169a4c3f412bf81f8158ce37fbe247 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Thu, 8 Sep 2016 18:54:46 +0200 Subject: [PATCH 036/572] Implement calc_check_digits() in IBAN Introduce a function to calculate the two check digits of an IBAN. Since the check digits are the third and fourth characters in the number, placeholders need to be provided when calling this function. --- stdnum/iban.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/stdnum/iban.py b/stdnum/iban.py index ae01a02d..e0d48986 100644 --- a/stdnum/iban.py +++ b/stdnum/iban.py @@ -1,6 +1,6 @@ # iban.py - functions for handling International Bank Account Numbers (IBANs) # -# Copyright (C) 2011-2015 Arthur de Jong +# Copyright (C) 2011-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -40,6 +40,8 @@ 'GR1601101050000010547023795' >>> format('GR1601101050000010547023795') 'GR16 0110 1050 0000 1054 7023 795' +>>> calc_check_digits('BExx435411161155') +'31' """ import re @@ -71,7 +73,20 @@ def _to_base10(number): check digits to the end) so it can be checked with the ISO 7064 Mod 97, 10 algorithm.""" # TODO: find out whether this should be in the mod_97_10 module - return ''.join(str(_alphabet.index(x)) for x in number[4:] + number[:4]) + try: + return ''.join( + str(_alphabet.index(x)) for x in number[4:] + number[:4]) + except Exception: + raise InvalidFormat() + + +def calc_check_digits(number): + """Calculate the check digits that should be put in the number to make + it valid. Check digits in the supplied number are ignored..""" + number = compact(number) + # replace check digits with placeholders + number = ''.join((number[:2], '00', number[4:])) + return mod_97_10.calc_check_digits(_to_base10(number)[:-2]) def _struct_to_re(structure): @@ -90,12 +105,8 @@ def conv(match): def validate(number): """Checks to see if the number provided is a valid IBAN.""" number = compact(number) - try: - test_number = _to_base10(number) - except Exception: - raise InvalidFormat() # ensure that checksum is valid - mod_97_10.validate(test_number) + mod_97_10.validate(_to_base10(number)) # look up the number info = _ibandb.info(number) # check if the bban part of number has the correct structure From 1622873beb762ff31ce45b0356edb7c7ab834dd8 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 6 Sep 2016 19:43:46 +0200 Subject: [PATCH 037/572] Add to_iban() function to Spanish CCC --- stdnum/es/ccc.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/stdnum/es/ccc.py b/stdnum/es/ccc.py index 3f69ff9e..3800bb37 100644 --- a/stdnum/es/ccc.py +++ b/stdnum/es/ccc.py @@ -58,6 +58,8 @@ InvalidChecksum: ... >>> format('12341234161234567890') '1234 1234 16 12345 67890' +>>> to_iban('21000418450200051331') +'ES2121000418450200051331' """ from stdnum.exceptions import * @@ -114,3 +116,12 @@ def is_valid(number): return bool(validate(number)) except ValidationError: return False + + +def to_iban(number): + """Convert the number to an IBAN.""" + from stdnum import iban + separator = ' ' if ' ' in number else '' + return separator.join(( + 'ES' + iban.calc_check_digits('ES00' + number), + number)) From d8cca82e40e7e8fee6de3f20b3b6284d9a925e66 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Tue, 6 Sep 2016 18:16:21 +0200 Subject: [PATCH 038/572] Introduce get_cc_module() utility function This changes the get_vat_module() function to a more generic get_cc_module() function so that it can also be used for other things like IBAN checking. --- stdnum/eu/vat.py | 6 +++--- stdnum/util.py | 25 ++++++++++++------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/stdnum/eu/vat.py b/stdnum/eu/vat.py index 88d97efb..3604aba1 100644 --- a/stdnum/eu/vat.py +++ b/stdnum/eu/vat.py @@ -1,7 +1,7 @@ # vat.py - functions for handling European VAT numbers # coding: utf-8 # -# Copyright (C) 2012-2015 Arthur de Jong +# Copyright (C) 2012-2016 Arthur de Jong # Copyright (C) 2015 Lionel Elie Mamane # # This library is free software; you can redistribute it and/or @@ -40,7 +40,7 @@ """ from stdnum.exceptions import * -from stdnum.util import clean, get_vat_module, get_soap_client +from stdnum.util import clean, get_cc_module, get_soap_client country_codes = set([ @@ -69,7 +69,7 @@ def _get_cc_module(cc): if cc not in country_codes: return if cc not in _country_modules: - _country_modules[cc] = get_vat_module(cc) + _country_modules[cc] = get_cc_module(cc, 'vat') return _country_modules[cc] diff --git a/stdnum/util.py b/stdnum/util.py index 21307baf..111f5af8 100644 --- a/stdnum/util.py +++ b/stdnum/util.py @@ -24,9 +24,9 @@ guaranteed to remain stable and as such not part of the public API of stdnum. ->>> get_vat_module('nl').__name__ +>>> get_cc_module('nl', 'vat').__name__ 'stdnum.nl.btw' ->>> get_vat_module('is').__name__ +>>> get_cc_module('is', 'vat').__name__ 'stdnum.is_.vsk' """ @@ -103,13 +103,6 @@ def _mk_char_map(mapping): })) -# mapping of country codes to internally used names -# used in the get_vat_module() function -_cc_translations = { - 'el': 'gr', 'is': 'is_', -} - - def _clean_chars(number): """Replace various Unicode characters with their ASCII counterpart.""" return ''.join(_char_map.get(x, x) for x in number) @@ -173,11 +166,17 @@ def get_module_list(): ) -def get_vat_module(cc): - """Find the VAT number module based on the country code.""" +def get_cc_module(cc, name): + """Find the country-specific named module.""" cc = cc.lower() - cc = _cc_translations.get(cc, cc) - return __import__('stdnum.%s' % cc, globals(), locals(), ['vat']).vat + # add suffix for python reserved words + if cc in ('in', 'is', 'if'): + cc += '_' + try: + mod = __import__('stdnum.%s' % cc, globals(), locals(), [name]) + return getattr(mod, name, None) + except ImportError: + return def get_soap_client(wsdlurl): # pragma: no cover (no tests for this function) From 251093268dfe1be05ecfc6c7c53a08577e77e930 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Thu, 8 Sep 2016 18:55:03 +0200 Subject: [PATCH 039/572] Validate country-specific part of IBAN This adds the possible of validating the country-specific part of the IBAN. If the country has an IBAN module, checking is also delegated to that module. --- stdnum/iban.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/stdnum/iban.py b/stdnum/iban.py index e0d48986..18a9faa3 100644 --- a/stdnum/iban.py +++ b/stdnum/iban.py @@ -25,7 +25,7 @@ for the remainder of the number. Some countries may also use checksum algorithms within their number but -this is currently not checked by this number. +this is only checked for a few countries. More information: @@ -49,7 +49,7 @@ from stdnum import numdb from stdnum.exceptions import * from stdnum.iso7064 import mod_97_10 -from stdnum.util import clean +from stdnum.util import clean, get_cc_module # our open copy of the IBAN database @@ -61,6 +61,9 @@ # regular expression to check IBAN structure _struct_re = re.compile(r'([1-9][0-9]*)!([nac])') +# cache of country codes to modules +_country_modules = dict() + def compact(number): """Convert the iban number to the minimal representation. This strips the @@ -102,8 +105,18 @@ def conv(match): return re.compile('^%s$' % _struct_re.sub(conv, structure)) -def validate(number): - """Checks to see if the number provided is a valid IBAN.""" +def _get_cc_module(cc): + """Get the VAT number module based on the country code.""" + # Greece uses a "wrong" country code + cc = cc.lower() + if cc not in _country_modules: + _country_modules[cc] = get_cc_module(cc, 'iban') + return _country_modules[cc] + + +def validate(number, check_country=True): + """Checks to see if the number provided is a valid IBAN. The country- + specific check can be disabled with the check_country argument.""" number = compact(number) # ensure that checksum is valid mod_97_10.validate(_to_base10(number)) @@ -113,14 +126,19 @@ def validate(number): bban = number[4:] if not _struct_to_re(info[0][1].get('bban', '')).match(bban): raise InvalidFormat() + # check the country-specific module if it exists + if check_country: + module = _get_cc_module(number[:2]) + if module: + module.validate(number) # return the compact representation return number -def is_valid(number): +def is_valid(number, check_country=True): """Checks to see if the number provided is a valid IBAN.""" try: - return bool(validate(number)) + return bool(validate(number, check_country=check_country)) except ValidationError: return False @@ -128,4 +146,7 @@ def is_valid(number): def format(number, separator=' '): """Reformat the passed number to the space-separated format.""" number = compact(number) + module = _get_cc_module(number[:2]) + if module and hasattr(module, 'format') and module.format != format: + return module.format(number, separator=separator) return separator.join(number[i:i + 4] for i in range(0, len(number), 4)) From be24790818d1c8c32a055613c22fd98556455800 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Thu, 8 Sep 2016 18:56:06 +0200 Subject: [PATCH 040/572] Add Spanish IBAN number module This validates the country-specific part of the IBAN. --- stdnum/es/iban.py | 79 +++++++++++++++++++++++++++++++++++++++++ tests/test_iban.doctest | 12 +++++++ 2 files changed, 91 insertions(+) create mode 100644 stdnum/es/iban.py diff --git a/stdnum/es/iban.py b/stdnum/es/iban.py new file mode 100644 index 00000000..5d25774d --- /dev/null +++ b/stdnum/es/iban.py @@ -0,0 +1,79 @@ +# iban.py - functions for handling Spanish IBANs +# coding: utf-8 +# +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""Spanish IBAN (International Bank Account Number). + +The IBAN is used to identify bank accounts across national borders. The +Spanish IBAN is built up of the IBAN prefix (ES) and check digits, followed +by the 20 digit CCC (Código Cuenta Corriente). + +>>> validate('ES77 1234-1234-16 1234567890') +'ES7712341234161234567890' +>>> to_ccc('ES77 1234-1234-16 1234567890') +'12341234161234567890' +>>> format('ES771234-1234-16 1234567890') +'ES77 1234 1234 1612 3456 7890' +>>> validate('GR1601101050000010547023795') # different country +Traceback (most recent call last): + ... +InvalidComponent: ... +>>> validate('ES12 1234-1234-16 1234567890') # invalid IBAN check digit +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> validate('ES15 1234-1234-17 1234567890') # invalid CCC check digit +Traceback (most recent call last): + ... +InvalidChecksum: ... +""" + +from stdnum import iban +from stdnum.es import ccc +from stdnum.exceptions import * + + +__all__ = ['compact', 'format', 'to_ccc', 'validate', 'is_valid'] + + +compact = iban.compact +format = iban.format + + +def to_ccc(number): + """Return the CCC (Código Cuenta Corriente) part of the number.""" + number = compact(number) + if not number.startswith('ES'): + raise InvalidComponent() + return number[4:] + + +def validate(number): + """Checks to see if the number provided is a valid Spanish IBAN.""" + number = iban.validate(number, check_country=False) + ccc.validate(to_ccc(number)) + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid Spanish IBAN.""" + try: + return bool(validate(number)) + except ValidationError: + return False diff --git a/tests/test_iban.doctest b/tests/test_iban.doctest index b2d91b8f..10b66e8d 100644 --- a/tests/test_iban.doctest +++ b/tests/test_iban.doctest @@ -199,3 +199,15 @@ or have an unknown country code: ... ''' >>> [ x for x in numbers.splitlines() if x and iban.is_valid(x) ] [] + + +These are mostly for the normal IBAN check but they are not correct according +to the country-specific validation. + +>>> numbers = ''' +... ES2121000418450200051331 +... ''' +>>> [ x for x in numbers.splitlines() if x and not iban.is_valid(x, check_country=False) ] +[] +>>> [ x for x in numbers.splitlines() if x and iban.is_valid(x) ] +[] From 878e0360d5820fc7616eb68a87f8b88f15684c44 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 10 Sep 2016 16:15:26 +0200 Subject: [PATCH 041/572] Avoid leaving open file descriptor in test --- stdnum/numdb.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stdnum/numdb.py b/stdnum/numdb.py index c8cbc3c3..ea3c3b9b 100644 --- a/stdnum/numdb.py +++ b/stdnum/numdb.py @@ -25,7 +25,8 @@ To read a database from a file: ->>> dbfile = read(open('tests/numdb-test.dat', 'r')) +>>> with open('tests/numdb-test.dat', 'r') as f: +... dbfile = read(f) To split a number: From b128c8d3cbb6a07c937de531507c63b4b7acd36e Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 10 Sep 2016 18:59:26 +0200 Subject: [PATCH 042/572] Test a few Spanish IBANs found online --- tests/test_iban.doctest | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_iban.doctest b/tests/test_iban.doctest index 10b66e8d..9c95c24d 100644 --- a/tests/test_iban.doctest +++ b/tests/test_iban.doctest @@ -62,8 +62,31 @@ numbers: ... DO28BAGR00000001212453611324 ... EE38 2200 2210 2014 5685 ... EE382200221020145685 +... ES 58 0049 0290 3424 1352 8341 +... ES04 0075 0078 0605 0005 0355 +... ES0521053014113400002160 +... ES10 0075 0080 11 0600658108 +... ES15-0049-1806-9121-1186-9374 +... ES2030810089311100269222 +... ES24 2090 3191 1400 4012 1040 +... ES27 3183 1500 9600 0121 0562 +... ES28 2104 0485 5390 6968 2983 +... ES29 2100 2815 9822 0059 9427 +... ES37 2038 8700 7861 0000 9781 +... ES39 0081 0294 66 0001238624 +... ES58 1465 0100 9719 0014 4593 +... ES59 0049 5030 1129 1601 1246 +... ES62 2100 4288 5922 0010 4465 +... ES72 2013-0692-81-0201150993 +... ES72 2048 1075 8334 0000 2171 +... ES81 0081 5515 2900 0157 5763 +... ES8521005731710200031769 +... ES86 2013 0095 1102 0142 6812 +... ES86 30580157682720001384 +... ES88 2095 0497 9191 0708 8631 ... ES91 2100 0418 4502 0005 1332 ... ES9121000418450200051332 +... ES98 0049 5442 2227 1606 6973 ... FI21 1234 5600 0007 85 ... FI2112345600000785 ... FI5542345670000081 @@ -206,6 +229,7 @@ to the country-specific validation. >>> numbers = ''' ... ES2121000418450200051331 +... ES89 3183 1500 9500 0121 0562 ... ''' >>> [ x for x in numbers.splitlines() if x and not iban.is_valid(x, check_country=False) ] [] From 2c557a0c2e091487fcf9dfe00d3934208136501e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Garc=C3=ADa=20Garz=C3=B3n?= Date: Wed, 31 Aug 2016 21:43:17 +0200 Subject: [PATCH 043/572] Add Spansih Referencia Catastral The control digit check algorithm is based on Javascript implementation by Vicente Sancho that can be found at http://trellat.es/validar-la-referencia-catastral-en-javascript/ See https://github.com/arthurdejong/python-stdnum/pull/38 --- stdnum/es/referenciacatastral.py | 114 +++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 stdnum/es/referenciacatastral.py diff --git a/stdnum/es/referenciacatastral.py b/stdnum/es/referenciacatastral.py new file mode 100644 index 00000000..68c09939 --- /dev/null +++ b/stdnum/es/referenciacatastral.py @@ -0,0 +1,114 @@ +# referenciacatastral.py - functions for handling Spanish real state ids +# coding: utf-8 +# +# Copyright (C) 2016 David García Garzón +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""Referencia Catastral (Spanish real estate property id) + +The cadastral reference code is an identifier for real estate in Spain. It is +issued by Dirección General del Catastro (General Directorate of Land +Registry) of the Ministerio de Hacienda (Tresury Ministry). + +It has 20 digits and contains numbers and letters including the Spanish Ñ. +The number consists of 14 digits for the parcel, 4 for identifying properties +within the parcel and 2 check digits. The parcel digits are structured +differently for urban, non-urban or special (infrastructure) cases. + +More information: + +* http://www.catastro.meh.es/esp/referencia_catastral_1.asp (Spanish) +* http://www.catastro.meh.es/documentos/05042010_P.pdf (Spanish) +* https://es.wikipedia.org/wiki/Catastro#Referencia_catastral + +>>> validate('7837301-VG8173B-0001 TT') # Lanteira town hall +'7837301VG8173B0001TT' +>>> validate('783301 VG8173B 0001 TT') # missing digit +Traceback (most recent call last): + ... +InvalidLength: ... +>>> validate('7837301/VG8173B 0001 TT') # not alphanumeric +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> validate('7837301 VG8173B 0001 NN') # bad check digits +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> format('4A08169P03PRAT0001LR') # BCN Airport +'4A08169 P03PRAT 0001 LR' +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +alphabet = u'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789' + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' -').strip().upper() + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join([ + number[:7], + number[7:14], + number[14:18], + number[18:] + ]) + + +def _check_digit(number): + """Calculate a single check digit on the provided part of the number.""" + weights = (13, 15, 12, 5, 4, 17, 9, 21, 3, 7, 1) + s = sum(w * (int(n) if n.isdigit() else alphabet.find(n) + 1) + for w, n in zip(weights, number)) + return 'MQWERTYUIOPASDFGHJKLBZX'[s % 23] + + +def calc_check_digits(number): + """Calculate the check digits for the number.""" + return ( + _check_digit(number[0:7] + number[14:18]) + + _check_digit(number[7:14] + number[14:18])) + + +def validate(number): + """Checks to see if the number provided is a valid Cadastral Reference. + This checks the length, formatting and check digits.""" + number = compact(number) + if not all(c in alphabet for c in number): + raise InvalidFormat() + if len(number) != 20: + raise InvalidLength() + if calc_check_digits(number) != number[18:]: + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid Cadastral Reference.""" + try: + return bool(validate(number)) + except ValidationError: + return False From 49db5531efb72708a88e2b809009c6734e0fac4c Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 3 Sep 2016 19:09:03 +0200 Subject: [PATCH 044/572] Add more tests for Referencia Catastral This adds a number of extra tests for the Spanish Referencia Catastral (stdnum.es.referenciacatastral) module, mostly based on numbers found online. This commit includes some of the documentation on the structure of Referencia Catastral that was in the original pull request. See https://github.com/arthurdejong/python-stdnum/pull/38 --- tests/test_es_referenciacatastral.doctest | 295 ++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 tests/test_es_referenciacatastral.doctest diff --git a/tests/test_es_referenciacatastral.doctest b/tests/test_es_referenciacatastral.doctest new file mode 100644 index 00000000..f175d1c9 --- /dev/null +++ b/tests/test_es_referenciacatastral.doctest @@ -0,0 +1,295 @@ +test_es_referenciacatastral.doctest - more detailed doctests + +Copyright (C) 2016 David García Garzón +Copyright (C) 2015 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the +stdnum.es.referenciacatastral module. + +>>> from stdnum.es import referenciacatastral +>>> from stdnum.exceptions import * + + +The parcel digits are structured differently for urban, non-urban or special +(infrastructure) cases: + +* Urban states + * 7 digits: (numeric) block sequence within cartographic sheet, + and parcel sequence within the block. + * 7 digits: (alphanum) cartographic sheet where the block centroid is. + +* Non-urban states: + * 2 digits: (numeric) Province or more exactly, ministerial delegation + * 3 digits: (numeric) Municipality + * 1 digits: (letter) Sector + * 3 digits: (numeric) Polygon + * 5 digits: (numeric) Parcel + +* Special states: + * BICE code: (2 digits, a number and a letter) + * Energy infrastructure + * 1E: Thermal power plant + * 1G: Regasification terminal + * 1R: Oil refinery + * 1N: Nuclear power plant + * 1H: Hydro power plant + * Hydro + * 2P: Dam + * Roads and highways + * 3A: Tolled highway + * 3C: Tolled road + * 3T: Tolled tunnel + * Ports and airports + * 4A: Airports + * 4P: Commercial ports + * Province (major if many) (2 digits) + * Municipality (3 digits) + * Scope (1 letter) + * E: National + * A: Autonomous Community + * P: Province + * M: Municipality + * Number of municipalities it extends (2 digits, numbers) + * Abbreviated denomination (4 digits, letters) + +An online validator can be found at +https://www1.sedecatastro.gob.es/CYCBienInmueble/OVCBusqueda.aspx + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 000100100QE45D0001GA +... 000100100TH44D0001GX +... 000700100UJ13C0001XY +... 0014001QD4901S0001LP +... 001700100QC04D0001AF +... 002100100QD03C0001HH +... 0307813QD3100N0001LW +... 0376902QE3607N0001UM +... 0412501QD0301S0001BQ +... 0426012TJ3502N0001SQ +... 0474001QE5307C0033DW +... 0474001QE5307C0060IB +... 0474001QE5307C0067GR +... 0474001QE5307C0149YK +... 0553304TK9405S0001GR +... 06011A012002450000QE +... 06011A045000920000QX +... 06016A012090090000ZI +... 06051A005000200000ZJ +... 06060A040001360000XM +... 06063A002000200001SL +... 06063A015000110000AX +... 06074A005005560000BR +... 06079A002002810000JX +... 06080A504000390000II +... 06080A507000270000IK +... 06083A045001460000ZM +... 06083A136002390000UH +... 06084A508000290000QT +... 06084A511000950000QL +... 06085A009000130000YK +... 06086A023000710000PG +... 06092A010090070000XY +... 06105A014002400000QA +... 06127A011000890000LG +... 06150A022002960000YK +... 06151A008000450000PE +... 06153A002000420000KQ +... 06154A016090110000XD +... 06160A030009840000AJ +... 06162A009000770000LK +... 06900A228000090000EB +... 06900A228000110000EA +... 06900A230000050000EG +... 0736601QE2503N0002XI +... 0786418PD6508N0001GB +... 0791405PD6509S0001RX +... 0811056TJ8201S0001QF +... 0847501PE8504N0001EF +... 0895009TK5309N0001DA +... 0939216PD5603N0001BB +... 0989801QC2308N0001LY +... 10010A012005070000SA +... 10033A017000040000AH +... 10036A001002140000MU +... 10042A005090420000SX +... 10063A006000030000EW +... 10083A002030290000DX +... 10103A002002490000IE +... 10105A007004020000HQ +... 10118A004030320000PY +... 10122A032090100000FH +... 10134A009000010000RY +... 10149A011090100000YZ +... 10178A034090180000JE +... 1087910TK7118N0001FS +... 10900A044090170000MU +... 1099107TJ3419N0001RR +... 1344504PD5614S0001XE +... 1468103QC6316N0001PQ +... 1470436TJ5117S0001EP +... 1665311QC6316S0001OO +... 1811701QC3711S0001RM +... 1927510QD2812N0001GJ +... 2014801QC3721S0001IR +... 2019001QD2821N0001QR +... 2035116PD7423N0001WL +... 2070105TK4027A0001XW +... 2093020TK8129S0005RA +... 2106409QE0520N0001IO +... 2209001TK5620N0001LL +... 2217331QC3721N0001GL +... 2272003TJ5127S0001JF +... 2335208QC5823N0001YD +... 2372801QC0427S0001MO +... 2380105PC8328S0001PS +... 2409516TK5620N0001HL +... 2444001QD2724C0001EB +... 2595010TK8129N0001XX +... 2641303TK5424S0001WH +... 2667407TJ5126N0001RS +... 2735401PD7423N0001AL +... 2750203PC9625S0001BA +... 2787101TK8128N0001MT +... 2792003TK8129S0001QU +... 2792020TJ6029S0001IO +... 2911401TJ4521S0001BS +... 2951205TJ7025S0001RX +... 3012723TJ4531S0001DH +... 3065602TH8836N0001KA +... 3117006QC3731N0001KM +... 3135901PD7033E0001MF +... 3178101UJ2337N0001IB +... 3327002TJ6332N0001QH +... 3368022PE8136N0001LJ +... 3390803PC9439S0001XR +... 3456202TK7435N0001OU +... 3575302TJ6437N0001QF +... 3809537QC3230N0001JR +... 4028713TK8142N0001TE +... 4045111TK8444N0001KY +... 4443202PD7044C0068ZB +... 4471131PD7047A0001DR +... 4578201UJ0147N0001HD +... 4637801TK6843N0001WI +... 4878424TK6347N0001GT +... 4926002QE4142N0001UP +... 5034623PC6853S0001MO +... 5078102VK8957N0001TB +... 5172401PD7057A0001HI +... 5215006QC5751N0001EO +... 5238069TJ6253N0001PD +... 5335702QE3853N0001AI +... 5342201QC2854S0001WF +... 5347806UK9354N0001RU +... 5349709QC2854N0001FY +... 5410808QD5451S0001SJ +... 5417221QC5751N0001JO +... 5443405UK9354S0001BG +... 5468703QC3356N0001JR +... 5539105PC6853N0001KQ +... 5552401TK6255S0001YQ +... 5640007TJ6254S0001FG +... 5670823QC3357S0001AY +... 5867418QD1256N0001UD +... 5967307QC0256N0001GO +... 5972003QD1257S0001MG +... 6026813QD2762E0001WB +... 6043208PD9164C0001GI +... 6045303QE1564N0001UD +... 6050201PD7065A0001KQ +... 6061002QC2566S0001DF +... 6117611QC4261N0001UX +... 6229101QD2762G0001UG +... 6284203TH6368S0001UH +... 6320001QD2161N0001LI +... 6326404QD2762E0001MB +... 6380501UH0868S0001LT +... 6396405TJ8269N0001QT +... 6407102TJ8360N0001SK +... 6528901UJ0262N0001PP +... 6534011PC9763S0001YZ +... 6537302PD7063H0001WU +... 6595333QD0069N0001OM +... 6642023PD7064F0001SY +... 6684201VK8968S0002RR +... 6743701QD2764D0001IX +... 6795121QD0069N0008EU +... 6821105TK5662S0001QI +... 6822811QD2162S0001GP +... 6893505QC5569S0001LO +... 6991224PD3869S0001FW +... 7076102TJ5177N0001ZE +... 7174002QD2077S0001XW +... 7244002PD7074C0001QY +... 7282901TJ5178S0001BT +... 7383502VK8978S0001PU +... 7384201TJ5178S0012WD +... 7384201TJ5178S0019OB +... 7384201TJ5178S0043QS +... 7479113QE2477N0001UY +... 7570012TJ4377S0001PO +... 7640222QE4374B0001FR +... 7682601TJ5178S0001XT +... 7749401PD7074H0001HT +... 7865002TJ4376N0001TU +... 7865004TJ4376N0001MU +... 7865006TJ4376N0001KU +... 7977802TJ5177N0001TE +... 8327413PE8482N0001HU +... 8344202PC6684S0001FT +... 8354003PD7085C0001RR +... 8384416TJ8688S0001IQ +... 8645036TJ5984N0001TL +... 8670604TJ4587S0004BE +... 8679007TJ5187N0001LU +... 8696402TH7889N0001XQ +... 8696802TH7889N0001GQ +... 8701105PD7180B0001AU +... 8701110PD7180B0001YU +... 8788845QC2588H0001IJ +... 8796005QD2089N0001WO +... 8796022QD2089N0001OO +... 8827314QD5282N0001RT +... 8843501PC7484S0001KU +... 8910403QD3481S0001LT +... 8990307TH7889S0001OO +... 9013602QD2191S0001ET +... 9165501QE4396E0001YR +... 9201801QD2190S0001PA +... 9205301VL8090N0001PW +... 9265801QE4396E0001PR +... 9327401QE3592N0001JG +... 9655311TK9195N0001OJ +... 9712301QD2191S0001DT +... 9811901DS3191S0001QY +... 9811901TN8391S0001QM +... 9815402PD9391N0001PO +... 9854802PD7195D0001MX +... 9872023 VH5797S 0001 WX +... 9953001PD7195D0001GX +... 9988220VK8998N0001JU +... 9996812TJ9699N0001ZE +... +... ''' +>>> [x for x in numbers.splitlines() if x and not referenciacatastral.is_valid(x)] +[] From 352aa8aef4b60456fba02a52460e9b8c6462b2fb Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 10 Sep 2016 23:29:34 +0200 Subject: [PATCH 045/572] Add reference to Referencia Catastral implementation --- stdnum/es/referenciacatastral.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stdnum/es/referenciacatastral.py b/stdnum/es/referenciacatastral.py index 68c09939..fefb1081 100644 --- a/stdnum/es/referenciacatastral.py +++ b/stdnum/es/referenciacatastral.py @@ -78,6 +78,10 @@ def format(number): ]) +# The check digit implementation is based on the Javascript +# implementation by Vicente Sancho that can be found at +# http://trellat.es/validar-la-referencia-catastral-en-javascript/ + def _check_digit(number): """Calculate a single check digit on the provided part of the number.""" weights = (13, 15, 12, 5, 4, 17, 9, 21, 3, 7, 1) From d7cff5ddbcc3212eb9735e8a128039e5766da211 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Fri, 14 Oct 2016 11:17:38 +0200 Subject: [PATCH 046/572] Provide businessid as an alias The Belgian company number or enterprise number (ondernemingsnummer) is the new name for what was previously the VAT number. --- stdnum/be/__init__.py | 5 ++++- stdnum/be/vat.py | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/stdnum/be/__init__.py b/stdnum/be/__init__.py index dd183789..5295496a 100644 --- a/stdnum/be/__init__.py +++ b/stdnum/be/__init__.py @@ -1,7 +1,7 @@ # __init__.py - collection of Belgian numbers # coding: utf-8 # -# Copyright (C) 2012 Arthur de Jong +# Copyright (C) 2012-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,3 +19,6 @@ # 02110-1301 USA """Collection of Belgian numbers.""" + +# provide businessid as an alias +from stdnum.be import vat as businessid diff --git a/stdnum/be/vat.py b/stdnum/be/vat.py index 5bffa3f0..39a33351 100644 --- a/stdnum/be/vat.py +++ b/stdnum/be/vat.py @@ -1,6 +1,6 @@ # vat.py - functions for handling Belgian VAT numbers # -# Copyright (C) 2012, 2013 Arthur de Jong +# Copyright (C) 2012-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -17,7 +17,11 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA -"""BTW, TVA, NWSt (Belgian VAT number). +"""BTW, TVA, NWSt, ondernemingsnummer (Belgian enterprise number). + +The enterprise number (ondernemingsnummer) is a unique identifier of +companies within the Belgian administrative services. It was previously +the VAT ID number. The number consists of 10 digits. >>> compact('BE403019261') '0403019261' From 70b94ee719cfe3f40aa2efe91370104a171c8677 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Fri, 14 Oct 2016 15:42:55 +0200 Subject: [PATCH 047/572] Add Australian Business Number Based on the implementation provided by Vincent Bastos See https://github.com/arthurdejong/python-stdnum/pull/40 --- stdnum/au/__init__.py | 21 ++++++ stdnum/au/abn.py | 85 ++++++++++++++++++++++++ tests/test_au_abn.doctest | 136 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 242 insertions(+) create mode 100644 stdnum/au/__init__.py create mode 100644 stdnum/au/abn.py create mode 100644 tests/test_au_abn.doctest diff --git a/stdnum/au/__init__.py b/stdnum/au/__init__.py new file mode 100644 index 00000000..bcf9b0b5 --- /dev/null +++ b/stdnum/au/__init__.py @@ -0,0 +1,21 @@ +# __init__.py - collection of Australian numbers +# coding: utf-8 +# +# Copyright (C) 2016 Vincent Bastos +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""Collection of Australian numbers.""" diff --git a/stdnum/au/abn.py b/stdnum/au/abn.py new file mode 100644 index 00000000..ba695575 --- /dev/null +++ b/stdnum/au/abn.py @@ -0,0 +1,85 @@ +# abn.py - functions for handling Australian Business Numbers (ABNs) +# +# Copyright (C) 2016 Vincent Bastos +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""ABN (Australian Business Number). + +The Australian Business Number (ABN) is an identifier issued to entities +registered in the Australian Business Register (ABR). The number consists of +11 digits of which the first two are check digits. + +More information: + +* https://en.wikipedia.org/wiki/Australian_Business_Number +* https://abr.business.gov.au/ + +>>> validate('83 914 571 673') +'83914571673' +>>> validate('99 999 999 999') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> format('51824753556') +'51 824 753 556' +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' ').strip() + + +def calc_check_digits(number): + """Calculate the check digits that should be prepended to make the number + valid.""" + weights = (3, 5, 7, 9, 11, 13, 15, 17, 19) + s = sum(-w * int(n) for w, n in zip(weights, number)) + return str(11 + (s - 1) % 89) + + +def validate(number): + """Checks to see if the number provided is a valid ABN. This checks the + length, formatting and check digit.""" + number = compact(number) + if not number.isdigit(): + raise InvalidFormat() + if len(number) != 11: + raise InvalidLength() + if calc_check_digits(number[2:]) != number[:2]: + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid ABN. This checks the + length, formatting and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join((number[0:2], number[2:5], number[5:8], number[8:])) diff --git a/tests/test_au_abn.doctest b/tests/test_au_abn.doctest new file mode 100644 index 00000000..079b0e32 --- /dev/null +++ b/tests/test_au_abn.doctest @@ -0,0 +1,136 @@ +test_au_abn.doctest - more detailed doctests for the stdnum.au.abn module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.au.abn module. It +tries to validate a number of numbers that have been found online. + +>>> from stdnum.au import abn +>>> from stdnum.exceptions import * + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 11574456001 +... 12 123 552 732 +... 12197960056 +... 14 007 145 637 +... 14 085 537 097 +... 15 071 884 994 +... 16 050 539 350 +... 16 875 959 817 +... 16207643640 +... 17 088 952 023  +... 17 091 664 318 +... 17798019840 +... 18657363620 +... 18986035694 +... 19406270520 +... 20 080 574 616 +... 21 006 741 420 +... 211 082 588 59 +... 21276698420 +... 22752397988 +... 25 009 256 179 +... 25 078 164 020 +... 26 128 975 842 +... 27146513745 +... 29 176 219 543 +... 30194533815 +... 30319635949 +... 30753140115 +... 32510077067 +... 32967065962 +... 34180019054 +... 35 061 659 185 +... 35367869361 +... 36562063587 +... 38032136826 +... 38689369989 +... 42350020583 +... 42793074259 +... 43 002 724 334 +... 45138393975 +... 45686492545 +... 46 003 855 561 +... 46 003 855 561  +... 46065060376 +... 46080667721 +... 46241363405 +... 48110267900 +... 49046814670 +... 50 001 065 096 +... 50785233431 +... 51 824 753 556 +... 51120335948 +... 51424722884 +... 51974674048 +... 52 007 061 930 +... 54159269665 +... 55344832020 +... 55593511022 +... 57 064 001 270 +... 57356639841 +... 58437726834 +... 60431599619 +... 61173792360 +... 61483329243 +... 62128948118 +... 62361423248 +... 62826560160 +... 66 098 752 319 +... 66870124640 +... 68515519306 +... 69629520833 +... 73401973717 +... 73420076995 +... 74756347129 +... 74823923971 +... 75 091 431 202 +... 79772126259 +... 81 633 873 422 +... 83562801946 +... 84 002 705 224 +... 84598062158 +... 84696968277 +... 84771313085 +... 85 192 178 954 +... 85573270719 +... 86760778045 +... 87252821098 +... 88 775 098 848 +... 88278681363 +... 90 006 091 774 +... 90399103769 +... 91 010 334 915 +... 91044249923 +... 91957581192 +... 92 104 128 001 +... 93915085021 +... 96196152632 +... 97522448851 +... 98 116 306 453 +... 98977939326 +... 99870624871 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not abn.is_valid(x)] +[] From 8028c3abe0a805577fe7bef3f0d4840264429071 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Fri, 14 Oct 2016 18:33:05 +0200 Subject: [PATCH 048/572] Add Australian Company Number Based on the implementation provided by Vincent Bastos See https://github.com/arthurdejong/python-stdnum/pull/40 --- stdnum/au/acn.py | 91 +++++++++++++++++++++++++++ tests/test_au_acn.doctest | 125 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 stdnum/au/acn.py create mode 100644 tests/test_au_acn.doctest diff --git a/stdnum/au/acn.py b/stdnum/au/acn.py new file mode 100644 index 00000000..ed99d3db --- /dev/null +++ b/stdnum/au/acn.py @@ -0,0 +1,91 @@ +# acn.py - functions for handling Australian Company Numbers (ACNs) +# +# Copyright (C) 2016 Vincent Bastos +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""ACN (Australian Company Number). + +The Australian Company Number (ACN) is a company identifier issued by the +Australian Securities and Investments Commission. + +More information: + +* https://en.wikipedia.org/wiki/Australian_Company_Number + +>>> validate('004 085 616') +'004085616' +>>> validate('010 499 966') +'010499966' +>>> validate('999 999 999') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> format('004085616') +'004 085 616' +>>> to_abn('002 724 334') +'43002724334' +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' ').strip() + + +def calc_check_digit(number): + """Calculate the checksum.""" + return str((sum(int(n) * (i - 8) for i, n in enumerate(number))) % 10) + + +def validate(number): + """Checks to see if the number provided is a valid ACN. This checks the + length, formatting and check digit.""" + number = compact(number) + if not number.isdigit(): + raise InvalidFormat() + if len(number) != 9: + raise InvalidLength() + if calc_check_digit(number) != number[-1]: + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid ACN. This checks the + length, formatting and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join((number[0:3], number[3:6], number[6:])) + + +def to_abn(number): + """Convert the number to an Australian Business Number (ABN).""" + from stdnum.au import abn + number = compact(number) + return abn.calc_check_digits(number) + number diff --git a/tests/test_au_acn.doctest b/tests/test_au_acn.doctest new file mode 100644 index 00000000..da7bd4a9 --- /dev/null +++ b/tests/test_au_acn.doctest @@ -0,0 +1,125 @@ +test_au_acn.doctest - more detailed doctests for the stdnum.au.acn module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.au.acn module. It +tries to validate a number of numbers that have been found online. + +>>> from stdnum.au import acn, abn +>>> from stdnum.exceptions import * + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 000 024 733 +... 001 002 731 +... 001 976 272 +... 002 724 334 +... 002 955 722 +... 003 855 561 +... 004 071 854 +... 004 235 063 +... 004 394 763 +... 005 957 004 +... 007 433 623 +... 050 539 350 +... 055 980 204 +... 082 930 916 +... 088 952 023 +... 093 966 888  +... 099503456 +... 104 045 089 +... 104 128 001 +... 112 045 002 +... 116 306 453 +... 125 295 712  +... 135 427 075  +... 141 800 357 +... 143477632 +... +... 000 000 019 +... 000 250 000 +... 000 500 005 +... 000 750 005 +... 001 000 004 +... 001 250 004 +... 001 500 009 +... 001 749 999 +... 001 999 999 +... 002 249 998 +... 002 499 998 +... 002 749 993 +... 002 999 993 +... 003 249 992 +... 003 499 992 +... 003 749 988 +... 003 999 988 +... 004 249 987 +... 004 499 987 +... 004 749 982 +... 004 999 982 +... 005 249 981 +... 005 499 981 +... 005 749 986 +... 005 999 977 +... 006 249 976 +... 006 499 976 +... 006 749 980 +... 006 999 980 +... 007 249 989 +... 007 499 989 +... 007 749 975 +... 007 999 975 +... 008 249 974 +... 008 499 974 +... 008 749 979 +... 008 999 979 +... 009 249 969 +... 009 499 969 +... 009 749 964 +... 009 999 964 +... 010 249 966 +... 010 499 966 +... 010 749 961 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not acn.is_valid(x)] +[] + + +These numbers have been found in combination with an existing ABN. + +>>> numbers = ''' +... +... 000 024 733 / 79 000 024 733 +... 002 724 334 / 43002724334 +... 004 071 854 / 56 004 071 854 +... 004 235 063 / 63 004 235 063 +... 004 394 763 / 74 004 394 763 +... 055 980 204 / 31 055 980 204 +... 104 045 089 / 97 104 045 089 +... 112 045 002 / 19 112 045 002 +... 143477632 / 28143477632 +... +... ''' +>>> lines = (l.split('/') for l in numbers.splitlines() if l) +>>> [(x, y) for x, y in lines if acn.to_abn(x) != abn.compact(y)] +[] From 8ea76ba7ea52c3a33aae2e45d16aa41eacb6374b Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Fri, 14 Oct 2016 23:35:42 +0200 Subject: [PATCH 049/572] Add Australian Tax File Number Based on the implementation provided by Vincent Bastos See https://github.com/arthurdejong/python-stdnum/pull/40 --- stdnum/au/tfn.py | 88 +++++++++++++++++++++++++++++++++++++++ tests/test_au_tfn.doctest | 42 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 stdnum/au/tfn.py create mode 100644 tests/test_au_tfn.doctest diff --git a/stdnum/au/tfn.py b/stdnum/au/tfn.py new file mode 100644 index 00000000..99b4b84b --- /dev/null +++ b/stdnum/au/tfn.py @@ -0,0 +1,88 @@ +# tfn.py - functions for handling Australian Tax File Numbers (TFNs) +# +# Copyright (C) 2016 Vincent Bastos +# Copyright (C) 2016 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""TFN (Australian Tax File Number). + +The Tax File Number (TFN) is issued by the Australian Taxation Office (ATO) +to taxpaying individuals and organisations. A business has both a TFN and an +Australian Business Number (ABN). + +The number consists of 8 (older numbers) or 9 digits and includes a check +digit but otherwise without structure. + +More information: + +* https://en.wikipedia.org/wiki/Tax_file_number +* https://www.ato.gov.au/Individuals/Tax-file-number/ + +>>> validate('123 456 782') +'123456782' +>>> validate('999 999 999') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> format('123456782') +'123 456 782' +""" + +import operator + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' ').strip() + + +def checksum(number): + """Calculate the checksum.""" + weights = (1, 4, 3, 7, 5, 8, 6, 9, 10) + return sum(w * int(n) for w, n in zip(weights, number)) % 11 + + +def validate(number): + """Checks to see if the number provided is a valid TFN. This checks the + length, formatting and check digit.""" + number = compact(number) + if not number.isdigit(): + raise InvalidFormat() + if len(number) not in (8, 9): + raise InvalidLength() + if checksum(number) != 0: + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid TFN. This checks the + length, formatting and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join((number[0:3], number[3:6], number[6:])) diff --git a/tests/test_au_tfn.doctest b/tests/test_au_tfn.doctest new file mode 100644 index 00000000..1dddcaec --- /dev/null +++ b/tests/test_au_tfn.doctest @@ -0,0 +1,42 @@ +test_au_tfn.doctest - more detailed doctests for the stdnum.au.tfn module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.au.tfn module. It +tries to validate a number of numbers that have been found online. + +>>> from stdnum.au import tfn +>>> from stdnum.exceptions import * + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 112474082 +... 459599230 +... 565051603 +... 812 239 321 +... 865414088 +... 876 543 210 +... 907974668 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not tfn.is_valid(x)] +[] From a9e540510cec7581c16ce95e59822bff749af045 Mon Sep 17 00:00:00 2001 From: Sergi Almacellas Abellana Date: Tue, 8 Nov 2016 18:04:18 +0100 Subject: [PATCH 050/572] Implement calc_check_digits in SEPA Identifier of the Creditor (AT-02) --- stdnum/eu/at_02.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/stdnum/eu/at_02.py b/stdnum/eu/at_02.py index fa5d7072..ca5973ef 100644 --- a/stdnum/eu/at_02.py +++ b/stdnum/eu/at_02.py @@ -1,6 +1,6 @@ # at_02.py - functions for handling AT-02 (SEPA Creditor identifier) # -# Copyright (C) 2014 Sergi Almacellas Abellana +# Copyright (C) 2014-2016 Sergi Almacellas Abellana # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -22,17 +22,20 @@ This identifier is indicated in the ISO 20022 data element `Creditor Scheme Identification`. The creditor can be a legal entity, or an association that is not a legal entity, or a person. + Ther first two digits contain the ISO country code, the nex two are check -digitsi for the ISO 7064 Mod 97, 10 checksum, the next tree contain the +digits for the ISO 7064 Mod 97, 10 checksum, the next tree contain the Creditor Bussines Code (or `ZZZ` if no bussness code used) and the remainder contain the country-specific identifier. ->>> validate('ES23ZZZ47690558N') +>>> validate('ES 23 ZZZ 47690558N') 'ES23ZZZ47690558N' >>> validate('ES2300047690558N') 'ES2300047690558N' >>> compact('ES++()+23ZZZ4//7690558N') 'ES23ZZZ47690558N' +>>> calc_check_digits('ESXXZZZ47690558N') +'23' """ from stdnum.exceptions import * @@ -44,15 +47,15 @@ def compact(number): - """Convert the AT-02 number to the minimal representation. This strips the - number of any valid separators and removes invalid characters.""" + """Convert the AT-02 number to the minimal representation. This strips + the number of any valid separators and removes invalid characters.""" return clean(number, ' -/?:().m\'+"').strip().upper() def _to_base10(number): """Prepare the number to its base10 representation so it can be checked - with the ISO 7064 Mod 97, 10 algorithm. That means excluding positions - 5 to 7 and moving the first four digits to the end""" + with the ISO 7064 Mod 97, 10 algorithm. That means excluding positions 5 + to 7 and moving the first four digits to the end.""" return ''.join(str(_alphabet.index(x)) for x in number[7:] + number[:4]) @@ -74,3 +77,12 @@ def is_valid(number): return bool(validate(number)) except ValidationError: return False + + +def calc_check_digits(number): + """Calculate the check digits that should be put in the number to make it + valid. Check digits in the supplied number are ignored.""" + number = compact(number) + # replace check digits with placeholders + number = ''.join((number[:2], '00', number[4:])) + return mod_97_10.calc_check_digits(_to_base10(number)[:-2]) From 45faa7c8c20150a7c26c682a402aafefbb96535e Mon Sep 17 00:00:00 2001 From: Sergi Almacellas Abellana Date: Wed, 9 Nov 2016 10:05:05 +0100 Subject: [PATCH 051/572] Add tox.ini file --- .gitignore | 7 ++++--- tox.ini | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore index 2ffac4e8..8f7c162a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,10 @@ __pycache__ # / -/build -/dist -/python_stdnum.egg-info /.coverage +/.tox +/build /coverage +/dist /distribute-*.egg +/python_stdnum.egg-info diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..f8b77dc9 --- /dev/null +++ b/tox.ini @@ -0,0 +1,7 @@ +[tox] +envlist = {py27,py34,py35,py36,pypy} + +[testenv] +deps = nose + coverage +commands = nosetests From 458c310d3bcc0dca4d4db776d3950757ff2b2c76 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 13 Nov 2016 22:51:57 +0100 Subject: [PATCH 052/572] Update gettin IBAN registry The format of the registry file has changed. Before it was a straightforward CSV file with countries in rows but countries are now in columns. --- getiban.py | 62 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/getiban.py b/getiban.py index 44d9f19e..e6894c68 100755 --- a/getiban.py +++ b/getiban.py @@ -23,54 +23,56 @@ Financial Telecommunication which is the official IBAN registrar) to get the data needed to correctly parse and validate IBANs.""" +from collections import defaultdict import csv import urllib -# The place where the current version of IBAN_Registry.txt can be downloaded. +# The place where the current version of +# swift_standards_infopaper_ibanregistry_1.txt can be downloaded. download_url = 'https://www.swift.com/node/11971' -def clean_row(row): - """Clean up a read row from the CSV file.""" - stripit = ' \t\n\r;:\'"' - return dict( - (k.strip(stripit).lower(), v.strip(stripit)) - for k, v in row.items()) - - def get_country_codes(line): """Return the list of country codes this line has.""" # simplest case first - if len(line['country code as defined in iso 3166']) == 2: - return [line['country code as defined in iso 3166']] + if len(line['IBAN prefix country code (ISO 3166)']) == 2: + return [line['IBAN prefix country code (ISO 3166)']] # fall back to parsing the IBAN structure return [x.strip()[:2] for x in line['iban structure'].split(',')] def parse(f): """Parse the specified file.""" - print '# generated from IBAN_Registry.txt, downloaded from' - print '# %s' % download_url - for row in csv.DictReader(f, delimiter='\t', quotechar='"'): - row = clean_row(row) - bban = row['bban structure'] - if not(bban) or bban.lower() == 'not in use': - bban = row['iban structure'] - for cc in get_country_codes(row): - if bban.startswith(cc + '2!n'): - bban = bban[5:] - # print country line - print '%s country="%s" bban="%s"' % ( - cc, row['name of country'], bban.replace(' ', '')) - # TODO: some countries have a fixed check digit value - # TODO: some countries have extra check digits - # TODO: use "Bank identifier position within the BBAN" field - # to add labels to the ranges (Bank identifier and Branch - # Identifier) + print '# generated from swift_standards_infopaper_ibanregistry_1.txt,' + print '# downloaded from %s' % download_url + values = defaultdict(dict) + # the file is CSV but the data is in columns instead of rows + for row in csv.reader(f, delimiter='\t', quotechar='"'): + # skip first row + if row[0] != 'Data element': + # first column contains label + for i, c in enumerate(row[1:]): + values[i][row[0]] = c + # output the collected data + for i, data in values.items(): + bban = data['BBAN structure'] + if not(bban) or bban.lower() == 'n/a': + bban = data['IBAN structure'] + bban = bban.replace(' ', '') + cc = data['IBAN prefix country code (ISO 3166)'][:2] + cname = data['Name of country'] + if bban.startswith(cc + '2!n'): + bban = bban[5:] + # print country line + print '%s country="%s" bban="%s"' % (cc, cname, bban) + # TODO: some countries have a fixed check digit value + # TODO: some countries have extra check digits + # TODO: use "Bank identifier position within the BBAN" field + # to add labels to the ranges (Bank identifier and Branch + # Identifier) if __name__ == '__main__': - #f = open('IBAN_Registry.txt', 'r') f = urllib.urlopen(download_url) parse(f) From ac560a764dca5eb36634458522db13a7e2212e83 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 13 Nov 2016 23:00:03 +0100 Subject: [PATCH 053/572] Update getisbn to Python3 There were some SSL-related issues with the urllib module. This was the easiest solution. --- getisbn.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/getisbn.py b/getisbn.py index 53775655..5755df58 100755 --- a/getisbn.py +++ b/getisbn.py @@ -1,8 +1,8 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # getisbn.py - script to get ISBN prefix data # -# Copyright (C) 2010, 2011, 2014 Arthur de Jong +# Copyright (C) 2010-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -26,7 +26,7 @@ an item number and a check-digit.""" from xml.etree import ElementTree -import urllib +import urllib.request # the location of the ISBN Ranges XML file @@ -55,7 +55,7 @@ def get(f=None): if f is None: yield '# generated from RangeMessage.xml, downloaded from' yield '# %s' % download_url - f = urllib.urlopen(download_url) + f = urllib.request.urlopen(download_url) else: yield '# generated from %r' % f @@ -87,4 +87,4 @@ def get(f=None): if __name__ == '__main__': # get('RangeMessage.xml') for row in get(): - print row.encode('utf-8') + print(row) From c9beb00735b88df06b134a2e8228a5af8a080181 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 13 Nov 2016 23:00:44 +0100 Subject: [PATCH 054/572] Update database files This removes the Costa Rica IBAN test because the format of the IBAN seems to have been changed. The old length still seems to be in use so a more permanent solution is probably required. --- stdnum/cn/loc.dat | 2 +- stdnum/iban.dat | 72 ++-- stdnum/imsi.dat | 723 ++++++++++++++++++++++++---------------- stdnum/isbn.dat | 29 +- stdnum/isil.dat | 4 +- tests/test_iban.doctest | 1 - 6 files changed, 488 insertions(+), 343 deletions(-) diff --git a/stdnum/cn/loc.dat b/stdnum/cn/loc.dat index 96003c76..ff371cc6 100644 --- a/stdnum/cn/loc.dat +++ b/stdnum/cn/loc.dat @@ -1,6 +1,6 @@ # generated from National Bureau of Statistics of the People's # Republic of China, downloaded from https://github.com/cn/GB2260 -# 2016-07-26 20:51:28.113057 +# 2016-11-13 21:19:09.023818 110101 county="东城区" prefecture="市辖区" province="北京市" 110102 county="西城区" prefecture="市辖区" province="北京市" 110103 county="崇文区" prefecture="市辖区" province="北京市" diff --git a/stdnum/iban.dat b/stdnum/iban.dat index 50d61cd9..ab7db08f 100644 --- a/stdnum/iban.dat +++ b/stdnum/iban.dat @@ -1,74 +1,74 @@ -# generated from IBAN_Registry.txt, downloaded from -# https://www.swift.com/node/11971 -AL country="Albania" bban="8!n16!c" +# generated from swift_standards_infopaper_ibanregistry_1.txt, +# downloaded from https://www.swift.com/node/11971 AD country="Andorra" bban="4!n4!n12!c" +AE country="Arab Emirates" bban="3!n16!n" +AL country="Albania" bban="8!n16!c" AT country="Austria" bban="5!n11!n" -AZ country="Republic of Azerbaijan" bban="4!a20!c" -BH country="Bahrain (Kingdom of)" bban="4!a14!c" -BE country="Belgium" bban="3!n7!n2!n" +AZ country="Azerbaijan" bban="4!a20!c" BA country="Bosnia and Herzegovina" bban="3!n3!n8!n2!n" -BR country="Brazil" bban="8!n5!n10!n1!a1!c" +BE country="Belgium" bban="3!n7!n2!n" BG country="Bulgaria" bban="4!a4!n2!n8!c" -CR country="Costa Rica" bban="3!n14!n" -HR country="Croatia" bban="7!n10!n" +BH country="Bahrain" bban="4!a14!c" +BR country="Brazil" bban="8!n5!n10!n1!a1!c" +CH country="Switzerland" bban="5!n12!c" +CR country="Costa Rica" bban="4!n14!n" CY country="Cyprus" bban="3!n5!n16!c" CZ country="Czech Republic" bban="4!n6!n10!n" +DE country="Germany" bban="8!n10!n" DK country="Denmark" bban="4!n9!n1!n" -FO country="Denmark" bban="4!n9!n1!n" -GL country="Denmark" bban="4!n9!n1!n" DO country="Dominican Republic" bban="4!c20!n" EE country="Estonia" bban="2!n2!n11!n1!n" -FI country="Finland" bban="6!n7!n1!n" +ES country="Spain" bban="4!n4!n1!n1!n10!n" +FI country="Finland" bban="3!n11!n" +FO country="Faroe Islands" bban="4!n9!n1!n" FR country="France" bban="5!n5!n11!c2!n" +GB country="United Kingdom" bban="4!a6!n8!n" GE country="Georgia" bban="2!a16!n" -DE country="Germany" bban="8!n10!n" GI country="Gibraltar" bban="4!a15!c" +GL country="Greenland" bban="4!n9!n1!n" GR country="Greece" bban="3!n4!n16!c" GT country="Guatemala" bban="4!c20!c" +HR country="Croatia" bban="7!n10!n" HU country="Hungary" bban="3!n4!n1!n15!n1!n" -IS country="Iceland" bban="4!n2!n6!n10!n" IE country="Ireland" bban="4!a6!n8!n" IL country="Israel" bban="3!n3!n13!n" +IS country="Iceland" bban="4!n2!n6!n10!n" IT country="Italy" bban="1!a5!n5!n12!c" JO country="Jordan" bban="4!a4!n18!c" -KZ country="Kazakhstan" bban="3!n13!c" -XK country="Republic of Kosovo" bban="4!n10!n2!n" KW country="Kuwait" bban="4!a22!c" -LV country="Latvia" bban="4!a13!c" +KZ country="Kazakhstan" bban="3!n13!c" LB country="Lebanon" bban="4!n20!c" -LI country="Liechtenstein (Principality of)" bban="5!n12!c" +LC country="Saint Lucia" bban="4!a24!c" +LI country="Liechtenstein" bban="5!n12!c" LT country="Lithuania" bban="5!n11!n" LU country="Luxembourg" bban="3!n13!c" -MK country="Macedonia, Former Yugoslav Republic of" bban="3!n10!c2!n" -MT country="Malta" bban="4!a5!n18!c" -MR country="Mauritania" bban="5!n5!n11!n2!n" -MU country="Mauritius" bban="4!a2!n2!n12!n3!n3!a" -MD country="Moldova" bban="2!c18!c" +LV country="Latvia" bban="4!a13!c" MC country="Monaco" bban="5!n5!n11!c2!n" +MD country="Moldova" bban="2!c18!c" ME country="Montenegro" bban="3!n13!n2!n" +MK country="Macedonia" bban="3!n10!c2!n" +MR country="Mauritania" bban="5!n5!n11!n2!n" +MT country="Malta" bban="4!a5!n18!c" +MU country="Mauritius" bban="4!a2!n2!n12!n3!n3!a" NL country="The Netherlands" bban="4!a10!n" NO country="Norway" bban="4!n6!n1!n" PK country="Pakistan" bban="4!a16!c" -PS country="Palestine, State of" bban="4!a21!c" PL country="Poland" bban="8!n16!n" +PS country="Palestine" bban="4!a21!c" PT country="Portugal" bban="4!n4!n11!n2!n" QA country="Qatar" bban="4!a21!c" RO country="Romania" bban="4!a16!c" -LC country="Saint Lucia" bban="4!a24!c" -SM country="San Marino" bban="1!a5!n5!n12!c" -ST country="Sao Tome And Principe" bban="8!n11!n2!n" -SA country="Saudi Arabia" bban="2!n18!c" RS country="Serbia" bban="3!n13!n2!n" -SC country="Seychelles" bban="4a!2n!2n!16n!3a!" -SK country="Slovak Republic" bban="4!n6!n10!n" -SI country="Slovenia" bban="5!n8!n2!n" -ES country="Spain" bban="4!n4!n1!n1!n10!n" +SA country="Saudi Arabia" bban="2!n18!c" +SC country="Seychelles" bban="4!a2!n2!n16!n3!a" SE country="Sweden" bban="3!n16!n1!n" -CH country="Switzerland" bban="5!n12!c" +SI country="Slovenia" bban="5!n8!n2!n" +SK country="Slovakia" bban="4!n6!n10!n" +SM country="San Marino" bban="1!a5!n5!n12!c" +ST country="Sao Tome and Principe" bban="4!n4!n11!n2!n" TL country="Timor-Leste" bban="3!n14!n2!n" TN country="Tunisia" bban="2!n3!n13!n2!n" TR country="Turkey" bban="5!n1!n16!c" UA country="Ukraine" bban="6!n19!c" -AE country="United Arab Emirates" bban="3!n16!n" -GB country="United Kingdom" bban="4!a6!n8!n" -VG country="Virgin Islands, British" bban="4!a16!n" +VG country="Virgin Islands" bban="4!a16!n" +XK country="Kosovo" bban="4!n10!n2!n" diff --git a/stdnum/imsi.dat b/stdnum/imsi.dat index bc3bce1d..dc14c876 100644 --- a/stdnum/imsi.dat +++ b/stdnum/imsi.dat @@ -36,11 +36,11 @@ 13 bands="" cc="nl" country="Netherlands" operator="Unica Installatietechniek B.V." status="" 14 cc="nl" country="Netherlands" operator="6GMOBILE B.V." status="Reserved" 15 bands="LTE 2600" brand="Ziggo" cc="nl" country="Netherlands" operator="Ziggo B.V." status="Operational" - 16 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="T-Mobile (BEN)" cc="nl" country="Netherlands" operator="T-Mobile Netherlands B.V" status="Operational" + 16 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600" brand="T-Mobile (BEN)" cc="nl" country="Netherlands" operator="T-Mobile Netherlands B.V" status="Operational" 17 bands="MVNE" brand="Intercity Zakelijk" cc="nl" country="Netherlands" operator="Intercity Mobile Communications B.V." status="Operational" 18 bands="MVNO" brand="upc" cc="nl" country="Netherlands" operator="UPC Nederland B.V." status="Operational" 19 bands="" cc="nl" country="Netherlands" operator="Mixe Communication Solutions B.V." status="" - 20 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="T-Mobile" cc="nl" country="Netherlands" operator="T-Mobile Netherlands B.V" status="Operational" + 20 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600" brand="T-Mobile" cc="nl" country="Netherlands" operator="T-Mobile Netherlands B.V" status="Operational" 21 bands="GSM-R 900" cc="nl" country="Netherlands" operator="ProRail B.V." status="Operational" 22 bands="" cc="nl" country="Netherlands" operator="Ministerie van Defensie" status="" 23 bands="MVNE" cc="nl" country="Netherlands" operator="ASPIDER Solutions Nederland B.V." status="Operational" @@ -116,15 +116,15 @@ 01 bands="GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="Office des Telephones" cc="mc" country="Monaco" operator="Monaco Telecom" status="Operational" 00-99 213 - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Mobiland" cc="ad" country="Andorra" operator="Servei De Tele. DAndorra" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Mobiland" cc="ad" country="Andorra" operator="Servei De Tele. DAndorra" status="Operational" 00-99 214 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Vodafone" cc="es" country="Spain" operator="Vodafone Spain" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Orange" cc="es" country="Spain" operator="France Telecom España SA" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Orange" cc="es" country="Spain" operator="France Telecom España SA" status="Operational" 04 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="Yoigo" cc="es" country="Spain" operator="Xfera Moviles SA" status="Operational" - 05 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="TME" cc="es" country="Spain" operator="Telefónica Móviles España" status="Operational" + 05 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Movistar" cc="es" country="Spain" operator="Telefónica Móviles España" status="Operational" 06 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Vodafone" cc="es" country="Spain" operator="Vodafone Spain" status="Operational" - 07 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="movistar" cc="es" country="Spain" operator="Telefónica Móviles España" status="Operational" + 07 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Movistar" cc="es" country="Spain" operator="Telefónica Móviles España" status="Operational" 08 bands="MVNO" brand="Euskaltel" cc="es" country="Spain" status="Operational" 09 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Orange" cc="es" country="Spain" operator="France Telecom España SA" status="Operational" 10 bands="" cc="es" country="Spain" operator="Operadora de Telecomunicaciones Opera SL" status="" @@ -156,11 +156,11 @@ 51 bands="GSM-R" brand="ADIF" cc="es" country="Spain" operator="Administrador de Infraestructuras Ferroviarias" status="Operational" 00-99 216 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Telenor Hungary" cc="hu" country="Hungary" operator="Telenor Magyarország Zrt." status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="Telenor Hungary" cc="hu" country="Hungary" operator="Telenor Magyarország Zrt." status="Operational" 02 bands="" cc="hu" country="Hungary" operator="MVM Net Ltd." status="" - 03 bands="1800" brand="DIGI" cc="hu" country="Hungary" operator="DIGI Telecommunication Ltd." status="" + 03 bands="LTE 1800" brand="DIGI" cc="hu" country="Hungary" operator="DIGI Telecommunication Ltd." status="Not operational" 30 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="T-Mobile" cc="hu" country="Hungary" operator="Magyar Telekom Plc" status="Operational" - 70 bands="GSM 900 / GSM 1800 / UMTS 2100 / UMTS 900" brand="Vodafone" cc="hu" country="Hungary" operator="Vodafone Magyarország Zrt." status="Operational" + 70 bands="GSM 900 / GSM 1800 / UMTS 2100 / UMTS 900 / LTE 800 / LTE 2600" brand="Vodafone" cc="hu" country="Hungary" operator="Vodafone Magyarország Zrt." status="Operational" 71 bands="MVNO" brand="upc" cc="hu" country="Hungary" operator="UPC Hungary Ltd." status="Operational" 99 bands="GSM-R 900" brand="MAV GSM-R" cc="hu" country="Hungary" operator="Magyar Államvasutak" status="Planned" 00-99 @@ -180,8 +180,10 @@ 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Telenor" cc="rs" country="Serbia" operator="Telenor Montenegro" status="Not operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="mt:s" cc="rs" country="Serbia" operator="Telekom Srbija" status="Operational" 04 bands="GSM" brand="T-Mobile" cc="rs" country="Serbia" operator="T-Mobile Montenegro LLC" status="Not operational" - 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="VIP" cc="rs" country="Serbia" operator="VIP Mobile" status="Operational" + 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="VIP" cc="rs" country="Serbia" operator="VIP Mobile" status="Operational" 07 bands="CDMA 450" cc="rs" country="Serbia" operator="Orion Telekom" status="Operational" + 09 bands="MVNO" brand="Vectone Mobile" cc="rs" country="Serbia" operator="MUNDIO MOBILE d.o.o." status="Not operational" + 11 bands="MVNO" cc="rs" country="Serbia" operator="GLOBALTEL d.o.o." status="Not operational" 00-99 222 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="TIM" cc="it" country="Italy" operator="Telecom Italia S.p.A" status="Operational" @@ -197,29 +199,29 @@ 35 bands="MVNO" brand="Lycamobile" cc="it" country="Italy" operator="Lycamobile" status="Operational" 36 bands="" brand="Digi Mobil" cc="it" country="Italy" operator="Digi Italy S.r.l." status="" 37 bands="" brand="3 Italia" cc="it" country="Italy" operator="H3G S.p.A." status="" - 38 bands="" brand="LINKEM" cc="it" country="Italy" operator="Linkem S.p.A." status="" + 38 bands="TD-LTE 3500" brand="LINKEM" cc="it" country="Italy" operator="Linkem S.p.A." status="Operational" 39 bands="" brand="SMS Italia" cc="it" country="Italy" operator="SMS Italia S.r.l." status="" 43 bands="" brand="TIM" cc="it" country="Italy" operator="Telecom Italia S.p.A." status="" 48 bands="" brand="TIM" cc="it" country="Italy" operator="Telecom Italia S.p.A." status="" 77 bands="UMTS 2100" brand="IPSE 2000" cc="it" country="Italy" status="Not operational" - 88 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="Wind" cc="it" country="Italy" operator="Wind Telecomunicazioni S.p.A." status="Operational" + 88 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800" brand="Wind" cc="it" country="Italy" operator="Wind Telecomunicazioni S.p.A." status="Operational" 98 bands="GSM 900" brand="BLU" cc="it" country="Italy" operator="BLU S.p.A." status="Not operational" - 99 bands="UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="3 Italia" cc="it" country="Italy" operator="H3G S.p.A." status="Operational" + 99 bands="UMTS 900 / UMTS 2100 / LTE 1800" brand="3 Italia" cc="it" country="Italy" operator="H3G S.p.A." status="Operational" 00-99 226 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / TD-LTE 2600" brand="Vodafone" cc="ro" country="Romania" operator="Vodafone România" status="Operational" 02 bands="CDMA 420" brand="Clicknet Mobile" cc="ro" country="Romania" operator="Telekom Romania" status="Not operational" 03 bands="GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600" brand="Telekom" cc="ro" country="Romania" operator="Telekom Romania" status="Operational" 04 bands="CDMA 450" brand="Cosmote/Zapp" cc="ro" country="Romania" operator="Telekom Romania" status="Not operational" - 05 bands="UMTS 900 / UMTS 2100 / TD-LTE 2600" brand="Digi.Mobil" cc="ro" country="Romania" operator="RCS&RDS" status="Operational" - 06 bands="UMTS 2100" brand="Telekom/Zapp" cc="ro" country="Romania" operator="Telekom Romania" status="Operational" + 05 bands="UMTS 900 / UMTS 2100 / LTE 2100 / TD-LTE 2600" brand="Digi.Mobil" cc="ro" country="Romania" operator="RCS&RDS" status="Operational" + 06 bands="UMTS 900 / UMTS 2100" brand="Telekom/Zapp" cc="ro" country="Romania" operator="Telekom Romania" status="Operational" 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Orange" cc="ro" country="Romania" operator="Orange România" status="Operational" 11 bands="MVNO" cc="ro" country="Romania" operator="Enigma-System" status="" 15 bands="WiMAX / TD-LTE 2600" brand="Idilis" cc="ro" country="Romania" operator="Idilis" status="Operational" 16 bands="MVNO" brand="Lycamobile" cc="ro" country="Romania" operator="Lycamobile Romania" status="Operational" 00-99 228 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Swisscom" cc="ch" country="Switzerland" operator="Swisscom Ltd" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600" brand="Swisscom" cc="ch" country="Switzerland" operator="Swisscom Ltd" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Sunrise" cc="ch" country="Switzerland" operator="Sunrise Communications AG" status="Operational" 03 bands="GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Salt" cc="ch" country="Switzerland" operator="Salt Mobile SA" status="Operational" 05 bands="" cc="ch" country="Switzerland" operator="Comfone AG" status="Not operational" @@ -256,7 +258,7 @@ 231 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="Orange" cc="sk" country="Slovakia" operator="Orange Slovensko" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telekom" cc="sk" country="Slovakia" operator="Slovak Telekom" status="Operational" - 03 bands="LTE 1800" brand="Swan" cc="sk" country="Slovakia" operator="Unient Communications" status="Operational" + 03 bands="LTE 1800 / TD-LTE 3700" brand="Swan" cc="sk" country="Slovakia" operator="Unient Communications" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Telekom" cc="sk" country="Slovakia" operator="Slovak Telekom" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Orange" cc="sk" country="Slovakia" operator="Orange Slovensko" status="Operational" 06 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="O2" cc="sk" country="Slovakia" operator="Telefónica O2 Slovakia" status="Operational" @@ -290,7 +292,7 @@ 00 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="BT" cc="gb" country="United Kingdom" operator="BT Group" status="Operational" 01 bands="MVNO" brand="Vectone Mobile" cc="gb" country="United Kingdom" operator="Mundio Mobile Limited" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800" brand="O2 (UK)" cc="gb" country="United Kingdom" operator="Telefónica Europe" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel-Vodafone" cc="je" country="Jersey (United Kingdom)" operator="Jersey Airtel Limited" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE" brand="Airtel-Vodafone" cc="je" country="Jersey (United Kingdom)" operator="Jersey Airtel Limited" status="Operational" 04 bands="GSM 1800" brand="FMS Solutions Ltd" cc="gb" country="United Kingdom" operator="FMS Solutions Ltd" status="Reserved" 05 cc="gb" country="United Kingdom" operator="COLT Mobile Telecommunications Limited" status="" 06 cc="gb" country="United Kingdom" operator="Internet Computer Bureau Limited" status="" @@ -328,11 +330,11 @@ 38 bands="" brand="Virgin Mobile" cc="gb" country="United Kingdom" operator="Virgin Media" status="" 39 bands="" cc="gb" country="United Kingdom" operator="Gamma Telecom Holdings Ltd." status="" 50 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="JT" cc="gb" country="United Kingdom" operator="JT Group Limited" status="Operational" - 51 bands="TD-LTE 3500 / TD-LTE 3700" brand="UK Broadband" cc="gb" country="United Kingdom" operator="UK Broadband Limited" status="Operational" + 51 bands="TD-LTE 3500 / TD-LTE 3700" brand="Relish" cc="gb" country="United Kingdom" operator="UK Broadband Limited" status="Operational" 52 bands="" cc="gb" country="United Kingdom" operator="Shyam Telecom UK Ltd" status="" 53 bands="MVNO" cc="gb" country="United Kingdom" operator="Limitless Mobile Ltd" status="Operational" 54 bands="" cc="gb" country="United Kingdom" operator="The Carphone Warehouse Limited" status="" - 55 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Sure Mobile" cc="je" country="Jersey (United Kingdom)" operator="Sure (Jersey) Limited" status="Operational" + 55 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Sure Mobile" cc="je" country="Jersey (United Kingdom)" operator="Sure (Jersey) Limited" status="Operational" 56 bands="" cc="gb" country="United Kingdom" operator="CESG" status="" 57 bands="" cc="gb" country="United Kingdom" operator="Sky UK Limited" status="" 58 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Pronto GSM" cc="im" country="Isle of Man (United Kingdom)" operator="Manx Telecom" status="Operational" @@ -346,7 +348,7 @@ 00 brand="Vectone Mobile" cc="gb" country="United Kingdom" operator="Mundio Mobile Limited" status="" 01 bands="" cc="gb" country="United Kingdom" operator="EE" status="" 02 bands="" cc="gb" country="United Kingdom" operator="EE" status="" - 03 bands="" brand="UK Broadband" cc="gb" country="United Kingdom" operator="UK Broadband Limited" status="" + 03 bands="" brand="Relish" cc="gb" country="United Kingdom" operator="UK Broadband Limited" status="" 77 brand="BT" cc="gb" country="United Kingdom" operator="BT Group" status="" 91 cc="gb" country="United Kingdom" operator="Vodafone United Kingdom" status="" 92 cc="gb" country="United Kingdom" operator="Vodafone United Kingdom" status="" @@ -354,7 +356,7 @@ 95 cc="gb" country="United Kingdom" operator="Network Rail Infrastructure Limited" status="" 00-99 238 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600" brand="TDC" cc="dk" country="Denmark" operator="TDC A/S" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="TDC" cc="dk" country="Denmark" operator="TDC A/S" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telenor" cc="dk" country="Denmark" operator="Telenor Denmark" status="Operational" 03 bands="" cc="dk" country="Denmark" operator="MACH Connectivity" status="" 04 bands="" cc="dk" country="Denmark" operator="NextGen Mobile Ltd T/A CardBoardFish" status="" @@ -376,6 +378,7 @@ 28 bands="" cc="dk" country="Denmark" operator="CoolTEL ApS" status="" 30 bands="" cc="dk" country="Denmark" operator="Interactive digital media GmbH" status="" 40 bands="" cc="dk" country="Denmark" operator="Ericsson Danmark A/S" status="" + 42 bands="" cc="dk" country="Denmark" operator="Brandtel ApS" status="" 43 bands="" cc="dk" country="Denmark" operator="MobiWeb Limited" status="" 66 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" cc="dk" country="Denmark" operator="TT-Netværket P/S" status="Operational" 77 bands="GSM 900 / GSM 1800" brand="Telenor" cc="dk" country="Denmark" operator="Telenor Denmark" status="Operational" @@ -383,7 +386,7 @@ 240 01 bands="GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2600" brand="Telia" cc="se" country="Sweden" operator="TeliaSonera Sverige AB" status="Operational" 02 bands="UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600 / TD-LTE 2600" brand="3" cc="se" country="Sweden" operator="HI3G Access AB" status="Operational" - 03 bands="CDMA 450" brand="Net 1" cc="se" country="Sweden" operator="Netett Sverige AB" status="Operational" + 03 bands="LTE 450" brand="Net 1" cc="se" country="Sweden" operator="Netett Sverige AB" status="Operational" 04 bands="UMTS 2100" brand="SWEDEN" cc="se" country="Sweden" operator="3G Infrastructure Services AB" status="Operational" 05 bands="UMTS 2100" brand="Sweden 3G" cc="se" country="Sweden" operator="Svenska UMTS-Nät AB" status="Operational" 06 bands="UMTS 2100" brand="Telenor" cc="se" country="Sweden" operator="Telenor Sverige AB" status="Operational" @@ -391,7 +394,7 @@ 08 bands="GSM 900 / GSM 1800" brand="Telenor" cc="se" country="Sweden" operator="Telenor Sverige AB" status="Not operational" 09 bands="" cc="se" country="Sweden" operator="Communication for Devices in Sweden AB" status="" 10 brand="Spring Mobil" cc="se" country="Sweden" operator="Spring Mobil AB" status="Operational" - 11 bands="" cc="se" country="Sweden" operator="Lindholmen Science Park AB" status="Not operational" + 11 bands="" cc="se" country="Sweden" operator="ComHem AB" status="" 12 bands="MVNO" brand="Lycamobile" cc="se" country="Sweden" operator="Lycamobile Sweden Limited" status="Operational" 13 bands="" cc="se" country="Sweden" operator="Alltele Företag Sverige AB" status="" 14 bands="MVNO" cc="se" country="Sweden" operator="TDC Sverige AB" status="Not operational" @@ -405,7 +408,7 @@ 22 bands="" cc="se" country="Sweden" operator="EuTel AB" status="" 23 bands="" cc="se" country="Sweden" operator="Infobip Limited" status="Not operational" 24 bands="GSM 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600" brand="Sweden 2G" cc="se" country="Sweden" operator="Net4Mobility HB" status="Operational" - 25 bands="" cc="se" country="Sweden" operator="Digitel Mobile Srl" status="Not operational" + 25 bands="" cc="se" country="Sweden" operator="Monty UK Global Ltd" status="" 26 bands="GSM" cc="se" country="Sweden" operator="Beepsend AB" status="Operational" 27 bands="MVNO" cc="se" country="Sweden" operator="GlobeTouch AB" status="Operational" 28 bands="" cc="se" country="Sweden" operator="CoolTEL Aps" status="" @@ -426,26 +429,29 @@ 43 bands="" cc="se" country="Sweden" operator="MobiWeb Ltd." status="" 44 bands="" cc="se" country="Sweden" operator="Limitless Mobile AB" status="" 45 bands="" cc="se" country="Sweden" operator="Spirius AB" status="" + 60 bands="" cc="se" country="Sweden" operator="Telefonaktiebolaget LM Ericsson" status="" 00-99 242 - 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Telenor" cc="no" country="Norway" operator="Telenor Norge AS" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Telia" cc="no" country="Norway" operator="TeliaSonera Norge AS" status="Operational" - 03 brand="Teletopia" cc="no" country="Norway" operator="Teletopia Gruppen AS" status="Not operational" - 04 bands="MVNO" brand="Tele2" cc="no" country="Norway" operator="Tele2 (Mobile Norway AS)" status="Operational" - 05 bands="GSM 900 / UMTS 900 / UMTS 2100" brand="Network Norway" cc="no" country="Norway" operator="Tele2 (Mobile Norway AS)" status="Operational" - 06 bands="CDMA2000 450" brand="ICE" cc="no" country="Norway" operator="ICE Norge AS" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telenor" cc="no" country="Norway" operator="Telenor Norge AS" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telia" cc="no" country="Norway" operator="TeliaSonera Norge AS" status="Operational" + 03 bands="" cc="no" country="Norway" operator="Televerket AS" status="" + 04 bands="MVNO" brand="Tele2" cc="no" country="Norway" operator="Tele2 (Mobile Norway AS)" status="Not operational" + 05 bands="GSM 900 / UMTS 900 / UMTS 2100" brand="Telia" cc="no" country="Norway" operator="TeliaSonera Norge AS" status="Not operational" + 06 bands="LTE 450" brand="ICE" cc="no" country="Norway" operator="ICE Norge AS" status="Operational" 07 bands="MVNO" brand="Phonero" cc="no" country="Norway" operator="Phonero AS" status="Operational" 08 bands="MVNO" brand="TDC" cc="no" country="Norway" operator="TDC Mobil AS" status="Operational" 09 bands="MVNO" brand="Com4" cc="no" country="Norway" operator="Com4 AS" status="Operational" - 10 bands="" cc="no" country="Norway" operator="Nasjonal kommunikasjonsmyndighet" status="" + 10 bands="" cc="no" country="Norway" operator="Norwegian Communications Authority" status="" 11 bands="Test" brand="SystemNet" cc="no" country="Norway" operator="SystemNet AS" status="" 12 bands="" brand="Telenor" cc="no" country="Norway" operator="Telenor Norge AS" status="" - 14 bands="" cc="no" country="Norway" operator="ICE Communication Norge AS" status="" + 14 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="ICE" cc="no" country="Norway" operator="ICE Communication Norge AS" status="Operational" 20 bands="GSM-R 900" cc="no" country="Norway" operator="Jernbaneverket AS" status="Operational" 21 bands="GSM-R 900" cc="no" country="Norway" operator="Jernbaneverket AS" status="Operational" + 22 bands="" cc="no" country="Norway" operator="Network Norway AS" status="Not operational" 23 bands="MVNO" brand="Lycamobile" cc="no" country="Norway" operator="Lyca Mobile Ltd" status="Operational" - 24 bands="" cc="no" country="Norway" operator="Mobile Norway AS" status="" + 24 bands="" cc="no" country="Norway" operator="Mobile Norway AS" status="Not operational" 25 bands="" cc="no" country="Norway" operator="Forsvarets kompetansesenter KKIS" status="" + 99 bands="LTE" cc="no" country="Norway" operator="TampNet AS" status="Operational" 00-99 244 03 bands="GSM 1800" brand="DNA" cc="fi" country="Finland" operator="DNA Oy" status="Operational" @@ -471,12 +477,12 @@ 26 bands="MVNO" brand="Compatel" cc="fi" country="Finland" operator="Compatel Ltd" status="Operational" 27 bands="" cc="fi" country="Finland" operator="Teknologian tutkimuskeskus VTT Oy" status="" 29 bands="MVNO" cc="fi" country="Finland" operator="SCNL Truphone" status="Not operational" - 30 bands="MVNO" brand="Vectone Mobile" cc="fi" country="Finland" operator="Mundio Mobile Oy" status="Not Operational" + 30 bands="MVNO" brand="Vectone Mobile" cc="fi" country="Finland" operator="Mundio Mobile Oy" status="Not operational" 31 bands="MVNO" brand="Kuiri" cc="fi" country="Finland" operator="Ukko Mobile Oy" status="Operational" 32 bands="MVNO" brand="Voxbone" cc="fi" country="Finland" operator="Voxbone SA" status="Operational" 33 bands="TETRA" brand="VIRVE" cc="fi" country="Finland" operator="Virve Tuotteet ja Palvelut Oy" status="Operational" 34 bands="MVNO" brand="Bittium Wireless" cc="fi" country="Finland" operator="Bittium Wireless Oy" status="Operational" - 35 bands="LTE 450 / LTE 2600" brand="Ukko Mobile" cc="fi" country="Finland" operator="Ukkoverkot Oy" status="Operational" + 35 bands="LTE 450 / TD-LTE 2600" brand="Ukko Mobile" cc="fi" country="Finland" operator="Ukkoverkot Oy" status="Operational" 36 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Sonera / DNA" cc="fi" country="Finland" operator="TeliaSonera Finland Oyj / Suomen Yhteisverkko Oy" status="Operational" 37 bands="MVNO" brand="Tismi" cc="fi" country="Finland" operator="Tismi BV" status="Operational" 38 bands="" cc="fi" country="Finland" operator="Nokia Solutions and Networks Oy" status="Test Network" @@ -494,15 +500,15 @@ 05 bands="GSM-R 900" brand="LitRail" cc="lt" country="Lithuania" operator="Lietuvos geležinkeliai (Lithuanian Railways)" status="Operational" 06 bands="" brand="Mediafon" cc="lt" country="Lithuania" operator="UAB Mediafon" status="Operational" 07 bands="" cc="lt" country="Lithuania" operator="Compatel Ltd." status="" - 08 bands="WiMAX 3500 / LTE 3500" brand="MEZON" cc="lt" country="Lithuania" operator="Lietuvos radijo ir televizijos centras" status="Operational" + 08 bands="WiMAX 3500 / TD-LTE 2300" brand="MEZON" cc="lt" country="Lithuania" operator="Lietuvos radijo ir televizijos centras" status="Operational" 00-99 247 - 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="LMT" cc="lv" country="Latvia" operator="Latvian Mobile Telephone" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Tele2" cc="lv" country="Latvia" operator="Tele2" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="LMT" cc="lv" country="Latvia" operator="Latvian Mobile Telephone" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Tele2" cc="lv" country="Latvia" operator="Tele2" status="Operational" 03 bands="CDMA 450" brand="TRIATEL" cc="lv" country="Latvia" operator="Telekom Baltija" status="Operational" 04 bands="" cc="lv" country="Latvia" operator="Beta Telecom" status="" - 05 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Bite" cc="lv" country="Latvia" operator="Bite Latvija" status="Operational" - 06 bands="" cc="lv" country="Latvia" operator="Rigatta" status="Reserved" + 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Bite" cc="lv" country="Latvia" operator="Bite Latvija" status="Operational" + 06 bands="" cc="lv" country="Latvia" operator="Rigatta" status="Not operational" 07 bands="MVNO" brand="MTS" cc="lv" country="Latvia" operator="Master Telecom" status="Operational" 08 bands="MVNO" brand="IZZI" cc="lv" country="Latvia" operator="IZZI" status="Operational" 09 bands="MVNO" brand="Camel Mobile" cc="lv" country="Latvia" operator="Camel Mobile" status="Operational" @@ -522,24 +528,24 @@ 00-99 250 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / TD-LTE 2600" brand="MTS" cc="ru" country="Russian Federation" operator="Mobile TeleSystems" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600" brand="MegaFon" cc="ru" country="Russian Federation" operator="MegaFon OJSC - previously known as North-West GSM" status="Operational" - 03 bands="GSM 900 / GSM 1800" brand="NCC" cc="ru" country="Russian Federation" operator="Nizhegorodskaya Cellular Communications (purchased by Tele2)" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="MegaFon" cc="ru" country="Russian Federation" operator="MegaFon PJSC" status="Operational" + 03 bands="GSM 900 / GSM 1800" brand="NCC" cc="ru" country="Russian Federation" operator="Nizhegorodskaya Cellular Communications" status="Operational" 04 bands="GSM 900" brand="Sibchallenge" cc="ru" country="Russian Federation" operator="Sibchallenge" status="Not operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / CDMA2000 450" brand="ETK" cc="ru" country="Russian Federation" operator="Yeniseytelecom" status="Operational" 06 bands="CDMA2000 450" brand="Skylink" cc="ru" country="Russian Federation" operator="CJSC Saratov System of Cellular Communications" status="Operational" 07 bands="GSM 900 / GSM 1800" brand="SMARTS" cc="ru" country="Russian Federation" operator="Zao SMARTS" status="Operational" 09 bands="CDMA2000 450" brand="Skylink" cc="ru" country="Russian Federation" operator="Khabarovsky Cellular Phone" status="Operational" 10 bands="GSM 900" brand="DTC" cc="ru" country="Russian Federation" operator="Dontelekom" status="Not operational" - 11 bands="LTE 2600" brand="Yota" cc="ru" country="Russian Federation" operator="Scartel" status="Operational" + 11 bands="MVNO" brand="Yota" cc="ru" country="Russian Federation" operator="Scartel" status="Operational" 12 bands="GSM 1800" brand="Akos" cc="ru" country="Russian Federation" operator="Baykal Westcom / New Telephone Company / Far Eastern Cellular" status="Operational" 13 bands="GSM 900 / GSM 1800" brand="KUGSM" cc="ru" country="Russian Federation" operator="Kuban GSM" status="Not operational" - 14 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / TD-LTE 2600" brand="MegaFon" cc="ru" country="Russian Federation" operator="MegaFon OJSC" status="Operational" + 14 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / TD-LTE 2600" brand="MegaFon" cc="ru" country="Russian Federation" operator="MegaFon OJSC" status="Not operational" 15 bands="GSM 1800" brand="SMARTS" cc="ru" country="Russian Federation" operator="SMARTS Ufa, SMARTS Uljanovsk" status="Operational" 16 bands="GSM 900 / GSM 1800" brand="NTC" cc="ru" country="Russian Federation" operator="New Telephone Company" status="Operational" 17 bands="GSM 900 / GSM 1800" brand="Utel" cc="ru" country="Russian Federation" operator="JSC Uralsvyazinform" status="Operational" 18 bands="TD-LTE 2300" brand="Osnova Telecom" cc="ru" country="Russian Federation" status="Not operational" 19 bands="GSM 1800" brand="INDIGO" cc="ru" country="Russian Federation" operator="INDIGO" status="Not operational" - 20 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Tele2" cc="ru" country="Russian Federation" operator="Tele2" status="Operational" + 20 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 450 / LTE 1800 / LTE 2600" brand="Tele2" cc="ru" country="Russian Federation" operator="Tele2" status="Operational" 22 bands="TD-LTE 2300" cc="ru" country="Russian Federation" operator="Vainakh Telecom" status="Operational" 23 bands="GSM 900 / GSM 1800" brand="Mobicom - Novosibirsk" cc="ru" country="Russian Federation" operator="Mobicom - Novosibirsk" status="Not operational" 28 bands="GSM 900" brand="Beeline" cc="ru" country="Russian Federation" operator="Beeline" status="Not operational" @@ -548,12 +554,12 @@ 34 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Krymtelekom" cc="ru" country="Russian Federation" operator="Krymtelekom" status="Operational" 35 bands="GSM 1800 / LTE 1800" brand="MOTIV" cc="ru" country="Russian Federation" operator="EKATERINBURG-2000" status="Operational" 38 bands="GSM 900 / GSM 1800" brand="Tambov GSM" cc="ru" country="Russian Federation" operator="Central Telecommunication Company" status="Operational" - 39 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / TD-LTE 2300 / LTE 2600" brand="Rostelecom" cc="ru" country="Russian Federation" operator="ROSTELECOM" status="Operational" + 39 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / TD-LTE 2300 / LTE 2600" brand="Rostelecom" cc="ru" country="Russian Federation" operator="ROSTELECOM" status="Not operational" 44 bands="" cc="ru" country="Russian Federation" operator="Stavtelesot / North Caucasian GSM" status="Not operational" - 50 bands="GSM 900 / GSM 1800" brand="MTS" cc="ru" country="Russian Federation" operator="Bezlimitno.ru" status="Operational" + 50 bands="MVNO" brand="MTS" cc="ru" country="Russian Federation" operator="Bezlimitno.ru" status="Operational" 54 bands="LTE 1800" brand="TTK" cc="ru" country="Russian Federation" operator="Tattelecom" status="Operational" 60 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Volna mobile" cc="ru" country="Russian Federation" operator="KTK Telecom" status="Operational" - 811 cc="ru" country="Russian Federation" operator="Votek Mobile" status="" + 811 bands="AMPS / DAMPS / GSM 1800" cc="ru" country="Russian Federation" operator="Votek Mobile" status="Not operational" 91 bands="GSM 1800" brand="Sonic Duo" cc="ru" country="Russian Federation" operator="Sonic Duo CJSC" status="Not operational" 92 bands="" cc="ru" country="Russian Federation" operator="Primtelefon" status="Not operational" 93 bands="" cc="ru" country="Russian Federation" operator="Telecom XXI" status="Not operational" @@ -578,7 +584,6 @@ 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="life:)" cc="by" country="Belarus" operator="Belarusian Telecommunications Network" status="Operational" 05 bands="" cc="by" country="Belarus" operator="Beltelecom" status="" 06 bands="LTE 1800" brand="beCloud" cc="by" country="Belarus" operator="Belorussian Cloud Technologies" status="Operational" - 501 bands="" brand="BelCel JV" cc="by" country="Belarus" status="" 00-99 259 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Orange" cc="md" country="Moldova" operator="Orange Moldova" status="Operational" @@ -622,7 +627,7 @@ 31 bands="" brand="Phone IT" cc="pl" country="Poland" operator="Phone IT Sp. z o.o." status="" 32 bands="" cc="pl" country="Poland" operator="Compatel Limited" status="" 33 bands="MVNO" brand="Truphone" cc="pl" country="Poland" operator="Truphone Poland Sp. z o.o." status="Operational" - 34 bands="UMTS 900" brand="NetWorkS!" cc="pl" country="Poland" operator="T-Mobile Polska S.A." status="Operational" + 34 bands="UMTS 900 / LTE 1800" brand="NetWorkS!" cc="pl" country="Poland" operator="T-Mobile Polska S.A." status="Operational" 35 bands="GSM-R" cc="pl" country="Poland" operator="PKP Polskie Linie Kolejowe S.A." status="Operational" 36 bands="MVNO" brand="Vectone Mobile" cc="pl" country="Poland" operator="Mundio Mobile" status="Not operational" 37 bands="" cc="pl" country="Poland" operator="NEXTGEN MOBILE LTD" status="" @@ -637,7 +642,7 @@ 46 bands="" cc="pl" country="Poland" operator="Terra Telekom Sp. z o.o." status="" 47 bands="" cc="pl" country="Poland" operator="SMShighway Limited" status="" 48 bands="" cc="pl" country="Poland" operator="AGILE TELECOM S.P.A." status="" - 98 bands="LTE 1800" brand="Play" cc="pl" country="Poland" operator="P4 Sp. z o.o." status="Not Operational" + 98 bands="LTE 1800" brand="Play" cc="pl" country="Poland" operator="P4 Sp. z o.o." status="Not operational" 00-99 262 01 bands="GSM 900 / GSM 1800/ / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telekom" cc="de" country="Germany" operator="Telekom Deutschland GmbH" status="Operational" @@ -679,7 +684,7 @@ 92 bands="GSM 1800 / UMTS 2100" cc="de" country="Germany" operator="Nash Technologies" status="Operational" 00-99 266 - 01 bands="GSM 900" brand="GibTel" cc="gi" country="Gibraltar (United Kingdom)" operator="Gibtelecom" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600" brand="GibTel" cc="gi" country="Gibraltar (United Kingdom)" operator="Gibtelecom" status="Operational" 06 bands="UMTS 2100" brand="CTS Mobile" cc="gi" country="Gibraltar (United Kingdom)" operator="CTS Gibraltar" status="Not operational" 09 bands="GSM 1800 / UMTS 2100" brand="Shine" cc="gi" country="Gibraltar (United Kingdom)" operator="Eazitelecom" status="Operational" 00-99 @@ -700,7 +705,7 @@ 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="POST" cc="lu" country="Luxembourg" operator="POST Luxembourg" status="Operational" 02 bands="" cc="lu" country="Luxembourg" operator="MTX Connect S.a.r.l." status="" 10 bands="" cc="lu" country="Luxembourg" operator="Blue Communications" status="" - 77 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Tango" cc="lu" country="Luxembourg" operator="Tango SA" status="Operational" + 77 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="Tango" cc="lu" country="Luxembourg" operator="Tango SA" status="Operational" 78 bands="" cc="lu" country="Luxembourg" operator="Interactive digital media GmbH" status="" 99 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Orange" cc="lu" country="Luxembourg" operator="Orange S.A." status="Operational" 00-99 @@ -737,9 +742,9 @@ 04 bands="GSM 900 / GSM 1800" brand="Plus Communication" cc="al" country="Albania" operator="Plus Communication" status="Operational" 00-99 278 - 01 bands="GSM 900 / UMTS 2100" brand="Vodafone" cc="mt" country="Malta" operator="Vodafone Malta" status="Operational" + 01 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Vodafone" cc="mt" country="Malta" operator="Vodafone Malta" status="Operational" 11 bands="MVNO" cc="mt" country="Malta" operator="YOM Ltd." status="Operational" - 21 bands="GSM 1800 / UMTS 2100" brand="GO" cc="mt" country="Malta" operator="Mobile Communications Limited" status="Operational" + 21 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="GO" cc="mt" country="Malta" operator="Mobile Communications Limited" status="Operational" 30 bands="" brand="GO" cc="mt" country="Malta" operator="Mobile Communications Limited" status="" 77 bands="UMTS 2100" brand="Melita" cc="mt" country="Malta" operator="Melita" status="Operational" 00-99 @@ -762,10 +767,10 @@ 09 bands="" cc="ge" country="Georgia" operator="Gmobile Ltd" status="" 00-99 283 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Beeline" cc="am" country="Armenia" operator="ArmenTel" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 450" brand="Beeline" cc="am" country="Armenia" operator="ArmenTel" status="Operational" 04 bands="GSM 900 / UMTS 900" brand="Karabakh Telecom" cc="am" country="Armenia" operator="Karabakh Telecom" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="VivaCell-MTS" cc="am" country="Armenia" operator="K Telecom CJSC" status="Operational" - 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Orange" cc="am" country="Armenia" operator="Orange S.A." status="Operational" + 10 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Ucom" cc="am" country="Armenia" operator="Ucom LLC" status="Operational" 00-99 284 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="M-Tel" cc="bg" country="Bulgaria" operator="Mobiltel" status="Operational" @@ -777,9 +782,9 @@ 13 bands="LTE 1800" brand="MAX" cc="bg" country="Bulgaria" operator="Max Telecom LTD" status="Operational" 00-99 286 - 01 bands="GSM 900 / UMTS 2100" brand="Turkcell" cc="tr" country="Turkey" operator="Turkcell Iletisim Hizmetleri A.S." status="Operational" - 02 bands="GSM 900 / UMTS 2100" brand="Vodafone" cc="tr" country="Turkey" operator="Vodafone Turkey" status="Operational" - 03 bands="GSM 1800 / UMTS 2100" brand="Türk Telekom" cc="tr" country="Turkey" operator="Türk Telekom" status="Operational" + 01 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600" brand="Turkcell" cc="tr" country="Turkey" operator="Turkcell Iletisim Hizmetleri A.S." status="Operational" + 02 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600" brand="Vodafone" cc="tr" country="Turkey" operator="Vodafone Turkey" status="Operational" + 03 bands="GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Türk Telekom" cc="tr" country="Turkey" operator="Türk Telekom" status="Operational" 04 bands="GSM 1800" brand="Aycell" cc="tr" country="Turkey" operator="Aycell" status="Not operational" 00-99 288 @@ -788,12 +793,12 @@ 03 bands="GSM 1800" cc="fo" country="Faroe Islands (Denmark)" operator="Edge Mobile Sp/F" status="Not operational" 00-99 289 - 67 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Aquafon" country="Abkhazia - GE-AB" operator="Aquafon JSC" status="Operational" + 67 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Aquafon" country="Abkhazia - GE-AB" operator="Aquafon JSC" status="Operational" 88 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="A-Mobile" country="Abkhazia - GE-AB" operator="A-Mobile LLSC" status="Operational" 00-99 290 01 bands="GSM 900 / UMTS 900 / LTE 800" cc="gl" country="Greenland (Denmark)" operator="TELE Greenland A/S" status="Operational" - 02 bands="" cc="gl" country="Greenland (Denmark)" operator="inu:it a/s" status="" + 02 bands="TD-LTE 2500" brand="Nuuk TV" cc="gl" country="Greenland (Denmark)" operator="inu:it a/s" status="Operational" 00-99 292 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="PRIMA" cc="sm" country="San Marino" operator="San Marino Telecom" status="Operational" @@ -802,21 +807,21 @@ 10 bands="GSM-R" cc="si" country="Slovenia" operator="SŽ - Infrastruktura, d.o.o." status="Not operational" 20 bands="" cc="si" country="Slovenia" operator="COMPATEL Ltd" status="" 40 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Si.mobil" cc="si" country="Slovenia" operator="SI.MOBIL d.d." status="Operational" - 41 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800" brand="Mobitel" cc="si" country="Slovenia" operator="Telekom Slovenije" status="Operational" + 41 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600" brand="Mobitel" cc="si" country="Slovenia" operator="Telekom Slovenije" status="Operational" 64 bands="UMTS 2100" brand="T-2" cc="si" country="Slovenia" operator="T-2 d.o.o." status="Operational" - 70 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Telemach" cc="si" country="Slovenia" operator="Tušmobil d.o.o." status="Operational" + 70 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Telemach" cc="si" country="Slovenia" operator="Tušmobil d.o.o." status="Operational" 00-99 294 - 01 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Telekom.mk" cc="mk" country="Macedonia" operator="Makedonski Telekom" status="Operational" - 02 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="ONE" cc="mk" country="Macedonia" operator="One" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Vip MK" cc="mk" country="Macedonia" operator="VIP Operator" status="Operational" + 01 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Telekom.mk" cc="mk" country="Macedonia" operator="Makedonski Telekom" status="Operational" + 02 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="ONE" cc="mk" country="Macedonia" operator="One" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Vip MK" cc="mk" country="Macedonia" operator="VIP Operator" status="Operational" 04 bands="MVNO" brand="Lycamobile" cc="mk" country="Macedonia" operator="Lycamobile LLC" status="Operational" 10 bands="" cc="mk" country="Macedonia" operator="WTI Macedonia" status="" 11 bands="" cc="mk" country="Macedonia" operator="MOBIK TELEKOMUNIKACII DOOEL Skopje" status="" 00-99 295 - 01 bands="GSM 900 / GSM 1800" brand="Swisscom" cc="li" country="Liechtenstein" operator="Swisscom Schweiz AG" status="Operational" - 02 bands="GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="7acht" cc="li" country="Liechtenstein" operator="Salt Liechtenstein AG" status="Operational" + 01 bands="GSM 900 / GSM 1800 / LTE 1800" brand="Swisscom" cc="li" country="Liechtenstein" operator="Swisscom Schweiz AG" status="Operational" + 02 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="7acht" cc="li" country="Liechtenstein" operator="Salt Liechtenstein AG" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="FL1" cc="li" country="Liechtenstein" operator="Telecom Liechtenstein AG" status="Operational" 06 bands="MVNO" brand="Cubic Telecom" cc="li" country="Liechtenstein" operator="Cubic Telecom AG" status="Operational" 07 bands="MVNO" cc="li" country="Liechtenstein" operator="First Mobile AG" status="" @@ -825,7 +830,7 @@ 77 bands="GSM 900" brand="Alpmobil" cc="li" country="Liechtenstein" operator="Alpcom AG" status="Not operational" 00-99 297 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Telenor" cc="me" country="Montenegro" operator="Telenor Montenegro" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="Telenor" cc="me" country="Montenegro" operator="Telenor Montenegro" status="Operational" 02 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="T-Mobile" cc="me" country="Montenegro" operator="T-Mobile Montenegro LLC" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="m:tel CG" cc="me" country="Montenegro" operator="MTEL CG" status="Operational" 00-99 @@ -898,7 +903,7 @@ 013 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" 014 bands="" cc="us" country="United States of America" status="" 015 bands="iDEN" brand="Southern LINC" cc="us" country="United States of America" operator="Southern Communications" status="" - 016 bands="CDMA2000 1900 / CDMA2000 1700" brand="Cricket Wireless" cc="us" country="United States of America" operator="Cricket Communications" status="Not operational" + 016 bands="CDMA2000 1900 / CDMA2000 1700" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Not operational" 017 bands="iDEN" brand="ProxTel" cc="us" country="United States of America" operator="North Sight Communications Inc." status="" 020 bands="GSM 850 / GSM 1900 / UMTS" brand="Union Wireless" cc="us" country="United States of America" operator="Union Telephone Company" status="Operational" 030 bands="GSM 850" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" @@ -910,11 +915,11 @@ 050 bands="CDMA" brand="GCI" cc="us" country="United States of America" operator="Alaska Communications" status="Operational" 053 bands="MVNO" brand="Virgin Mobile" cc="us" country="United States of America" operator="Sprint" status="Operational" 054 bands="" cc="us" country="United States of America" operator="Alltel US" status="Operational" - 060 bands="" brand="CTEL" cc="us" country="United States of America" operator="Consolidated Telcom" status="" + 060 bands="1900" cc="us" country="United States of America" operator="Consolidated Telcom" status="" 066 bands="GSM / CDMA" brand="U.S. Cellular" cc="us" country="United States of America" operator="U.S. Cellular" status="Operational" 070 bands="GSM 850" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 080 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" - 090 bands="GSM 1900" brand="Cricket Wireless" cc="us" country="United States of America" operator="Cricket Communications" status="Operational" + 090 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 100 bands="GSM 850 / UMTS 850 / UMTS 1700" brand="Plateau Wireless" cc="us" country="United States of America" operator="New Mexico RSA 4 East LP" status="Operational" 110 bands="CDMA / GSM 850 / LTE 700" brand="IT&E Wireless" cc="us" country="United States of America" operator="PTI Pacifica Inc." status="Operational" 120 bands="CDMA2000 1900 / LTE 850 / LTE 1900" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="Operational" @@ -933,7 +938,7 @@ 250 bands="GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Not operational" 260 bands="GSM 1900 / UMTS 1900 / UMTS 1700 / LTE 700 / LTE 1900 / LTE 1700" brand="T-Mobile USA" cc="us" country="United States of America" operator="T-Mobile USA" status="Operational" 270 bands="GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Not operational" - 280 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Not Operational" + 280 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Not operational" 290 bands="GSM 1900" brand="nep" cc="us" country="United States of America" operator="NEP Cellcorp Inc." status="Not operational" 300 bands="GSM 1900" brand="Big Sky Mobile" cc="us" country="United States of America" operator="iSmart Mobile, LLC" status="Operational" 310 bands="GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Not operational" @@ -953,7 +958,7 @@ 440 bands="MVNO" cc="us" country="United States of America" operator="Numerex" status="Operational" 450 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="Viaero" cc="us" country="United States of America" operator="Viaero Wireless" status="Operational" 460 bands="GSM 1900" brand="NewCore" cc="us" country="United States of America" operator="NewCore Wireless LLC" status="Operational" - 470 bands="CDMA2000 1900" brand="nTelos" cc="us" country="United States of America" operator="nTelos Communications, Inc." status="Operational" + 470 bands="CDMA2000 1900" brand="Shentel" cc="us" country="United States of America" operator="Shenandoah Telecommunications Company" status="Operational" 480 bands="iDEN" brand="Instant Connect" cc="us" country="United States of America" operator="Wave Runner LLC" status="Operational" 490 bands="GSM 850 / GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Operational" 500 bands="CDMA2000 850 / CDMA2000 1900" brand="Alltel" cc="us" country="United States of America" operator="Public Service Cellular Inc." status="Operational" @@ -967,7 +972,7 @@ 580 bands="CDMA2000" cc="us" country="United States of America" operator="Inland Cellular Telephone Company" status="Operational" 59 bands="CDMA" brand="Cellular One" cc="bm" country="Bermuda" status="Operational" 590 bands="GSM 850 / GSM 1900" cc="us" country="United States of America" operator="Verizon Wireless" status="" - 600 bands="CDMA2000 850 / CDMA2000 1900 / LTE 700" brand="Cellcom" cc="us" country="United States of America" operator="New-Cell Inc." status="Operational" + 600 bands="CDMA2000 850 / CDMA2000 1900" brand="Cellcom" cc="us" country="United States of America" operator="New-Cell Inc." status="Operational" 610 bands="GSM 1900" brand="Epic PCS" cc="us" country="United States of America" operator="Elkhart Telephone Co." status="Not operational" 620 bands="" brand="Cellcom" cc="us" country="United States of America" operator="Nsighttel Wireless LLC" status="" 630 bands="LTE 700" brand="miSpot" cc="us" country="United States of America" operator="Agri-Valley Communications" status="Not operational" @@ -981,7 +986,7 @@ 710 bands="GSM 850" brand="ASTAC" cc="us" country="United States of America" operator="Arctic Slope Telephone Association Cooperative" status="Operational" 720 bands="" cc="us" country="United States of America" operator="Syniverse Technologies" status="" 730 bands="" brand="U.S. Cellular" cc="us" country="United States of America" operator="U.S. Cellular" status="" - 740 bands="" cc="us" country="United States of America" operator="Green Eagle Communications, Inc." status="" + 740 bands="LTE 700 / LTE 1700 / LTE 1900" brand="Viaero" cc="us" country="United States of America" operator="Viaero Wireless" status="Operational" 750 bands="CDMA2000 850 / CDMA2000 1900" brand="Appalachian Wireless" cc="us" country="United States of America" operator="East Kentucky Network, LLC" status="Operational" 760 bands="" cc="us" country="United States of America" operator="Lynch 3G Communications Corporation" status="Not operational" 770 bands="GSM 1900 / UMTS 1700 / LTE 1700 / LTE 1900" brand="iWireless" cc="us" country="United States of America" operator="Iowa Wireless Services" status="Operational" @@ -990,11 +995,11 @@ 800 bands="GSM 1900" cc="us" country="United States of America" operator="T-Mobile" status="Not operational" 810 bands="1900" cc="us" country="United States of America" operator="LCFR LLC" status="" 820 bands="" cc="us" country="United States of America" operator="Verizon Wireless" status="" - 830 bands="" cc="us" country="United States of America" operator="Clearwire Corporation" status="" + 830 bands="WiMAX" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="Not operational" 840 bands="MVNO" brand="telna Mobile" cc="us" country="United States of America" operator="Telecom North America Mobile, Inc." status="Operational" - 850 bands="CDMA" brand="Aeris" cc="us" country="United States of America" operator="Aeris Communications, Inc." status="Operational" + 850 bands="MVNO" brand="Aeris" cc="us" country="United States of America" operator="Aeris Communications, Inc." status="Operational" 860 bands="CDMA" brand="Five Star Wireless" cc="us" country="United States of America" operator="TX RSA 15B2, LP" status="Operational" - 870 bands="MVNO" brand="PACE" cc="us" country="United States of America" operator="Kaplan Telephone Company" status="Operational" + 870 bands="GSM 850" brand="PACE" cc="us" country="United States of America" operator="Kaplan Telephone Company" status="Not operational" 880 bands="GSM 850" brand="DTC Wireless" cc="us" country="United States of America" operator="Advantage Cellular Systems, Inc." status="Operational" 890 bands="GSM 850 / GSM 1900" cc="us" country="United States of America" operator="Verizon Wireless" status="" 900 bands="CDMA2000 850 / CDMA2000 1900" brand="Mid-Rivers Wireless" cc="us" country="United States of America" operator="Cable & Communications Corporation" status="Operational" @@ -1003,7 +1008,7 @@ 930 bands="CDMA" cc="us" country="United States of America" operator="Copper Valley Wireless" status="Operational" 940 bands="MVNO" cc="us" country="United States of America" operator="Iris Wireless LLC" status="" 950 bands="GSM 850" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" - 960 bands="CDMA / LTE 700" brand="STRATA" cc="us" country="United States of America" operator="UBET Wireless" status="Operational" + 960 bands="CDMA" brand="STRATA" cc="us" country="United States of America" operator="UBET Wireless" status="Operational" 970 bands="Satellite" cc="us" country="United States of America" operator="Globalstar" status="Operational" 980 bands="CDMA / LTE 700" brand="Peoples Telephone" cc="us" country="United States of America" operator="Texas RSA 7B3" status="Not operational" 990 bands="LTE 700" brand="Evolve Broadband" cc="us" country="United States of America" operator="Worldcall Interconnect Inc." status="Operational" @@ -1014,85 +1019,205 @@ 012 bands="CDMA2000 850 / CDMA2000 1900" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Operational" 020 bands="GSM 850" brand="Chariton Valley" cc="us" country="United States of America" operator="Missouri RSA 5 Partnership" status="Operational" 030 bands="GSM 850 / GSM 1900 / UMTS 850" brand="Indigo Wireless" cc="us" country="United States of America" operator="Americell PA 3 Partnership" status="Operational" - 040 bands="GSM 850 / GSM 1900" brand="Choice Wireless" cc="us" country="United States of America" operator="Commnet Wireless" status="Operational" + 040 bands="GSM 850 / GSM 1900 / CDMA 2000 / UMTS" brand="Choice Wireless" cc="us" country="United States of America" operator="Commnet Wireless" status="Operational" 050 bands="CDMA2000 850" cc="us" country="United States of America" operator="Thumb Cellular LP" status="Operational" - 060 bands="GSM 850 / GSM 1900" brand="Farmers Cellular" cc="us" country="United States of America" operator="Farmers Cellular Telephone" status="Operational" - 070 bands="GSM 850" brand="Easterbrooke" cc="us" country="United States of America" operator="Easterbrooke Cellular Corporation" status="Operational" + 060 bands="" cc="us" country="United States of America" operator="Space Data Corporation" status="Operational" + 070 bands="GSM 850" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" 080 bands="GSM 850 / LTE" brand="Pine Cellular" cc="us" country="United States of America" operator="Pine Telephone Company" status="Operational" 090 bands="GSM 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Operational" - 100 bands="GSM 1900" cc="us" country="United States of America" operator="High Plains Wireless" status="Operational" - 110 bands="GSM 1900" cc="us" country="United States of America" operator="High Plains Wireless" status="Operational" + 100 bands="CDMA2000" cc="us" country="United States of America" operator="Nex-Tech Wireless" status="Operational" + 110 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" 120 bands="" brand="iConnect" cc="us" country="United States of America" operator="Wave Runner LLC" status="Operational" - 130 bands="GSM 850" cc="us" country="United States of America" operator="Cell One Amarillo" status="Operational" + 130 bands="LTE" cc="us" country="United States of America" operator="Lightsquared L.P." status="Not operational" 140 bands="CDMA" brand="Sprocket Wireless" cc="us" country="United States of America" operator="Cross Telephone / MBO Wireless" status="Operational" 150 bands="GSM 850" cc="us" country="United States of America" operator="Wilkes Cellular" status="Operational" - 160 bands="" cc="us" country="United States of America" operator="Endless Mountains Wireless" status="Operational" - 170 bands="GSM 850" brand="PetroCom" cc="us" country="United States of America" operator="Broadpoint Inc" status="Operational" - 180 bands="GSM 850 / UMTS 850 / UMTS 1900" cc="us" country="United States of America" operator="Cingular Wireless" status="Not operational" - 190 bands="" cc="us" country="United States of America" operator="Cellular Properties" status="" - 210 bands="GSM 1900 / UMTS 2100" cc="us" country="United States of America" operator="Emery Telcom Wireless" status="Operational" + 160 bands="LTE" cc="us" country="United States of America" operator="Lightsquared L.P." status="Not operational" + 170 bands="GSM 850" cc="us" country="United States of America" operator="Broadpoint Inc." status="Operational" + 180 bands="GSM 850 / UMTS 850 / UMTS 1900" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="Not operational" + 190 bands="" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="" + 200 bands="" cc="us" country="United States of America" operator="ARINC" status="" + 210 bands="GSM 1900" cc="us" country="United States of America" operator="Emery Telcom Wireless" status="Not operational" 220 bands="CDMA" brand="U.S. Cellular" cc="us" country="United States of America" operator="U.S. Cellular" status="Operational" 230 bands="CDMA 850 / CDMA 1900 / LTE 1900 / LTE 1700" brand="C Spire Wireless" cc="us" country="United States of America" operator="Cellular South Inc." status="Operational" + 240 bands="GSM / UMTS 850 / WiMAX" cc="us" country="United States of America" operator="Cordova Wireless" status="Operational" 250 bands="" brand="iConnect" cc="us" country="United States of America" operator="Wave Runner LLC" status="Operational" - 330 bands="" brand="Bug Tussel Wireless" cc="us" country="United States of America" operator="Bug Tussel Wireless" status="Operational" + 260 bands="WiMAX" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="Not operational" + 270 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 271 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 272 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 273 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 274 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 275 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 276 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 277 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 278 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 279 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 280 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 281 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 282 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 283 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 284 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 285 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 286 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 287 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 288 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 289 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 290 bands="GSM 1900 / UMTS / LTE" brand="BLAZE" cc="us" country="United States of America" operator="PinPoint Communications Inc." status="Operational" + 300 bands="" cc="us" country="United States of America" operator="Nexus Communications, Inc." status="" + 310 bands="CDMA2000" brand="NMobile" cc="us" country="United States of America" operator="Leaco Rural Telephone Company Inc." status="Operational" + 320 bands="GSM 850 / GSM 1900 / CDMA 2000 / UMTS" brand="Choice Wireless" cc="us" country="United States of America" operator="Commnet Wireless" status="Operational" + 330 bands="GSM 1900" brand="Bug Tussel Wireless" cc="us" country="United States of America" operator="Bug Tussel Wireless LLC" status="Operational" + 340 bands="CDMA2000 / LTE 850" cc="us" country="United States of America" operator="Illinois Valley Cellular" status="Operational" + 350 bands="CDMA2000" brand="Nemont" cc="us" country="United States of America" operator="Sagebrush Cellular, Inc." status="Operational" 360 bands="UMTS 1700" cc="us" country="United States of America" operator="Stelera Wireless" status="Not operational" 370 bands="LTE 1700" brand="GCI Wireless" cc="us" country="United States of America" operator="General Communication Inc." status="Operational" - 410 bands="LTE 700" brand="Chat Mobility" cc="us" country="United States of America" operator="Iowa RSA No. 2 LP" status="Operational" - 420 bands="CDMA / LTE 700" brand="NorthwestCell" cc="us" country="United States of America" operator="Northwest Missouri Cellular LP" status="Operational" + 380 bands="MVNO" cc="us" country="United States of America" operator="New Dimension Wireless Ltd." status="Operational" + 390 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 400 bands="" cc="us" country="United States of America" status="" + 410 bands="CDMA" brand="Chat Mobility" cc="us" country="United States of America" operator="Iowa RSA No. 2 LP" status="Operational" + 420 bands="CDMA" brand="NorthwestCell" cc="us" country="United States of America" operator="Northwest Missouri Cellular LP" status="Operational" + 430 bands="CDMA" brand="Chat Mobility" cc="us" country="United States of America" operator="RSA 1 LP" status="" + 440 bands="CDMA" cc="us" country="United States of America" operator="Bluegrass Cellular LLC" status="Operational" 450 bands="GSM 1900 / LTE 700" brand="PTCI" cc="us" country="United States of America" operator="Panhandle Telecommunication Systems Inc." status="Operational" + 460 bands="DMR" cc="us" country="United States of America" operator="Fisher Wireless Services Inc." status="Operational" + 470 bands="GSM 850 / GSM 1900" brand="Innovative Wireless" cc="us" country="United States of America" operator="Vitelcom Cellular Inc." status="Operational" 480 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Operational" - 481 cc="us" country="United States of America" + 481 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" + 482 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" + 483 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" + 484 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" + 485 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" + 486 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" + 487 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" + 488 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" + 489 bands="LTE 700" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="Not operational" 490 bands="LTE 850 / LTE 1900 / TD-LTE 2500" brand="Sprint Corporation" cc="us" country="United States of America" operator="Sprint" status="Operational" - 500 bands="UMTS / LTE 700 / LTE 1700" cc="us" country="United States of America" operator="Mosaic Telecom" status="Operational" - 530 bands="GSM 1900" brand="NewCore" cc="us" country="United States of America" operator="NewCore Wireless LLC" status="Operational" - 570 bands="UMTS 1700 / LTE 1700" cc="us" country="United States of America" operator="BendBroadband" status="Not operational" + 500 bands="UMTS / LTE 700 / LTE 1700" cc="us" country="United States of America" operator="Mosaic Telecom" status="Not operational" + 510 bands="LTE" cc="us" country="United States of America" operator="Lightsquared L.P." status="Not operational" + 520 bands="LTE" cc="us" country="United States of America" operator="Lightsquared L.P." status="Not operational" + 530 bands="LTE 1900" brand="NewCore" cc="us" country="United States of America" operator="NewCore Wireless LLC" status="Operational" + 540 bands="GSM 850" cc="us" country="United States of America" operator="Proximiti Mobility Inc." status="" + 550 bands="GSM 850 / GSM 1900 / CDMA 2000 / UMTS" brand="Choice Wireless" cc="us" country="United States of America" operator="Commnet Midwest LLC" status="Operational" + 560 bands="GSM 850" brand="OTZ Cellular" cc="us" country="United States of America" operator="OTZ Communications, Inc." status="Operational" + 570 bands="UMTS 1700 / LTE 1700" brand="BendBroadband" cc="us" country="United States of America" operator="Bend Cable Communications LLC" status="Not operational" 580 bands="LTE 700 / LTE 850" brand="U.S. Cellular" cc="us" country="United States of America" operator="U.S. Cellular" status="Operational" + 590 bands="" brand="Verizon" cc="us" country="United States of America" operator="Verizon Wireless" status="" + 600 bands="CDMA" brand="Cox Wireless" cc="us" country="United States of America" operator="Cox TMI Wireless LLC" status="Not operational" + 610 bands="CDMA" brand="SRT Communications" cc="us" country="United States of America" operator="North Dakota Network Co." status="Operational" + 620 bands="Satellite" cc="us" country="United States of America" operator="TerreStar Networks, Inc." status="Not operational" 630 bands="" brand="C Spire Wireless" cc="us" country="United States of America" operator="Cellular South Inc." status="" 640 bands="LTE 700" brand="Rock Wireless" cc="us" country="United States of America" operator="Standing Rock Telecommunications" status="Operational" 650 bands="CDMA / LTE 700 / WiMAX 3700" brand="United Wireless" cc="us" country="United States of America" operator="United Wireless" status="Operational" - 660 bands="CDMA2000 1900 / CDMA 2000 1700 / LTE 1700" brand="metroPCS" cc="us" country="United States of America" operator="metroPCS" status="Operational" - 750 bands="LTE" cc="us" country="United States of America" operator="NetAmerica Alliance" status="Operational" + 660 bands="MVNO" brand="metroPCS" cc="us" country="United States of America" operator="MetroPCS Wireless Inc." status="Operational" + 670 bands="CDMA" brand="Pine Belt Wireless" cc="us" country="United States of America" operator="Pine Belt Cellular Inc." status="Operational" + 680 bands="GSM 1900" cc="us" country="United States of America" operator="GreenFly LLC" status="" + 690 bands="paging" cc="us" country="United States of America" operator="TeleBEEPER of New Mexico" status="Operational" + 700 bands="MVNO" cc="us" country="United States of America" operator="Aspenta International, Inc." status="Operational" + 710 bands="" cc="us" country="United States of America" operator="Northeast Wireless Networks LLC" status="" + 720 bands="GSM 1900" cc="us" country="United States of America" operator="MainePCS LLC" status="Not operational" + 730 bands="GSM 850" cc="us" country="United States of America" operator="Proximiti Mobility Inc." status="" + 740 bands="GSM 850" cc="us" country="United States of America" operator="Telalaska Cellular" status="Operational" + 750 bands="" brand="ClearTalk" cc="us" country="United States of America" operator="Flat Wireless LLC" status="" + 760 bands="" cc="us" country="United States of America" operator="Edigen Inc." status="" + 770 bands="" cc="us" country="United States of America" operator="Altiostar Networks, Inc." status="" + 780 bands="" brand="Pioneer Cellular" cc="us" country="United States of America" operator="Cellular Network Partnership" status="Not operational" 790 bands="" cc="us" country="United States of America" operator="Coleman County Telephone Cooperative, Inc." status="" - 810 bands="CDMA / LTE 700" brand="Bluegrass Wireless" cc="us" country="United States of America" operator="Bluegrass Wireless" status="Operational" + 800 bands="LTE 700" cc="us" country="United States of America" operator="Bluegrass Cellular LLC" status="Operational" + 810 bands="LTE 700" cc="us" country="United States of America" operator="Bluegrass Cellular LLC" status="Operational" + 820 bands="" cc="us" country="United States of America" operator="Sonus Networks" status="" 830 bands="LTE 700" cc="us" country="United States of America" operator="Thumb Cellular LP" status="Operational" - 870 bands="MVNO" brand="Boost" cc="us" country="United States of America" operator="Boost Mobile" status="Operational" - 910 bands="LTE" brand="Mobile Nation" cc="us" country="United States of America" operator="SI Wireless LLC" status="Operational" - 930 bands="LTE 700" cc="us" country="United States of America" operator="Syringa Wireless" status="Operational" - 950 bands="LTE 700" brand="ETC" cc="us" country="United States of America" operator="Enhanced Telecommmunications Corp. (Sunman Telecom)" status="Operational" - 960 bands="MVNO" brand="Lycamobile" cc="us" country="United States of America" operator="Lyca Technology Solutions" status="Operational" + 840 bands="LTE 700" brand="Cellcom" cc="us" country="United States of America" operator="Nsight Spectrum LLC" status="Operational" + 850 bands="LTE 700" brand="Cellcom" cc="us" country="United States of America" operator="Nsight Spectrum LLC" status="Operational" + 860 bands="LTE 700" brand="STRATA" cc="us" country="United States of America" operator="Uintah Basin Electronic Telecommunications" status="Operational" + 870 bands="MVNO" brand="Boost Mobile" cc="us" country="United States of America" operator="Sprint Corporation" status="Operational" + 880 bands="" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="" + 890 bands="" cc="us" country="United States of America" operator="Globecomm Network Services Corporation" status="" + 900 bands="MVNO" cc="us" country="United States of America" operator="GigSky" status="Operational" + 910 bands="CDMA / LTE" brand="Mobile Nation" cc="us" country="United States of America" operator="SI Wireless LLC" status="Operational" + 920 bands="" brand="Chariton Valley" cc="us" country="United States of America" operator="Missouri RSA 5 Partnership" status="" + 930 bands="LTE 700" cc="us" country="United States of America" operator="Syringa Wireless" status="Not operational" + 940 bands="WiMAX" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="Not operational" + 950 bands="CDMA / LTE 700" brand="ETC" cc="us" country="United States of America" operator="Enhanced Telecommmunications Corp." status="Operational" + 960 bands="MVNO" brand="Lycamobile" cc="us" country="United States of America" operator="Lycamobile USA Inc." status="Operational" 970 bands="LTE 1700" brand="Big River Broadband" cc="us" country="United States of America" operator="Big River Broadband, LLC" status="Operational" + 980 bands="" cc="us" country="United States of America" operator="LigTel Communications" status="" 990 bands="LTE 700 / LTE 1700" cc="us" country="United States of America" operator="VTel Wireless" status="Operational" 000-999 312 + 010 bands="" brand="Chariton Valley" cc="us" country="United States of America" operator="Chariton Valley Communication Corporation, Inc" status="" 020 bands="LTE 700" cc="us" country="United States of America" operator="Infrastructure Networks, LLC" status="Operational" 030 bands="LTE 700" brand="Sprocket Wireless" cc="us" country="United States of America" operator="Cross Telephone / MBO Wireless" status="Operational" 040 bands="LTE 700" cc="us" country="United States of America" operator="Custer Telephone Co-op (CTCI)" status="Operational" - 050 bands="LTE 700" cc="us" country="United States of America" operator="Fuego Wireless" status="Operational" + 050 bands="LTE 700" cc="us" country="United States of America" operator="Fuego Wireless" status="Not operational" + 060 bands="CDMA / GSM" cc="us" country="United States of America" operator="CoverageCo" status="" 070 bands="LTE 700" cc="us" country="United States of America" operator="Adams Networks Inc" status="Operational" 080 bands="UMTS-TDD 700" brand="SyncSouth" cc="us" country="United States of America" operator="South Georgia Regional Information Technology Authority" status="Operational" + 090 bands="" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="" + 100 bands="" cc="us" country="United States of America" operator="ClearSky Technologies, Inc." status="" + 110 bands="LTE" cc="us" country="United States of America" operator="Texas Energy Network LLC" status="" 120 bands="LTE 700" brand="Appalachian Wireless" cc="us" country="United States of America" operator="East Kentucky Network, LLC" status="Operational" 130 bands="LTE 700" brand="Appalachian Wireless" cc="us" country="United States of America" operator="East Kentucky Network, LLC" status="Operational" + 140 bands="CDMA" brand="Revol Wireless" cc="us" country="United States of America" operator="Cleveland Unlimited, Inc." status="Not operational" + 150 bands="LTE 700" brand="NorthwestCell" cc="us" country="United States of America" operator="Northwest Missouri Cellular LP" status="Operational" + 160 bands="LTE 700" brand="Chat Mobility" cc="us" country="United States of America" operator="RSA1 Limited Partnership" status="Operational" + 170 bands="LTE 700" brand="Chat Mobility" cc="us" country="United States of America" operator="Iowa RSA No. 2 LP" status="Operational" 180 bands="" cc="us" country="United States of America" operator="Limiteless Mobile LLC" status="" - 220 bands="LTE 700" cc="us" country="United States of America" operator="Chariton Valley Telephone" status="Operational" + 190 bands="" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="" + 200 bands="MVNO" cc="us" country="United States of America" operator="Voyager Mobility LLC" status="Not operational" + 210 bands="MVNO" cc="us" country="United States of America" operator="Aspenta International, Inc." status="Operational" + 220 bands="LTE 700" brand="Chariton Valley" cc="us" country="United States of America" operator="Chariton Valley Communication Corporation, Inc." status="Operational" + 230 bands="" brand="SRT Communications" cc="us" country="United States of America" operator="North Dakota Network Co." status="" + 240 bands="" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="" + 250 bands="" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="" 260 bands="LTE 1900" brand="NewCore" cc="us" country="United States of America" operator="Central LTE Holdings" status="Operational" 270 bands="LTE 700" brand="Pioneer Cellular" cc="us" country="United States of America" operator="Cellular Network Partnership" status="Operational" 280 bands="LTE 700" brand="Pioneer Cellular" cc="us" country="United States of America" operator="Cellular Network Partnership" status="Operational" - 330 bands="LTE 700" brand="Nemont" cc="us" country="United States of America" operator="Sagebrush Cellular" status="Operational" + 290 bands="" brand="STRATA" cc="us" country="United States of America" operator="Uintah Basin Electronic Telecommunications" status="" + 300 bands="MVNO" brand="telna Mobile" cc="us" country="United States of America" operator="Telecom North America Mobile, Inc." status="Operational" + 310 bands="LTE 700" cc="us" country="United States of America" operator="Clear Stream Communications, LLC" status="Operational" + 320 bands="LTE 700" cc="us" country="United States of America" operator="S and R Communications LLC" status="Operational" + 330 bands="LTE 700" brand="Nemont" cc="us" country="United States of America" operator="Nemont Communications, Inc." status="Operational" 340 bands="LTE 700" brand="MTA" cc="us" country="United States of America" operator="Matanuska Telephone Association, Inc." status="Operational" - 350 bands="LTE" cc="us" country="United States of America" operator="Triangle Communications" status="Operational" - 370 bands="LTE" cc="us" country="United States of America" operator="Choice Wireless" status="Operational" + 350 bands="LTE 700" cc="us" country="United States of America" operator="Triangle Communication Sytem Inc." status="Operational" + 360 bands="" cc="us" country="United States of America" operator="Wes-Tex Telecommunications, Ltd." status="" + 370 bands="LTE" brand="Choice Wireless" cc="us" country="United States of America" operator="Commnet Wireless" status="Operational" 380 bands="LTE 700" cc="us" country="United States of America" operator="Copper Valley Wireless" status="Operational" + 390 bands="UMTS / LTE" brand="FTC Wireless" cc="us" country="United States of America" operator="FTC Communications LLC" status="Operational" 400 bands="LTE 700" brand="Mid-Rivers Wireless" cc="us" country="United States of America" operator="Mid-Rivers Telephone Cooperative" status="Operational" + 410 bands="" cc="us" country="United States of America" operator="Eltopia Communications, LLC" status="" 420 bands="LTE 700" cc="us" country="United States of America" operator="Nex-Tech Wireless" status="Operational" + 430 bands="CDMA / LTE 700" cc="us" country="United States of America" operator="Silver Star Communications" status="Operational" + 440 bands="2500" cc="us" country="United States of America" operator="Consolidated Telcom" status="" + 450 bands="" cc="us" country="United States of America" operator="Cable & Communications Corporation" status="" 460 bands="LTE 700" cc="us" country="United States of America" operator="Ketchikan Public Utilities (KPU)" status="Operational" 470 bands="LTE 700" brand="Carolina West Wireless" cc="us" country="United States of America" operator="Carolina West Wireless" status="Operational" - 530 bands="" cc="us" country="United States of America" operator="Sprint Spectrum" status="Operational" + 480 bands="" brand="Nemont" cc="us" country="United States of America" operator="Sagebrush Cellular, Inc." status="" + 490 bands="Satellite" cc="us" country="United States of America" operator="TrustComm, Inc." status="" + 500 bands="LTE 700" cc="us" country="United States of America" operator="AB Spectrum LLC" status="Not operational" + 510 bands="CDMA / LTE" cc="us" country="United States of America" operator="WUE Inc." status="" + 520 bands="" cc="us" country="United States of America" operator="ANIN" status="Not operational" + 530 bands="" brand="Sprint" cc="us" country="United States of America" operator="Sprint Corporation" status="Operational" + 540 bands="" cc="us" country="United States of America" operator="Broadband In Hand LLC" status="Not operational" + 550 bands="" cc="us" country="United States of America" operator="Great Plains Communications, Inc." status="" + 560 bands="MVNO" cc="us" country="United States of America" operator="NHLT Inc." status="Not operational" + 570 bands="CDMA / LTE" brand="Blue Wireless" cc="us" country="United States of America" operator="Buffalo-Lake Erie Wireless Systems Co., LLC" status="Operational" + 580 bands="" cc="us" country="United States of America" operator="Morgan, Lewis & Bockius LLP" status="" 590 bands="LTE 2600" brand="NMU" cc="us" country="United States of America" operator="Northern Michigan University" status="Operational" - 610 bands="LTE 1900" brand="nTelos" cc="us" country="United States of America" operator="nTelos Licenses, Inc." status="Operational" - 660 bands="LTE 1900" brand="nTelos" cc="us" country="United States of America" operator="nTelos Wireless" status="Operational" + 600 bands="" brand="Nemont" cc="us" country="United States of America" operator="Sagebrush Cellular, Inc." status="" + 610 bands="LTE 1900" brand="nTelos" cc="us" country="United States of America" operator="nTelos Licenses, Inc." status="Not operational" + 620 bands="MVNO" cc="us" country="United States of America" operator="GlobeTouch Inc." status="Operational" + 630 bands="" cc="us" country="United States of America" operator="NetGenuity, Inc." status="" + 640 bands="" brand="Nemont" cc="us" country="United States of America" operator="Sagebrush Cellular, Inc." status="Not operational" + 650 bands="" cc="us" country="United States of America" operator="365 Wireless LLC" status="" + 660 bands="LTE 1900" brand="nTelos" cc="us" country="United States of America" operator="nTelos Wireless" status="Not operational" + 670 bands="" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="" + 680 bands="" brand="AT&T" cc="us" country="United States of America" operator="AT&T Mobility" status="" + 690 bands="" cc="us" country="United States of America" operator="Tecore Government Services, LLC" status="" + 730 bands="CDMA" cc="us" country="United States of America" operator="Triangle Communication Sytem Inc." status="Operational" 780 bands="TD-LTE 2500" cc="us" country="United States of America" operator="Redzone Wireless" status="Operational" 860 bands="CDMA / LTE 1900 / LTE 1700" brand="ClearTalk" cc="us" country="United States of America" operator="Flat Wireless, LLC" status="Operational" 900 bands="CDMA / LTE 1900 / LTE 1700" brand="ClearTalk" cc="us" country="United States of America" operator="Flat West Wireless, LLC" status="Operational" + 910 bands="" brand="Appalachian Wireless" cc="us" country="United States of America" operator="East Kentucky Network, LLC" status="" 000-999 313 100 bands="LTE 700" brand="FirstNet" cc="us" country="United States of America" operator="700 MHz Public Safety Broadband" status="" @@ -1111,14 +1236,14 @@ 001 bands="" cc="mx" country="Mexico" operator="Comunicaciones Digitales Del Norte, S.A. de C.V." status="" 010 bands="iDEN 800" brand="AT&T" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" 020 bands="TDMA 850 / GSM 1900 / UMTS 850 / LTE 1700" brand="Telcel" cc="mx" country="Mexico" operator="América Móvil" status="Operational" - 030 bands="CDMA2000 800 / CDMA2000 1900 / GSM 1900 / UMTS 850 / LTE 1900" brand="movistar" cc="mx" country="Mexico" operator="Movistar - Telefónica Moviles" status="Operational" + 030 bands="CDMA2000 800 / CDMA2000 1900 / GSM 1900 / UMTS 850 / LTE 1700" brand="movistar" cc="mx" country="Mexico" operator="Movistar - Telefónica Moviles" status="Operational" 040 bands="CDMA2000 800 / CDMA2000 1900" brand="Unefon" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" - 050 bands="GSM 850 / GSM 1900" brand="AT&T" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" + 050 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900" brand="AT&T" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" 060 bands="" cc="mx" country="Mexico" operator="Servicios de Acceso Inalambrico, S.A. de C.V." status="" 066 bands="" cc="mx" country="Mexico" operator="Telefonos de México, S.A.B. de C.V." status="" 070 bands="" cc="mx" country="Mexico" operator="Unefon" status="" 080 bands="" cc="mx" country="Mexico" operator="Unefon" status="" - 090 bands="UMTS 1700" brand="AT&T" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" + 090 bands="UMTS 1700 / LTE 1700" brand="AT&T" cc="mx" country="Mexico" operator="AT&T Mexico" status="Operational" 000-999 338 020 bands="" brand="FLOW" cc="jm" country="Jamaica" operator="LIME (Cable & Wireless)" status="Not operational" @@ -1130,7 +1255,7 @@ 340 01 bands="GSM 900 / UMTS 2100" brand="Orange" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="Orange Caraïbe Mobiles" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS" brand="Only" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="Outremer Telecom" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS" brand="Chippie" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="UTS Caraïbe" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS / LTE 1800" brand="Chippie" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="UTS Caraïbe" status="Operational" 08 bands="GSM 900 / GSM 1800 / UMTS" brand="Dauphin" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="Dauphin Telecom" status="Operational" 10 bands="" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="Guadeloupe Téléphone Mobile" status="Not operational" 11 bands="" country="French Antilles (France) - BL/GF/GP/MF/MQ" operator="Guyane Téléphone Mobile" status="Not operational" @@ -1139,7 +1264,7 @@ 00-99 342 600 bands="GSM 1900 / UMTS" brand="FLOW" cc="bb" country="Barbados" operator="LIME (formerly known as Cable & Wireless)" status="Operational" - 750 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Digicel" cc="bb" country="Barbados" operator="Digicel (Barbados) Limited" status="Operational" + 750 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE" brand="Digicel" cc="bb" country="Barbados" operator="Digicel (Barbados) Limited" status="Operational" 820 bands="" cc="bb" country="Barbados" operator="Sunbeach Communications" status="Reserved" 000-999 344 @@ -1159,7 +1284,7 @@ 770 bands="GSM 1800 / GSM 1900 / UMTS" brand="Digicel" cc="vg" country="British Virgin Islands" operator="Digicel (BVI) Limited" status="Operational" 000-999 350 - 00 bands="GSM 1900 / UMTS 850 / LTE 700 / LTE 1900" brand="CellOne" cc="bm" country="Bermuda" operator="Bermuda Digital Communications Ltd." status="Operational" + 00 bands="GSM 1900 / UMTS 850 / LTE 850" brand="CellOne" cc="bm" country="Bermuda" operator="Bermuda Digital Communications Ltd." status="Operational" 01 bands="GSM 1900" brand="Digicel Bermuda" cc="bm" country="Bermuda" operator="Telecommunications (Bermuda & West Indies) Ltd" status="Reserved" 02 bands="GSM 1900 / UMTS" brand="Mobility" cc="bm" country="Bermuda" operator="M3 Wireless" status="Operational" 00-99 @@ -1190,7 +1315,7 @@ 51 bands="GSM 900 / UMTS 2100" brand="Telcell" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="Telcell N.V." status="Operational" 54 bands="GSM 900 / GSM 1800" brand="ECC" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="East Caribbean Cellular" status="Operational" 59 bands="GSM 900 / GSM 1800" brand="Chippie" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="United Telecommunication Service N.V. (UTS)" status="Operational" - 60 bands="UMTS 2100" brand="Chippie" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="United Telecommunication Service N.V. (UTS)" status="Operational" + 60 bands="UMTS 2100 / LTE 1800" brand="Chippie" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="United Telecommunication Service N.V. (UTS)" status="Operational" 63 bands="" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="CSC N.V." status="" 68 bands="UMTS 2100" brand="Digicel" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="Curaçao Telecom N.V." status="Operational" 69 bands="GSM 900 / GSM 1800" brand="Digicel" country="Former Netherlands Antilles (Kingdom of the Netherlands) - BQ/CW/SX" operator="Curaçao Telecom N.V." status="Operational" @@ -1206,15 +1331,16 @@ 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Digicel" cc="aw" country="Aruba (Kingdom of the Netherlands)" operator="Digicel Aruba" status="Operational" 00-99 364 - 390 bands="GSM 850 / GSM 1900 / UMTS 850 / LTE 700" brand="BTC" cc="bs" country="Bahamas" operator="The Bahamas Telecommunications Company Ltd (BaTelCo)" status="Operational" - 000-999 + 39 bands="GSM 850 / GSM 1900 / UMTS 850 / LTE 700" brand="BTC" cc="bs" country="Bahamas" operator="The Bahamas Telecommunications Company Ltd (BaTelCo)" status="Operational" + 49 bands="700 / 850 / AWS / 1900" brand="NewCo 2015" cc="bs" country="Bahamas" operator="Cable Bahamas Ltd" status="Not operational" + 00-99 365 010 bands="" cc="ai" country="Anguilla" operator="Weblinks Limited" status="Operational" 840 bands="GSM 850 / UMTS / LTE 700" brand="FLOW" cc="ai" country="Anguilla" operator="Cable & Wireless" status="Operational" 000-999 366 020 bands="GSM 900 / GSM 1900 / UMTS" brand="Digicel" cc="dm" country="Dominica" operator="Digicel Group Limited" status="Operational" - 110 bands="GSM 850 / UMTS" brand="FLOW" cc="dm" country="Dominica" operator="Cable & Wireless" status="Operational" + 110 bands="GSM 850 / UMTS / LTE 700" brand="FLOW" cc="dm" country="Dominica" operator="Cable & Wireless" status="Operational" 000-999 368 01 bands="GSM 900 / GSM 850" brand="CUBACEL" cc="cu" country="Cuba" operator="Empresa de Telecomunicaciones de Cuba, SA" status="Operational" @@ -1250,8 +1376,8 @@ 06 bands="CDMA 800" brand="Naxtel" cc="az" country="Azerbaijan" operator="Nakhtel LLC" status="Operational" 00-99 401 - 01 bands="GSM 900 / GSM 1800" brand="Beeline" cc="kz" country="Kazakhstan" operator="KaR-Tel LLP" status="Operational" - 02 bands="GSM 900 / GSM 1800" brand="Kcell" cc="kz" country="Kazakhstan" operator="Kcell JSC" status="Operational" + 01 bands="GSM 900 / GSM 1800 / LTE 1800 / LTE 2100" brand="Beeline" cc="kz" country="Kazakhstan" operator="KaR-Tel LLP" status="Operational" + 02 bands="GSM 900 / GSM 1800 / LTE 800 / LTE 1800" brand="Kcell" cc="kz" country="Kazakhstan" operator="Kcell JSC" status="Operational" 07 bands="UMTS 850 / GSM 1800 / LTE 1800" brand="Altel" cc="kz" country="Kazakhstan" operator="Altel" status="Operational" 08 bands="CDMA2000 800 / CDMA2000 450" brand="Kazakhtelecom" cc="kz" country="Kazakhstan" status="Operational" 77 bands="GSM 900 / GSM 1800 / UMTS 900" brand="Tele2.kz" cc="kz" country="Kazakhstan" operator="MTS" status="Operational" @@ -1479,10 +1605,10 @@ 410 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Mobilink" cc="pk" country="Pakistan" operator="Mobilink-PMCL" status="Operational" 02 bands="CDMA2000 1900" brand="PTCL" cc="pk" country="Pakistan" operator="PTCL" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Ufone" cc="pk" country="Pakistan" operator="Pakistan Telecommunication Mobile Ltd" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Ufone" cc="pk" country="Pakistan" operator="Pakistan Telecommunication Mobile Ltd" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Zong" cc="pk" country="Pakistan" operator="China Mobile" status="Operational" 05 bands="GSM 900 / GSM 1800" brand="SCO Mobile" cc="pk" country="Pakistan" operator="SCO Mobile Ltd" status="Operational" - 06 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Telenor" cc="pk" country="Pakistan" operator="Telenor Pakistan" status="Operational" + 06 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 850" brand="Telenor" cc="pk" country="Pakistan" operator="Telenor Pakistan" status="Operational" 07 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Warid Pakistan" cc="pk" country="Pakistan" operator="WaridTel" status="Operational" 08 bands="GSM 900 / GSM 1800" brand="SCO Mobile" cc="pk" country="Pakistan" operator="SCO Mobile Ltd" status="Operational" 00-99 @@ -1497,27 +1623,28 @@ 00-99 413 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Mobitel" cc="lk" country="Sri Lanka" operator="Mobitel (Pvt) Ltd" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Dialog" cc="lk" country="Sri Lanka" operator="Dialog Axiata PLC" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / TD-LTE 2300" brand="Dialog" cc="lk" country="Sri Lanka" operator="Dialog Axiata PLC" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Etisalat" cc="lk" country="Sri Lanka" operator="Etisalat Lanka (Pvt) Ltd" status="Operational" + 04 bands="CDMA / WiMAX / TD-LTE 2300" brand="Lanka Bell" cc="lk" country="Sri Lanka" operator="Lanka Bell Ltd" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel" cc="lk" country="Sri Lanka" operator="Bharti Airtel Lanka (Pvt) Ltd" status="Operational" 08 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Hutch" cc="lk" country="Sri Lanka" operator="Hutchison Telecommunications Lanka (Pvt) Ltd" status="Operational" 00-99 414 - 01 bands="GSM 900 / UMTS 2100" brand="MPT" cc="mm" country="Myanmar" operator="Myanmar Posts and Telecommunications" status="Operational" + 01 bands="GSM 900 / UMTS 2100 / LTE 2100" brand="MPT" cc="mm" country="Myanmar" operator="Myanmar Posts and Telecommunications" status="Operational" 03 bands="CDMA 800" brand="CDMA800" cc="mm" country="Myanmar" operator="Myanmar Economic Corporation" status="Operational" - 05 bands="UMTS 900 / UMTS 2100" brand="Ooredoo" cc="mm" country="Myanmar" operator="Ooredoo Myanmar" status="Operational" - 06 bands="GSM 900 / UMTS 2100" brand="Telenor" cc="mm" country="Myanmar" operator="Telenor Myanmar" status="Operational" + 05 bands="UMTS 900 / UMTS 2100 / LTE 2100" brand="Ooredoo" cc="mm" country="Myanmar" operator="Ooredoo Myanmar" status="Operational" + 06 bands="GSM 900 / UMTS 2100 / LTE 2100" brand="Telenor" cc="mm" country="Myanmar" operator="Telenor Myanmar" status="Operational" 00-99 415 01 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Alfa" cc="lb" country="Lebanon" operator="MIC 1" status="Operational" - 03 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="touch" cc="lb" country="Lebanon" operator="MIC 2" status="Operational" + 03 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="touch" cc="lb" country="Lebanon" operator="MIC 2" status="Operational" 05 bands="GSM 900" brand="Ogero Mobile" cc="lb" country="Lebanon" operator="Ogero Telecom" status="Operational" 00-99 416 - 01 bands="GSM 900" brand="zain JO" cc="jo" country="Jordan" operator="Jordan Mobile Telephone Services" status="Operational" - 02 bands="iDEN 800" brand="XPress Telecom" cc="jo" country="Jordan" operator="XPress Telecom" status="Operational" + 01 bands="GSM 900 / LTE 1800" brand="zain JO" cc="jo" country="Jordan" operator="Jordan Mobile Telephone Services" status="Operational" + 02 bands="iDEN 800" brand="XPress Telecom" cc="jo" country="Jordan" operator="XPress Telecom" status="Not operational" 03 bands="GSM 1800" brand="Umniah" cc="jo" country="Jordan" operator="Umniah Mobile Company" status="Operational" - 77 bands="GSM 900" brand="Orange" cc="jo" country="Jordan" operator="Petra Jordanian Mobile Telecommunications Company (MobileCom)" status="Operational" + 77 bands="GSM 900 / LTE 1800" brand="Orange" cc="jo" country="Jordan" operator="Petra Jordanian Mobile Telecommunications Company (MobileCom)" status="Operational" 00-99 417 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Syriatel" cc="sy" country="Syria" operator="Syriatel Mobile Telecom" status="Operational" @@ -1537,13 +1664,13 @@ 00-99 419 02 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="zain KW" cc="kw" country="Kuwait" operator="Zain Kuwait" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="K.S.C Ooredoo" cc="kw" country="Kuwait" operator="National Mobile Telecommunications" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="K.S.C Ooredoo" cc="kw" country="Kuwait" operator="National Mobile Telecommunications" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Viva" cc="kw" country="Kuwait" operator="Kuwait Telecommunication Company" status="Operational" 00-99 420 - 01 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 2300" brand="Al Jawal (STC )" cc="sa" country="Saudi Arabia" operator="Saudi Telecom Company" status="Operational" - 03 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 2600" brand="Mobily" cc="sa" country="Saudi Arabia" operator="Etihad Etisalat Company" status="Operational" - 04 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800/ LTE 2600" brand="Zain SA" cc="sa" country="Saudi Arabia" operator="Zain Saudi Arabia" status="Operational" + 01 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / TD-LTE 2300" brand="Al Jawal (STC )" cc="sa" country="Saudi Arabia" operator="Saudi Telecom Company" status="Operational" + 03 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / TD-LTE 2600" brand="Mobily" cc="sa" country="Saudi Arabia" operator="Etihad Etisalat Company" status="Operational" + 04 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100" brand="Zain SA" cc="sa" country="Saudi Arabia" operator="Zain Saudi Arabia" status="Operational" 05 bands="MVNO" brand="Virgin Mobile" cc="sa" country="Saudi Arabia" operator="Virgin Mobile Saudi Arabia" status="Operational" 21 bands="GSM-R 900" brand="RGSM" cc="sa" country="Saudi Arabia" operator="Saudi Railways GSM" status="Operational" 00-99 @@ -1554,13 +1681,13 @@ 04 bands="GSM 900" brand="HiTS-UNITEL" cc="ye" country="Yemen" operator="Y" status="Operational" 00-99 422 - 02 bands="GSM 900 / GSM 1800 / UMTS 900" brand="Omantel" cc="om" country="Oman" operator="Oman Telecommunications Company" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900" brand="ooredoo" cc="om" country="Oman" operator="Omani Qatari Telecommunications Company SAOC" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / LTE 1800 / TD-LTE 2300" brand="Omantel" cc="om" country="Oman" operator="Oman Telecommunications Company" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / TD-LTE 2300" brand="ooredoo" cc="om" country="Oman" operator="Omani Qatari Telecommunications Company SAOC" status="Operational" 04 bands="" brand="Omantel" cc="om" country="Oman" operator="Oman Telecommunications Company" status="" 00-99 424 - 02 bands="GSM 900 / UMTS 2100" brand="Etisalat" cc="ae" country="United Arab Emirates" operator="Emirates Telecom Corp" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="du" cc="ae" country="United Arab Emirates" operator="Emirates Integrated Telecommunications Company" status="Operational" + 02 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Etisalat" cc="ae" country="United Arab Emirates" operator="Emirates Telecom Corp" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="du" cc="ae" country="United Arab Emirates" operator="Emirates Integrated Telecommunications Company" status="Operational" 00-99 425 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Partner" cc="il" country="Israel" operator="Partner Communications Company Ltd." status="Operational" @@ -1595,16 +1722,16 @@ 05 bands="GSM 900 / GSM 1800" brand="Batelco" cc="bh" country="Bahrain" operator="Bahrain Telecommunications Company" status="Operational" 00-99 427 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600" brand="ooredoo" cc="qa" country="Qatar" operator="ooredoo" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Vodafone" cc="qa" country="Qatar" operator="Vodafone Qatar" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="ooredoo" cc="qa" country="Qatar" operator="ooredoo" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600" brand="Vodafone" cc="qa" country="Qatar" operator="Vodafone Qatar" status="Operational" 05 bands="TETRA 380" brand="Ministry of Interior" cc="qa" country="Qatar" operator="Ministry of Interior" status="Operational" 06 bands="LTE" brand="Ministry of Interior" cc="qa" country="Qatar" operator="Ministry of Interior" status="Operational" 00-99 428 - 88 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Unitel" cc="mn" country="Mongolia" operator="Unitel LLC" status="Operational" - 91 bands="CDMA2000 800 / UMTS 2100" brand="Skytel" cc="mn" country="Mongolia" operator="Skytel LLC" status="Operational" + 88 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="Unitel" cc="mn" country="Mongolia" operator="Unitel LLC" status="Operational" + 91 bands="CDMA2000 800 / UMTS 2100 / LTE 1800" brand="Skytel" cc="mn" country="Mongolia" operator="Skytel LLC" status="Operational" 98 bands="CDMA2000 450 / UMTS 2100" brand="G-Mobile" cc="mn" country="Mongolia" operator="G-Mobile LLC" status="Operational" - 99 bands="GSM 900 / UMTS 2100" brand="Mobicom" cc="mn" country="Mongolia" operator="Mobicom Corporation" status="Operational" + 99 bands="GSM 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="Mobicom" cc="mn" country="Mongolia" operator="Mobicom Corporation" status="Operational" 00-99 429 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Namaste / NT Mobile" cc="np" country="Nepal" operator="Nepal Telecom" status="Operational" @@ -1619,7 +1746,7 @@ 19 bands="GSM 900" brand="MTCE (Espadan)" cc="ir" country="Iran" operator="Mobile Telecommunications Company of Esfahan" status="Operational" 20 bands="UMTS 900 / UMTS 2100 / LTE 1800" brand="Rightel" cc="ir" country="Iran" operator="Social Security Investment Co." status="Operational" 32 bands="GSM 900 / GSM 1800" brand="Taliya" cc="ir" country="Iran" operator="TCI of Iran and Iran Mobin" status="Operational" - 35 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="MTN Irancell" cc="ir" country="Iran" operator="MTN Irancell Telecommunications Services Company" status="Operational" + 35 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600 / TD-LTE 3500" brand="MTN Irancell" cc="ir" country="Iran" operator="MTN Irancell Telecommunications Services Company" status="Operational" 70 bands="GSM 900 / GSM 1800" brand="TCI" cc="ir" country="Iran" operator="Telephone Communications Company of Iran" status="Operational" 93 bands="GSM 1800" brand="Iraphone" cc="ir" country="Iran" operator="Iraphone" status="Operational" 00-99 @@ -1630,8 +1757,8 @@ 04 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="Beeline" cc="uz" country="Uzbekistan" operator="Unitel LLC" status="Operational" 05 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="Ucell" cc="uz" country="Uzbekistan" operator="Coscom" status="Operational" 06 bands="CDMA2000 800" brand="Perfectum Mobile" cc="uz" country="Uzbekistan" operator="RUBICON WIRELESS COMMUNICATION" status="Operational" - 07 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="UMS" cc="uz" country="Uzbekistan" operator="Universal Mobile Systems" status="Operational" - 08 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="UzMobile" cc="uz" country="Uzbekistan" operator="Uzbektelekom" status="Operational" + 07 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="UMS" cc="uz" country="Uzbekistan" operator="Universal Mobile Systems" status="Operational" + 08 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="UzMobile" cc="uz" country="Uzbekistan" operator="Uzbektelekom" status="Operational" 00-99 436 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Tcell" cc="tj" country="Tajikistan" operator="JV Somoncom" status="Operational" @@ -1642,10 +1769,10 @@ 12 bands="UMTS 2100" brand="Tcell" cc="tj" country="Tajikistan" operator="Indigo" status="" 00-99 437 - 01 bands="GSM 900 / GSM 1800" brand="Beeline" cc="kg" country="Kyrgyzstan" operator="Sky Mobile LLC" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800" brand="Beeline" cc="kg" country="Kyrgyzstan" operator="Sky Mobile LLC" status="Operational" 03 bands="CDMA2000" brand="Fonex" cc="kg" country="Kyrgyzstan" operator="Aktel Ltd" status="Operational" - 05 bands="GSM 900 / GSM 1800" brand="MegaCom" cc="kg" country="Kyrgyzstan" operator="Alfa Telecom CJSC" status="Operational" - 09 bands="GSM 900 / GSM 1800" brand="O!" cc="kg" country="Kyrgyzstan" operator="NurTelecom LLC" status="Operational" + 05 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100" brand="MegaCom" cc="kg" country="Kyrgyzstan" operator="Alfa Telecom CJSC" status="Operational" + 09 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="O!" cc="kg" country="Kyrgyzstan" operator="NurTelecom LLC" status="Operational" 00-99 438 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="MTS" cc="tm" country="Turkmenistan" operator="MTS Turkmenistan" status="Operational" @@ -1680,17 +1807,17 @@ 10 bands="WiMAX 2500" brand="UQ WiMAX" cc="jp" country="Japan" operator="UQ Communications Inc." status="Operational" 00-99 450 - 02 bands="CDMA2000 1800" brand="KT" cc="kr" country="South Korea" operator="KT" status="Discontinued" - 03 bands="CDMA2000 800" brand="Power 017" cc="kr" country="South Korea" operator="Shinsegi Telecom, Inc." status="Discontinued" - 04 bands="CDMA2000 1800" brand="KT" cc="kr" country="South Korea" operator="KT" status="Discontinued" - 05 bands="CDMA2000 800 / UMTS 2100 / LTE 850 1800 2100" brand="SKTelecom" cc="kr" country="South Korea" operator="SK Telecom" status="Operational" - 06 bands="CDMA2000 1800 / LTE 850 2100 2600" brand="LG U+" cc="kr" country="South Korea" operator="LG Telecom" status="Operational" - 08 bands="UMTS 2100 / LTE 900 1800 2100" brand="olleh" cc="kr" country="South Korea" operator="KT" status="Operational" + 02 bands="CDMA2000 1800" brand="KT" cc="kr" country="South Korea" operator="KT" status="Not operational" + 03 bands="CDMA2000 800" brand="Power 017" cc="kr" country="South Korea" operator="Shinsegi Telecom, Inc." status="Not operational" + 04 bands="CDMA2000 1800" brand="KT" cc="kr" country="South Korea" operator="KT" status="Not operational" + 05 bands="CDMA2000 800 / UMTS 2100 / LTE 850 / LTE 1800 / LTE 2100" brand="SKTelecom" cc="kr" country="South Korea" operator="SK Telecom" status="Operational" + 06 bands="CDMA2000 1800 / LTE 850 / LTE 2100 / LTE 2600" brand="LG U+" cc="kr" country="South Korea" operator="LG Telecom" status="Operational" + 08 bands="UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100" brand="olleh" cc="kr" country="South Korea" operator="KT" status="Operational" 11 bands="MVNO of SK Telecom" cc="kr" country="South Korea" operator="Korea Cable Telecom" status="Operational" 00-99 452 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="MobiFone" cc="vn" country="Vietnam" operator="Vietnam Mobile Telecom Services Company" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 900 /UMTS 2100" brand="Vinaphone" cc="vn" country="Vietnam" operator="Vietnam Telecom Services Company" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Vinaphone" cc="vn" country="Vietnam" operator="Vietnam Telecom Services Company" status="Operational" 03 bands="CDMA2000 800" brand="S-Fone" cc="vn" country="Vietnam" operator="S-Telecom" status="Not operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Viettel Mobile" cc="vn" country="Vietnam" operator="Viettel Telecom" status="Operational" 05 bands="GSM 900 / UMTS 2100" brand="Vietnamobile" cc="vn" country="Vietnam" operator="Hanoi Telecom" status="Operational" @@ -1702,22 +1829,22 @@ 00 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="1O1O / One2Free / New World Mobility / SUNMobile" cc="hk" country="Hong Kong" operator="CSL Limited" status="Operational" 01 bands="MVNO" cc="hk" country="Hong Kong" operator="CITIC Telecom 1616" status="Operational" 02 bands="GSM 900 / GSM 1800" cc="hk" country="Hong Kong" operator="CSL Limited" status="Operational" - 03 bands="UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="3" cc="hk" country="Hong Kong" operator="Hutchison Telecom" status="Operational" + 03 bands="UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600" brand="3" cc="hk" country="Hong Kong" operator="Hutchison Telecom" status="Operational" 04 bands="GSM 900 / GSM 1800" brand="3 (2G)" cc="hk" country="Hong Kong" operator="Hutchison Telecom" status="Operational" 05 bands="CDMA 800" brand="3 (CDMA)" cc="hk" country="Hong Kong" operator="Hutchison Telecom" status="Not operational" - 06 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800 / LTE 2600" brand="SmarTone" cc="hk" country="Hong Kong" operator="SmarTone Mobile Communications Limited" status="Operational" + 06 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600" brand="SmarTone" cc="hk" country="Hong Kong" operator="SmarTone Mobile Communications Limited" status="Operational" 07 bands="MVNO" brand="China Unicom" cc="hk" country="Hong Kong" operator="China Unicom (Hong Kong) Limited" status="Operational" 08 bands="MVNO" brand="Truphone" cc="hk" country="Hong Kong" operator="Truphone Limited" status="Operational" 09 bands="MVNO" cc="hk" country="Hong Kong" operator="China Motion Telecom" status="Operational" - 10 bands="GSM 1800" brand="New World Mobility" cc="hk" country="Hong Kong" operator="CSL Limited" status="Not Operational" + 10 bands="GSM 1800" brand="New World Mobility" cc="hk" country="Hong Kong" operator="CSL Limited" status="Not operational" 11 bands="MVNO" cc="hk" country="Hong Kong" operator="China-Hong Kong Telecom" status="Operational" - 12 bands="GSM 1800 / LTE 1800 / LTE 2600" brand="CMCC HK" cc="hk" country="Hong Kong" operator="China Mobile Hong Kong Company Limited" status="Operational" + 12 bands="GSM 1800 / LTE 1800 / TD-LTE 2300 / LTE 2600" brand="CMCC HK" cc="hk" country="Hong Kong" operator="China Mobile Hong Kong Company Limited" status="Operational" 13 bands="MVNO" brand="CMCC HK" cc="hk" country="Hong Kong" operator="China Mobile Hong Kong Company Limited" status="Operational" 14 bands="GSM 900 / GSM 1800" cc="hk" country="Hong Kong" operator="Hutchison Telecom" status="Operational" 15 bands="GSM 1800" cc="hk" country="Hong Kong" operator="SmarTone Mobile Communications Limited" status="Operational" 16 bands="GSM 1800" brand="PCCW Mobile (2G)" cc="hk" country="Hong Kong" operator="PCCW-HKT" status="Operational" 17 bands="GSM 1800" cc="hk" country="Hong Kong" operator="SmarTone Mobile Communications Limited" status="Operational" - 18 bands="GSM 900 / GSM 1800" cc="hk" country="Hong Kong" operator="CSL Limited" status="Not Operational" + 18 bands="GSM 900 / GSM 1800" cc="hk" country="Hong Kong" operator="CSL Limited" status="Not operational" 19 bands="UMTS 2100 / LTE 1800 / LTE 2600" brand="PCCW Mobile (3G/4G)" cc="hk" country="Hong Kong" operator="PCCW-HKT" status="Operational" 20 bands="" cc="hk" country="Hong Kong" operator="PCCW-HKT" status="" 21 bands="" cc="hk" country="Hong Kong" operator="21Vianet Mobile Ltd." status="" @@ -1726,17 +1853,17 @@ 29 bands="CDMA 800" brand="PCCW Mobile (CDMA)" cc="hk" country="Hong Kong" operator="PCCW-HKT" status="Operational" 00-99 455 - 00 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="SmarTone" cc="mo" country="Macau (China)" operator="Smartone – Comunicações Móveis, S.A." status="Operational" - 01 bands="GSM 900 / GSM 1800 / LTE" brand="CTM" cc="mo" country="Macau (China)" operator="Companhia de Telecomunicações de Macau, S.A.R.L." status="Operational" + 00 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="SmarTone" cc="mo" country="Macau (China)" operator="Smartone – Comunicações Móveis, S.A." status="Operational" + 01 bands="GSM 900 / GSM 1800 / LTE 1800" brand="CTM" cc="mo" country="Macau (China)" operator="Companhia de Telecomunicações de Macau, S.A.R.L." status="Operational" 02 bands="CDMA 800" brand="China Telecom" cc="mo" country="Macau (China)" operator="China Telecom (Macau) Company Limited" status="Operational" - 03 bands="GSM 900 / GSM 1800" brand="3" cc="mo" country="Macau (China)" operator="Hutchison Telephone (Macau), Limitada" status="Operational" + 03 bands="GSM 900 / GSM 1800 / LTE 1800" brand="3" cc="mo" country="Macau (China)" operator="Hutchison Telephone (Macau), Limitada" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="CTM" cc="mo" country="Macau (China)" operator="Companhia de Telecomunicações de Macau, S.A.R.L." status="Operational" 05 bands="UMTS 900 / UMTS 2100" brand="3" cc="mo" country="Macau (China)" operator="Hutchison Telephone (Macau), Limitada" status="Operational" 06 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="SmarTone" cc="mo" country="Macau (China)" operator="Smartone – Comunicações Móveis, S.A." status="Operational" - 07 bands="LTE" brand="China Telecom" cc="mo" country="Macau (China)" operator="China Telecom (Macau) Limitada" status="Operational" + 07 bands="LTE 1800" brand="China Telecom" cc="mo" country="Macau (China)" operator="China Telecom (Macau) Limitada" status="Operational" 00-99 456 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Cellcard" cc="kh" country="Cambodia" operator="CamGSM / The Royal Group" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Cellcard" cc="kh" country="Cambodia" operator="CamGSM / The Royal Group" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Smart" cc="kh" country="Cambodia" operator="Smart Axiata Co. Ltd" status="Operational" 03 bands="GSM 1800 / UMTS 2100" brand="qb" cc="kh" country="Cambodia" operator="Cambodia Advance Communications Co. Ltd" status="Operational" 04 bands="GSM 1800 / UMTS 2100" brand="qb" cc="kh" country="Cambodia" operator="Cambodia Advance Communications Co. Ltd" status="Operational" @@ -1754,14 +1881,14 @@ 08 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Beeline" cc="la" country="Laos" operator="VimpelCom Lao Ltd" status="Operational" 00-99 460 - 00 bands="GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2600" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="Operational" - 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / TD-LTE 2300 / TD-LTE 2600 / LTE 1800" brand="China Unicom" cc="cn" country="China" operator="China Unicom" status="Operational" - 02 bands="GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2600" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="Not operational" - 03 bands="CDMA2000 800 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2600" brand="China Telecom" cc="cn" country="China" operator="China Telecom" status="Operational" + 00 bands="GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / TD-LTE 2300 / TD-LTE 2500" brand="China Unicom" cc="cn" country="China" operator="China Unicom" status="Operational" + 02 bands="GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="Not operational" + 03 bands="CDMA2000 800 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500" brand="China Telecom" cc="cn" country="China" operator="China Telecom" status="Operational" 04 bands="" cc="cn" country="China" operator="Global Star Satellite" status="" - 05 bands="CDMA2000 800 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2600" brand="China Telecom" cc="cn" country="China" operator="China Telecom" status="Not operational" + 05 bands="CDMA2000 800 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500" brand="China Telecom" cc="cn" country="China" operator="China Telecom" status="Not operational" 06 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="China Unicom" cc="cn" country="China" operator="China Unicom" status="Not operational" - 07 bands="GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2600" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="Not operational" + 07 bands="GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="Not operational" 08 bands="" brand="China Mobile" cc="cn" country="China" operator="China Mobile" status="" 09 bands="" brand="China Unicom" cc="cn" country="China" operator="China Unicom" status="" 11 bands="" brand="China Telecom" cc="cn" country="China" operator="China Telecom" status="" @@ -1781,9 +1908,9 @@ 56 bands="WiMAX 2600 / PHS" brand="FITEL" cc="tw" country="Taiwan" operator="First International Telecom" status="Not operational" 68 bands="WiMAX 2600" cc="tw" country="Taiwan" operator="Tatung InfoComm" status="Not operational" 88 bands="GSM 1800" brand="FarEasTone" cc="tw" country="Taiwan" operator="Far EasTone Telecommunications Co Ltd" status="Operational" - 89 bands="UMTS 2100 / LTE 900" brand="T Star" cc="tw" country="Taiwan" operator="Taiwan Star Telecom" status="Operational" + 89 bands="UMTS 2100 / LTE 900 / LTE 2600" brand="T Star" cc="tw" country="Taiwan" operator="Taiwan Star Telecom" status="Operational" 90 bands="LTE 900" brand="T Star" cc="tw" country="Taiwan" operator="Taiwan Star Telecom" status="" - 92 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800" brand="Chunghwa" cc="tw" country="Taiwan" operator="Chunghwa Telecom" status="Operational" + 92 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600" brand="Chunghwa" cc="tw" country="Taiwan" operator="Chunghwa Telecom" status="Operational" 93 bands="GSM 900" brand="MobiTai" cc="tw" country="Taiwan" operator="Mobitai Communications" status="Not operational" 97 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800" brand="Taiwan Mobile" cc="tw" country="Taiwan" operator="Taiwan Mobile Co. Ltd" status="Operational" 99 bands="GSM 900" brand="TransAsia" cc="tw" country="Taiwan" operator="TransAsia Telecoms" status="Not operational" @@ -1800,37 +1927,37 @@ 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="TeleTalk" cc="bd" country="Bangladesh" operator="Teletalk Bangladesh Limited" status="Operational" 05 bands="CDMA 800 / GSM 900 / GSM 1800" brand="Citycell" cc="bd" country="Bangladesh" operator="Pacific Bangladesh Telecom Limited" status="Operational" 07 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel" cc="bd" country="Bangladesh" operator="Bharti airtel Bangladesh Ltd." status="Operational" - 09 bands="LTE 800 / LTE 2600 / WiMAX" brand="ollo" cc="bd" country="Bangladesh" operator="Bangladesh Internet Exchange Limited (BIEL)" status="Operational" + 09 bands="LTE 800 / LTE 2600 / WiMAX 3500" brand="ollo" cc="bd" country="Bangladesh" operator="Bangladesh Internet Exchange Limited (BIEL)" status="Operational" 00-99 472 - 01 bands="GSM 900 / UMTS 2100" brand="Dhiraagu" cc="mv" country="Maldives" operator="Dhivehi Raajjeyge Gulhun" status="Operational" + 01 bands="GSM 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Dhiraagu" cc="mv" country="Maldives" operator="Dhivehi Raajjeyge Gulhun" status="Operational" 02 bands="GSM 900 / UMTS 2100 / LTE 2600" brand="Ooredoo" cc="mv" country="Maldives" operator="Wataniya Telecom Maldives" status="Operational" 00-99 502 01 bands="CDMA2000 450" brand="ATUR 450" cc="my" country="Malaysia" operator="Telekom Malaysia Bhd" status="Operational" 10 cc="my" country="Malaysia" operator="DiGi Telecommunications" status="" - 11 bands="CDMA2000 850" brand="TM Homeline" cc="my" country="Malaysia" operator="Telekom Malaysia Bhd" status="Operational" - 12 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Maxis" cc="my" country="Malaysia" operator="Maxis Mobile Services SDN Berhad" status="Operational" - 13 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Celcom" cc="my" country="Malaysia" operator="Celcom Axiata Berhad" status="Operational" + 11 bands="CDMA2000 850 / LTE 850" brand="TM Homeline" cc="my" country="Malaysia" operator="Telekom Malaysia Bhd" status="Operational" + 12 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Maxis" cc="my" country="Malaysia" operator="Maxis Mobile Services SDN Berhad" status="Operational" + 13 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="Celcom" cc="my" country="Malaysia" operator="Celcom Axiata Berhad" status="Operational" 14 cc="my" country="Malaysia" operator="Telekom Malaysia Berhad for PSTN SMS" status="" 150 bands="MVNO" brand="Tune Talk" cc="my" country="Malaysia" operator="Tune Talk Sdn Bhd" status="Operational" 151 bands="MVNO" cc="my" country="Malaysia" operator="Baraka Telecom Sdn Bhd (MVNE)" status="Operational" - 152 bands="WiMAX 2.3 GHz / LTE 4G" brand="Yes" cc="my" country="Malaysia" operator="YTL Communications Sdn Bhd" status="Operational" - 153 bands="WiMAX 2.3 GHz" cc="my" country="Malaysia" operator="Packet One Networks Sdn Bhd" status="Operational" + 152 bands="WiMAX 2300 / TD-LTE 2300 / TD-LTE 2600" brand="Yes" cc="my" country="Malaysia" operator="YTL Communications Sdn Bhd" status="Operational" + 153 bands="WiMAX 2300 / LTE" brand="Webe" cc="my" country="Malaysia" operator="Packet One Networks Sdn Bhd" status="Operational" 154 bands="" cc="my" country="Malaysia" operator="Talk Focus Sdn Bhd" status="" 155 bands="" cc="my" country="Malaysia" operator="Clixster Mobile Sdn Bhd" status="" - 156 bands="LTE 4G / MVNO" brand="Altel" cc="my" country="Malaysia" operator="Altel Communications Sdn Bhd" status="Operational" + 156 bands="MVNO" brand="Altel" cc="my" country="Malaysia" operator="Altel Communications Sdn Bhd" status="Operational" 157 bands="" cc="my" country="Malaysia" operator="Telekomunikasi Indonesia International (M) Sdn Bhd" status="" - 16 bands="GSM 1800 / UMTS 2100 / LTE 2600" brand="DiGi" cc="my" country="Malaysia" operator="DiGi Telecommunications" status="Operational" + 16 bands="GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600" brand="DiGi" cc="my" country="Malaysia" operator="DiGi Telecommunications" status="Operational" 17 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="Hotlink" cc="my" country="Malaysia" operator="Maxis Prepaid" status="Operational" - 18 bands="UMTS 2100" brand="U Mobile" cc="my" country="Malaysia" operator="U Mobile Sdn Bhd" status="Operational" + 18 bands="UMTS 2100 / LTE 2600" brand="U Mobile" cc="my" country="Malaysia" operator="U Mobile Sdn Bhd" status="Operational" 19 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600" brand="Celcom" cc="my" country="Malaysia" operator="Celcom Axiata Berhad" status="Operational" 20 bands="CDMA" cc="my" country="Malaysia" operator="Electcoms Wireless Sdn Bhd" status="Operational" 00-99 505 - 01 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800" brand="Telstra" cc="au" country="Australia" operator="Telstra Corporation Limited" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / TD-LTE 2300" brand="Optus" cc="au" country="Australia" operator="Singtel Optus Proprietary Limited" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Vodafone" cc="au" country="Australia" operator="Vodafone Hutchison Australia Proprietary Limited" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100" brand="Telstra" cc="au" country="Australia" operator="Telstra Corporation Limited" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / TD-LTE 2300" brand="Optus" cc="au" country="Australia" operator="Singtel Optus Proprietary Limited" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 850 / LTE 1800" brand="Vodafone" cc="au" country="Australia" operator="Vodafone Hutchison Australia Proprietary Limited" status="Operational" 04 bands="" cc="au" country="Australia" operator="Department of Defence" status="Operational" 05 brand="Ozitel" cc="au" country="Australia" status="Not operational" 06 bands="UMTS 2100" brand="3" cc="au" country="Australia" operator="Vodafone Hutchison Australia Proprietary Limited" status="Not operational" @@ -1840,15 +1967,15 @@ 10 bands="GSM 900" brand="Norfolk Telecom" cc="nf" country="Norfolk Island" operator="Norfolk Telecom" status="Operational" 11 bands="" brand="Telstra" cc="au" country="Australia" operator="Telstra Corporation Ltd." status="" 12 bands="UMTS 2100" brand="3" cc="au" country="Australia" operator="Vodafone Hutchison Australia Proprietary Limited" status="Not operational" - 13 bands="GSM 1800" brand="Railcorp" cc="au" country="Australia" operator="Railcorp, Transport for New South Wales" status="Operational" - 14 bands="GSM 1800 / UMTS 2100" brand="AAPT" cc="au" country="Australia" operator="Telecom New Zealand" status="Operational" + 13 bands="GSM-R 1800" brand="Railcorp" cc="au" country="Australia" operator="Railcorp, Transport for New South Wales" status="Operational" + 14 bands="MVNO" brand="AAPT" cc="au" country="Australia" operator="TPG Telecom" status="Operational" 15 brand="3GIS" cc="au" country="Australia" status="Not operational" - 16 bands="GSM 1800" brand="VicTrack" cc="au" country="Australia" operator="Victorian Rail Track" status="Reserved" - 17 bands="" cc="au" country="Australia" operator="Vivid Wireless Pty. Ltd." status="" - 18 brand="Pactel" cc="au" country="Australia" operator="Pactel International Pty Ltd" status="Reserved" + 16 bands="GSM-R 1800" brand="VicTrack" cc="au" country="Australia" operator="Victorian Rail Track" status="Operational" + 17 bands="TD-LTE 2300" cc="au" country="Australia" operator="Optus" status="" + 18 brand="Pactel" cc="au" country="Australia" operator="Pactel International Pty Ltd" status="" 19 bands="MVNO" brand="Lycamobile" cc="au" country="Australia" operator="Lycamobile Pty Ltd" status="Operational" 20 bands="" cc="au" country="Australia" operator="Ausgrid Corporation" status="" - 21 bands="" cc="au" country="Australia" operator="Queensland Rail Limited" status="" + 21 bands="GSM-R 1800" cc="au" country="Australia" operator="Queensland Rail Limited" status="" 22 bands="" cc="au" country="Australia" operator="iiNet Ltd" status="" 23 bands="LTE 2100" cc="au" country="Australia" operator="Challenge Networks Pty. Ltd." status="Planning" 24 bands="" cc="au" country="Australia" operator="Advanced Communications Technologies Pty. Ltd." status="" @@ -1863,9 +1990,11 @@ 34 bands="" cc="au" country="Australia" operator="Santos Limited" status="" 35 bands="" cc="au" country="Australia" operator="MessageBird Pty Ltd" status="" 36 bands="" brand="Optus" cc="au" country="Australia" operator="Optus Mobile Pty. Ltd." status="" - 38 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="Crazy John's" cc="au" country="Australia" operator="Vodafone Hutchison Australia Proprietary Limited" status="Operational" - 62 bands="LTE 2300" brand="NBN" cc="au" country="Australia" operator="National Broadband Network Co." status="" - 68 bands="LTE 2300" brand="NBN" cc="au" country="Australia" operator="National Broadband Network Co." status="" + 37 bands="" cc="au" country="Australia" operator="Yancoal Australia Ltd" status="" + 38 bands="MVNO" brand="Truphone" cc="au" country="Australia" operator="Truphone Pty Ltd" status="Operational" + 39 bands="" brand="Telstra" cc="au" country="Australia" operator="Telstra Corporation Ltd." status="" + 62 bands="TD-LTE 2300" brand="NBN" cc="au" country="Australia" operator="National Broadband Network Co." status="Operational" + 68 bands="TD-LTE 2300" brand="NBN" cc="au" country="Australia" operator="National Broadband Network Co." status="Operational" 71 bands="" brand="Telstra" cc="au" country="Australia" operator="Telstra Corporation Limited" status="Operational" 72 bands="" brand="Telstra" cc="au" country="Australia" operator="Telstra Corporation Limited" status="Operational" 88 brand="Localstar Holding Pty. Ltd." cc="au" country="Australia" status="Not operational" @@ -1876,9 +2005,9 @@ 00 bands="Satellite" brand="PSN" cc="id" country="Indonesia" operator="PT Pasifik Satelit Nusantara (ACeS)" status="Operational" 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800" brand="Indosat Ooredoo" cc="id" country="Indonesia" operator="PT Indonesian Satellite Corporation Tbk (INDOSAT)" status="Operational" 03 bands="CDMA 800" brand="StarOne" cc="id" country="Indonesia" operator="PT Indosat Tbk" status="Not operational" - 07 bands="CDMA 800" brand="TelkomFlexi" cc="id" country="Indonesia" operator="PT Telkom" status="Operational" + 07 bands="CDMA 800" brand="TelkomFlexi" cc="id" country="Indonesia" operator="PT Telkom" status="Not operational" 08 bands="GSM 1800 / UMTS 2100" brand="AXIS" cc="id" country="Indonesia" operator="PT Natrindo Telepon Seluler" status="Not operational" - 09 bands="CDMA 800 / CDMA 1900 / LTE 850 / TD-LTE 2300" brand="Smartfren" cc="id" country="Indonesia" operator="PT Smart Telecom" status="Operational" + 09 bands="CDMA 800 / CDMA 1900 / LTE 850 / TD-LTE 2300" brand="Smartfren" cc="id" country="Indonesia" operator="PT Smartfren Telecom" status="Operational" 10 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800" brand="Telkomsel" cc="id" country="Indonesia" operator="PT Telekomunikasi Selular" status="Operational" 11 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800" brand="XL" cc="id" country="Indonesia" operator="PT XL Axiata Tbk" status="Operational" 20 bands="GSM 1800" brand="TELKOMMobile" cc="id" country="Indonesia" operator="PT Telkom Indonesia Tbk" status="Not operational" @@ -1887,7 +2016,7 @@ 28 bands="CDMA 800 / LTE 850 / TD-LTE 2300" brand="Fren/Hepi" cc="id" country="Indonesia" operator="PT Mobile-8 Telecom" status="Operational" 88 bands="TD-LTE 2300" brand="BOLT! Super 4G" cc="id" country="Indonesia" operator="PT Internux" status="Operational" 89 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="3" cc="id" country="Indonesia" operator="PT Hutchison CP Telecommunications" status="Operational" - 99 bands="CDMA 800" brand="Esia" cc="id" country="Indonesia" operator="PT Bakrie Telecom" status="Operational" + 99 bands="CDMA 800" brand="Esia" cc="id" country="Indonesia" operator="PT Bakrie Telecom" status="Not Operational" 00-99 514 01 bands="GSM 900 / GSM 1800 / UMTS 850" brand="Telkomcel" cc="tl" country="East Timor" operator="PT Telekomunikasi Indonesia International" status="Operational" @@ -1896,19 +2025,19 @@ 00-99 515 01 bands="GSM 900" brand="Islacom" cc="ph" country="Philippines" operator="Globe Telecom via Innove Communications" status="Not operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 1800" brand="Globe" cc="ph" country="Philippines" operator="Globe Telecom" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800" brand="SMART" cc="ph" country="Philippines" operator="PLDT via Smart Communications" status="Operational" - 05 bands="GSM 1800 / UMTS 2100 / LTE 1800" brand="Sun" cc="ph" country="Philippines" operator="Digital Telecommunications Philippines" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 1800 / TD-LTE 2500" brand="Globe" cc="ph" country="Philippines" operator="Globe Telecom" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 850 / LTE 1800 / LTE 2100" brand="SMART" cc="ph" country="Philippines" operator="PLDT via Smart Communications" status="Operational" + 05 bands="GSM 1800 / UMTS 2100" brand="Sun Cellular" cc="ph" country="Philippines" operator="Digital Telecommunications Philippines" status="Operational" 11 bands="" cc="ph" country="Philippines" operator="PLDT via ACeS Philippines" status="" 18 bands="GSM 900 / UMTS 2100" brand="Cure" cc="ph" country="Philippines" operator="PLDT via Smart's Connectivity Unlimited Resources Enterprise" status="Not operational" - 24 bands="" brand="ABS-CBN" cc="ph" country="Philippines" operator="ABS-CBN Convergence with Globe Telecom" status="Operational" - 88 bands="" cc="ph" country="Philippines" operator="Nextel" status="" + 24 bands="MVNO" brand="ABS-CBN Mobile" cc="ph" country="Philippines" operator="ABS-CBN Convergence with Globe Telecom" status="Operational" + 88 bands="iDEN" cc="ph" country="Philippines" operator="Next Mobile Inc." status="Operational" 00-99 520 00 bands="UMTS 850" brand="my by CAT" cc="th" country="Thailand" operator="CAT Telecom" status="Operational" 01 bands="GSM 900 / UMTS 900" brand="AIS" cc="th" country="Thailand" operator="Advanced Info Service" status="Not operational" 02 bands="CDMA 800" brand="CAT CDMA" cc="th" country="Thailand" operator="CAT Telecom" status="Not operational" - 03 bands="UMTS 2100 / LTE 1800" brand="AIS" cc="th" country="Thailand" operator="Advanced Wireless Network Company Ltd." status="Operational" + 03 bands="UMTS 2100 / LTE 1800 / LTE 2100" brand="AIS" cc="th" country="Thailand" operator="Advanced Wireless Network Company Ltd." status="Operational" 04 bands="UMTS 2100 / LTE 1800 / LTE 2100" brand="TrueMove H" cc="th" country="Thailand" operator="Real Future Company Ltd." status="Operational" 05 bands="UMTS 850 / UMTS 2100 / LTE 1800 / LTE 2100" brand="dtac TriNet" cc="th" country="Thailand" operator="DTAC Network Company Ltd." status="Operational" 15 bands="UMTS 2100" brand="TOT 3G" cc="th" country="Thailand" operator="TOT Public Company Limited" status="Operational" @@ -1965,13 +2094,13 @@ 541 00 bands="GSM 900" brand="AIL" cc="vu" country="Vanuatu" operator="ACeS International (AIL)" status="Operational" 01 bands="GSM 900" brand="SMILE" cc="vu" country="Vanuatu" operator="Telecom Vanuatu Ltd" status="Operational" - 05 bands="GSM 900 / UMTS 900" brand="Digicel" cc="vu" country="Vanuatu" operator="Digicel Vanuatu Ltd" status="Operational" + 05 bands="GSM 900 / UMTS 900 / LTE 700" brand="Digicel" cc="vu" country="Vanuatu" operator="Digicel Vanuatu Ltd" status="Operational" 07 bands="TD-LTE 2300" brand="WanTok" cc="vu" country="Vanuatu" operator="WanTok Vanuatu Ltd" status="Operational" 00-99 542 01 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Vodafone" cc="fj" country="Fiji" operator="Vodafone Fiji" status="Operational" - 02 bands="GSM 900 / UMTS 900 / UMTS 2100 / WIMAX 4G" brand="Digicel" cc="fj" country="Fiji" operator="Digicel Fiji" status="Operational" - 03 bands="CDMA" cc="fj" country="Fiji" operator="Telecom Fiji Ltd" status="" + 02 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / WiMAX" brand="Digicel" cc="fj" country="Fiji" operator="Digicel Fiji" status="Operational" + 03 bands="CDMA2000 850 / LTE 700" cc="fj" country="Fiji" operator="Telecom Fiji Ltd" status="Operational" 00-99 543 01 bands="" cc="wf" country="Wallis and Futuna" operator="Manuia" status="" @@ -1987,7 +2116,7 @@ 01 bands="GSM 900 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2600" brand="Mobilis" cc="nc" country="New Caledonia (France)" operator="OPT New Caledonia" status="Operational" 00-99 547 - 05 bands="WiMAX" cc="pf" country="French Polynesia" operator="VITI" status="Operational" + 05 bands="WiMAX / LTE 800 / LTE 2600" brand="Ora" cc="pf" country="French Polynesia" operator="VITI" status="Operational" 10 bands="GSM 900" cc="pf" country="French Polynesia" operator="Mara Telecom" status="Not operational" 15 bands="GSM 900 / UMTS 2100" brand="Vodafone" cc="pf" country="French Polynesia" operator="Pacific Mobile Telecom" status="Operational" 20 bands="GSM 900 / UMTS 2100" brand="Vini" cc="pf" country="French Polynesia" operator="Tikiphone SA" status="Operational" @@ -2007,7 +2136,7 @@ 00-99 552 01 bands="GSM 900" brand="PNCC" cc="pw" country="Palau" operator="Palau National Communications Corp." status="Operational" - 80 bands="GSM 1800" brand="Palau Mobile" cc="pw" country="Palau" operator="Palau Mobile Corporation" status="Operational" + 80 bands="GSM 1800" brand="Palau Mobile" cc="pw" country="Palau" operator="Palau Mobile Corporation" status="Not operational" 00-99 553 01 bands="GSM 900" brand="TTC" cc="tv" country="Tuvalu" operator="Tuvalu Telecom" status="Operational" @@ -2021,9 +2150,9 @@ 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Etisalat" cc="eg" country="Egypt" operator="Etisalat Egypt" status="Operational" 00-99 603 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / CDMA 1900" brand="Mobilis" cc="dz" country="Algeria" operator="ATM Mobilis" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Djezzy" cc="dz" country="Algeria" operator="Orascom Telecom Algerie Spa" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Ooredoo" cc="dz" country="Algeria" operator="Wataniya Telecom Algerie" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / CDMA 1900" brand="Mobilis" cc="dz" country="Algeria" operator="Algérie Télécom" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Djezzy" cc="dz" country="Algeria" operator="Optimum Telecom Algérie Spa" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Ooredoo" cc="dz" country="Algeria" operator="Wataniya Telecom Algérie" status="Operational" 00-99 604 00 bands="GSM 900 / GSM 1800 / LTE" brand="Méditel" cc="ma" country="Morocco" operator="Medi Telecom" status="Operational" @@ -2032,9 +2161,9 @@ 05 bands="GSM 900 / GSM 1800 / LTE 1800" brand="INWI (Telecommunications)" cc="ma" country="Morocco" operator="WANA - Groupe ONA" status="Operational" 00-99 605 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Orange" cc="tn" country="Tunisia" operator="Orange Tunisie" status="Operational" - 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Tunicell" cc="tn" country="Tunisia" operator="Tunisie Telecom" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800" brand="OOREDOO TN" cc="tn" country="Tunisia" operator="ooredoo Tunisiana" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="Orange" cc="tn" country="Tunisia" operator="Orange Tunisie" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800" brand="Tunicell" cc="tn" country="Tunisia" operator="Tunisie Telecom" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800" brand="OOREDOO TN" cc="tn" country="Tunisia" operator="ooredoo Tunisiana" status="Operational" 00-99 606 00 bands="GSM900 / GSM 1800 / UMTS 2100" brand="Libyana" cc="ly" country="Libya" operator="Libyana" status="Operational" @@ -2044,10 +2173,12 @@ 06 bands="CDMA2000" brand="Hatef Libya" cc="ly" country="Libya" operator="Hatef Libya" status="Operational" 00-99 607 - 01 bands="GSM 900 / GSM 1900" brand="Gamcel" cc="gm" country="Gambia" operator="Gamcel" status="Operational" - 02 bands="GSM 900 / GSM 1900" brand="Africell" cc="gm" country="Gambia" operator="Africell" status="Operational" - 03 bands="GSM 900 / GSM 1900" brand="Comium" cc="gm" country="Gambia" operator="Comium" status="Operational" + 01 bands="GSM 900 / GSM 1800" brand="Gamcel" cc="gm" country="Gambia" operator="Gamcel" status="Operational" + 02 bands="GSM 900 / GSM 1800" brand="Africell" cc="gm" country="Gambia" operator="Africell" status="Operational" + 03 bands="GSM 900 / GSM 1800" brand="Comium" cc="gm" country="Gambia" operator="Comium" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="QCell" cc="gm" country="Gambia" operator="QCell Gambia" status="Operational" + 05 bands="WiMAX / LTE" cc="gm" country="Gambia" operator="GAMTEL-Ecowan" status="" + 06 bands="TD-LTE 2300" cc="gm" country="Gambia" operator="NETPAGE" status="Operational" 00-99 608 01 bands="GSM 900 / UMTS 2100" brand="Orange" cc="sn" country="Senegal" operator="Sonatel" status="Operational" @@ -2105,15 +2236,15 @@ 00-99 617 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Orange" cc="mu" country="Mauritius" operator="Cellplus Mobile Communications Ltd." status="Operational" - 02 bands="GSM 900 / CDMA2000" brand="MTML" cc="mu" country="Mauritius" operator="Mahanagar Telephone (Mauritius) Ltd." status="Operational" - 03 bands="" brand="MTML" cc="mu" country="Mauritius" operator="Mahanagar Telephone (Mauritius) Ltd." status="" + 02 bands="CDMA2000" brand="MOKOZE / AZU" cc="mu" country="Mauritius" operator="Mahanagar Telephone Mauritius Limited (MTML)" status="Operational" + 03 bands="GSM 900 / LTE 1800" brand="CHILI" cc="mu" country="Mauritius" operator="Mahanagar Telephone Mauritius Limited (MTML)" status="Operational" 10 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Emtel" cc="mu" country="Mauritius" operator="Emtel Ltd." status="Operational" 00-99 618 01 bands="GSM 900" brand="Lonestar Cell" cc="lr" country="Liberia" operator="Lonestar Communications Corporation" status="Operational" 02 bands="" brand="Libercell" cc="lr" country="Liberia" operator="Atlantic Wireless (Liberia) Inc." status="Not operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Novafone" cc="lr" country="Liberia" operator="Novafone Inc." status="Operational" - 07 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE" brand="Cellcom" cc="lr" country="Liberia" operator="Cellcom Telecommunications, Inc." status="Operational" + 07 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Cellcom" cc="lr" country="Liberia" operator="Cellcom Telecommunications, Inc." status="Operational" 20 bands="CDMA2000" brand="LIBTELCO" cc="lr" country="Liberia" operator="Liberia Telecommunications Corporation" status="Operational" 00-99 619 @@ -2132,7 +2263,7 @@ 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800" brand="MTN" cc="gh" country="Ghana" operator="MTN Group" status="Operational" 02 bands="GSM 900 / GSM 1800 / UMTS / LTE 1800" brand="Vodafone" cc="gh" country="Ghana" operator="Vodafone Group" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS" brand="tiGO" cc="gh" country="Ghana" operator="Millicom Ghana" status="Operational" - 04 bands="CDMA2000" brand="Expresso" cc="gh" country="Ghana" operator="Kasapa / Hutchison Telecom" status="Operational" + 04 bands="CDMA2000 850" brand="Expresso" cc="gh" country="Ghana" operator="Kasapa / Hutchison Telecom" status="Operational" 06 bands="GSM 900 / GSM 1800 / UMTS" brand="Airtel" cc="gh" country="Ghana" operator="Airtel" status="Operational" 07 bands="GSM 900 / GSM 1800 / UMTS" brand="Globacom" cc="gh" country="Ghana" operator="Globacom Group" status="Operational" 08 bands="LTE 2600" brand="Surfline" cc="gh" country="Ghana" operator="Surfline Communications Ltd" status="Operational" @@ -2142,14 +2273,15 @@ 621 00 bands="LTE 1900" cc="ng" country="Nigeria" operator="Capcom" status="Not operational" 20 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel" cc="ng" country="Nigeria" operator="Bharti Airtel Limited" status="Operational" + 22 bands="LTE 800" brand="InterC" cc="ng" country="Nigeria" operator="InterC Network Ltd." status="Operational" 24 bands="TD-LTE 2300" cc="ng" country="Nigeria" operator="Spectranet" status="Operational" - 25 bands="CDMA2000 800 / CDMA2000 1900" brand="Visafone" cc="ng" country="Nigeria" operator="Visafone Communications Ltd." status="Operational" + 25 bands="CDMA2000 800 / CDMA2000 1900" brand="Visafone" cc="ng" country="Nigeria" operator="Visafone Communications Ltd." status="Not operational" 26 bands="TD-LTE 2300" cc="ng" country="Nigeria" operator="Swift" status="Operational" 27 bands="LTE 800" brand="Smile" cc="ng" country="Nigeria" operator="Smile Communications Nigeria" status="Operational" - 30 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="MTN" cc="ng" country="Nigeria" operator="MTN Nigeria Communications Limited" status="Operational" + 30 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600 / LTE 3500" brand="MTN" cc="ng" country="Nigeria" operator="MTN Nigeria Communications Limited" status="Operational" 40 bands="LTE 900 / LTE 1800" brand="Ntel" cc="ng" country="Nigeria" operator="Nigerian Mobile Telecommunications Limited" status="Operational" - 50 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Glo" cc="ng" country="Nigeria" operator="Globacom Ltd" status="Operational" - 60 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Etisalat" cc="ng" country="Nigeria" operator="Emerging Markets Telecommunication Services Ltd (Etisalat)" status="Operational" + 50 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 700" brand="Glo" cc="ng" country="Nigeria" operator="Globacom Ltd" status="Operational" + 60 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Etisalat" cc="ng" country="Nigeria" operator="Emerging Markets Telecommunication Services Ltd (Etisalat)" status="Operational" 00-99 622 01 bands="GSM 900 / UMTS" brand="Airtel" cc="td" country="Chad" operator="Bharti Airtel SA" status="Operational" @@ -2164,9 +2296,9 @@ 04 bands="GSM 900" brand="Nationlink" cc="cf" country="Central African Republic" operator="Nationlink Telecom RCA" status="Operational" 00-99 624 - 01 bands="GSM 900" brand="MTN Cameroon" cc="cm" country="Cameroon" operator="Mobile Telephone Network Cameroon Ltd" status="Operational" + 01 bands="GSM 900 / TD-LTE 2500" brand="MTN Cameroon" cc="cm" country="Cameroon" operator="Mobile Telephone Network Cameroon Ltd" status="Operational" 02 bands="GSM 900" brand="Orange" cc="cm" country="Cameroon" operator="Orange Cameroun S.A." status="Operational" - 04 bands="" brand="Nexttel" cc="cm" country="Cameroon" operator="Nexttel" status="Not operational" + 04 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Nexttel" cc="cm" country="Cameroon" operator="Viettel Cameroun" status="Operational" 00-99 625 01 bands="GSM 900 / UMTS" brand="CVMOVEL" cc="cv" country="Cape Verde" operator="CVMóvel, S.A." status="Operational" @@ -2180,10 +2312,10 @@ 03 bands="GSM 900 / GSM 1800" brand="Hits GQ" cc="gq" country="Equatorial Guinea" operator="HiTs EG.SA" status="Operational" 00-99 628 - 01 bands="GSM 900" brand="Libertis" cc="ga" country="Gabon" operator="Gabon Telecom & Libertis S.A." status="Operational" + 01 bands="GSM 900 / LTE" brand="Libertis" cc="ga" country="Gabon" operator="Gabon Telecom & Libertis S.A." status="Operational" 02 bands="GSM 900" brand="Moov" cc="ga" country="Gabon" operator="Atlantique Télécom (Etisalat Group) Gabon S.A." status="Operational" - 03 bands="GSM 900" brand="Airtel" cc="ga" country="Gabon" operator="Airtel Gabon S.A." status="Operational" - 04 bands="GSM 900" brand="Azur" cc="ga" country="Gabon" operator="USAN Gabon S.A." status="Operational" + 03 bands="GSM 900 / LTE" brand="Airtel" cc="ga" country="Gabon" operator="Airtel Gabon S.A." status="Operational" + 04 bands="GSM 900 / GSM 1800" brand="Azur" cc="ga" country="Gabon" operator="USAN Gabon S.A." status="Operational" 05 bands="" brand="RAG" cc="ga" country="Gabon" operator="Réseau de l’Administration Gabonaise" status="" 00-99 629 @@ -2209,7 +2341,7 @@ 632 01 bands="GSM 900 / GSM 1800" brand="Guinetel" cc="gw" country="Guinea-Bissau" operator="Guinétel S.A." status="Operational" 02 bands="GSM 900 / GSM 1800" brand="MTN Areeba" cc="gw" country="Guinea-Bissau" operator="Spacetel Guiné-Bissau S.A." status="Operational" - 03 bands="GSM 900 / GSM 1800" brand="Orange" cc="gw" country="Guinea-Bissau" status="Operational" + 03 bands="GSM 900 / GSM 1800 / LTE" brand="Orange" cc="gw" country="Guinea-Bissau" status="Operational" 07 bands="GSM 900 / GSM 1800" brand="Guinetel" cc="gw" country="Guinea-Bissau" operator="Guinétel S.A." status="Operational" 00-99 633 @@ -2230,7 +2362,7 @@ 11 bands="CDMA" brand="Rwandatel" cc="rw" country="Rwanda" operator="Rwandatel S.A." status="Not operational" 12 bands="GSM" brand="Rwandatel" cc="rw" country="Rwanda" operator="Rwandatel S.A." status="Not operational" 13 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Tigo" cc="rw" country="Rwanda" operator="TIGO RWANDA S.A" status="Operational" - 14 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE" brand="Airtel" cc="rw" country="Rwanda" operator="Airtel RWANDA" status="Operational" + 14 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel" cc="rw" country="Rwanda" operator="Airtel RWANDA" status="Operational" 17 bands="LTE 800" brand="Olleh" cc="rw" country="Rwanda" operator="Olleh Rwanda Networks" status="Operational" 00-99 636 @@ -2259,17 +2391,18 @@ 07 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Orange Kenya" cc="ke" country="Kenya" operator="Telkom Kenya" status="Operational" 00-99 640 - 01 bands="" cc="tz" country="Tanzania" operator="Rural NetCo Limited" status="" + 01 bands="UMTS 900" cc="tz" country="Tanzania" operator="Rural NetCo Limited" status="Not operational" 02 bands="GSM 900 / GSM 1800 / LTE 800" brand="tiGO" cc="tz" country="Tanzania" operator="MIC Tanzania Limited" status="Operational" 03 bands="GSM 900 / GSM 1800 / LTE 1800" brand="Zantel" cc="tz" country="Tanzania" operator="Zanzibar Telecom Ltd" status="Operational" 04 bands="GSM 900 / GSM 1800 / LTE 1800" brand="Vodacom" cc="tz" country="Tanzania" operator="Vodacom Tanzania Limited" status="Operational" 05 bands="GSM 900 / GSM 1800" brand="Airtel" cc="tz" country="Tanzania" operator="Bharti Airtel" status="Operational" - 06 bands="CDMA" brand="Sasatel" cc="tz" country="Tanzania" operator="Dovetel Limited" status="Operational" - 07 bands="CDMA 800" brand="TTCL Mobile" cc="tz" country="Tanzania" operator="Tanzania Telecommunication Company LTD (TTCL)" status="Operational" - 08 bands="CDMA" brand="Benson Online (BOL)" cc="tz" country="Tanzania" operator="Benson Informatics Limited" status="Operational" - 09 brand="Hits" cc="tz" country="Tanzania" operator="ExcellentCom Tanzania Limited" status="Not operational" + 06 bands="CDMA 800" brand="Sasatel (Dovetel)" cc="tz" country="Tanzania" operator="Dovetel Limited" status="Not operational" + 07 bands="CDMA 800 / LTE 1800 / TD-LTE 2300" brand="TTCL Mobile" cc="tz" country="Tanzania" operator="Tanzania Telecommunication Company LTD (TTCL)" status="Operational" + 08 bands="TD-LTE 2300" brand="Smart" cc="tz" country="Tanzania" operator="Benson Informatics Limited" status="Operational" + 09 bands="GSM 900 / GSM 1800" brand="Halotel" cc="tz" country="Tanzania" operator="Viettel Tanzania Limited" status="Operational" 11 bands="LTE 800" brand="SmileCom" cc="tz" country="Tanzania" operator="Smile Telecoms Holdings Ltd." status="Operational" - 12 bands="" cc="tz" country="Tanzania" operator="MyCell Limited" status="" + 12 bands="" cc="tz" country="Tanzania" operator="MyCell Limited" status="Not operational" + 13 bands="" brand="Cootel" cc="tz" country="Tanzania" operator="Wiafrica Tanzania Limited" status="" 00-99 641 01 bands="GSM 900 / UMTS 2100" brand="Airtel" cc="ug" country="Uganda" operator="Bharti Airtel" status="Operational" @@ -2286,12 +2419,12 @@ 66 bands="" brand="i-Tel" cc="ug" country="Uganda" operator="i-Tel Ltd" status="" 00-99 642 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Spacetel" cc="bi" country="Burundi" operator="Econet Wireless Burundi PLC" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="econet Leo" cc="bi" country="Burundi" operator="Econet Wireless Burundi PLC" status="Operational" 02 bands="GSM 900" brand="Tempo" cc="bi" country="Burundi" operator="VTEL MEA" status="Not operational" 03 bands="GSM 900" brand="Onatel" cc="bi" country="Burundi" operator="Onatel" status="Operational" 07 bands="GSM 1800 / UMTS" brand="Smart Mobile" cc="bi" country="Burundi" operator="LACELL SU" status="Operational" - 08 bands="" brand="HiTs Telecom" cc="bi" country="Burundi" operator="HiTs Telecom" status="Not operational" - 82 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Leo" cc="bi" country="Burundi" operator="Orascom Telecom" status="Operational" + 08 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE" brand="Lumitel" cc="bi" country="Burundi" operator="Viettel Burundi" status="Operational" + 82 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="econet Leo" cc="bi" country="Burundi" operator="Econet Wireless Burundi PLC" status="Operational" 00-99 643 01 bands="GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100" brand="mCel" cc="mz" country="Mozambique" operator="Mocambique Celular S.A." status="Operational" @@ -2301,7 +2434,7 @@ 645 01 bands="GSM 900" brand="Airtel" cc="zm" country="Zambia" operator="Bharti Airtel" status="Operational" 02 bands="GSM 900 / LTE 1800" brand="MTN" cc="zm" country="Zambia" operator="MTN Group" status="Operational" - 03 bands="GSM 900" brand="ZAMTEL" cc="zm" country="Zambia" operator="Zambia Telecommunications Company Ltd" status="Operational" + 03 bands="GSM 900 / LTE" brand="ZAMTEL" cc="zm" country="Zambia" operator="Zambia Telecommunications Company Ltd" status="Operational" 00-99 646 01 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Airtel" cc="mg" country="Madagascar" operator="Bharti Airtel" status="Operational" @@ -2316,28 +2449,29 @@ 10 bands="GSM 900" brand="SFR Reunion" cc="re" country="Réunion (France)" operator="Societe Reunionnaise de Radiotelephone" status="Operational" 00-99 648 - 01 bands="GSM 900" brand="Net*One" cc="zw" country="Zimbabwe" operator="Net*One Cellular (Pvt) Ltd" status="Operational" + 01 bands="GSM 900 / LTE" brand="Net*One" cc="zw" country="Zimbabwe" operator="Net*One Cellular (Pvt) Ltd" status="Operational" 03 bands="GSM 900" brand="Telecel" cc="zw" country="Zimbabwe" operator="Telecel Zimbabwe (PVT) Ltd" status="Operational" 04 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Econet" cc="zw" country="Zimbabwe" operator="Econet Wireless" status="Operational" 00-99 649 - 01 bands="GSM 900 / GSM 1800 / LTE 1800" brand="MTC" cc="na" country="Namibia" operator="MTC Namibia" status="Operational" + 01 bands="GSM 900 / GSM 1800 / LTE 800 / LTE 1800" brand="MTC" cc="na" country="Namibia" operator="MTC Namibia" status="Operational" 02 bands="CDMA2000 800" brand="switch" cc="na" country="Namibia" operator="Telecom Namibia" status="Operational" 03 bands="GSM 900 / GSM 1800 / LTE 1800" brand="TN Mobile" cc="na" country="Namibia" operator="Telecom Namibia" status="Operational" 04 bands="WiMAX 2500" cc="na" country="Namibia" operator="Paratus Telecommunications (Pty)" status="Operational" 05 bands="" cc="na" country="Namibia" operator="Demshi Investments CC" status="" 00-99 650 - 01 bands="GSM 900 / GSM 1800" brand="TNM" cc="mw" country="Malawi" operator="Telecom Network Malawi" status="Operational" - 10 bands="GSM 900" brand="Airtel" cc="mw" country="Malawi" operator="Bharti Airtel Limited" status="Operational" + 01 bands="GSM 900 / GSM 1800 / LTE" brand="TNM" cc="mw" country="Malawi" operator="Telecom Network Malawi" status="Operational" + 02 bands="CDMA / LTE 850" brand="Access" cc="mw" country="Malawi" operator="Access Communications Ltd" status="Operational" + 10 bands="GSM 900 / UMTS 2100" brand="Airtel" cc="mw" country="Malawi" operator="Bharti Airtel Limited" status="Operational" 00-99 651 01 bands="GSM 900 / LTE 800" brand="Vodacom" cc="ls" country="Lesotho" operator="Vodacom Lesotho (Pty) Ltd" status="Operational" 02 bands="GSM / UMTS" brand="Econet Telecom" cc="ls" country="Lesotho" operator="Econet Ezi-cel" status="Operational" 00-99 652 - 01 bands="GSM 900 / UMTS" brand="Mascom" cc="bw" country="Botswana" operator="Mascom Wireless (Pty) Limited" status="Operational" - 02 bands="GSM 900" brand="Bip" cc="mg" country="Madagascar" operator="Bip Madagascar S.A." status="Operational" + 01 bands="GSM 900 / UMTS / LTE 1800" brand="Mascom" cc="bw" country="Botswana" operator="Mascom Wireless (Pty) Limited" status="Operational" + 02 bands="GSM 900 / UMTS 2100 / LTE 1800" brand="Orange" cc="bw" country="Botswana" operator="Orange (Botswana) Pty Limited" status="Operational" 04 bands="GSM 900 / GSM 1800" brand="BTC Mobile" cc="bw" country="Botswana" operator="Botswana Telecommunications Corporation" status="Operational" 00-99 653 @@ -2345,15 +2479,16 @@ 10 bands="GSM 900" brand="Swazi MTN" cc="sz" country="Swaziland" operator="Swazi MTN Limited" status="Operational" 00-99 654 - 01 bands="" brand="Comoros Telecom" cc="km" country="Comoros" operator="HURI - SNPT" status="Operational" + 01 bands="GSM 900" brand="HURI" cc="km" country="Comoros" operator="Comoros Telecom" status="Operational" + 02 bands="" brand="TELCO SA" cc="km" country="Comoros" operator="Telecom Malagasy (Telma)" status="" 00-99 655 - 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800" brand="Vodacom" cc="za" country="South Africa" operator="Vodacom" status="Operational" + 01 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100" brand="Vodacom" cc="za" country="South Africa" operator="Vodacom" status="Operational" 02 bands="GSM 1800 / UMTS 2100 / TD-LTE 2300" brand="Telkom" cc="za" country="South Africa" operator="Telkom SA Ltd" status="Operational" 04 bands="" cc="za" country="South Africa" operator="Sasol (Pty) Ltd." status="" 06 bands="" cc="za" country="South Africa" operator="Sentech (Pty) Ltd" status="Operational" 07 bands="GSM 900 / GSM 1800 / UMTS 900 / LTE 1800 / LTE 2100" brand="Cell C" cc="za" country="South Africa" operator="Cell C (Pty) Ltd" status="Operational" - 10 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800" brand="MTN" cc="za" country="South Africa" operator="MTN Group" status="Operational" + 10 bands="GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100" brand="MTN" cc="za" country="South Africa" operator="MTN Group" status="Operational" 11 bands="TETRA 410" cc="za" country="South Africa" operator="South African Police Service Gauteng" status="Operational" 12 bands="" brand="MTN" cc="za" country="South Africa" operator="MTN Group" status="" 13 bands="CDMA 800" brand="Neotel" cc="za" country="South Africa" operator="Neotel Pty Ltd" status="Operational" @@ -2375,14 +2510,17 @@ 36 bands="" cc="za" country="South Africa" operator="Amatole Telecommunications Pty Ltd" status="" 38 bands="" brand="iBurst" cc="za" country="South Africa" operator="Wireless Business Solutions (Pty) Ltd" status="" 41 bands="" cc="za" country="South Africa" operator="South African Police Service" status="" + 46 bands="MVNO" cc="za" country="South Africa" operator="SMS Cellular Services (Pty) Ltd" status="Operational" 50 bands="" cc="za" country="South Africa" operator="Ericsson South Africa (Pty) Ltd" status="" 51 bands="" cc="za" country="South Africa" operator="Integrat (Pty) Ltd" status="" + 73 bands="" brand="iBurst" cc="za" country="South Africa" operator="Wireless Business Solutions (Pty) Ltd" status="" + 74 bands="" brand="iBurst" cc="za" country="South Africa" operator="Wireless Business Solutions (Pty) Ltd" status="" 00-99 657 01 bands="GSM 900" brand="Eritel" cc="er" country="Eritrea" operator="Eritrea Telecommunications Services Corporation" status="Operational" 00-99 658 - 01 bands="GSM" brand="Sure" cc="sh" country="Saint Helena, Ascension and Tristan da Cunha" operator="Sure South Atlantic Ltd." status="Operational" + 01 bands="GSM 900 / GSM 1800 / LTE 1800" brand="Sure" cc="sh" country="Saint Helena, Ascension and Tristan da Cunha" operator="Sure South Atlantic Ltd." status="Operational" 00-99 659 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="MTN" cc="ss" country="South Sudan" operator="MTN South Sudan" status="Operational" @@ -2399,8 +2537,8 @@ 00-99 704 01 bands="CDMA 1900 / GSM 900 / GSM 1900 / UMTS 1900" brand="Claro" cc="gt" country="Guatemala" operator="Telecomunicaciones de Guatemala, S.A." status="Operational" - 02 bands="GSM 850 / TDMA 800 / UMTS 850" brand="Tigo" cc="gt" country="Guatemala" operator="Millicom / Local partners" status="Operational" - 03 bands="CDMA 1900 / GSM 1900 / UMTS 1900" brand="movistar" cc="gt" country="Guatemala" operator="Telefónica Móviles Guatemala (Telefónica)" status="Operational" + 02 bands="GSM 850 / TDMA 800 / UMTS 850 / LTE 850" brand="Tigo" cc="gt" country="Guatemala" operator="Millicom / Local partners" status="Operational" + 03 bands="CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 1900" brand="movistar" cc="gt" country="Guatemala" operator="Telefónica Móviles Guatemala (Telefónica)" status="Operational" 00-99 706 01 bands="GSM 1900 / UMTS 1900" brand="Claro" cc="sv" country="El Salvador" operator="CTE Telecom Personal, S.A. de C.V." status="Operational" @@ -2410,15 +2548,15 @@ 05 bands="iDEN" brand="RED" cc="sv" country="El Salvador" operator="INTELFON, S.A. de C.V." status="Operational" 00-99 708 - 001 bands="GSM 1900 / UMTS 1900" brand="Claro" cc="hn" country="Honduras" operator="Servicios de Comunicaciones de Honduras S.A. de C.V." status="Operational" - 002 bands="CDMA 850 / GSM 850 / UMTS 850" brand="Tigo" cc="hn" country="Honduras" operator="Celtel" status="Operational" + 001 bands="GSM 1900 / UMTS 1900 / LTE 1700" brand="Claro" cc="hn" country="Honduras" operator="Servicios de Comunicaciones de Honduras S.A. de C.V." status="Operational" + 002 bands="CDMA 850 / GSM 850 / UMTS 850 / LTE 1700" brand="Tigo" cc="hn" country="Honduras" operator="Celtel" status="Operational" 030 bands="GSM 1900" brand="Hondutel" cc="hn" country="Honduras" operator="Empresa Hondureña de Telecomunicaciones" status="Operational" 040 bands="GSM 1900" brand="Digicel" cc="hn" country="Honduras" operator="Digicel de Honduras" status="Operational" 000-999 710 - 21 bands="UMTS 850 / GSM 1900" brand="Claro" cc="ni" country="Nicaragua" operator="Empresa Nicaragüense de Telecomunicaciones, S.A. (ENITEL) (América Móvil)" status="Operational" - 30 bands="UMTS 850 / GSM 850 / GSM 1900" brand="movistar" cc="ni" country="Nicaragua" operator="Telefonía Celular de Nicaragua, S.A. (Telefónica, S.A.)" status="Operational" - 73 bands="UMTS 850 / GSM 1900" brand="Claro" cc="ni" country="Nicaragua" operator="Servicios de Comunicaciones S.A." status="Operational" + 21 bands="GSM 1900 / UMTS 850 / LTE 1700" brand="Claro" cc="ni" country="Nicaragua" operator="Empresa Nicaragüense de Telecomunicaciones, S.A. (ENITEL) (América Móvil)" status="Operational" + 30 bands="GSM 850 / GSM 1900 / UMTS 850 / LTE 1900" brand="movistar" cc="ni" country="Nicaragua" operator="Telefonía Celular de Nicaragua, S.A. (Telefónica, S.A.)" status="Operational" + 73 bands="GSM 1900 / UMTS 850" brand="Claro" cc="ni" country="Nicaragua" operator="Servicios de Comunicaciones S.A." status="Operational" 00-99 712 01 bands="GSM 1800 / UMTS 850 / LTE 2600" brand="Kolbi ICE" cc="cr" country="Costa Rica" operator="Instituto Costarricense de Electricidad" status="Operational" @@ -2429,16 +2567,16 @@ 00-99 714 01 bands="GSM 850 / UMTS 850 / LTE 700" brand="Cable & Wireless" cc="pa" country="Panama" operator="Cable & Wireless Panama S.A." status="Operational" - 02 bands="GSM 850 / UMTS 850 / UMTS 1900" brand="movistar" cc="pa" country="Panama" operator="Telefónica Moviles Panama S.A, Bell South Corp. (BSC)" status="Operational" - 03 bands="GSM 1900 / UMTS 1900" brand="Claro" cc="pa" country="Panama" operator="América Móvil" status="Operational" + 02 bands="GSM 850 / UMTS 850 / UMTS 1900 / LTE 700" brand="movistar" cc="pa" country="Panama" operator="Telefónica Moviles Panama S.A, Bell South Corp. (BSC)" status="Operational" + 03 bands="GSM 1900 / UMTS 1900 / LTE 700 / LTE 1900" brand="Claro" cc="pa" country="Panama" operator="América Móvil" status="Operational" 04 bands="GSM 1900 / UMTS 1900" brand="Digicel" cc="pa" country="Panama" operator="Digicel Group" status="Operational" 00-99 716 - 06 bands="CDMA2000 850 / GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700" brand="Movistar" cc="pe" country="Peru" operator="Telefónica Móviles Perú" status="Operational" + 06 bands="CDMA2000 850 / GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700" brand="Movistar" cc="pe" country="Peru" operator="Telefónica Móviles Perú" status="Operational" 07 bands="iDEN" brand="Entel" cc="pe" country="Peru" operator="Americatel Perú" status="Operational" - 10 bands="GSM 1900 / UMTS 850 / LTE 1900" brand="Claro" cc="pe" country="Peru" operator="América Móvil Perú" status="Operational" - 15 bands="GSM 1900 / UMTS 1900" brand="Viettel Mobile" cc="pe" country="Peru" operator="Viettel Peru S.A.C." status="Operational" - 17 bands="UMTS 1900" brand="Entel" cc="pe" country="Peru" operator="Americatel Perú" status="Operational" + 10 bands="GSM 1900 / UMTS 850 / LTE 700 / LTE 1900 / TD-LTE 3500" brand="Claro" cc="pe" country="Peru" operator="América Móvil Perú" status="Operational" + 15 bands="GSM 1900 / UMTS 1900" brand="Bitel" cc="pe" country="Peru" operator="Viettel Peru S.A.C." status="Operational" + 17 bands="UMTS 1900 / LTE 1700 / TD-LTE 2300" brand="Entel" cc="pe" country="Peru" operator="Americatel Perú" status="Operational" 00-99 722 010 bands="GSM 850 / GSM 1900 / UMTS / LTE 1700" brand="Movistar" cc="ar" country="Argentina" operator="Telefónica Móviles Argentina S.A." status="Operational" @@ -2447,18 +2585,18 @@ 040 bands="" brand="Globalstar" cc="ar" country="Argentina" operator="TE.SA.M Argentina S.A." status="Operational" 070 bands="GSM 1900" brand="Movistar" cc="ar" country="Argentina" operator="Telefónica Móviles Argentina S.A." status="Operational" 310 bands="GSM 1900" brand="Claro" cc="ar" country="Argentina" operator="AMX Argentina S.A." status="Operational" - 320 bands="GSM 850 / GSM 1900 / UMTS" brand="Claro" cc="ar" country="Argentina" operator="AMX Argentina S.A." status="Operational" - 330 bands="GSM 850 / GSM 1900 / UMTS" brand="Claro" cc="ar" country="Argentina" operator="AMX Argentina S.A." status="Operational" + 320 bands="GSM 850 / GSM 1900 / UMTS / LTE 1700" brand="Claro" cc="ar" country="Argentina" operator="AMX Argentina S.A." status="Operational" + 330 bands="GSM 850 / GSM 1900 / UMTS / LTE 1700" brand="Claro" cc="ar" country="Argentina" operator="AMX Argentina S.A." status="Operational" 341 bands="GSM 850 / GSM 1900 / UMTS / LTE 1700" brand="Personal" cc="ar" country="Argentina" operator="Telecom Personal S.A." status="Operational" 350 bands="GSM 900" brand="PORT-HABLE" cc="ar" country="Argentina" operator="Hutchison Telecommunications Argentina S.A." status="Not operational" 000-999 724 00 bands="iDEN 850" brand="Nextel" cc="br" country="Brazil" operator="NII Holdings, Inc." status="Operational" 01 bands="MVNO" cc="br" country="Brazil" operator="SISTEER DO BRASIL TELECOMUNICAÇÔES" status="" - 02 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" - 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" - 04 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" - 05 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Claro" cc="br" country="Brazil" operator="Claro" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" + 03 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" + 04 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600" brand="TIM" cc="br" country="Brazil" operator="Telecom Italia Mobile" status="Operational" + 05 bands="GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600" brand="Claro" cc="br" country="Brazil" operator="Claro" status="Operational" 06 bands="GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Vivo" cc="br" country="Brazil" operator="Vivo S.A." status="Operational" 10 bands="GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Vivo" cc="br" country="Brazil" operator="Vivo S.A." status="Operational" 11 bands="GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 2600" brand="Vivo" cc="br" country="Brazil" operator="Vivo S.A." status="Operational" @@ -2481,15 +2619,15 @@ 99 bands="" brand="Local" cc="br" country="Brazil" operator="Local ( purpose or usage)" status="" 00-99 730 - 01 bands="GSM 1900 / UMTS 1900 / LTE 2600" brand="entel" cc="cl" country="Chile" operator="Entel Telefonía Móvil S.A." status="Operational" - 02 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 2600" brand="movistar" cc="cl" country="Chile" operator="Telefónica Móvil de Chile" status="Operational" + 01 bands="GSM 1900 / UMTS 1900 / LTE 700 / LTE 2600" brand="entel" cc="cl" country="Chile" operator="Entel Telefonía Móvil S.A." status="Operational" + 02 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 2600" brand="movistar" cc="cl" country="Chile" operator="Telefónica Móvil de Chile" status="Operational" 03 bands="GSM 1900 / UMTS 850 / UMTS 1900 / LTE 2600" brand="Claro" cc="cl" country="Chile" operator="Claro Chile S.A." status="Operational" 04 bands="iDEN 800" brand="WOM" cc="cl" country="Chile" operator="Novator Partners" status="Operational" 05 bands="" cc="cl" country="Chile" operator="Multikom S.A." status="" 06 bands="MVNO" brand="Telefónica del Sur" cc="cl" country="Chile" operator="Blue Two Chile S.A." status="Operational" 07 bands="" brand="movistar" cc="cl" country="Chile" operator="Telefónica Móvil de Chile" status="" 08 bands="MVNO" brand="VTR Móvil" cc="cl" country="Chile" operator="VTR S.A." status="Operational" - 09 bands="UMTS 1700" brand="WOM" cc="cl" country="Chile" operator="Novator Partners" status="Operational" + 09 bands="UMTS 1700 / LTE 1700" brand="WOM" cc="cl" country="Chile" operator="Novator Partners" status="Operational" 10 bands="GSM 1900 / UMTS 1900" brand="entel" cc="cl" country="Chile" operator="Entel Telefonía Móvil S.A." status="Operational" 11 bands="" cc="cl" country="Chile" operator="Celupago S.A." status="" 12 bands="MVNO" brand="Wanderers Móvil" cc="cl" country="Chile" operator="Telestar Móvil S.A." status="Operational" @@ -2509,7 +2647,7 @@ 004 bands="" cc="co" country="Colombia" operator="COMPATEL COLOMBIA SAS" status="" 020 bands="LTE 2600" brand="Tigo" cc="co" country="Colombia" operator="Une EPM Telecomunicaciones S.A. E.S.P." status="Operational" 099 bands="GSM 900" brand="EMCALI" cc="co" country="Colombia" operator="Empresas Municipales de Cali" status="Operational" - 101 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700 / LTE 2600" brand="Claro" cc="co" country="Colombia" operator="COMCEL S.A." status="Operational" + 101 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 2600" brand="Claro" cc="co" country="Colombia" operator="COMCEL S.A." status="Operational" 102 bands="GSM 850 / GSM 1900 / CDMA 850" cc="co" country="Colombia" operator="Bellsouth Colombia" status="Not operational" 103 bands="GSM 1900 / UMTS / LTE 1700" brand="Tigo" cc="co" country="Colombia" operator="Colombia Móvil S.A. ESP" status="Operational" 111 bands="GSM 1900 / UMTS / LTE 1700" brand="Tigo" cc="co" country="Colombia" operator="Colombia Móvil S.A. ESP" status="Operational" @@ -2529,9 +2667,9 @@ 06 bands="CDMA2000 850 / GSM 850 / UMTS 1900" brand="Movilnet" cc="ve" country="Venezuela" operator="Telecomunicaciones Movilnet" status="Operational" 00-99 736 - 01 bands="GSM 1900 / UMTS" brand="Viva" cc="bo" country="Bolivia" operator="Nuevatel PCS De Bolivia SA" status="Operational" + 01 bands="GSM 1900 / UMTS / LTE 1700" brand="Viva" cc="bo" country="Bolivia" operator="Nuevatel PCS De Bolivia SA" status="Operational" 02 bands="GSM 850 / GSM 1900 / UMTS 850 / LTE 700" brand="Entel" cc="bo" country="Bolivia" operator="Entel SA" status="Operational" - 03 bands="GSM 850 / UMTS" brand="Tigo" cc="bo" country="Bolivia" operator="Telefónica Celular De Bolivia S.A" status="Operational" + 03 bands="GSM 850 / UMTS / LTE 700" brand="Tigo" cc="bo" country="Bolivia" operator="Telefónica Celular De Bolivia S.A" status="Operational" 00-99 738 01 bands="GSM 900" brand="Digicel" cc="gy" country="Guyana" operator="U-Mobile (Cellular) Inc." status="Operational" @@ -2541,7 +2679,7 @@ 00-99 740 00 bands="GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1900" brand="Movistar" cc="ec" country="Ecuador" operator="Otecel S.A." status="Operational" - 01 bands="GSM 850 / UMTS 850 / UMTS 1900" brand="Claro" cc="ec" country="Ecuador" operator="CONECEL S.A." status="Operational" + 01 bands="GSM 850 / UMTS 850 / UMTS 1900 / LTE 1700" brand="Claro" cc="ec" country="Ecuador" operator="CONECEL S.A." status="Operational" 02 bands="GSM 850 / UMTS 1900 / LTE 1700" brand="CNT Mobile" cc="ec" country="Ecuador" operator="Corporación Nacional de Telecomunicaciones (CNT EP)" status="Operational" 00-99 744 @@ -2553,7 +2691,7 @@ 06 bands="GSM 1800 / LTE 1700" brand="Copaco" cc="py" country="Paraguay" operator="Copaco S.A." status="Operational" 00-99 746 - 02 bands="GSM 900 / GSM 1800 / UMTS 2100" brand="Telesur" cc="sr" country="Suriname" operator="Telecommunications Company Suriname (Telesur)" status="Operational" + 02 bands="GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800" brand="Telesur" cc="sr" country="Suriname" operator="Telecommunications Company Suriname (Telesur)" status="Operational" 03 bands="GSM 900 / GSM 1800 / UMTS 850" brand="Digicel" cc="sr" country="Suriname" operator="Digicel Group Limited" status="Operational" 04 bands="GSM 900 / UMTS" brand="Digicel" cc="sr" country="Suriname" operator="Digicel Group Limited" status="Operational" 05 bands="CDMA 450" brand="Telesur" cc="sr" country="Suriname" operator="Telecommunications Company Suriname (Telesur)" status="" @@ -2580,7 +2718,7 @@ 09 bands="" country="International operators" operator="Unassigned" status="Returned spare" 10 bands="Satellite" brand="ACeS" country="International operators" status="Not operational" 11 bands="Satellite" brand="Inmarsat" country="International operators" status="Operational" - 12 bands="GSM 1800" brand="Telenor" country="International operators" operator="Maritime Communications Partner AS (MCP)" status="Operational" + 12 bands="GSM 1800 / LTE 800" brand="Telenor" country="International operators" operator="Telenor Maritime AS" status="Operational" 13 bands="GSM 1800" brand="GSM.AQ" country="International operators" operator="BebbiCell AG" status="Operational" 14 bands="GSM 1800" brand="AeroMobile" country="International operators" operator="AeroMobile AS" status="Operational" 15 bands="GSM 1800" brand="OnAir" country="International operators" operator="OnAir Switzerland Sarl" status="Operational" @@ -2620,5 +2758,10 @@ 49 bands="" country="International operators" operator="Zain Kuwait" status="" 50 bands="Satellite" country="International operators" operator="EchoStar Mobile" status="" 51 bands="" country="International operators" operator="VisionNG" status="" + 52 bands="" country="International operators" operator="Manx Telecom Trading Ltd." status="" + 53 bands="" country="International operators" operator="Deutsche Telekom AG" status="" 88 bands="" country="International operators" operator="UN Office for the Coordination of Humanitarian Affairs (OCHA)" status="" 00-99 +995 + 01 bands="GSM 900" brand="FonePlus" cc="io" country="British Indian Ocean Territory (United Kingdom)" operator="Sure (Diego Garcia) Ltd" status="Operational" + 00-99 diff --git a/stdnum/isbn.dat b/stdnum/isbn.dat index 49e57c3d..4289339b 100644 --- a/stdnum/isbn.dat +++ b/stdnum/isbn.dat @@ -1,16 +1,17 @@ # generated from RangeMessage.xml, downloaded from # https://www.isbn-international.org/export_rangemessage.xml -# file serial 06b89123-0e43-4b34-92ef-de9637e6f095 -# file date Mon, 25 Jul 2016 18:49:43 CEST +# file serial ba776596-a833-425a-ad40-560b7658dd7c +# file date Mon, 31 Oct 2016 17:32:39 CET 978 0-5,600-649,7-7,80-94,950-989,9900-9989,99900-99999 0 agency="English language" - 00-19,200-699,7000-8499,85000-89999,900000-949999,9500000-9999999 + 00-19,200-227,2280-2289,229-647,6480000-6489999,649-699,7000-8499 + 85000-89999,900000-949999,9500000-9999999 1 agency="English language" 00-09,100-399,4000-5499,55000-86979,869800-998999,9990000-9999999 2 agency="French language" - 00-19,200-349,35000-39999,400-699,7000-8399,84000-89999,900000-949999 - 9500000-9999999 + 00-19,200-349,35000-39999,400-699,7000-8399,84000-89999,900000-919942 + 9199430-9199689,919969-949999,9500000-9999999 3 agency="German language" 00-02,030-033,0340-0369,03700-03999,04-19,200-699,7000-8499,85000-89999 900000-949999,9500000-9539999,95400-96999,9700000-9899999,99000-99499 @@ -28,8 +29,8 @@ 00-19,200-699,7000-7999,80000-84999,85-99 602 agency="Indonesia" 00-07,0800-0899,0900-1099,1100-1199,1200-1399,14000-14999,1500-1699 - 17000-17999,18000-18999,19000-19999,200-619,6200-6749,6750-6999 - 70000-74999,7500-7999,8000-9499,95000-99999 + 17000-17999,18000-18999,19000-19999,200-599,60000-61999,6200-6749 + 6750-6999,70000-74999,7500-7999,8000-9499,95000-99999 603 agency="Saudi Arabia" 00-04,05-49,500-799,8000-8999,90000-99999 604 agency="Vietnam" @@ -86,8 +87,8 @@ 87 agency="Denmark" 00-29,400-649,7000-7999,85000-94999,970000-999999 88 agency="Italy" - 00-19,200-599,6000-8499,85000-89999,900000-909999,910-929,9300-9399 - 940000-949999,95000-99999 + 00-19,200-326,3270-3389,339-599,6000-8499,85000-89999,900000-909999 + 910-929,9300-9399,940000-947999,94800-94999,95000-99999 89 agency="Korea, Republic" 00-24,250-549,5500-8499,85000-94999,950000-969999,97000-98999,990-999 90 agency="Netherlands" @@ -112,15 +113,15 @@ 954 agency="Bulgaria" 00-28,2900-2999,300-799,8000-8999,90000-92999,9300-9999 955 agency="Sri Lanka" - 0000-1999,20-38,3900-4099,41000-43999,44000-44999,4500-4999,50000-54999 - 550-749,7500-7999,8000-9499,95000-99999 + 0000-1999,20-37,38000-38999,3900-4099,41000-43999,44000-44999,4500-4999 + 50000-54999,550-719,7200-7499,7500-7999,8000-9499,95000-99999 956 agency="Chile" 00-19,200-699,7000-9999 957 agency="Taiwan" 00-02,0300-0499,05-19,2000-2099,21-27,28000-30999,31-43,440-819 8200-9699,97000-99999 958 agency="Colombia" - 00-56,57000-59999,600-799,8000-9499,95000-99999 + 00-53,5400-5599,56000-56999,57000-59999,600-799,8000-9499,95000-99999 959 agency="Cuba" 00-19,200-699,7000-8499,85000-99999 960 agency="Greece" @@ -448,7 +449,7 @@ 99964 agency="Nicaragua" 0-1,20-79,800-999 99965 agency="Macau" - 0-3,40-62,630-999 + 0-2,300-399,40-62,630-999 99966 agency="Kuwait" 0-2,30-69,700-799,80-94 99967 agency="Paraguay" @@ -475,6 +476,8 @@ 0-1,40-69,700-799 99978 agency="Mongolia" 0-4,50-79,800-999 + 99979 agency="Honduras" + 0-4,50-79,800-999 979 10-12 10 agency="France" diff --git a/stdnum/isil.dat b/stdnum/isil.dat index 2d2dff2c..e47fbb5f 100644 --- a/stdnum/isil.dat +++ b/stdnum/isil.dat @@ -13,7 +13,7 @@ CY$ country="Cyprus" ra_url="http://library.cut.ac.cy/en/isil" ra="Cyprus Univer DE$ country="Germany" ra_url="http://sigel.staatsbibliothek-berlin.de/" ra="Staatsbibliothek zu Berlin" DK$ country="Denmark" ra_url="http://www.kulturstyrelsen.dk/english/institutions/libraries/national-solutions/standards/danish-library-number/" ra="Danish Agency for Culture and Palaces" EG$ country="Egypt" ra_url="http://www.sti.sci.eg/index.php?option=com_content&view=article&id=30:focal-point&catid=1:pages&Itemid=56" ra="Egyptian National Scientific and Technical Information Network (ENSTINET)" -FI$ country="Finland" ra_url="http://www.nationallibrary.fi/libraries/standards/isil.html" ra="The National Library of Finland" +FI$ country="Finland" ra_url="http://isil.kansalliskirjasto.fi/en/" ra="The National Library of Finland" FR$ country="France" ra_url="http://www.abes.fr" ra="Agence Bibliographique de l'Enseignement Superieur" GB$ country="United Kingdom" ra_url="http://www.bl.uk/bibliographic/isilagency.html" ra="British Library" GL$ country="Greenland" ra_url="http://www.katak.gl/ISIL/Greenlandic_library_identifiers.html" ra="Central and Public Library of Greenland" @@ -22,7 +22,7 @@ IR$ country="Islamic Republic of Iran" ra_url="http://www.nlai.ir/special_servic IT$ country="Italy" ra_url="http://www.iccu.sbn.it/genera.jsp?id=78&l=en" ra="Istituto Centrale per il Catalogo Unico delle biblioteche italiane e per le informazioni bibliografiche" JP$ country="Japan" ra_url="http://www.ndl.go.jp/en/library/isil/index.html" ra="National Diet Library" KR$ country="Republic of Korea" ra_url="http://www.nl.go.kr/isil/" ra="The National Library of Korea" -LU$ country="Luxembourg" ra_url="http://www.anlux.lu" ra="Archives nationales de Luxembourg" +LU$ country="Luxembourg" ra_url="http://www.anlux.public.lu" ra="Archives nationales de Luxembourg" NL$ country="The Netherlands" ra_url="http://www.kb.nl/expertise/voor-bibliotheken/interbibliotheciar-leenverkeer/internationale-standard-identifier-for-libraries-isil" ra="Koninklijke Bibliotheek, National Library of the Netherlands" NO$ country="Norway" ra_url="http://www.nb.no/" ra="National Library of Norway" NZ$ country="New Zealand" ra_url="http://natlib.govt.nz/" ra="National Library of New Zealand Te Puna Matauranga o Aotearoa" diff --git a/tests/test_iban.doctest b/tests/test_iban.doctest index 9c95c24d..855b88d8 100644 --- a/tests/test_iban.doctest +++ b/tests/test_iban.doctest @@ -48,7 +48,6 @@ numbers: ... BR9700360305000010009795493P1 ... CH93 0076 2011 6238 5295 7 ... CH9300762011623852957 -... CR0515202001026284066 ... CY17 0020 0128 0000 0012 0052 7600 ... CY17002001280000001200527600 ... CZ65 0800 0000 1920 0014 5399 From 62ebbceaf8dd7baeb6ff310da90ff8e2096af580 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 13 Nov 2016 23:27:42 +0100 Subject: [PATCH 055/572] Get files ready for 1.5 release --- ChangeLog | 214 ++++++++++++++++++++++--- NEWS | 16 ++ README | 9 +- docs/index.rst | 7 + docs/stdnum.au.abn.rst | 5 + docs/stdnum.au.acn.rst | 5 + docs/stdnum.au.tfn.rst | 5 + docs/stdnum.es.ccc.rst | 5 + docs/stdnum.es.cups.rst | 5 + docs/stdnum.es.iban.rst | 5 + docs/stdnum.es.referenciacatastral.rst | 5 + stdnum/__init__.py | 11 +- 12 files changed, 269 insertions(+), 23 deletions(-) create mode 100644 docs/stdnum.au.abn.rst create mode 100644 docs/stdnum.au.acn.rst create mode 100644 docs/stdnum.au.tfn.rst create mode 100644 docs/stdnum.es.ccc.rst create mode 100644 docs/stdnum.es.cups.rst create mode 100644 docs/stdnum.es.iban.rst create mode 100644 docs/stdnum.es.referenciacatastral.rst diff --git a/ChangeLog b/ChangeLog index 412b3ad4..8ba0abc5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,179 @@ +2016-11-13 Arthur de Jong + + * [c9beb00] stdnum/cn/loc.dat, stdnum/iban.dat, stdnum/imsi.dat, + stdnum/isbn.dat, stdnum/isil.dat, tests/test_iban.doctest: + Update database files + + This removes the Costa Rica IBAN test because the format of the + IBAN seems to have been changed. The old length still seems to + be in use so a more permanent solution is probably required. + +2016-11-13 Arthur de Jong + + * [ac560a7] getisbn.py: Update getisbn to Python3 + + There were some SSL-related issues with the urllib module. This + was the easiest solution. + +2016-11-13 Arthur de Jong + + * [458c310] getiban.py: Update gettin IBAN registry + + The format of the registry file has changed. Before it was a + straightforward CSV file with countries in rows but countries + are now in columns. + +2016-11-09 Sergi Almacellas Abellana + + * [45faa7c] .gitignore, tox.ini: Add tox.ini file + +2016-11-08 Sergi Almacellas Abellana + + * [a9e5405] stdnum/eu/at_02.py: Implement calc_check_digits in + SEPA Identifier of the Creditor (AT-02) + +2016-10-14 Arthur de Jong + + * [8ea76ba] stdnum/au/tfn.py, tests/test_au_tfn.doctest: Add + Australian Tax File Number + + Based on the implementation provided by Vincent Bastos + + + See https://github.com/arthurdejong/python-stdnum/pull/40 + +2016-10-14 Arthur de Jong + + * [8028c3a] stdnum/au/acn.py, tests/test_au_acn.doctest: Add + Australian Company Number + + Based on the implementation provided by Vincent Bastos + + + See https://github.com/arthurdejong/python-stdnum/pull/40 + +2016-10-14 Arthur de Jong + + * [70b94ee] stdnum/au/__init__.py, stdnum/au/abn.py, + tests/test_au_abn.doctest: Add Australian Business Number + + Based on the implementation provided by Vincent Bastos + + + See https://github.com/arthurdejong/python-stdnum/pull/40 + +2016-10-14 Arthur de Jong + + * [d7cff5d] stdnum/be/__init__.py, stdnum/be/vat.py: Provide + businessid as an alias + + The Belgian company number or enterprise number + (ondernemingsnummer) is the new name for what was previously + the VAT number. + +2016-09-10 Arthur de Jong + + * [352aa8a] stdnum/es/referenciacatastral.py: Add reference to + Referencia Catastral implementation + +2016-09-03 Arthur de Jong + + * [49db553] tests/test_es_referenciacatastral.doctest: Add more + tests for Referencia Catastral + + This adds a number of extra tests for the Spanish Referencia + Catastral (stdnum.es.referenciacatastral) module, mostly based + on numbers found online. + + This commit includes some of the documentation on the structure + of Referencia Catastral that was in the original pull request. + + See https://github.com/arthurdejong/python-stdnum/pull/38 + +2016-08-31 David García Garzón + + * [2c557a0] stdnum/es/referenciacatastral.py: Add Spansih Referencia + Catastral + + The control digit check algorithm is based on Javascript + implementation by Vicente Sancho that can be found at + http://trellat.es/validar-la-referencia-catastral-en-javascript/ + + See https://github.com/arthurdejong/python-stdnum/pull/38 + +2016-09-10 Arthur de Jong + + * [b128c8d] tests/test_iban.doctest: Test a few Spanish IBANs + found online + +2016-09-10 Arthur de Jong + + * [878e036] stdnum/numdb.py: Avoid leaving open file descriptor + in test + +2016-09-08 Arthur de Jong + + * [be24790] stdnum/es/iban.py, tests/test_iban.doctest: Add Spanish + IBAN number module + + This validates the country-specific part of the IBAN. + +2016-09-08 Arthur de Jong + + * [2510932] stdnum/iban.py: Validate country-specific part of IBAN + + This adds the possible of validating the country-specific part + of the IBAN. If the country has an IBAN module, checking is also + delegated to that module. + +2016-09-06 Arthur de Jong + + * [d8cca82] stdnum/eu/vat.py, stdnum/util.py: Introduce + get_cc_module() utility function + + This changes the get_vat_module() function to a more generic + get_cc_module() function so that it can also be used for other + things like IBAN checking. + +2016-09-06 Arthur de Jong + + * [1622873] stdnum/es/ccc.py: Add to_iban() function to Spanish CCC + +2016-09-08 Arthur de Jong + + * [7d969be] stdnum/iban.py: Implement calc_check_digits() in IBAN + + Introduce a function to calculate the two check digits of an + IBAN. Since the check digits are the third and fourth characters + in the number, placeholders need to be provided when calling + this function. + +2016-08-31 David García Garzón + + * [294f872] stdnum/es/ccc.py: Add Spanish Código Cuenta Corriente + (CCC) + +2016-08-28 David García Garzón + + * [466cec8] stdnum/es/cups.py, tests/test_es_cups.doctest: Add + Spanish CUPS code + +2016-08-28 Arthur de Jong + + * [d95382f] stdnum/exceptions.py: Properly print error message + of exceptions + + This ensures that the message passed to the constructor is shown + in the traceback while falling back to the class default. + +2016-07-26 Arthur de Jong + + * [01a7f34] ChangeLog, NEWS, README, docs/index.rst, + docs/stdnum.damm.rst, docs/stdnum.fr.nif.rst, + docs/stdnum.fr.nir.rst, docs/stdnum.fr.siret.rst, + docs/stdnum.gb.nhs.rst, docs/stdnum.tr.tckimlik.rst, + stdnum/__init__.py: Get files ready for 1.4 release + 2016-07-26 Arthur de Jong * [3e4e9e2] getmybp.py, stdnum/cn/loc.dat, stdnum/iban.dat, @@ -307,8 +483,8 @@ Jong 2015-10-10 Arthur de Jong - * [ebb5c07] MANIFEST.in, numdb-test.dat, stdnum/numdb.py, - tests/numdb-test.dat: Move numdb test file + * [ebb5c07] MANIFEST.in, stdnum/numdb.py, tests/numdb-test.dat: + Move numdb test file This places the test database file in the tests directory. @@ -881,8 +1057,8 @@ Jong http://www.citizensinformation.ie/en/social_welfare/irish_social_welfare_system/personal_public_service_number.html 2014-02-06 Arthur de Jong - * [71d9837] stdnum/at_02.py, stdnum/eu/at_02.py: Rename AT-02 - module to stdnum.eu.at_02 + * [71d9837] stdnum/eu/at_02.py: Rename AT-02 module to + stdnum.eu.at_02 2014-02-05 Sergi Almacellas Abellana @@ -1583,8 +1759,7 @@ Jong 2012-02-20 Arthur de Jong - * [680b7d1] numdb-test.dat, stdnum/numdb.py, test.dat: rename - numdb test file + * [680b7d1] numdb-test.dat, stdnum/numdb.py: rename numdb test file 2012-02-20 Arthur de Jong @@ -2133,13 +2308,13 @@ Jong 2011-02-05 Arthur de Jong - * [62aa496] tests/test_br_cpf.doctest, tests/test_iban.doctest, - tests/test_imei.doctest, tests/test_isan.doctest, - tests/test_isbn.doctest, tests/test_ismn.doctest, - tests/test_issn.doctest, tests/test_luhn.doctest, - tests/test_meid.doctest, tests/test_nl_bsn.doctest, - tests/test_robustness.doctest, tests/test_verhoeff.doctest: - move all robustness tests into one test file + * [62aa496] tests/test_iban.doctest, tests/test_imei.doctest, + tests/test_isan.doctest, tests/test_isbn.doctest, + tests/test_ismn.doctest, tests/test_issn.doctest, + tests/test_luhn.doctest, tests/test_meid.doctest, + tests/test_nl_bsn.doctest, tests/test_robustness.doctest, + tests/test_verhoeff.doctest: move all robustness tests into one + test file 2011-02-05 Arthur de Jong @@ -2207,9 +2382,8 @@ Jong 2011-01-15 Arthur de Jong - * [8d3a92c] stdnum/bsn.py, stdnum/nl/__init__.py, stdnum/nl/bsn.py, - tests/test_bsn.doctest, tests/test_nl_bsn.doctest: move bsn - module inside nl package + * [8d3a92c] stdnum/nl/__init__.py, stdnum/nl/bsn.py, + tests/test_nl_bsn.doctest: move bsn module inside nl package 2010-11-26 Arthur de Jong @@ -2219,10 +2393,10 @@ Jong 2010-11-24 Arthur de Jong * [124c16d] getisbn.py, stdnum/isbn.dat, stdnum/isbn.py, - stdnum/isbn/__init__.py, stdnum/isbn/ranges.py, stdnum/numdb.py, - test.dat, tests/test_isbn.doctest: implement a new numdb module - to hold information on hierarchically organised numbers and - switch the isbn module to use this format instead + stdnum/isbn/ranges.py, stdnum/numdb.py, test.dat, + tests/test_isbn.doctest: implement a new numdb module to hold + information on hierarchically organised numbers and switch the + isbn module to use this format instead 2010-09-11 Arthur de Jong diff --git a/NEWS b/NEWS index 1f8261da..317f8bb1 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,19 @@ +changes from 1.4 to 1.5 +----------------------- + +* add modules for the following number formats: + - ABN (Australian Business Number) + - ACN (Australian Company Number) + - TFN (Australian Tax File Number) + - CCC (Código Cuenta Corriente, Spanish Bank Account Code) + - CUPS (Código Unificado de Punto de Suministro, Supply Point Unified Code) + - Spanish IBAN (International Bank Account Number) + - Referencia Catastral (Spanish real estate property id) +* The IBAN module now support validating the country-specific part +* The Belgian VAT number is now also referenced as businessid +* add a Tox configuration file + + changes from 1.3 to 1.4 ----------------------- diff --git a/README b/README index 4c8c8de0..0cfdab8f 100644 --- a/README +++ b/README @@ -13,7 +13,10 @@ Currently this package supports the following formats: * CUIT (Código Único de Identificación Tributaria, Argentinian tax number) * Austrian Company Register Numbers * UID (Umsatzsteuer-Identifikationsnummer, Austrian VAT number) - * BTW, TVA, NWSt (Belgian VAT number) + * ABN (Australian Business Number) + * ACN (Australian Company Number) + * TFN (Australian Tax File Number) + * BTW, TVA, NWSt, ondernemingsnummer (Belgian enterprise number) * EGN (ЕГН, Единен граждански номер, Bulgarian personal identity codes) * PNF (ЛНЧ, Личен номер на чужденец, Bulgarian number of a foreigner) * VAT (Идентификационен номер по ДДС, Bulgarian VAT number) @@ -40,10 +43,14 @@ Currently this package supports the following formats: * RUC (Registro Único de Contribuyentes, Ecuadorian company tax number) * Isikukood (Estonian Personcal ID number) * KMKR (Käibemaksukohuslase, Estonian VAT number) + * CCC (Código Cuenta Corriente, Spanish Bank Account Code) * CIF (Certificado de Identificación Fiscal, Spanish company tax number) + * CUPS (Código Unificado de Punto de Suministro, Supply Point Unified Code) * DNI (Documento nacional de identidad, Spanish personal identity codes) + * Spanish IBAN (International Bank Account Number) * NIE (Número de Identificación de Extranjeros, Spanish foreigner number) * NIF (Número de Identificación Fiscal, Spanish VAT number) + * Referencia Catastral (Spanish real estate property id) * SEPA Identifier of the Creditor (AT-02) * VAT (European Union VAT number) * ALV nro (Arvonlisäveronumero, Finnish VAT number) diff --git a/docs/index.rst b/docs/index.rst index b85a8e0a..3e4096f5 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -90,6 +90,9 @@ Available formats ar.cuit at.businessid at.uid + au.abn + au.acn + au.tfn be.vat bg.egn bg.pnf @@ -117,10 +120,14 @@ Available formats ec.ruc ee.ik ee.kmkr + es.ccc es.cif + es.cups es.dni + es.iban es.nie es.nif + es.referenciacatastral eu.at_02 eu.vat fi.alv diff --git a/docs/stdnum.au.abn.rst b/docs/stdnum.au.abn.rst new file mode 100644 index 00000000..e1b646a7 --- /dev/null +++ b/docs/stdnum.au.abn.rst @@ -0,0 +1,5 @@ +stdnum.au.abn +============= + +.. automodule:: stdnum.au.abn + :members: \ No newline at end of file diff --git a/docs/stdnum.au.acn.rst b/docs/stdnum.au.acn.rst new file mode 100644 index 00000000..9b35a0af --- /dev/null +++ b/docs/stdnum.au.acn.rst @@ -0,0 +1,5 @@ +stdnum.au.acn +============= + +.. automodule:: stdnum.au.acn + :members: \ No newline at end of file diff --git a/docs/stdnum.au.tfn.rst b/docs/stdnum.au.tfn.rst new file mode 100644 index 00000000..a010db83 --- /dev/null +++ b/docs/stdnum.au.tfn.rst @@ -0,0 +1,5 @@ +stdnum.au.tfn +============= + +.. automodule:: stdnum.au.tfn + :members: \ No newline at end of file diff --git a/docs/stdnum.es.ccc.rst b/docs/stdnum.es.ccc.rst new file mode 100644 index 00000000..75c830a3 --- /dev/null +++ b/docs/stdnum.es.ccc.rst @@ -0,0 +1,5 @@ +stdnum.es.ccc +============= + +.. automodule:: stdnum.es.ccc + :members: \ No newline at end of file diff --git a/docs/stdnum.es.cups.rst b/docs/stdnum.es.cups.rst new file mode 100644 index 00000000..2fb20235 --- /dev/null +++ b/docs/stdnum.es.cups.rst @@ -0,0 +1,5 @@ +stdnum.es.cups +============== + +.. automodule:: stdnum.es.cups + :members: \ No newline at end of file diff --git a/docs/stdnum.es.iban.rst b/docs/stdnum.es.iban.rst new file mode 100644 index 00000000..6811e2c5 --- /dev/null +++ b/docs/stdnum.es.iban.rst @@ -0,0 +1,5 @@ +stdnum.es.iban +============== + +.. automodule:: stdnum.es.iban + :members: \ No newline at end of file diff --git a/docs/stdnum.es.referenciacatastral.rst b/docs/stdnum.es.referenciacatastral.rst new file mode 100644 index 00000000..c77588fb --- /dev/null +++ b/docs/stdnum.es.referenciacatastral.rst @@ -0,0 +1,5 @@ +stdnum.es.referenciacatastral +============================= + +.. automodule:: stdnum.es.referenciacatastral + :members: \ No newline at end of file diff --git a/stdnum/__init__.py b/stdnum/__init__.py index d12dcd47..777a09bc 100644 --- a/stdnum/__init__.py +++ b/stdnum/__init__.py @@ -29,7 +29,10 @@ * ar.cuit: CUIT (Código Único de Identificación Tributaria, Argentinian tax number) * at.businessid: Austrian Company Register Numbers * at.uid: UID (Umsatzsteuer-Identifikationsnummer, Austrian VAT number) -* be.vat: BTW, TVA, NWSt (Belgian VAT number) +* au.abn: ABN (Australian Business Number) +* au.acn: ACN (Australian Company Number) +* au.tfn: TFN (Australian Tax File Number) +* be.vat: BTW, TVA, NWSt, ondernemingsnummer (Belgian enterprise number) * bg.egn: EGN (ЕГН, Единен граждански номер, Bulgarian personal identity codes) * bg.pnf: PNF (ЛНЧ, Личен номер на чужденец, Bulgarian number of a foreigner) * bg.vat: VAT (Идентификационен номер по ДДС, Bulgarian VAT number) @@ -56,10 +59,14 @@ * ec.ruc: RUC (Registro Único de Contribuyentes, Ecuadorian company tax number) * ee.ik: Isikukood (Estonian Personcal ID number) * ee.kmkr: KMKR (Käibemaksukohuslase, Estonian VAT number) +* es.ccc: CCC (Código Cuenta Corriente, Spanish Bank Account Code) * es.cif: CIF (Certificado de Identificación Fiscal, Spanish company tax number) +* es.cups: CUPS (Código Unificado de Punto de Suministro, Supply Point Unified Code) * es.dni: DNI (Documento nacional de identidad, Spanish personal identity codes) +* es.iban: Spanish IBAN (International Bank Account Number) * es.nie: NIE (Número de Identificación de Extranjeros, Spanish foreigner number) * es.nif: NIF (Número de Identificación Fiscal, Spanish VAT number) +* es.referenciacatastral: Referencia Catastral (Spanish real estate property id) * eu.at_02: SEPA Identifier of the Creditor (AT-02) * eu.vat: VAT (European Union VAT number) * fi.alv: ALV nro (Arvonlisäveronumero, Finnish VAT number) @@ -159,4 +166,4 @@ # the version number of the library -__version__ = '1.4' +__version__ = '1.5' From da18e3ba8794b9eaa611c17fed23552dd51aa024 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 14 Nov 2016 23:53:30 +0100 Subject: [PATCH 056/572] Add Python 2.6 support This also brings the list of Python versions in setup.py in line with tox.ini. --- setup.py | 1 + stdnum/fi/associationid.py | 4 ++-- stdnum/meid.py | 12 ++++++++++-- tests/test_mx_rfc.doctest | 2 +- tox.ini | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index d91a7a93..941ff4eb 100755 --- a/setup.py +++ b/setup.py @@ -55,6 +55,7 @@ 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', 'Topic :: Office/Business :: Financial', 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Text Processing :: General', diff --git a/stdnum/fi/associationid.py b/stdnum/fi/associationid.py index 7af46c95..4efed2b1 100644 --- a/stdnum/fi/associationid.py +++ b/stdnum/fi/associationid.py @@ -31,11 +31,11 @@ >>> validate('123123123') Traceback (most recent call last): ... -stdnum.exceptions.InvalidLength: The number has an invalid length. +InvalidLength: The number has an invalid length. >>> validate('12df') Traceback (most recent call last): ... -stdnum.exceptions.InvalidFormat: The number has an invalid format. +InvalidFormat: The number has an invalid format. >>> format('123') '123' >>> format('1234') diff --git a/stdnum/meid.py b/stdnum/meid.py index 36b4445d..be52fbdb 100644 --- a/stdnum/meid.py +++ b/stdnum/meid.py @@ -1,6 +1,6 @@ # meid.py - functions for handling Mobile Equipment Identifiers (MEIDs) # -# Copyright (C) 2010, 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2010-2016 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -105,6 +105,14 @@ def compact(number, strip_check_digit=True): return number + cd +def _bit_length(n): + """Number of bits necessary to represent the number in binary.""" + if hasattr(n, 'bit_length'): + return n.bit_length() + import math + return int(math.log(n, 2)) + 1 + + def validate(number, strip_check_digit=True): """Checks to see if the number provided is a valid MEID number. This converts the representation format of the number (if it is @@ -119,7 +127,7 @@ def validate(number, strip_check_digit=True): # convert to hex manufacturer_code = int(number[0:10]) serial_num = int(number[10:18]) - if manufacturer_code.bit_length() > 32 or serial_num.bit_length() > 24: + if _bit_length(manufacturer_code) > 32 or _bit_length(serial_num) > 24: raise InvalidComponent() number = '%08X%06X' % (manufacturer_code, serial_num) cd = calc_check_digit(number) diff --git a/tests/test_mx_rfc.doctest b/tests/test_mx_rfc.doctest index 2d5e2f30..eba887d9 100644 --- a/tests/test_mx_rfc.doctest +++ b/tests/test_mx_rfc.doctest @@ -35,7 +35,7 @@ InvalidComponent: ... The last three digits are in a special alphabet and should only contain 1-9A-V, 1-9A-Z and 0-9A for the last digits. ->>> rfc.validate('AABN 821103 8Ñ2') +>>> rfc.validate('AABN 821103 8\xd12') # \xd1 is the N with tilde Traceback (most recent call last): ... InvalidFormat: ... diff --git a/tox.ini b/tox.ini index f8b77dc9..ec926c41 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = {py27,py34,py35,py36,pypy} +envlist = {py26,py27,py34,py35,py36,pypy} [testenv] deps = nose From dcde8f4f0dfbaba274d0ced7383b5a0809c11e48 Mon Sep 17 00:00:00 2001 From: Luciano Rossi Date: Mon, 14 Nov 2016 16:35:24 -0300 Subject: [PATCH 057/572] Implement CBU (unique bank code) of Argentina See https://github.com/arthurdejong/python-stdnum/issues/43 --- stdnum/ar/cbu.py | 86 +++++++++++++++++++++++++++++++++++++++ tests/test_ar_cbu.doctest | 79 +++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 stdnum/ar/cbu.py create mode 100644 tests/test_ar_cbu.doctest diff --git a/stdnum/ar/cbu.py b/stdnum/ar/cbu.py new file mode 100644 index 00000000..cd753ac1 --- /dev/null +++ b/stdnum/ar/cbu.py @@ -0,0 +1,86 @@ +# cbu.py - functions for handling Argentinian CBU numbers +# coding: utf-8 +# +# Copyright (C) 2016 Luciano Rossi +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""CBU (Clave Bancaria Uniforme, Argentine bank account number). + +CBU it s a code of the Banks of Argentina to identify customer +accounts. The number consists of 22 digits and consists of a 3 digit +bank identiefyer, followed by a 4 digit branch identifyer, a check +digit, a 13 digit account identifyer and another check digit. + +More information: + +* https://es.wikipedia.org/wiki/Clave_Bancaria_Uniforme +* http://www.clientebancario.gov.ar/mediospago/mp080000.asp + +>>> validate('2850590940090418135201') +'2850590940090418135201' +>>> format('2850590940090418135201') +'28505909 40090418135201' +>>> validate('2810590940090418135201') +Traceback (most recent call last): + ... +InvalidChecksum: ... +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' -').strip() + + +def calc_check_digit(number): + """Calculate the check digit.""" + weights = (3, 1, 7, 9) + check = sum(int(n) * weights[i % 4] + for i, n in enumerate(reversed(number))) + return str((10 - check) % 10) + + +def validate(number): + """Checks to see if the number provided is a valid CBU.""" + number = compact(number) + if len(number) != 22: + raise InvalidLength() + if not number.isdigit(): + raise InvalidFormat() + if calc_check_digit(number[:7]) != number[7]: + raise InvalidChecksum() + if calc_check_digit(number[8:-1]) != number[-1]: + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid CBU.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return ' '.join((number[:8], number[8:])) diff --git a/tests/test_ar_cbu.doctest b/tests/test_ar_cbu.doctest new file mode 100644 index 00000000..151600e9 --- /dev/null +++ b/tests/test_ar_cbu.doctest @@ -0,0 +1,79 @@ +test_ar_cbu.doctest - more detailed doctests for the stdnum.ar.cbu module + +Copyright (C) 2016 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.ar.cbu module. It +tries to validate a number of numbers that have been found online. + +>>> from stdnum.ar import cbu +>>> from stdnum.exceptions import * + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 0 0 7 0 9 9 9 0 2 0 0 0 0 0 6 5 7 0 6 0 8 0 +... 0 1 1 0 4 3 3 6 3 0 0 4 3 3 1 3 8 5 7 6 8 3 +... 0 1 4 0 3 3 9 6 0 1 6 3 0 2 0 1 3 8 1 2 7 6 +... 0 1400 236 – 01 5068 0262 5874 +... 0 4 4 0 0 6 4 – 6 – 4 0 0 0 0 1 4 2 9 4 1 0 9 – 2 +... 0 7 2 0 1 4 6 8 2 0 0 0 0 0 0 1 0 6 2 3 4 0 +... 0 7 2 0 1 6 8 0 2 0 0 0 0 0 0 1 1 8 3 2 3 6 +... 0 7 2 0 3 8 0 8 8 8 0 0 0 0 3 5 5 3 3 9 6 8 +... 0070090020000004146504 +... 0110097630009704213797 +... 0140339601630201381276 +... 0140351801684605023087 +... 0168888-1-0000827441015-8 +... 01703342 – 200 000 3036 7766 +... 0200915901000000274233 +... 03400562 00560007577005 +... 0720079388000035942322 +... 0940099324001313220028 +... 1 5 0 0 0 0 6 0 0 0 0 0 5 6 6 0 4 4 7 2 0 0 +... 1 5 0 0 0 8 7 9 - 0 0 0 5 1 3 3 2 0 7 5 1 9 - 6 +... 1 9 1 0 1 1 9 6 5 5 0 1 1 9 0 1 0 8 4 6 4 6 +... 2850590940090418135201 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not cbu.is_valid(x)] +[] + + +More detailed tests: + +>>> cbu.validate('285059094009041') +Traceback (most recent call last): + ... +InvalidLength: ... +>>> cbu.validate('A850590940090418135201') +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> cbu.validate('0940099324001313220028') +'0940099324001313220028' +>>> cbu.validate('1940099324001313220028') # error in first part +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> cbu.validate('0940099324001313220038') # error in second part +Traceback (most recent call last): + ... +InvalidChecksum: ... From 7d16ea5318bd0c3ce0606718c9e0a376cef3b023 Mon Sep 17 00:00:00 2001 From: Greg Kuwaye Date: Thu, 1 Dec 2016 14:30:32 -0800 Subject: [PATCH 058/572] Add new 47 EIN prefix; fix duplicate 46; move 81 47 appears to be a new Internet campus code. Prefix 46 was listed twice, once under the Philadelphia campus and again under the Internet campus. This error may be seen on the IRS website itself. The Wikipedia article on EIN (https://en.wikipedia.org/wiki/Employer_Identification_Number) does not have 46 listed twice. 81 has moved from the Philadelphia campus to the Internet campus. --- stdnum/us/ein.dat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdnum/us/ein.dat b/stdnum/us/ein.dat index e1a8e03d..d4d72e0d 100644 --- a/stdnum/us/ein.dat +++ b/stdnum/us/ein.dat @@ -4,10 +4,10 @@ 01,02,03,04,05,06,11,13,14,16,21,22,23,25,34,51,52,54,55,56,57,58,59,65 campus="Brookhaven" 10,12 campus="Andover" 15,24 campus="Fresno" -20,26,27,45,46 campus="Internet" +20,26,27,45,46,47,81 campus="Internet" 30,32,35,36,37,38,61 campus="Cincinnati" 31 campus="Small Business Administration (SBA)" -33,39,41,42,43,46,48,62,63,64,66,68,71,72,73,74,75,76,77,81,82,83,84,85,86,87,88,91,92,93,98,99 campus="Philadelphia" +33,39,41,42,43,48,62,63,64,66,68,71,72,73,74,75,76,77,82,83,84,85,86,87,88,91,92,93,98,99 campus="Philadelphia" 40,44 campus="Kansas City" 50,53 campus="Austin" 60,67 campus="Atlanta" From 5b4385732f6b7d7b5959e742881e20d63ec58183 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 11 Dec 2016 19:07:41 +0100 Subject: [PATCH 059/572] Remove unused import --- stdnum/au/tfn.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/stdnum/au/tfn.py b/stdnum/au/tfn.py index 99b4b84b..f4c1ab4d 100644 --- a/stdnum/au/tfn.py +++ b/stdnum/au/tfn.py @@ -42,8 +42,6 @@ '123 456 782' """ -import operator - from stdnum.exceptions import * from stdnum.util import clean From c957318aacacf6496e7fef6198f6b9e791552b70 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 19 Mar 2017 15:28:27 +0100 Subject: [PATCH 060/572] Add support for Monaco VAT number The number uses the French TVA number but, unlike normal French VAT numbers, they are not valid French SIREN numbers. See https://github.com/arthurdejong/python-stdnum/issues/46 --- stdnum/fr/tva.py | 8 +++-- stdnum/mc/__init__.py | 24 +++++++++++++++ stdnum/mc/tva.py | 63 +++++++++++++++++++++++++++++++++++++++ tests/test_eu_vat.doctest | 26 +++++++++++++++- 4 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 stdnum/mc/__init__.py create mode 100644 stdnum/mc/tva.py diff --git a/stdnum/fr/tva.py b/stdnum/fr/tva.py index c82ad82f..bb46feda 100644 --- a/stdnum/fr/tva.py +++ b/stdnum/fr/tva.py @@ -1,7 +1,7 @@ # tva.py - functions for handling French TVA numbers # coding: utf-8 # -# Copyright (C) 2012-2015 Arthur de Jong +# Copyright (C) 2012-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -67,9 +67,13 @@ def validate(number): number = compact(number) if not all(x in _alphabet for x in number[:2]): raise InvalidFormat() + if not number[2:].isdigit(): + raise InvalidFormat() if len(number) != 11: raise InvalidLength() - siren.validate(number[2:]) + if number[2:5] != '000': + # numbers from Monaco are valid TVA but not SIREN + siren.validate(number[2:]) if number.isdigit(): # all-numeric digits if int(number[:2]) != (int(number[2:] + '12') % 97): diff --git a/stdnum/mc/__init__.py b/stdnum/mc/__init__.py new file mode 100644 index 00000000..835d258d --- /dev/null +++ b/stdnum/mc/__init__.py @@ -0,0 +1,24 @@ +# __init__.py - collection of Monacan numbers +# coding: utf-8 +# +# Copyright (C) 2017 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""Collection of Monacan numbers.""" + +# provide vat as an alias +from stdnum.mc import tva as vat diff --git a/stdnum/mc/tva.py b/stdnum/mc/tva.py new file mode 100644 index 00000000..dacf803d --- /dev/null +++ b/stdnum/mc/tva.py @@ -0,0 +1,63 @@ +# tva.py - functions for handling Monacan TVA numbers +# coding: utf-8 +# +# Copyright (C) 2017 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""n° TVA (taxe sur la valeur ajoutée, Monacan VAT number). + +For VAT purposes Monaco is treated as territory of France. The number is +also validated the same as the French TVA, except that it is not based on +a French SIREN. + +>>> compact('53 0000 04605') +'FR53000004605' +>>> validate('53 0000 04605') +'FR53000004605' +>>> validate('FR 61 954 506 077') # French numbers are invalid +Traceback (most recent call last): + ... +InvalidComponent: ... +""" + +from stdnum.exceptions import * +from stdnum.util import clean +from stdnum.fr import tva + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return 'FR' + tva.compact(number) + + +def validate(number): + """Checks to see if the number provided is a valid VAT number. This + checks the length, formatting and check digit.""" + number = tva.validate(number) + if number[2:5] != '000': + raise InvalidComponent() + return 'FR' + number + + +def is_valid(number): + """Checks to see if the number provided is a valid VAT number. This + checks the length, formatting and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False diff --git a/tests/test_eu_vat.doctest b/tests/test_eu_vat.doctest index ce10efd5..a578d67d 100644 --- a/tests/test_eu_vat.doctest +++ b/tests/test_eu_vat.doctest @@ -1,6 +1,6 @@ test_eu_vat.doctest - more detailed doctests for the stdnum.eu.vat module -Copyright (C) 2012-2015 Arthur de Jong +Copyright (C) 2012-2017 Arthur de Jong This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -313,6 +313,28 @@ These have been found online and should all be valid numbers. ... Fr 96 631 620 572 ... fr 71383076817 ... +... FR16000063601 +... FR23000047372 +... FR26000040583 +... FR28000113851 +... FR30000017854 +... FR32000000330 +... FR36000006022 +... FR40000066034 +... FR43000020445 +... FR48000052489 +... FR54000065101 +... FR64000063908 +... FR65000100833 +... FR79000030642 +... FR83000065143 +... FR83000113158 +... FR84000082668 +... FR87000018746 +... FR88000008820 +... FR88000053537 +... FR96000110899 +... ... GB 002 4257 28 ... GB 003232345 ... GB 100 1950 75 @@ -864,6 +886,8 @@ These numbers should be mostly valid except that they have the wrong length. ... ... ES B-583784312 ... +... FR000076090 +... ... NL006866304B021 ... ... SE 55643359201 From 649f073f27154aa0664c04be0a53eb55d5600ae9 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 26 Mar 2017 18:07:41 +0200 Subject: [PATCH 061/572] Remove unused import --- stdnum/mc/tva.py | 1 - 1 file changed, 1 deletion(-) diff --git a/stdnum/mc/tva.py b/stdnum/mc/tva.py index dacf803d..9acb2227 100644 --- a/stdnum/mc/tva.py +++ b/stdnum/mc/tva.py @@ -35,7 +35,6 @@ """ from stdnum.exceptions import * -from stdnum.util import clean from stdnum.fr import tva From 61d73c17201a31b11bbdb0d7ab71423a1ce06fbb Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 26 Mar 2017 18:11:41 +0200 Subject: [PATCH 062/572] Add European NACE classification This number is used to classify business. Validation is done based on a downloaded registry. --- getnace.py | 74 +++ stdnum/eu/nace.dat | 999 ++++++++++++++++++++++++++++++++++ stdnum/eu/nace.py | 109 ++++ tests/test_robustness.doctest | 4 +- 4 files changed, 1184 insertions(+), 2 deletions(-) create mode 100755 getnace.py create mode 100644 stdnum/eu/nace.dat create mode 100644 stdnum/eu/nace.py diff --git a/getnace.py b/getnace.py new file mode 100755 index 00000000..0830563d --- /dev/null +++ b/getnace.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 + +# getnace.py - script to get the NACE v2 catalogue +# +# Copyright (C) 2017 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""This script downloads XML data from the European commission RAMON Eurostat +Metadata Server and extracts the information that is used for validating NACE +codes.""" + +from xml.etree import ElementTree +import cgi +import urllib.request + + +# the location of the ISBN Ranges XML file +download_url = 'http://ec.europa.eu/eurostat/ramon/nomenclatures/index.cfm?TargetUrl=ACT_OTH_CLS_DLD&StrNom=NACE_REV2&StrFormat=XML&StrLanguageCode=EN' + + +def get(f=None): + if f is None: + f = urllib.request.urlopen(download_url) + _, params = cgi.parse_header(f.info().get('Content-Disposition', '')) + filename = params.get('filename', '?') + yield '# generated from %s, downloaded from' % filename + yield '# %s' % download_url + else: + yield '# generated from %s' % f + + # parse XML document + doc = ElementTree.parse(f).getroot() + + # output header + yield '# %s: %s' % ( + doc.find('Classification').get('id'), + doc.find('Classification/Label/LabelText[@language="EN"]').text) + + for item in doc.findall('Classification/Item'): + number = item.get('id') + level = int(item.get('idLevel', 0)) + label = item.find('Label/LabelText[@language="EN"]').text + isic = item.find( + 'Property[@genericName="ISIC4_REF"]/PropertyQualifier/' + + 'PropertyText').text + if level == 1: + section = number + yield '%s label="%s" isic="%s"' % (number, label, isic) + elif level == 2: + yield '%s section="%s" label="%s" isic="%s"' % ( + number, section, label, isic) + else: + yield '%s%s label="%s" isic="%s"' % ( + ' ' * (level - 2), number[level], label, isic) + + +if __name__ == '__main__': + #get('NACE_REV2_20170326_162216.xml') + for row in get(): + print(row) diff --git a/stdnum/eu/nace.dat b/stdnum/eu/nace.dat new file mode 100644 index 00000000..370d5e6f --- /dev/null +++ b/stdnum/eu/nace.dat @@ -0,0 +1,999 @@ +# generated from NACE_REV2_20170326_174221.xml, downloaded from +# http://ec.europa.eu/eurostat/ramon/nomenclatures/index.cfm?TargetUrl=ACT_OTH_CLS_DLD&StrNom=NACE_REV2&StrFormat=XML&StrLanguageCode=EN +# NACE_REV2: Statistical Classification of Economic Activities in the European Community, Rev. 2 (2008) +A label="AGRICULTURE, FORESTRY AND FISHING" isic="A" +01 section="A" label="Crop and animal production, hunting and related service activities" isic="01" + 1 label="Growing of non-perennial crops" isic="011" + 1 label="Growing of cereals (except rice), leguminous crops and oil seeds" isic="0111" + 2 label="Growing of rice" isic="0112" + 3 label="Growing of vegetables and melons, roots and tubers" isic="0113" + 4 label="Growing of sugar cane" isic="0114" + 5 label="Growing of tobacco" isic="0115" + 6 label="Growing of fibre crops" isic="0116" + 9 label="Growing of other non-perennial crops" isic="0119" + 2 label="Growing of perennial crops" isic="012" + 1 label="Growing of grapes" isic="0121" + 2 label="Growing of tropical and subtropical fruits" isic="0122" + 3 label="Growing of citrus fruits" isic="0123" + 4 label="Growing of pome fruits and stone fruits" isic="0124" + 5 label="Growing of other tree and bush fruits and nuts" isic="0125" + 6 label="Growing of oleaginous fruits" isic="0126" + 7 label="Growing of beverage crops" isic="0127" + 8 label="Growing of spices, aromatic, drug and pharmaceutical crops" isic="0128" + 9 label="Growing of other perennial crops" isic="0129" + 3 label="Plant propagation" isic="013" + 0 label="Plant propagation" isic="0130" + 4 label="Animal production" isic="014" + 1 label="Raising of dairy cattle" isic="0141" + 2 label="Raising of other cattle and buffaloes" isic="0141" + 3 label="Raising of horses and other equines" isic="0142" + 4 label="Raising of camels and camelids" isic="0143" + 5 label="Raising of sheep and goats" isic="0144" + 6 label="Raising of swine/pigs" isic="0145" + 7 label="Raising of poultry" isic="0146" + 9 label="Raising of other animals" isic="0149" + 5 label="Mixed farming" isic="015" + 0 label="Mixed farming" isic="0150" + 6 label="Support activities to agriculture and post-harvest crop activities" isic="016" + 1 label="Support activities for crop production" isic="0161" + 2 label="Support activities for animal production" isic="0162" + 3 label="Post-harvest crop activities" isic="0163" + 4 label="Seed processing for propagation" isic="0164" + 7 label="Hunting, trapping and related service activities" isic="017" + 0 label="Hunting, trapping and related service activities" isic="0170" +02 section="A" label="Forestry and logging" isic="02" + 1 label="Silviculture and other forestry activities" isic="021" + 0 label="Silviculture and other forestry activities" isic="0210" + 2 label="Logging" isic="022" + 0 label="Logging" isic="0220" + 3 label="Gathering of wild growing non-wood products" isic="023" + 0 label="Gathering of wild growing non-wood products" isic="0230" + 4 label="Support services to forestry" isic="024" + 0 label="Support services to forestry" isic="0240" +03 section="A" label="Fishing and aquaculture" isic="03" + 1 label="Fishing" isic="031" + 1 label="Marine fishing" isic="0311" + 2 label="Freshwater fishing" isic="0312" + 2 label="Aquaculture" isic="032" + 1 label="Marine aquaculture" isic="0321" + 2 label="Freshwater aquaculture" isic="0322" +B label="MINING AND QUARRYING" isic="B" +05 section="B" label="Mining of coal and lignite" isic="05" + 1 label="Mining of hard coal" isic="051" + 0 label="Mining of hard coal" isic="0510" + 2 label="Mining of lignite" isic="052" + 0 label="Mining of lignite" isic="0520" +06 section="B" label="Extraction of crude petroleum and natural gas" isic="06" + 1 label="Extraction of crude petroleum" isic="061" + 0 label="Extraction of crude petroleum" isic="0610" + 2 label="Extraction of natural gas" isic="062" + 0 label="Extraction of natural gas" isic="0620" +07 section="B" label="Mining of metal ores" isic="07" + 1 label="Mining of iron ores" isic="071" + 0 label="Mining of iron ores" isic="0710" + 2 label="Mining of non-ferrous metal ores" isic="072" + 1 label="Mining of uranium and thorium ores" isic="0721" + 9 label="Mining of other non-ferrous metal ores" isic="0729" +08 section="B" label="Other mining and quarrying" isic="08" + 1 label="Quarrying of stone, sand and clay" isic="081" + 1 label="Quarrying of ornamental and building stone, limestone, gypsum, chalk and slate" isic="0810" + 2 label="Operation of gravel and sand pits; mining of clays and kaolin" isic="0810" + 9 label="Mining and quarrying n.e.c." isic="089" + 1 label="Mining of chemical and fertiliser minerals" isic="0891" + 2 label="Extraction of peat" isic="0892" + 3 label="Extraction of salt" isic="0893" + 9 label="Other mining and quarrying n.e.c." isic="0899" +09 section="B" label="Mining support service activities" isic="09" + 1 label="Support activities for petroleum and natural gas extraction" isic="091" + 0 label="Support activities for petroleum and natural gas extraction" isic="0910" + 9 label="Support activities for other mining and quarrying" isic="099" + 0 label="Support activities for other mining and quarrying" isic="0990" +C label="MANUFACTURING" isic="C" +10 section="C" label="Manufacture of food products" isic="10" + 1 label="Processing and preserving of meat and production of meat products" isic="101" + 1 label="Processing and preserving of meat" isic="1010" + 2 label="Processing and preserving of poultry meat" isic="1010" + 3 label="Production of meat and poultry meat products" isic="1010" + 2 label="Processing and preserving of fish, crustaceans and molluscs" isic="102" + 0 label="Processing and preserving of fish, crustaceans and molluscs" isic="1020" + 3 label="Processing and preserving of fruit and vegetables" isic="103" + 1 label="Processing and preserving of potatoes" isic="1030" + 2 label="Manufacture of fruit and vegetable juice" isic="1030" + 9 label="Other processing and preserving of fruit and vegetables" isic="1030" + 4 label="Manufacture of vegetable and animal oils and fats" isic="104" + 1 label="Manufacture of oils and fats" isic="1040" + 2 label="Manufacture of margarine and similar edible fats" isic="1040" + 5 label="Manufacture of dairy products" isic="105" + 1 label="Operation of dairies and cheese making" isic="1050" + 2 label="Manufacture of ice cream" isic="1050" + 6 label="Manufacture of grain mill products, starches and starch products" isic="106" + 1 label="Manufacture of grain mill products" isic="1061" + 2 label="Manufacture of starches and starch products" isic="1062" + 7 label="Manufacture of bakery and farinaceous products" isic="107" + 1 label="Manufacture of bread; manufacture of fresh pastry goods and cakes" isic="1071" + 2 label="Manufacture of rusks and biscuits; manufacture of preserved pastry goods and cakes" isic="1071" + 3 label="Manufacture of macaroni, noodles, couscous and similar farinaceous products" isic="1074" + 8 label="Manufacture of other food products" isic="107" + 1 label="Manufacture of sugar" isic="1072" + 2 label="Manufacture of cocoa, chocolate and sugar confectionery" isic="1073" + 3 label="Processing of tea and coffee" isic="1079" + 4 label="Manufacture of condiments and seasonings" isic="1079" + 5 label="Manufacture of prepared meals and dishes" isic="1075" + 6 label="Manufacture of homogenised food preparations and dietetic food" isic="1079" + 9 label="Manufacture of other food products n.e.c." isic="1079" + 9 label="Manufacture of prepared animal feeds" isic="108" + 1 label="Manufacture of prepared feeds for farm animals" isic="1080" + 2 label="Manufacture of prepared pet foods" isic="1080" +11 section="C" label="Manufacture of beverages" isic="11" + 0 label="Manufacture of beverages" isic="110" + 1 label="Distilling, rectifying and blending of spirits" isic="1101" + 2 label="Manufacture of wine from grape" isic="1102" + 3 label="Manufacture of cider and other fruit wines" isic="1102" + 4 label="Manufacture of other non-distilled fermented beverages" isic="1102" + 5 label="Manufacture of beer" isic="1103" + 6 label="Manufacture of malt" isic="1103" + 7 label="Manufacture of soft drinks; production of mineral waters and other bottled waters" isic="1104" +12 section="C" label="Manufacture of tobacco products" isic="12" + 0 label="Manufacture of tobacco products" isic="120" + 0 label="Manufacture of tobacco products" isic="1200" +13 section="C" label="Manufacture of textiles" isic="13" + 1 label="Preparation and spinning of textile fibres" isic="131" + 0 label="Preparation and spinning of textile fibres" isic="1311" + 2 label="Weaving of textiles" isic="131" + 0 label="Weaving of textiles" isic="1312" + 3 label="Finishing of textiles" isic="131" + 0 label="Finishing of textiles" isic="1313" + 9 label="Manufacture of other textiles" isic="139" + 1 label="Manufacture of knitted and crocheted fabrics" isic="1391" + 2 label="Manufacture of made-up textile articles, except apparel" isic="1392" + 3 label="Manufacture of carpets and rugs" isic="1393" + 4 label="Manufacture of cordage, rope, twine and netting" isic="1394" + 5 label="Manufacture of non-wovens and articles made from non-wovens, except apparel" isic="1399" + 6 label="Manufacture of other technical and industrial textiles" isic="1399" + 9 label="Manufacture of other textiles n.e.c." isic="1399" +14 section="C" label="Manufacture of wearing apparel" isic="14" + 1 label="Manufacture of wearing apparel, except fur apparel" isic="141" + 1 label="Manufacture of leather clothes" isic="1410" + 2 label="Manufacture of workwear" isic="1410" + 3 label="Manufacture of other outerwear" isic="1410" + 4 label="Manufacture of underwear" isic="1410" + 9 label="Manufacture of other wearing apparel and accessories" isic="1410" + 2 label="Manufacture of articles of fur" isic="142" + 0 label="Manufacture of articles of fur" isic="1420" + 3 label="Manufacture of knitted and crocheted apparel" isic="143" + 1 label="Manufacture of knitted and crocheted hosiery" isic="1430" + 9 label="Manufacture of other knitted and crocheted apparel" isic="1430" +15 section="C" label="Manufacture of leather and related products" isic="15" + 1 label="Tanning and dressing of leather; manufacture of luggage, handbags, saddlery and harness; dressing and dyeing of fur" isic="151" + 1 label="Tanning and dressing of leather; dressing and dyeing of fur" isic="1511" + 2 label="Manufacture of luggage, handbags and the like, saddlery and harness" isic="1512" + 2 label="Manufacture of footwear" isic="152" + 0 label="Manufacture of footwear" isic="1520" +16 section="C" label="Manufacture of wood and of products of wood and cork, except furniture; manufacture of articles of straw and plaiting materials" isic="16" + 1 label="Sawmilling and planing of wood" isic="161" + 0 label="Sawmilling and planing of wood" isic="1610" + 2 label="Manufacture of products of wood, cork, straw and plaiting materials" isic="162" + 1 label="Manufacture of veneer sheets and wood-based panels" isic="1621" + 2 label="Manufacture of assembled parquet floors" isic="1622" + 3 label="Manufacture of other builders' carpentry and joinery" isic="1622" + 4 label="Manufacture of wooden containers" isic="1623" + 9 label="Manufacture of other products of wood; manufacture of articles of cork, straw and plaiting materials" isic="1629" +17 section="C" label="Manufacture of paper and paper products" isic="17" + 1 label="Manufacture of pulp, paper and paperboard" isic="170" + 1 label="Manufacture of pulp" isic="1701" + 2 label="Manufacture of paper and paperboard" isic="1701" + 2 label="Manufacture of articles of paper and paperboard " isic="170" + 1 label="Manufacture of corrugated paper and paperboard and of containers of paper and paperboard" isic="1702" + 2 label="Manufacture of household and sanitary goods and of toilet requisites" isic="1709" + 3 label="Manufacture of paper stationery" isic="1709" + 4 label="Manufacture of wallpaper" isic="1709" + 9 label="Manufacture of other articles of paper and paperboard" isic="1709" +18 section="C" label="Printing and reproduction of recorded media" isic="18" + 1 label="Printing and service activities related to printing" isic="181" + 1 label="Printing of newspapers" isic="1811" + 2 label="Other printing" isic="1811" + 3 label="Pre-press and pre-media services" isic="1812" + 4 label="Binding and related services" isic="1812" + 2 label="Reproduction of recorded media" isic="182" + 0 label="Reproduction of recorded media" isic="1820" +19 section="C" label="Manufacture of coke and refined petroleum products" isic="19" + 1 label="Manufacture of coke oven products" isic="191" + 0 label="Manufacture of coke oven products" isic="1910" + 2 label="Manufacture of refined petroleum products" isic="192" + 0 label="Manufacture of refined petroleum products" isic="1920" +20 section="C" label="Manufacture of chemicals and chemical products" isic="20" + 1 label="Manufacture of basic chemicals, fertilisers and nitrogen compounds, plastics and synthetic rubber in primary forms" isic="201" + 1 label="Manufacture of industrial gases" isic="2011" + 2 label="Manufacture of dyes and pigments" isic="2011" + 3 label="Manufacture of other inorganic basic chemicals" isic="2011" + 4 label="Manufacture of other organic basic chemicals" isic="2011" + 5 label="Manufacture of fertilisers and nitrogen compounds" isic="2012" + 6 label="Manufacture of plastics in primary forms" isic="2013" + 7 label="Manufacture of synthetic rubber in primary forms" isic="2013" + 2 label="Manufacture of pesticides and other agrochemical products" isic="202" + 0 label="Manufacture of pesticides and other agrochemical products" isic="2021" + 3 label="Manufacture of paints, varnishes and similar coatings, printing ink and mastics" isic="202" + 0 label="Manufacture of paints, varnishes and similar coatings, printing ink and mastics" isic="2022" + 4 label="Manufacture of soap and detergents, cleaning and polishing preparations, perfumes and toilet preparations" isic="202" + 1 label="Manufacture of soap and detergents, cleaning and polishing preparations" isic="2023" + 2 label="Manufacture of perfumes and toilet preparations" isic="2023" + 5 label="Manufacture of other chemical products" isic="202" + 1 label="Manufacture of explosives" isic="2029" + 2 label="Manufacture of glues" isic="2029" + 3 label="Manufacture of essential oils" isic="2029" + 9 label="Manufacture of other chemical products n.e.c." isic="2029" + 6 label="Manufacture of man-made fibres" isic="203" + 0 label="Manufacture of man-made fibres" isic="2030" +21 section="C" label="Manufacture of basic pharmaceutical products and pharmaceutical preparations" isic="21" + 1 label="Manufacture of basic pharmaceutical products" isic="210" + 0 label="Manufacture of basic pharmaceutical products" isic="2100" + 2 label="Manufacture of pharmaceutical preparations" isic="210" + 0 label="Manufacture of pharmaceutical preparations" isic="2100" +22 section="C" label="Manufacture of rubber and plastic products" isic="22" + 1 label="Manufacture of rubber products" isic="221" + 1 label="Manufacture of rubber tyres and tubes; retreading and rebuilding of rubber tyres" isic="2211" + 9 label="Manufacture of other rubber products" isic="2219" + 2 label="Manufacture of plastic products" isic="222" + 1 label="Manufacture of plastic plates, sheets, tubes and profiles" isic="2220" + 2 label="Manufacture of plastic packing goods" isic="2220" + 3 label="Manufacture of builders’ ware of plastic" isic="2220" + 9 label="Manufacture of other plastic products" isic="2220" +23 section="C" label="Manufacture of other non-metallic mineral products" isic="23" + 1 label="Manufacture of glass and glass products" isic="231" + 1 label="Manufacture of flat glass" isic="2310" + 2 label="Shaping and processing of flat glass" isic="2310" + 3 label="Manufacture of hollow glass" isic="2310" + 4 label="Manufacture of glass fibres" isic="2310" + 9 label="Manufacture and processing of other glass, including technical glassware" isic="2310" + 2 label="Manufacture of refractory products" isic="239" + 0 label="Manufacture of refractory products" isic="2391" + 3 label="Manufacture of clay building materials" isic="239" + 1 label="Manufacture of ceramic tiles and flags" isic="2392" + 2 label="Manufacture of bricks, tiles and construction products, in baked clay" isic="2392" + 4 label="Manufacture of other porcelain and ceramic products" isic="239" + 1 label="Manufacture of ceramic household and ornamental articles" isic="2393" + 2 label="Manufacture of ceramic sanitary fixtures" isic="2393" + 3 label="Manufacture of ceramic insulators and insulating fittings" isic="2393" + 4 label="Manufacture of other technical ceramic products" isic="2393" + 9 label="Manufacture of other ceramic products" isic="2393" + 5 label="Manufacture of cement, lime and plaster" isic="239" + 1 label="Manufacture of cement" isic="2394" + 2 label="Manufacture of lime and plaster" isic="2394" + 6 label="Manufacture of articles of concrete, cement and plaster" isic="239" + 1 label="Manufacture of concrete products for construction purposes" isic="2395" + 2 label="Manufacture of plaster products for construction purposes" isic="2395" + 3 label="Manufacture of ready-mixed concrete" isic="2395" + 4 label="Manufacture of mortars" isic="2395" + 5 label="Manufacture of fibre cement" isic="2395" + 9 label="Manufacture of other articles of concrete, plaster and cement" isic="2395" + 7 label="Cutting, shaping and finishing of stone" isic="239" + 0 label="Cutting, shaping and finishing of stone" isic="2396" + 9 label="Manufacture of abrasive products and non-metallic mineral products n.e.c." isic="239" + 1 label="Production of abrasive products" isic="2399" + 9 label="Manufacture of other non-metallic mineral products n.e.c." isic="2399" +24 section="C" label="Manufacture of basic metals" isic="24" + 1 label="Manufacture of basic iron and steel and of ferro-alloys" isic="241" + 0 label="Manufacture of basic iron and steel and of ferro-alloys " isic="2410" + 2 label="Manufacture of tubes, pipes, hollow profiles and related fittings, of steel" isic="241" + 0 label="Manufacture of tubes, pipes, hollow profiles and related fittings, of steel" isic="2410" + 3 label="Manufacture of other products of first processing of steel" isic="241" + 1 label="Cold drawing of bars" isic="2410" + 2 label="Cold rolling of narrow strip" isic="2410" + 3 label="Cold forming or folding" isic="2410" + 4 label="Cold drawing of wire" isic="2410" + 4 label="Manufacture of basic precious and other non-ferrous metals" isic="242" + 1 label="Precious metals production" isic="2420" + 2 label="Aluminium production" isic="2420" + 3 label="Lead, zinc and tin production" isic="2420" + 4 label="Copper production" isic="2420" + 5 label="Other non-ferrous metal production" isic="2420" + 6 label="Processing of nuclear fuel " isic="2420" + 5 label="Casting of metals" isic="243" + 1 label="Casting of iron" isic="2431" + 2 label="Casting of steel" isic="2431" + 3 label="Casting of light metals" isic="2432" + 4 label="Casting of other non-ferrous metals" isic="2432" +25 section="C" label="Manufacture of fabricated metal products, except machinery and equipment" isic="25" + 1 label="Manufacture of structural metal products" isic="251" + 1 label="Manufacture of metal structures and parts of structures" isic="2511" + 2 label="Manufacture of doors and windows of metal" isic="2511" + 2 label="Manufacture of tanks, reservoirs and containers of metal" isic="251" + 1 label="Manufacture of central heating radiators and boilers" isic="2512" + 9 label="Manufacture of other tanks, reservoirs and containers of metal" isic="2512" + 3 label="Manufacture of steam generators, except central heating hot water boilers" isic="251" + 0 label="Manufacture of steam generators, except central heating hot water boilers" isic="2513" + 4 label="Manufacture of weapons and ammunition" isic="252" + 0 label="Manufacture of weapons and ammunition" isic="2520" + 5 label="Forging, pressing, stamping and roll-forming of metal; powder metallurgy" isic="259" + 0 label="Forging, pressing, stamping and roll-forming of metal; powder metallurgy" isic="2591" + 6 label="Treatment and coating of metals; machining" isic="259" + 1 label="Treatment and coating of metals" isic="2592" + 2 label="Machining" isic="2592" + 7 label="Manufacture of cutlery, tools and general hardware" isic="259" + 1 label="Manufacture of cutlery" isic="2593" + 2 label="Manufacture of locks and hinges" isic="2593" + 3 label="Manufacture of tools" isic="2593" + 9 label="Manufacture of other fabricated metal products" isic="259" + 1 label="Manufacture of steel drums and similar containers" isic="2599" + 2 label="Manufacture of light metal packaging " isic="2599" + 3 label="Manufacture of wire products, chain and springs" isic="2599" + 4 label="Manufacture of fasteners and screw machine products" isic="2599" + 9 label="Manufacture of other fabricated metal products n.e.c." isic="2599" +26 section="C" label="Manufacture of computer, electronic and optical products" isic="26" + 1 label="Manufacture of electronic components and boards" isic="261" + 1 label="Manufacture of electronic components" isic="2610" + 2 label="Manufacture of loaded electronic boards" isic="2610" + 2 label="Manufacture of computers and peripheral equipment" isic="262" + 0 label="Manufacture of computers and peripheral equipment" isic="2620" + 3 label="Manufacture of communication equipment" isic="263" + 0 label="Manufacture of communication equipment" isic="2630" + 4 label="Manufacture of consumer electronics" isic="264" + 0 label="Manufacture of consumer electronics" isic="2640" + 5 label="Manufacture of instruments and appliances for measuring, testing and navigation; watches and clocks" isic="265" + 1 label="Manufacture of instruments and appliances for measuring, testing and navigation" isic="2651" + 2 label="Manufacture of watches and clocks" isic="2652" + 6 label="Manufacture of irradiation, electromedical and electrotherapeutic equipment" isic="266" + 0 label="Manufacture of irradiation, electromedical and electrotherapeutic equipment" isic="2660" + 7 label="Manufacture of optical instruments and photographic equipment" isic="267" + 0 label="Manufacture of optical instruments and photographic equipment" isic="2670" + 8 label="Manufacture of magnetic and optical media" isic="268" + 0 label="Manufacture of magnetic and optical media" isic="2680" +27 section="C" label="Manufacture of electrical equipment" isic="27" + 1 label="Manufacture of electric motors, generators, transformers and electricity distribution and control apparatus" isic="271" + 1 label="Manufacture of electric motors, generators and transformers" isic="2710" + 2 label="Manufacture of electricity distribution and control apparatus" isic="2710" + 2 label="Manufacture of batteries and accumulators" isic="272" + 0 label="Manufacture of batteries and accumulators" isic="2720" + 3 label="Manufacture of wiring and wiring devices" isic="273" + 1 label="Manufacture of fibre optic cables" isic="2731" + 2 label="Manufacture of other electronic and electric wires and cables" isic="2732" + 3 label="Manufacture of wiring devices" isic="2733" + 4 label="Manufacture of electric lighting equipment" isic="274" + 0 label="Manufacture of electric lighting equipment" isic="2740" + 5 label="Manufacture of domestic appliances" isic="275" + 1 label="Manufacture of electric domestic appliances" isic="2750" + 2 label="Manufacture of non-electric domestic appliances" isic="2750" + 9 label="Manufacture of other electrical equipment" isic="279" + 0 label="Manufacture of other electrical equipment" isic="2790" +28 section="C" label="Manufacture of machinery and equipment n.e.c." isic="28" + 1 label="Manufacture of general-purpose machinery" isic="281" + 1 label="Manufacture of engines and turbines, except aircraft, vehicle and cycle engines" isic="2811" + 2 label="Manufacture of fluid power equipment" isic="2812" + 3 label="Manufacture of other pumps and compressors" isic="2813" + 4 label="Manufacture of other taps and valves" isic="2813" + 5 label="Manufacture of bearings, gears, gearing and driving elements" isic="2814" + 2 label="Manufacture of other general-purpose machinery" isic="281" + 1 label="Manufacture of ovens, furnaces and furnace burners" isic="2815" + 2 label="Manufacture of lifting and handling equipment" isic="2816" + 3 label="Manufacture of office machinery and equipment (except computers and peripheral equipment)" isic="2817" + 4 label="Manufacture of power-driven hand tools" isic="2818" + 5 label="Manufacture of non-domestic cooling and ventilation equipment" isic="2819" + 9 label="Manufacture of other general-purpose machinery n.e.c." isic="2819" + 3 label="Manufacture of agricultural and forestry machinery" isic="282" + 0 label="Manufacture of agricultural and forestry machinery" isic="2821" + 4 label="Manufacture of metal forming machinery and machine tools" isic="282" + 1 label="Manufacture of metal forming machinery" isic="2822" + 9 label="Manufacture of other machine tools" isic="2822" + 9 label="Manufacture of other special-purpose machinery" isic="282" + 1 label="Manufacture of machinery for metallurgy" isic="2823" + 2 label="Manufacture of machinery for mining, quarrying and construction" isic="2824" + 3 label="Manufacture of machinery for food, beverage and tobacco processing" isic="2825" + 4 label="Manufacture of machinery for textile, apparel and leather production" isic="2826" + 5 label="Manufacture of machinery for paper and paperboard production" isic="2829" + 6 label="Manufacture of plastics and rubber machinery" isic="2829" + 9 label="Manufacture of other special-purpose machinery n.e.c." isic="2829" +29 section="C" label="Manufacture of motor vehicles, trailers and semi-trailers" isic="29" + 1 label="Manufacture of motor vehicles" isic="291" + 0 label="Manufacture of motor vehicles" isic="2910" + 2 label="Manufacture of bodies (coachwork) for motor vehicles; manufacture of trailers and semi-trailers" isic="292" + 0 label="Manufacture of bodies (coachwork) for motor vehicles; manufacture of trailers and semi-trailers" isic="2920" + 3 label="Manufacture of parts and accessories for motor vehicles" isic="293" + 1 label="Manufacture of electrical and electronic equipment for motor vehicles" isic="2930" + 2 label="Manufacture of other parts and accessories for motor vehicles" isic="2930" +30 section="C" label="Manufacture of other transport equipment" isic="30" + 1 label="Building of ships and boats" isic="301" + 1 label="Building of ships and floating structures" isic="3011" + 2 label="Building of pleasure and sporting boats" isic="3012" + 2 label="Manufacture of railway locomotives and rolling stock" isic="302" + 0 label="Manufacture of railway locomotives and rolling stock" isic="3020" + 3 label="Manufacture of air and spacecraft and related machinery" isic="303" + 0 label="Manufacture of air and spacecraft and related machinery" isic="3030" + 4 label="Manufacture of military fighting vehicles" isic="304" + 0 label="Manufacture of military fighting vehicles" isic="3040" + 9 label="Manufacture of transport equipment n.e.c." isic="309" + 1 label="Manufacture of motorcycles" isic="3091" + 2 label="Manufacture of bicycles and invalid carriages" isic="3092" + 9 label="Manufacture of other transport equipment n.e.c." isic="3099" +31 section="C" label="Manufacture of furniture" isic="31" + 0 label="Manufacture of furniture" isic="310" + 1 label="Manufacture of office and shop furniture" isic="3100" + 2 label="Manufacture of kitchen furniture" isic="3100" + 3 label="Manufacture of mattresses" isic="3100" + 9 label="Manufacture of other furniture" isic="3100" +32 section="C" label="Other manufacturing" isic="32" + 1 label="Manufacture of jewellery, bijouterie and related articles" isic="321" + 1 label="Striking of coins" isic="3211" + 2 label="Manufacture of jewellery and related articles" isic="3211" + 3 label="Manufacture of imitation jewellery and related articles" isic="3212" + 2 label="Manufacture of musical instruments" isic="322" + 0 label="Manufacture of musical instruments" isic="3220" + 3 label="Manufacture of sports goods" isic="323" + 0 label="Manufacture of sports goods" isic="3230" + 4 label="Manufacture of games and toys" isic="324" + 0 label="Manufacture of games and toys" isic="3240" + 5 label="Manufacture of medical and dental instruments and supplies" isic="325" + 0 label="Manufacture of medical and dental instruments and supplies" isic="3250" + 9 label="Manufacturing n.e.c." isic="329" + 1 label="Manufacture of brooms and brushes" isic="3290" + 9 label="Other manufacturing n.e.c. " isic="3290" +33 section="C" label="Repair and installation of machinery and equipment" isic="33" + 1 label="Repair of fabricated metal products, machinery and equipment" isic="331" + 1 label="Repair of fabricated metal products" isic="3311" + 2 label="Repair of machinery" isic="3312" + 3 label="Repair of electronic and optical equipment" isic="3313" + 4 label="Repair of electrical equipment" isic="3314" + 5 label="Repair and maintenance of ships and boats" isic="3315" + 6 label="Repair and maintenance of aircraft and spacecraft" isic="3315" + 7 label="Repair and maintenance of other transport equipment" isic="3315" + 9 label="Repair of other equipment" isic="3319" + 2 label="Installation of industrial machinery and equipment" isic="332" + 0 label="Installation of industrial machinery and equipment" isic="3320" +D label="ELECTRICITY, GAS, STEAM AND AIR CONDITIONING SUPPLY" isic="D" +35 section="D" label="Electricity, gas, steam and air conditioning supply" isic="35" + 1 label="Electric power generation, transmission and distribution" isic="351" + 1 label="Production of electricity" isic="3510" + 2 label="Transmission of electricity" isic="3510" + 3 label="Distribution of electricity" isic="3510" + 4 label="Trade of electricity" isic="3510" + 2 label="Manufacture of gas; distribution of gaseous fuels through mains" isic="352" + 1 label="Manufacture of gas" isic="3520" + 2 label="Distribution of gaseous fuels through mains" isic="3520" + 3 label="Trade of gas through mains" isic="3520" + 3 label="Steam and air conditioning supply" isic="353" + 0 label="Steam and air conditioning supply" isic="3530" +E label="WATER SUPPLY; SEWERAGE, WASTE MANAGEMENT AND REMEDIATION ACTIVITIES" isic="E" +36 section="E" label="Water collection, treatment and supply" isic="36" + 0 label="Water collection, treatment and supply" isic="360" + 0 label="Water collection, treatment and supply" isic="3600" +37 section="E" label="Sewerage" isic="37" + 0 label="Sewerage" isic="370" + 0 label="Sewerage" isic="3700" +38 section="E" label="Waste collection, treatment and disposal activities; materials recovery" isic="38" + 1 label="Waste collection" isic="381" + 1 label="Collection of non-hazardous waste" isic="3811" + 2 label="Collection of hazardous waste" isic="3812" + 2 label="Waste treatment and disposal" isic="382" + 1 label="Treatment and disposal of non-hazardous waste" isic="3821" + 2 label="Treatment and disposal of hazardous waste" isic="3822" + 3 label="Materials recovery" isic="383" + 1 label="Dismantling of wrecks" isic="3830" + 2 label="Recovery of sorted materials" isic="3830" +39 section="E" label="Remediation activities and other waste management services" isic="39" + 0 label="Remediation activities and other waste management services" isic="390" + 0 label="Remediation activities and other waste management services" isic="3900" +F label="CONSTRUCTION" isic="F" +41 section="F" label="Construction of buildings" isic="41" + 1 label="Development of building projects" isic="410" + 0 label="Development of building projects" isic="4100" + 2 label="Construction of residential and non-residential buildings" isic="410" + 0 label="Construction of residential and non-residential buildings" isic="4100" +42 section="F" label="Civil engineering" isic="42" + 1 label="Construction of roads and railways" isic="421" + 1 label="Construction of roads and motorways" isic="4210" + 2 label="Construction of railways and underground railways" isic="4210" + 3 label="Construction of bridges and tunnels" isic="4210" + 2 label="Construction of utility projects" isic="422" + 1 label="Construction of utility projects for fluids" isic="4220" + 2 label="Construction of utility projects for electricity and telecommunications" isic="4220" + 9 label="Construction of other civil engineering projects" isic="429" + 1 label="Construction of water projects" isic="4290" + 9 label="Construction of other civil engineering projects n.e.c." isic="4290" +43 section="F" label="Specialised construction activities" isic="43" + 1 label="Demolition and site preparation" isic="431" + 1 label="Demolition" isic="4311" + 2 label="Site preparation" isic="4312" + 3 label="Test drilling and boring" isic="4312" + 2 label="Electrical, plumbing and other construction installation activities" isic="432" + 1 label="Electrical installation" isic="4321" + 2 label="Plumbing, heat and air-conditioning installation" isic="4322" + 9 label="Other construction installation" isic="4329" + 3 label="Building completion and finishing" isic="433" + 1 label="Plastering" isic="4330" + 2 label="Joinery installation" isic="4330" + 3 label="Floor and wall covering" isic="4330" + 4 label="Painting and glazing" isic="4330" + 9 label="Other building completion and finishing" isic="4330" + 9 label="Other specialised construction activities" isic="439" + 1 label="Roofing activities" isic="4390" + 9 label="Other specialised construction activities n.e.c." isic="4390" +G label="WHOLESALE AND RETAIL TRADE; REPAIR OF MOTOR VEHICLES AND MOTORCYCLES" isic="G" +45 section="G" label="Wholesale and retail trade and repair of motor vehicles and motorcycles" isic="45" + 1 label="Sale of motor vehicles" isic="451" + 1 label="Sale of cars and light motor vehicles" isic="4510" + 9 label="Sale of other motor vehicles" isic="4510" + 2 label="Maintenance and repair of motor vehicles" isic="452" + 0 label="Maintenance and repair of motor vehicles" isic="4520" + 3 label="Sale of motor vehicle parts and accessories" isic="453" + 1 label="Wholesale trade of motor vehicle parts and accessories" isic="4530" + 2 label="Retail trade of motor vehicle parts and accessories" isic="4530" + 4 label="Sale, maintenance and repair of motorcycles and related parts and accessories" isic="454" + 0 label="Sale, maintenance and repair of motorcycles and related parts and accessories" isic="4540" +46 section="G" label="Wholesale trade, except of motor vehicles and motorcycles" isic="46" + 1 label="Wholesale on a fee or contract basis" isic="461" + 1 label="Agents involved in the sale of agricultural raw materials, live animals, textile raw materials and semi-finished goods" isic="4610" + 2 label="Agents involved in the sale of fuels, ores, metals and industrial chemicals" isic="4610" + 3 label="Agents involved in the sale of timber and building materials" isic="4610" + 4 label="Agents involved in the sale of machinery, industrial equipment, ships and aircraft" isic="4610" + 5 label="Agents involved in the sale of furniture, household goods, hardware and ironmongery" isic="4610" + 6 label="Agents involved in the sale of textiles, clothing, fur, footwear and leather goods" isic="4610" + 7 label="Agents involved in the sale of food, beverages and tobacco" isic="4610" + 8 label="Agents specialised in the sale of other particular products" isic="4610" + 9 label="Agents involved in the sale of a variety of goods" isic="4610" + 2 label="Wholesale of agricultural raw materials and live animals" isic="462" + 1 label="Wholesale of grain, unmanufactured tobacco, seeds and animal feeds" isic="4620" + 2 label="Wholesale of flowers and plants" isic="4620" + 3 label="Wholesale of live animals" isic="4620" + 4 label="Wholesale of hides, skins and leather" isic="4620" + 3 label="Wholesale of food, beverages and tobacco" isic="463" + 1 label="Wholesale of fruit and vegetables" isic="4630" + 2 label="Wholesale of meat and meat products" isic="4630" + 3 label="Wholesale of dairy products, eggs and edible oils and fats" isic="4630" + 4 label="Wholesale of beverages" isic="4630" + 5 label="Wholesale of tobacco products" isic="4630" + 6 label="Wholesale of sugar and chocolate and sugar confectionery" isic="4630" + 7 label="Wholesale of coffee, tea, cocoa and spices" isic="4630" + 8 label="Wholesale of other food, including fish, crustaceans and molluscs" isic="4630" + 9 label="Non-specialised wholesale of food, beverages and tobacco" isic="4630" + 4 label="Wholesale of household goods" isic="464" + 1 label="Wholesale of textiles" isic="4641" + 2 label="Wholesale of clothing and footwear" isic="4641" + 3 label="Wholesale of electrical household appliances" isic="4649" + 4 label="Wholesale of china and glassware and cleaning materials" isic="4649" + 5 label="Wholesale of perfume and cosmetics" isic="4649" + 6 label="Wholesale of pharmaceutical goods" isic="4649" + 7 label="Wholesale of furniture, carpets and lighting equipment" isic="4649" + 8 label="Wholesale of watches and jewellery" isic="4649" + 9 label="Wholesale of other household goods" isic="4649" + 5 label="Wholesale of information and communication equipment" isic="465" + 1 label="Wholesale of computers, computer peripheral equipment and software" isic="4651" + 2 label="Wholesale of electronic and telecommunications equipment and parts" isic="4652" + 6 label="Wholesale of other machinery, equipment and supplies" isic="466" + 1 label="Wholesale of agricultural machinery, equipment and supplies" isic="4653" + 2 label="Wholesale of machine tools" isic="4659" + 3 label="Wholesale of mining, construction and civil engineering machinery" isic="4659" + 4 label="Wholesale of machinery for the textile industry and of sewing and knitting machines" isic="4659" + 5 label="Wholesale of office furniture" isic="4659" + 6 label="Wholesale of other office machinery and equipment" isic="4659" + 9 label="Wholesale of other machinery and equipment" isic="4659" + 7 label="Other specialised wholesale" isic="466" + 1 label="Wholesale of solid, liquid and gaseous fuels and related products" isic="4661" + 2 label="Wholesale of metals and metal ores" isic="4662" + 3 label="Wholesale of wood, construction materials and sanitary equipment" isic="4663" + 4 label="Wholesale of hardware, plumbing and heating equipment and supplies" isic="4663" + 5 label="Wholesale of chemical products" isic="4669" + 6 label="Wholesale of other intermediate products" isic="4669" + 7 label="Wholesale of waste and scrap" isic="4669" + 9 label="Non-specialised wholesale trade" isic="469" + 0 label="Non-specialised wholesale trade" isic="4690" +47 section="G" label="Retail trade, except of motor vehicles and motorcycles" isic="47" + 1 label="Retail sale in non-specialised stores" isic="471" + 1 label="Retail sale in non-specialised stores with food, beverages or tobacco predominating" isic="4711" + 9 label="Other retail sale in non-specialised stores" isic="4719" + 2 label="Retail sale of food, beverages and tobacco in specialised stores" isic="472" + 1 label="Retail sale of fruit and vegetables in specialised stores" isic="4721" + 2 label="Retail sale of meat and meat products in specialised stores" isic="4721" + 3 label="Retail sale of fish, crustaceans and molluscs in specialised stores" isic="4721" + 4 label="Retail sale of bread, cakes, flour confectionery and sugar confectionery in specialised stores" isic="4721" + 5 label="Retail sale of beverages in specialised stores" isic="4722" + 6 label="Retail sale of tobacco products in specialised stores" isic="4723" + 9 label="Other retail sale of food in specialised stores" isic="4721" + 3 label="Retail sale of automotive fuel in specialised stores" isic="473" + 0 label="Retail sale of automotive fuel in specialised stores" isic="4730" + 4 label="Retail sale of information and communication equipment in specialised stores" isic="474" + 1 label="Retail sale of computers, peripheral units and software in specialised stores" isic="4741" + 2 label="Retail sale of telecommunications equipment in specialised stores" isic="4741" + 3 label="Retail sale of audio and video equipment in specialised stores" isic="4742" + 5 label="Retail sale of other household equipment in specialised stores" isic="475" + 1 label="Retail sale of textiles in specialised stores" isic="4751" + 2 label="Retail sale of hardware, paints and glass in specialised stores" isic="4752" + 3 label="Retail sale of carpets, rugs, wall and floor coverings in specialised stores" isic="4753" + 4 label="Retail sale of electrical household appliances in specialised stores" isic="4759" + 9 label="Retail sale of furniture, lighting equipment and other household articles in specialised stores" isic="4759" + 6 label="Retail sale of cultural and recreation goods in specialised stores" isic="476" + 1 label="Retail sale of books in specialised stores" isic="4761" + 2 label="Retail sale of newspapers and stationery in specialised stores" isic="4761" + 3 label="Retail sale of music and video recordings in specialised stores" isic="4762" + 4 label="Retail sale of sporting equipment in specialised stores" isic="4763" + 5 label="Retail sale of games and toys in specialised stores" isic="4764" + 7 label="Retail sale of other goods in specialised stores" isic="477" + 1 label="Retail sale of clothing in specialised stores" isic="4771" + 2 label="Retail sale of footwear and leather goods in specialised stores" isic="4771" + 3 label="Dispensing chemist in specialised stores" isic="4772" + 4 label="Retail sale of medical and orthopaedic goods in specialised stores" isic="4772" + 5 label="Retail sale of cosmetic and toilet articles in specialised stores" isic="4772" + 6 label="Retail sale of flowers, plants, seeds, fertilisers, pet animals and pet food in specialised stores" isic="4773" + 7 label="Retail sale of watches and jewellery in specialised stores" isic="4773" + 8 label="Other retail sale of new goods in specialised stores" isic="4773" + 9 label="Retail sale of second-hand goods in stores" isic="4774" + 8 label="Retail sale via stalls and markets" isic="478" + 1 label="Retail sale via stalls and markets of food, beverages and tobacco products" isic="4781" + 2 label="Retail sale via stalls and markets of textiles, clothing and footwear" isic="4782" + 9 label="Retail sale via stalls and markets of other goods" isic="4789" + 9 label="Retail trade not in stores, stalls or markets" isic="479" + 1 label="Retail sale via mail order houses or via Internet" isic="4791" + 9 label="Other retail sale not in stores, stalls or markets" isic="4799" +H label="TRANSPORTATION AND STORAGE" isic="H" +49 section="H" label="Land transport and transport via pipelines" isic="49" + 1 label="Passenger rail transport, interurban" isic="491" + 0 label="Passenger rail transport, interurban" isic="4911" + 2 label="Freight rail transport" isic="491" + 0 label="Freight rail transport" isic="4912" + 3 label="Other passenger land transport " isic="492" + 1 label="Urban and suburban passenger land transport" isic="4921" + 2 label="Taxi operation" isic="4922" + 9 label="Other passenger land transport n.e.c." isic="4922" + 4 label="Freight transport by road and removal services" isic="492" + 1 label="Freight transport by road" isic="4923" + 2 label="Removal services" isic="4923" + 5 label="Transport via pipeline" isic="493" + 0 label="Transport via pipeline" isic="4930" +50 section="H" label="Water transport" isic="50" + 1 label="Sea and coastal passenger water transport" isic="501" + 0 label="Sea and coastal passenger water transport" isic="5011" + 2 label="Sea and coastal freight water transport" isic="501" + 0 label="Sea and coastal freight water transport" isic="5012" + 3 label="Inland passenger water transport" isic="502" + 0 label="Inland passenger water transport" isic="5021" + 4 label="Inland freight water transport" isic="502" + 0 label="Inland freight water transport" isic="5022" +51 section="H" label="Air transport" isic="51" + 1 label="Passenger air transport" isic="511" + 0 label="Passenger air transport" isic="5110" + 2 label="Freight air transport and space transport" isic="512" + 1 label="Freight air transport" isic="5120" + 2 label="Space transport" isic="5120" +52 section="H" label="Warehousing and support activities for transportation" isic="52" + 1 label="Warehousing and storage" isic="521" + 0 label="Warehousing and storage" isic="5210" + 2 label="Support activities for transportation" isic="522" + 1 label="Service activities incidental to land transportation" isic="5221" + 2 label="Service activities incidental to water transportation" isic="5222" + 3 label="Service activities incidental to air transportation" isic="5223" + 4 label="Cargo handling" isic="5224" + 9 label="Other transportation support activities " isic="5229" +53 section="H" label="Postal and courier activities" isic="53" + 1 label="Postal activities under universal service obligation" isic="531" + 0 label="Postal activities under universal service obligation" isic="5310" + 2 label="Other postal and courier activities" isic="532" + 0 label="Other postal and courier activities" isic="5320" +I label="ACCOMMODATION AND FOOD SERVICE ACTIVITIES" isic="I" +55 section="I" label="Accommodation" isic="55" + 1 label="Hotels and similar accommodation" isic="551" + 0 label="Hotels and similar accommodation" isic="5510" + 2 label="Holiday and other short-stay accommodation" isic="551" + 0 label="Holiday and other short-stay accommodation" isic="5510" + 3 label="Camping grounds, recreational vehicle parks and trailer parks" isic="552" + 0 label="Camping grounds, recreational vehicle parks and trailer parks" isic="5520" + 9 label="Other accommodation" isic="559" + 0 label="Other accommodation" isic="5590" +56 section="I" label="Food and beverage service activities" isic="56" + 1 label="Restaurants and mobile food service activities" isic="561" + 0 label="Restaurants and mobile food service activities" isic="5610" + 2 label="Event catering and other food service activities" isic="562" + 1 label="Event catering activities" isic="5621" + 9 label="Other food service activities" isic="5629" + 3 label="Beverage serving activities" isic="563" + 0 label="Beverage serving activities" isic="5630" +J label="INFORMATION AND COMMUNICATION" isic="J" +58 section="J" label="Publishing activities" isic="58" + 1 label="Publishing of books, periodicals and other publishing activities" isic="581" + 1 label="Book publishing" isic="5811" + 2 label="Publishing of directories and mailing lists" isic="5812" + 3 label="Publishing of newspapers" isic="5813" + 4 label="Publishing of journals and periodicals" isic="5813" + 9 label="Other publishing activities" isic="5819" + 2 label="Software publishing" isic="582" + 1 label="Publishing of computer games" isic="5820" + 9 label="Other software publishing" isic="5820" +59 section="J" label="Motion picture, video and television programme production, sound recording and music publishing activities" isic="59" + 1 label="Motion picture, video and television programme activities" isic="591" + 1 label="Motion picture, video and television programme production activities" isic="5911" + 2 label="Motion picture, video and television programme post-production activities" isic="5912" + 3 label="Motion picture, video and television programme distribution activities" isic="5913" + 4 label="Motion picture projection activities" isic="5914" + 2 label="Sound recording and music publishing activities" isic="592" + 0 label="Sound recording and music publishing activities" isic="5920" +60 section="J" label="Programming and broadcasting activities" isic="60" + 1 label="Radio broadcasting" isic="601" + 0 label="Radio broadcasting" isic="6010" + 2 label="Television programming and broadcasting activities" isic="602" + 0 label="Television programming and broadcasting activities" isic="6020" +61 section="J" label="Telecommunications" isic="61" + 1 label="Wired telecommunications activities" isic="611" + 0 label="Wired telecommunications activities" isic="6110" + 2 label="Wireless telecommunications activities" isic="612" + 0 label="Wireless telecommunications activities" isic="6120" + 3 label="Satellite telecommunications activities" isic="613" + 0 label="Satellite telecommunications activities" isic="6130" + 9 label="Other telecommunications activities" isic="619" + 0 label="Other telecommunications activities" isic="6190" +62 section="J" label="Computer programming, consultancy and related activities" isic="62" + 0 label="Computer programming, consultancy and related activities" isic="620" + 1 label="Computer programming activities" isic="6201" + 2 label="Computer consultancy activities" isic="6202" + 3 label="Computer facilities management activities" isic="6202" + 9 label="Other information technology and computer service activities" isic="6209" +63 section="J" label="Information service activities" isic="63" + 1 label="Data processing, hosting and related activities; web portals" isic="631" + 1 label="Data processing, hosting and related activities" isic="6311" + 2 label="Web portals" isic="6312" + 9 label="Other information service activities" isic="639" + 1 label="News agency activities" isic="6391" + 9 label="Other information service activities n.e.c." isic="6399" +K label="FINANCIAL AND INSURANCE ACTIVITIES" isic="K" +64 section="K" label="Financial service activities, except insurance and pension funding" isic="64" + 1 label="Monetary intermediation" isic="641" + 1 label="Central banking" isic="6411" + 9 label="Other monetary intermediation" isic="6419" + 2 label="Activities of holding companies" isic="642" + 0 label="Activities of holding companies" isic="6420" + 3 label="Trusts, funds and similar financial entities" isic="643" + 0 label="Trusts, funds and similar financial entities" isic="6430" + 9 label="Other financial service activities, except insurance and pension funding" isic="649" + 1 label="Financial leasing" isic="6491" + 2 label="Other credit granting" isic="6492" + 9 label="Other financial service activities, except insurance and pension funding n.e.c." isic="6499" +65 section="K" label="Insurance, reinsurance and pension funding, except compulsory social security" isic="65" + 1 label="Insurance" isic="651" + 1 label="Life insurance" isic="6511" + 2 label="Non-life insurance" isic="6512" + 2 label="Reinsurance" isic="652" + 0 label="Reinsurance" isic="6520" + 3 label="Pension funding" isic="653" + 0 label="Pension funding" isic="6530" +66 section="K" label="Activities auxiliary to financial services and insurance activities" isic="66" + 1 label="Activities auxiliary to financial services, except insurance and pension funding" isic="661" + 1 label="Administration of financial markets" isic="6611" + 2 label="Security and commodity contracts brokerage" isic="6612" + 9 label="Other activities auxiliary to financial services, except insurance and pension funding" isic="6619" + 2 label="Activities auxiliary to insurance and pension funding" isic="662" + 1 label="Risk and damage evaluation" isic="6621" + 2 label="Activities of insurance agents and brokers" isic="6622" + 9 label="Other activities auxiliary to insurance and pension funding" isic="6629" + 3 label="Fund management activities" isic="663" + 0 label="Fund management activities" isic="6630" +L label="REAL ESTATE ACTIVITIES" isic="L" +68 section="L" label="Real estate activities" isic="68" + 1 label="Buying and selling of own real estate" isic="681" + 0 label="Buying and selling of own real estate" isic="6810" + 2 label="Rental and operating of own or leased real estate" isic="681" + 0 label="Rental and operating of own or leased real estate" isic="6810" + 3 label="Real estate activities on a fee or contract basis" isic="682" + 1 label="Real estate agencies" isic="6820" + 2 label="Management of real estate on a fee or contract basis" isic="6820" +M label="PROFESSIONAL, SCIENTIFIC AND TECHNICAL ACTIVITIES" isic="M" +69 section="M" label="Legal and accounting activities" isic="69" + 1 label="Legal activities" isic="691" + 0 label="Legal activities" isic="6910" + 2 label="Accounting, bookkeeping and auditing activities; tax consultancy" isic="692" + 0 label="Accounting, bookkeeping and auditing activities; tax consultancy" isic="6920" +70 section="M" label="Activities of head offices; management consultancy activities" isic="70" + 1 label="Activities of head offices" isic="701" + 0 label="Activities of head offices" isic="7010" + 2 label="Management consultancy activities" isic="702" + 1 label="Public relations and communication activities" isic="7020" + 2 label="Business and other management consultancy activities" isic="7020" +71 section="M" label="Architectural and engineering activities; technical testing and analysis" isic="71" + 1 label="Architectural and engineering activities and related technical consultancy" isic="711" + 1 label="Architectural activities " isic="7110" + 2 label="Engineering activities and related technical consultancy" isic="7110" + 2 label="Technical testing and analysis" isic="712" + 0 label="Technical testing and analysis" isic="7120" +72 section="M" label="Scientific research and development " isic="72" + 1 label="Research and experimental development on natural sciences and engineering" isic="721" + 1 label="Research and experimental development on biotechnology" isic="7210" + 9 label="Other research and experimental development on natural sciences and engineering" isic="7210" + 2 label="Research and experimental development on social sciences and humanities" isic="722" + 0 label="Research and experimental development on social sciences and humanities" isic="7220" +73 section="M" label="Advertising and market research" isic="73" + 1 label="Advertising" isic="731" + 1 label="Advertising agencies" isic="7310" + 2 label="Media representation" isic="7310" + 2 label="Market research and public opinion polling" isic="732" + 0 label="Market research and public opinion polling" isic="7320" +74 section="M" label="Other professional, scientific and technical activities" isic="74" + 1 label="Specialised design activities" isic="741" + 0 label="Specialised design activities" isic="7410" + 2 label="Photographic activities" isic="742" + 0 label="Photographic activities" isic="7420" + 3 label="Translation and interpretation activities" isic="749" + 0 label="Translation and interpretation activities" isic="7490" + 9 label="Other professional, scientific and technical activities n.e.c." isic="749" + 0 label="Other professional, scientific and technical activities n.e.c." isic="7490" +75 section="M" label="Veterinary activities" isic="75" + 0 label="Veterinary activities" isic="750" + 0 label="Veterinary activities" isic="7500" +N label="ADMINISTRATIVE AND SUPPORT SERVICE ACTIVITIES" isic="N" +77 section="N" label="Rental and leasing activities" isic="77" + 1 label="Rental and leasing of motor vehicles" isic="771" + 1 label="Rental and leasing of cars and light motor vehicles" isic="7710" + 2 label="Rental and leasing of trucks" isic="7710" + 2 label="Rental and leasing of personal and household goods" isic="772" + 1 label="Rental and leasing of recreational and sports goods" isic="7721" + 2 label="Rental of video tapes and disks" isic="7722" + 9 label="Rental and leasing of other personal and household goods" isic="7729" + 3 label="Rental and leasing of other machinery, equipment and tangible goods" isic="773" + 1 label="Rental and leasing of agricultural machinery and equipment" isic="7730" + 2 label="Rental and leasing of construction and civil engineering machinery and equipment" isic="7730" + 3 label="Rental and leasing of office machinery and equipment (including computers)" isic="7730" + 4 label="Rental and leasing of water transport equipment" isic="7730" + 5 label="Rental and leasing of air transport equipment" isic="7730" + 9 label="Rental and leasing of other machinery, equipment and tangible goods n.e.c." isic="7730" + 4 label="Leasing of intellectual property and similar products, except copyrighted works" isic="774" + 0 label="Leasing of intellectual property and similar products, except copyrighted works" isic="7740" +78 section="N" label="Employment activities" isic="78" + 1 label="Activities of employment placement agencies" isic="781" + 0 label="Activities of employment placement agencies" isic="7810" + 2 label="Temporary employment agency activities" isic="782" + 0 label="Temporary employment agency activities" isic="7820" + 3 label="Other human resources provision" isic="783" + 0 label="Other human resources provision" isic="7830" +79 section="N" label="Travel agency, tour operator and other reservation service and related activities" isic="79" + 1 label="Travel agency and tour operator activities" isic="791" + 1 label="Travel agency activities" isic="7911" + 2 label="Tour operator activities" isic="7912" + 9 label="Other reservation service and related activities" isic="799" + 0 label="Other reservation service and related activities" isic="7990" +80 section="N" label="Security and investigation activities" isic="80" + 1 label="Private security activities" isic="801" + 0 label="Private security activities" isic="8010" + 2 label="Security systems service activities" isic="802" + 0 label="Security systems service activities" isic="8020" + 3 label="Investigation activities" isic="803" + 0 label="Investigation activities" isic="8030" +81 section="N" label="Services to buildings and landscape activities" isic="81" + 1 label="Combined facilities support activities" isic="811" + 0 label="Combined facilities support activities" isic="8110" + 2 label="Cleaning activities" isic="812" + 1 label="General cleaning of buildings" isic="8121" + 2 label="Other building and industrial cleaning activities" isic="8129" + 9 label="Other cleaning activities" isic="8129" + 3 label="Landscape service activities" isic="813" + 0 label="Landscape service activities" isic="8130" +82 section="N" label="Office administrative, office support and other business support activities" isic="82" + 1 label="Office administrative and support activities" isic="821" + 1 label="Combined office administrative service activities" isic="8211" + 9 label="Photocopying, document preparation and other specialised office support activities" isic="8219" + 2 label="Activities of call centres" isic="822" + 0 label="Activities of call centres" isic="8220" + 3 label="Organisation of conventions and trade shows" isic="823" + 0 label="Organisation of conventions and trade shows" isic="8230" + 9 label="Business support service activities n.e.c." isic="829" + 1 label="Activities of collection agencies and credit bureaus" isic="8291" + 2 label="Packaging activities" isic="8292" + 9 label="Other business support service activities n.e.c." isic="8299" +O label="PUBLIC ADMINISTRATION AND DEFENCE; COMPULSORY SOCIAL SECURITY" isic="O" +84 section="O" label="Public administration and defence; compulsory social security" isic="84" + 1 label="Administration of the State and the economic and social policy of the community" isic="841" + 1 label="General public administration activities" isic="8411" + 2 label="Regulation of the activities of providing health care, education, cultural services and other social services, excluding social security" isic="8412" + 3 label="Regulation of and contribution to more efficient operation of businesses" isic="8413" + 2 label="Provision of services to the community as a whole" isic="842" + 1 label="Foreign affairs" isic="8421" + 2 label="Defence activities" isic="8422" + 3 label="Justice and judicial activities" isic="8423" + 4 label="Public order and safety activities" isic="8423" + 5 label="Fire service activities" isic="8423" + 3 label="Compulsory social security activities" isic="843" + 0 label="Compulsory social security activities" isic="8430" +P label="EDUCATION" isic="P" +85 section="P" label="Education" isic="85" + 1 label="Pre-primary education" isic="851" + 0 label="Pre-primary education " isic="8510" + 2 label="Primary education" isic="851" + 0 label="Primary education " isic="8510" + 3 label="Secondary education" isic="852" + 1 label="General secondary education " isic="8521" + 2 label="Technical and vocational secondary education " isic="8522" + 4 label="Higher education" isic="853" + 1 label="Post-secondary non-tertiary education" isic="8530" + 2 label="Tertiary education" isic="8530" + 5 label="Other education" isic="854" + 1 label="Sports and recreation education" isic="8541" + 2 label="Cultural education" isic="8542" + 3 label="Driving school activities" isic="8549" + 9 label="Other education n.e.c." isic="8549" + 6 label="Educational support activities" isic="855" + 0 label="Educational support activities" isic="8550" +Q label="HUMAN HEALTH AND SOCIAL WORK ACTIVITIES" isic="Q" +86 section="Q" label="Human health activities" isic="86" + 1 label="Hospital activities" isic="861" + 0 label="Hospital activities" isic="8610" + 2 label="Medical and dental practice activities" isic="862" + 1 label="General medical practice activities" isic="8620" + 2 label="Specialist medical practice activities" isic="8620" + 3 label="Dental practice activities" isic="8620" + 9 label="Other human health activities" isic="869" + 0 label="Other human health activities" isic="8690" +87 section="Q" label="Residential care activities" isic="87" + 1 label="Residential nursing care activities" isic="871" + 0 label="Residential nursing care activities" isic="8710" + 2 label="Residential care activities for mental retardation, mental health and substance abuse" isic="872" + 0 label="Residential care activities for mental retardation, mental health and substance abuse" isic="8720" + 3 label="Residential care activities for the elderly and disabled" isic="873" + 0 label="Residential care activities for the elderly and disabled" isic="8730" + 9 label="Other residential care activities" isic="879" + 0 label="Other residential care activities" isic="8790" +88 section="Q" label="Social work activities without accommodation" isic="88" + 1 label="Social work activities without accommodation for the elderly and disabled" isic="881" + 0 label="Social work activities without accommodation for the elderly and disabled" isic="8810" + 9 label="Other social work activities without accommodation" isic="889" + 1 label="Child day-care activities" isic="8890" + 9 label="Other social work activities without accommodation n.e.c." isic="8890" +R label="ARTS, ENTERTAINMENT AND RECREATION" isic="R" +90 section="R" label="Creative, arts and entertainment activities" isic="90" + 0 label="Creative, arts and entertainment activities" isic="900" + 1 label="Performing arts" isic="9000" + 2 label="Support activities to performing arts" isic="9000" + 3 label="Artistic creation" isic="9000" + 4 label="Operation of arts facilities" isic="9000" +91 section="R" label="Libraries, archives, museums and other cultural activities" isic="91" + 0 label="Libraries, archives, museums and other cultural activities" isic="910" + 1 label="Library and archives activities" isic="9101" + 2 label="Museums activities" isic="9102" + 3 label="Operation of historical sites and buildings and similar visitor attractions" isic="9102" + 4 label="Botanical and zoological gardens and nature reserves activities" isic="9103" +92 section="R" label="Gambling and betting activities" isic="92" + 0 label="Gambling and betting activities" isic="920" + 0 label="Gambling and betting activities" isic="9200" +93 section="R" label="Sports activities and amusement and recreation activities" isic="93" + 1 label="Sports activities" isic="931" + 1 label="Operation of sports facilities" isic="9311" + 2 label="Activities of sports clubs" isic="9312" + 3 label="Fitness facilities" isic="9311" + 9 label="Other sports activities" isic="9319" + 2 label="Amusement and recreation activities" isic="932" + 1 label="Activities of amusement parks and theme parks" isic="9321" + 9 label="Other amusement and recreation activities" isic="9329" +S label="OTHER SERVICE ACTIVITIES" isic="S" +94 section="S" label="Activities of membership organisations" isic="94" + 1 label="Activities of business, employers and professional membership organisations" isic="941" + 1 label="Activities of business and employers membership organisations" isic="9411" + 2 label="Activities of professional membership organisations" isic="9412" + 2 label="Activities of trade unions" isic="942" + 0 label="Activities of trade unions" isic="9420" + 9 label="Activities of other membership organisations" isic="949" + 1 label="Activities of religious organisations" isic="9491" + 2 label="Activities of political organisations" isic="9492" + 9 label="Activities of other membership organisations n.e.c." isic="9499" +95 section="S" label="Repair of computers and personal and household goods" isic="95" + 1 label="Repair of computers and communication equipment" isic="951" + 1 label="Repair of computers and peripheral equipment" isic="9511" + 2 label="Repair of communication equipment" isic="9512" + 2 label="Repair of personal and household goods" isic="952" + 1 label="Repair of consumer electronics" isic="9521" + 2 label="Repair of household appliances and home and garden equipment" isic="9522" + 3 label="Repair of footwear and leather goods" isic="9523" + 4 label="Repair of furniture and home furnishings" isic="9524" + 5 label="Repair of watches, clocks and jewellery" isic="9529" + 9 label="Repair of other personal and household goods" isic="9529" +96 section="S" label="Other personal service activities" isic="96" + 0 label="Other personal service activities" isic="960" + 1 label="Washing and (dry-)cleaning of textile and fur products" isic="9601" + 2 label="Hairdressing and other beauty treatment" isic="9602" + 3 label="Funeral and related activities" isic="9603" + 4 label="Physical well-being activities" isic="9609" + 9 label="Other personal service activities n.e.c." isic="9609" +T label="ACTIVITIES OF HOUSEHOLDS AS EMPLOYERS; UNDIFFERENTIATED GOODS- AND SERVICES-PRODUCING ACTIVITIES OF HOUSEHOLDS FOR OWN USE" isic="T" +97 section="T" label="Activities of households as employers of domestic personnel" isic="97" + 0 label="Activities of households as employers of domestic personnel" isic="970" + 0 label="Activities of households as employers of domestic personnel" isic="9700" +98 section="T" label="Undifferentiated goods- and services-producing activities of private households for own use" isic="98" + 1 label="Undifferentiated goods-producing activities of private households for own use" isic="981" + 0 label="Undifferentiated goods-producing activities of private households for own use" isic="9810" + 2 label="Undifferentiated service-producing activities of private households for own use" isic="982" + 0 label="Undifferentiated service-producing activities of private households for own use" isic="9820" +U label="ACTIVITIES OF EXTRATERRITORIAL ORGANISATIONS AND BODIES" isic="U" +99 section="U" label="Activities of extraterritorial organisations and bodies" isic="99" + 0 label="Activities of extraterritorial organisations and bodies" isic="990" + 0 label="Activities of extraterritorial organisations and bodies" isic="9900" diff --git a/stdnum/eu/nace.py b/stdnum/eu/nace.py new file mode 100644 index 00000000..344629ce --- /dev/null +++ b/stdnum/eu/nace.py @@ -0,0 +1,109 @@ +# nace.py - functions for handling EU NACE classification +# coding: utf-8 +# +# Copyright (C) 2017 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""NACE (classification for businesses in the European Union). + +The NACE (nomenclature statistique des activités économiques dans la +Communauté européenne) is a 4-level (and up to 4 digit) code for classifying +economic activities. It is the European implementation of the UN +classification ISIC. + +The first 4 digits are the same in all EU countries while additional levels +and digits may be vary between countries. This module validates the numbers +according to revision 2 and based on the registry as published by the EC. + +More information: + +* https://en.wikipedia.org/wiki/Statistical_Classification_of_Economic_Activities_in_the_European_Community +* http://ec.europa.eu/eurostat/ramon/nomenclatures/index.cfm?TargetUrl=LST_NOM_DTL&StrNom=NACE_REV2&StrLanguageCode=EN&IntPcKey=&StrLayoutCode=HIERARCHIC + +>>> validate('A') +'A' +>>> validate('62.01') +'6201' +>>> str(label('62.01')) +'Computer programming activities' +>>> validate('62.05') +Traceback (most recent call last): + ... +InvalidComponent: ... +>>> validate('62059') # does not validate country-specific numbers +Traceback (most recent call last): + ... +InvalidLength: ... +>>> format('6201') +'62.01' +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, '.').strip() + + +def info(number): + """Lookup information about the specified NACE. This returns a dict.""" + number = compact(number) + from stdnum import numdb + info = dict() + for n, i in numdb.get('eu/nace').info(number): + if not i: + raise InvalidComponent() + info.update(i) + return info + + +def label(number): + """Lookup the category label for the number.""" + return info(number)['label'] + + +def validate(number): + """Checks to see if the number provided is a valid NACE. This checks the + format and searches the registry to see if it exists.""" + number = compact(number) + if len(number) > 4: + raise InvalidLength() + elif len(number) == 1: + if not number.isalpha(): + raise InvalidFormat() + else: + if not number.isdigit(): + raise InvalidFormat() + info(number) + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid NACE. This checks the + format and searches the registry to see if it exists.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number): + """Reformat the passed number to the standard format.""" + return '.'.join((number[:2], number[2:])).strip('.') diff --git a/tests/test_robustness.doctest b/tests/test_robustness.doctest index 8e2c4be2..8ce1f355 100644 --- a/tests/test_robustness.doctest +++ b/tests/test_robustness.doctest @@ -1,6 +1,6 @@ test_robustness.doctest - test is_valid() functions to not break -Copyright (C) 2011-2016 Arthur de Jong +Copyright (C) 2011-2017 Arthur de Jong This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,7 +22,7 @@ This file contains some tests for modules in the stdnum package to check whether all provided is_valid() functions can handle clearly invalid junk. ->>> testvalues = (None, '*&^%$', '', 0, False, object(), 'Q', 'QQ', '3') +>>> testvalues = (None, '*&^%$', '', 0, False, object(), 'Z', 'QQ', '3') >>> from stdnum.util import get_number_modules Go over each module and try every value. From d43c394049e52e474575948b94ab52ee8567fd44 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 26 Mar 2017 23:27:42 +0200 Subject: [PATCH 063/572] =?UTF-8?q?Add=20test=20for=20=C3=91=20in=20Refere?= =?UTF-8?q?ncia=20Catastral?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This supports the Referencia Catastral with an Ñ in it for both byte strings (Python 2) and unicode strings (Python 2 and 3). Support for literal unicode strings in Python 2 doctests is flaky so the test is a bit ugly. This also adds a few numbers that were found online. Sadly no real numbers with an Ñ in it have been found so the one in the test was constructed. --- stdnum/es/referenciacatastral.py | 17 ++++++++++++---- tests/test_es_referenciacatastral.doctest | 24 ++++++++++++++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/stdnum/es/referenciacatastral.py b/stdnum/es/referenciacatastral.py index fefb1081..b9882cfd 100644 --- a/stdnum/es/referenciacatastral.py +++ b/stdnum/es/referenciacatastral.py @@ -2,7 +2,7 @@ # coding: utf-8 # # Copyright (C) 2016 David García Garzón -# Copyright (C) 2016 Arthur de Jong +# Copyright (C) 2016-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -90,8 +90,16 @@ def _check_digit(number): return 'MQWERTYUIOPASDFGHJKLBZX'[s % 23] +def _force_unicode(number): + """Convert the number to unicode.""" + if not hasattr(number, 'isnumeric'): # pragma: no cover (Python 2 code) + number = number.decode('utf-8') + return number + + def calc_check_digits(number): """Calculate the check digits for the number.""" + number = _force_unicode(compact(number)) return ( _check_digit(number[0:7] + number[14:18]) + _check_digit(number[7:14] + number[14:18])) @@ -101,11 +109,12 @@ def validate(number): """Checks to see if the number provided is a valid Cadastral Reference. This checks the length, formatting and check digits.""" number = compact(number) - if not all(c in alphabet for c in number): + n = _force_unicode(number) + if not all(c in alphabet for c in n): raise InvalidFormat() - if len(number) != 20: + if len(n) != 20: raise InvalidLength() - if calc_check_digits(number) != number[18:]: + if calc_check_digits(n) != n[18:]: raise InvalidChecksum() return number diff --git a/tests/test_es_referenciacatastral.doctest b/tests/test_es_referenciacatastral.doctest index f175d1c9..94610ee8 100644 --- a/tests/test_es_referenciacatastral.doctest +++ b/tests/test_es_referenciacatastral.doctest @@ -1,7 +1,7 @@ test_es_referenciacatastral.doctest - more detailed doctests Copyright (C) 2016 David García Garzón -Copyright (C) 2015 Arthur de Jong +Copyright (C) 2015-2017 Arthur de Jong This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -72,6 +72,19 @@ An online validator can be found at https://www1.sedecatastro.gob.es/CYCBienInmueble/OVCBusqueda.aspx +This is a constructed example of a Referencia Catastral with an Ñ in it. It +seems that unicode literals do not work so we are escaping Ñ. + +>>> referenciacatastral.calc_check_digits('9872023 ÑH5797S 0001') +'WP' +>>> referenciacatastral.calc_check_digits(u'9872023 \xd1H5797S 0001') +'WP' +>>> referenciacatastral.validate('9872023 ÑH5797S 0001 WP') == '9872023ÑH5797S0001WP' +True +>>> referenciacatastral.validate(u'9872023 \xd1H5797S 0001 WP') == u'9872023\xd1H5797S0001WP' +True + + These have been found online and should all be valid numbers. >>> numbers = ''' @@ -147,6 +160,9 @@ These have been found online and should all be valid numbers. ... 1344504PD5614S0001XE ... 1468103QC6316N0001PQ ... 1470436TJ5117S0001EP +... 15001A005004610000JK +... 15001A005004620000JR +... 15037A024005060000PX ... 1665311QC6316S0001OO ... 1811701QC3711S0001RM ... 1927510QD2812N0001GJ @@ -178,6 +194,8 @@ These have been found online and should all be valid numbers. ... 3065602TH8836N0001KA ... 3117006QC3731N0001KM ... 3135901PD7033E0001MF +... 3174922NH0737S0011QS +... 3174932NH0737S0001AT ... 3178101UJ2337N0001IB ... 3327002TJ6332N0001QH ... 3368022PE8136N0001LJ @@ -193,6 +211,7 @@ These have been found online and should all be valid numbers. ... 4637801TK6843N0001WI ... 4878424TK6347N0001GT ... 4926002QE4142N0001UP +... 50210A003001510000LT ... 5034623PC6853S0001MO ... 5078102VK8957N0001TB ... 5172401PD7057A0001HI @@ -236,6 +255,7 @@ These have been found online and should all be valid numbers. ... 6795121QD0069N0008EU ... 6821105TK5662S0001QI ... 6822811QD2162S0001GP +... 6837203FT3063N0001YP ... 6893505QC5569S0001LO ... 6991224PD3869S0001FW ... 7076102TJ5177N0001ZE @@ -247,6 +267,7 @@ These have been found online and should all be valid numbers. ... 7384201TJ5178S0019OB ... 7384201TJ5178S0043QS ... 7479113QE2477N0001UY +... 7499524NH0179N0001RJ ... 7570012TJ4377S0001PO ... 7640222QE4374B0001FR ... 7682601TJ5178S0001XT @@ -259,6 +280,7 @@ These have been found online and should all be valid numbers. ... 8344202PC6684S0001FT ... 8354003PD7085C0001RR ... 8384416TJ8688S0001IQ +... 8579507NH0387N0001QB ... 8645036TJ5984N0001TL ... 8670604TJ4587S0004BE ... 8679007TJ5187N0001LU From 194f02576de66a1cdd47f57081fb0a24519cc91a Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sun, 26 Mar 2017 23:32:17 +0200 Subject: [PATCH 064/572] Add unicode robustness tests This tests a few unicode strings and fixes a bug in the MEID module. --- stdnum/meid.py | 4 ++-- tests/test_robustness.doctest | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/stdnum/meid.py b/stdnum/meid.py index be52fbdb..30777538 100644 --- a/stdnum/meid.py +++ b/stdnum/meid.py @@ -1,6 +1,6 @@ # meid.py - functions for handling Mobile Equipment Identifiers (MEIDs) # -# Copyright (C) 2010-2016 Arthur de Jong +# Copyright (C) 2010-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -48,7 +48,7 @@ def _cleanup(number): """Remove any grouping information from the number and removes surrounding whitespace.""" - return clean(str(number), ' -').strip().upper() + return clean(number, ' -').strip().upper() def _ishex(number): diff --git a/tests/test_robustness.doctest b/tests/test_robustness.doctest index 8ce1f355..b4ba36ad 100644 --- a/tests/test_robustness.doctest +++ b/tests/test_robustness.doctest @@ -22,7 +22,9 @@ This file contains some tests for modules in the stdnum package to check whether all provided is_valid() functions can handle clearly invalid junk. ->>> testvalues = (None, '*&^%$', '', 0, False, object(), 'Z', 'QQ', '3') +>>> testvalues = ( +... None, '*&^%$', '', 0, False, object(), 'Z', 'QQ', '3', '€', u'€', +... '😴', '¥') >>> from stdnum.util import get_number_modules Go over each module and try every value. From 23b2150c6ceee574207e0c5e5b19d2f95fbd9828 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Sat, 1 Apr 2017 16:40:08 +0200 Subject: [PATCH 065/572] Add European EIC (Energy Identification Code) --- stdnum/eu/eic.py | 88 ++++++++++++++++++++++++++++ tests/test_eu_eic.doctest | 118 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 stdnum/eu/eic.py create mode 100644 tests/test_eu_eic.doctest diff --git a/stdnum/eu/eic.py b/stdnum/eu/eic.py new file mode 100644 index 00000000..88d28e05 --- /dev/null +++ b/stdnum/eu/eic.py @@ -0,0 +1,88 @@ +# eic.py - functions for handling EU EIC numbers +# coding: utf-8 +# +# Copyright (C) 2017 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""EIC (European Energy Identification Code). + +The EIC (Energy Identification Code) a 16 character code used in Europe to +uniquely identify entities and objects in the electricity and gas sector. + +The number uses letters, digits and the minus sign. The first 2 character +identify the issuing office, 1 character for the object type, 12 digits for +the object and 1 check character. + +More information: + +* https://en.wikipedia.org/wiki/Energy_Identification_Code +* http://www.eiccodes.eu/ + +>>> validate('22XWATTPLUS----G') +'22XWATTPLUS----G' +>>> validate('22XWATTPLUS----X') +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> validate('23X--130302DLGW-') # check digit cannot be minus +Traceback (most recent call last): + ... +InvalidFormat: ... +""" + +from stdnum.exceptions import * +from stdnum.util import clean + + +_alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-' + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding white space.""" + return clean(number, ' ').strip() + + +def calc_check_digit(number): + """Calculate the check digit for the number.""" + number = compact(number) + s = sum((16 - i) * _alphabet.index(n) for i, n in enumerate(number[:15])) + return _alphabet[36 - ((s - 1) % 37)] + + +def validate(number): + """Checks to see if the number provided is valid. This checks the length, + format and check digit.""" + number = compact(number) + if not all(x in _alphabet for x in number): + raise InvalidFormat() + if len(number) != 16: + raise InvalidLength() + if number[-1] == '-': + raise InvalidFormat() + if number[-1] != calc_check_digit(number): + raise InvalidChecksum() + return number + + +def is_valid(number): + """Checks to see if the number provided is valid. This checks the length, + format and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False diff --git a/tests/test_eu_eic.doctest b/tests/test_eu_eic.doctest new file mode 100644 index 00000000..92b7a32e --- /dev/null +++ b/tests/test_eu_eic.doctest @@ -0,0 +1,118 @@ +test_eu_eic.doctest - more detailed doctests for the stdnum.eu.eic module + +Copyright (C) 2017 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.eu.eic module. It +tries to validate a number of EIC numbers that have been found online. + +>>> from stdnum.eu import eic + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 10T-NO-SE-00005Q +... 10Y1001A1001B05V +... 10YAT-APG------L +... 10YCH-SWISSGRIDZ +... 10YDE-RWENET---I +... 10YDE-VE-------2 +... 11WD8JAEN1L---AD +... 11XE-WERK-STERNP +... 11XEMRHAENDLER-M +... 11XNATGAST00000G +... 11XNEW-ENERGIE-8 +... 11XWEMAG-------Q +... 13X-IKBAG-NV---3 +... 14X-VES--------8 +... 18X0000000002OOE +... 18X0000000003VQM +... 18XAIGVA-12345-G +... 18XALMAL-1234-12 +... 18XCEG-123456-1F +... 18XCEPSA-12345-6 +... 18XEACCO-12345-K +... 18XENERS-12345-Q +... 18XEPCSA-12345-S +... 18XERUYA-12345-5 +... 18XGEM3-12345--K +... 18XGESTN-12345-G +... 18XJEALS-12345-P +... 18XLURIA-12345-Y +... 18XMONTO-12345-C +... 18XUTZUB-1234-1M +... 19XENIONENERGIAM +... 21W000000000092T +... 21X0000000011845 +... 21X000000001297T +... 21YEA-EC-------9 +... 22X20160610----4 +... 23X----090406-1H +... 23X--150408-AS-5 +... 23XB4CARCAPMKT-H +... 25X-SHELLAUSTRIL +... 26X00000004851-Y +... 26X00000105742-Q +... 26X00000107862-1 +... 27XAPTPOWER-CZ-3 +... 27XG-ACTHERM-CV1 +... 27XG-RWE-STP-CZJ +... 27XMND---------8 +... 28XENS---------6 +... 37X000000000054S +... 59X000000000110J +... 59X0000000001515 +... 59X0000000002309 +... 59Z000000000216C +... 59Z000000000276V +... 59Z000000000368Q +... 59Z0000000004180 +... 59Z000000000673L +... 59Z000000000905Q +... 59Z000000001369J +... 59Z000000001534U +... 59Z0000000017952 +... 59Z000000001801X +... 59Z000000001934E +... 59Z0000000020518 +... 59Z0000000021522 +... 59Z000000002270X +... 59Z000000002349K +... 59Z000000002376H +... 59Z000000002475F +... 59Z0000000027818 +... 59Z000000003405V +... 59Z000000003499X +... 59Z000000003597X +... 59Z0000000036639 +... 59Z0000000038194 +... 59Z000000003867U +... 59Z000000004048O +... 59Z000000004192H +... 59Z000000004481A +... 59Z0000000045638 +... 59Z000000004595W +... 59Z000000004748X +... 59Z000000004764Z +... 59Z000000004787N +... +... ''' +>>> [x for x in numbers.splitlines() if x and not eic.is_valid(x)] +[] From 7493eca08309922c76974566cc6d2eee1de126e1 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Fri, 7 Apr 2017 15:27:48 +0200 Subject: [PATCH 066/572] Use a slightly more readable weight alternation Switch to a slightly more readable syntax for alternating between two weights in checksums calculations. --- stdnum/cusip.py | 4 ++-- stdnum/ean.py | 4 ++-- stdnum/ec/ci.py | 4 ++-- stdnum/isin.py | 4 ++-- stdnum/tr/tckimlik.py | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/stdnum/cusip.py b/stdnum/cusip.py index f6858802..9fa6d905 100644 --- a/stdnum/cusip.py +++ b/stdnum/cusip.py @@ -1,6 +1,6 @@ # cusip.py - functions for handling CUSIP numbers # -# Copyright (C) 2015 Arthur de Jong +# Copyright (C) 2015-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -57,7 +57,7 @@ def calc_check_digit(number): """Calculate the check digits for the number.""" # convert to numeric first, then sum individual digits number = ''.join( - str((i % 2 + 1) * _alphabet.index(n)) for i, n in enumerate(number)) + str((1, 2)[i % 2] * _alphabet.index(n)) for i, n in enumerate(number)) return str((10 - sum(int(n) for n in number)) % 10) diff --git a/stdnum/ean.py b/stdnum/ean.py index ec6007e4..c237f2ec 100644 --- a/stdnum/ean.py +++ b/stdnum/ean.py @@ -1,6 +1,6 @@ # ean.py - functions for handling EANs # -# Copyright (C) 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2011-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -41,7 +41,7 @@ def compact(number): def calc_check_digit(number): """Calculate the EAN check digit for 13-digit numbers. The number passed should not have the check bit included.""" - return str((10 - sum((3 - 2 * (i % 2)) * int(n) + return str((10 - sum((3, 1)[i % 2] * int(n) for i, n in enumerate(reversed(number)))) % 10) diff --git a/stdnum/ec/ci.py b/stdnum/ec/ci.py index 9343e471..9af837dd 100644 --- a/stdnum/ec/ci.py +++ b/stdnum/ec/ci.py @@ -2,7 +2,7 @@ # coding: utf-8 # # Copyright (C) 2014 Jonathan Finlay -# Copyright (C) 2014 Arthur de Jong +# Copyright (C) 2014-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -48,7 +48,7 @@ def compact(number): def _checksum(number): """Calculate a checksum over the number.""" fold = lambda x: x - 9 if x > 9 else x - return sum(fold((2 - (i % 2)) * int(n)) + return sum(fold((2, 1)[i % 2] * int(n)) for i, n in enumerate(number)) % 10 diff --git a/stdnum/isin.py b/stdnum/isin.py index 135326ae..47c4560c 100644 --- a/stdnum/isin.py +++ b/stdnum/isin.py @@ -1,6 +1,6 @@ # isin.py - functions for handling ISIN numbers # -# Copyright (C) 2015 Arthur de Jong +# Copyright (C) 2015-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -91,7 +91,7 @@ def calc_check_digit(number): # convert to numeric first, then double some, then sum individual digits number = ''.join(str(_alphabet.index(n)) for n in number) number = ''.join( - str(int(n) * (2 - i % 2)) for i, n in enumerate(reversed(number))) + str((2, 1)[i % 2] * int(n)) for i, n in enumerate(reversed(number))) return str((10 - sum(int(n) for n in number)) % 10) diff --git a/stdnum/tr/tckimlik.py b/stdnum/tr/tckimlik.py index 4083229f..03ff92c4 100644 --- a/stdnum/tr/tckimlik.py +++ b/stdnum/tr/tckimlik.py @@ -1,7 +1,7 @@ # tckimlik.py - functions for handling T.C. Kimlik No. # coding: utf-8 # -# Copyright (C) 2016 Arthur de Jong +# Copyright (C) 2016-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -66,7 +66,7 @@ def compact(number): def calc_check_digits(number): """Calculate the check digits for the specified number. The number passed should not have the check digit included.""" - check1 = (10 - sum((3 - 2 * (i % 2)) * int(n) + check1 = (10 - sum((3, 1)[i % 2] * int(n) for i, n in enumerate(number[:9]))) % 10 check2 = (check1 + sum(int(n) for n in number[:9])) % 10 return '%d%d' % (check1, check2) From 800205c6f2ff1dd585b02bb9ca070b043b05cdf4 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 10 Apr 2017 13:17:26 +0200 Subject: [PATCH 067/572] Print warnings during tox run --- tox.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tox.ini b/tox.ini index ec926c41..282c9ee8 100644 --- a/tox.ini +++ b/tox.ini @@ -5,3 +5,5 @@ envlist = {py26,py27,py34,py35,py36,pypy} deps = nose coverage commands = nosetests +setenv= + PYTHONWARNINGS=all From 72f5c6cec264a05e19b46c8038118958b3f9ade2 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 10 Apr 2017 14:32:02 +0200 Subject: [PATCH 068/572] Add Serbian Poreski Identifikacioni Broj --- stdnum/rs/__init__.py | 24 +++++++ stdnum/rs/pib.py | 63 ++++++++++++++++++ tests/test_rs_pib.doctest | 134 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 stdnum/rs/__init__.py create mode 100644 stdnum/rs/pib.py create mode 100644 tests/test_rs_pib.doctest diff --git a/stdnum/rs/__init__.py b/stdnum/rs/__init__.py new file mode 100644 index 00000000..c23d2358 --- /dev/null +++ b/stdnum/rs/__init__.py @@ -0,0 +1,24 @@ +# __init__.py - collection of Serbian numbers +# coding: utf-8 +# +# Copyright (C) 2017 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""Collection of Serbian numbers.""" + +# provide vat as an alias +from stdnum.rs import pib as vat diff --git a/stdnum/rs/pib.py b/stdnum/rs/pib.py new file mode 100644 index 00000000..cf530c5d --- /dev/null +++ b/stdnum/rs/pib.py @@ -0,0 +1,63 @@ +# pib.py - functions for handling Serbian VAT numbers +# coding: utf-8 +# +# Copyright (C) 2017 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""PIB (Poreski Identifikacioni Broj, Serbian tax identification number). + +The Serbian tax identification number consists of 9 digits where the last +digit is a check digit. + +>>> validate('101134702') +'101134702' +>>> validate('101134703') +Traceback (most recent call last): + ... +InvalidChecksum: ... +""" + +from stdnum.exceptions import * +from stdnum.util import clean +from stdnum.iso7064 import mod_11_10 + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding whitespace.""" + return clean(number, ' -.').strip() + + +def validate(number): + """Checks to see if the number provided is a valid VAT number. This + checks the length, formatting and check digit.""" + number = compact(number) + if not number.isdigit(): + raise InvalidFormat() + if len(number) != 9: + raise InvalidLength() + mod_11_10.validate(number) + return number + + +def is_valid(number): + """Checks to see if the number provided is a valid VAT number. This + checks the length, formatting and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False diff --git a/tests/test_rs_pib.doctest b/tests/test_rs_pib.doctest new file mode 100644 index 00000000..80135c4c --- /dev/null +++ b/tests/test_rs_pib.doctest @@ -0,0 +1,134 @@ +test_rs_pib.doctest - more detailed doctests for the stdnum.rs.pib module + +Copyright (C) 2017 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.rs.pib module. + +>>> from stdnum.rs import pib +>>> from stdnum.exceptions import * + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 100000303 +... 100081000 +... 100081235 +... 100081260 +... 100081341 +... 100081649 +... 100081882 +... 100081903 +... 100082658 +... 100084073 +... 100084354 +... 100085087 +... 100085118 +... 100085175 +... 100085386 +... 100086047 +... 100086549 +... 100086688 +... 100088399 +... 100088487 +... 100088518 +... 100089182 +... 100089199 +... 100089480 +... 100089990 +... 100090168 +... 100090301 +... 100090545 +... 100109782 +... 100109959 +... 100110287 +... 100110650 +... 100110756 +... 100110949 +... 100111525 +... 100112202 +... 100112995 +... 100113109 +... 100113117 +... 100113184 +... 100113561 +... 100125276 +... 100125305 +... 100125313 +... 100125799 +... 100126349 +... 100185801 +... 100185810 +... 100187083 +... 100187243 +... 100187392 +... 101230316 +... 101230611 +... 101230783 +... 101765372 +... 101827944 +... 101895156 +... 101895365 +... 101895638 +... 101895994 +... 101896698 +... 101896913 +... 101896972 +... 101897641 +... 101897692 +... 101897949 +... 101898689 +... 102056361 +... 102097064 +... 102194170 +... 102324017 +... 102372731 +... 102883324 +... 102890888 +... 102960137 +... 103054816 +... 103094132 +... 103180484 +... 103311203 +... 103323675 +... 103338275 +... 103421003 +... 103428256 +... 103465975 +... 103470618 +... 103521454 +... 103539751 +... 103622128 +... 103669676 +... 103728660 +... 103747316 +... 103809880 +... 103837987 +... 103853451 +... 103883410 +... 104007533 +... 104044942 +... 104064625 +... 104079900 +... 104111220 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not pib.is_valid(x)] +[] From 1b3d16ee525ae941d49be8a27acca66b0e73c44d Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 10 Apr 2017 18:48:48 +0200 Subject: [PATCH 069/572] Add missing export (__all__) --- stdnum/es/nie.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdnum/es/nie.py b/stdnum/es/nie.py index 9e510e6d..01d218da 100644 --- a/stdnum/es/nie.py +++ b/stdnum/es/nie.py @@ -1,7 +1,7 @@ # nie.py - functions for handling Spanish foreigner identity codes # coding: utf-8 # -# Copyright (C) 2012, 2013 Arthur de Jong +# Copyright (C) 2012-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -40,7 +40,7 @@ from stdnum.exceptions import * -__all__ = ['compact', 'is_valid'] +__all__ = ['compact', 'calc_check_digit', 'validate', 'is_valid'] # use the same compact function as DNI From e844b5235a1a0599cabe6a5f1b27228b3036db05 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 10 Apr 2017 21:58:01 +0200 Subject: [PATCH 070/572] Integrate base10 conversion into Mod 97, 10 This moves the conversion of an alphanumeric string to a numeric representation for modulo 97 calculation to the mod_97_10 module because this mechanism seems to be used by multiple formats. --- stdnum/iban.py | 25 ++++--------------------- stdnum/iso7064/mod_97_10.py | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/stdnum/iban.py b/stdnum/iban.py index 18a9faa3..a9c56b3a 100644 --- a/stdnum/iban.py +++ b/stdnum/iban.py @@ -1,6 +1,6 @@ # iban.py - functions for handling International Bank Account Numbers (IBANs) # -# Copyright (C) 2011-2016 Arthur de Jong +# Copyright (C) 2011-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -55,9 +55,6 @@ # our open copy of the IBAN database _ibandb = numdb.get('iban') -# the valid characters we have -_alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' - # regular expression to check IBAN structure _struct_re = re.compile(r'([1-9][0-9]*)!([nac])') @@ -71,25 +68,11 @@ def compact(number): return clean(number, ' -').strip().upper() -def _to_base10(number): - """Prepare the number to its base10 representation (also moving the - check digits to the end) so it can be checked with the ISO 7064 - Mod 97, 10 algorithm.""" - # TODO: find out whether this should be in the mod_97_10 module - try: - return ''.join( - str(_alphabet.index(x)) for x in number[4:] + number[:4]) - except Exception: - raise InvalidFormat() - - def calc_check_digits(number): """Calculate the check digits that should be put in the number to make - it valid. Check digits in the supplied number are ignored..""" + it valid. Check digits in the supplied number are ignored.""" number = compact(number) - # replace check digits with placeholders - number = ''.join((number[:2], '00', number[4:])) - return mod_97_10.calc_check_digits(_to_base10(number)[:-2]) + return mod_97_10.calc_check_digits(number[4:] + number[:2]) def _struct_to_re(structure): @@ -119,7 +102,7 @@ def validate(number, check_country=True): specific check can be disabled with the check_country argument.""" number = compact(number) # ensure that checksum is valid - mod_97_10.validate(_to_base10(number)) + mod_97_10.validate(number[4:] + number[:4]) # look up the number info = _ibandb.info(number) # check if the bban part of number has the correct structure diff --git a/stdnum/iso7064/mod_97_10.py b/stdnum/iso7064/mod_97_10.py index 618fbc7f..39f05c47 100644 --- a/stdnum/iso7064/mod_97_10.py +++ b/stdnum/iso7064/mod_97_10.py @@ -1,6 +1,6 @@ # mod_97_10.py - functions for performing the ISO 7064 Mod 97, 10 algorithm # -# Copyright (C) 2010, 2011, 2012, 2013 Arthur de Jong +# Copyright (C) 2010-2017 Arthur de Jong # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -37,9 +37,22 @@ from stdnum.exceptions import * +# the valid characters we have +_alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' + + +def _to_base10(number): + """Prepare the number to its base10 representation.""" + try: + return ''.join( + str(_alphabet.index(x)) for x in number) + except Exception: + raise InvalidFormat() + + def checksum(number): """Calculate the checksum. A valid number should have a checksum of 1.""" - return int(number) % 97 + return int(_to_base10(number)) % 97 def calc_check_digits(number): From 53982477586198b2e22ec16d30a8d4e371191d70 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 10 Apr 2017 22:21:45 +0200 Subject: [PATCH 071/572] Add Legal Entity Identifier --- stdnum/lei.py | 68 +++++++++++++++++++++ tests/test_lei.doctest | 134 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 stdnum/lei.py create mode 100644 tests/test_lei.doctest diff --git a/stdnum/lei.py b/stdnum/lei.py new file mode 100644 index 00000000..f87bbee0 --- /dev/null +++ b/stdnum/lei.py @@ -0,0 +1,68 @@ +# lei.py - functions for handling Legal Entity Identifiers (LEIs) +# coding: utf-8 +# +# Copyright (C) 2017 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""LEI (Legal Entity Identifier). + +The Legal Entity Identifier (LEI) is used to identify legal entities for use +in financial transactions. A LEI is a 20-character alphanumeric string that +consists of a 4-character issuing LOU (Local Operating Unit), 2 digits that +are often 0, 13 digits to identify the organisation and 2 check digits. + +More information: + +* https://en.wikipedia.org/wiki/Legal_Entity_Identifier +* http://www.lei-lookup.com/ +* https://www.gleif.org/ +* http://openleis.com/ + +>>> validate('213800KUD8LAJWSQ9D15') +'213800KUD8LAJWSQ9D15' +>>> validate('213800KUD8LXJWSQ9D15') +Traceback (most recent call last): + ... +InvalidChecksum: ... +""" + +from stdnum.exceptions import * +from stdnum.iso7064 import mod_97_10 +from stdnum.util import clean + + +def compact(number): + """Convert the number to the minimal representation. This strips the + number of any valid separators and removes surrounding white space.""" + return clean(number, ' -').strip().upper() + + +def validate(number): + """Checks to see if the number provided is valid. This checks the length, + format and check digits.""" + number = compact(number) + mod_97_10.validate(number) + return number + + +def is_valid(number): + """Checks to see if the number provided is valid. This checks the length, + format and check digits.""" + try: + return bool(validate(number)) + except ValidationError: + return False diff --git a/tests/test_lei.doctest b/tests/test_lei.doctest new file mode 100644 index 00000000..5c2900dd --- /dev/null +++ b/tests/test_lei.doctest @@ -0,0 +1,134 @@ +test_lei.doctest - more detailed doctests for the stdnum.lei module + +Copyright (C) 2017 Arthur de Jong + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.lei module. + +>>> from stdnum import lei +>>> from stdnum.exceptions import * + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 0YPKKE5F0QW6RC51HE09 +... 1YTX3EVB2EG3PFFYOI09 +... 2138001CY61HDFJ5ZA27 +... 2138001KT6BLFA2SBA38 +... 213800699Y1P5GMARI40 +... 213800DIH9U9264UW504 +... 213800F25B5OHORTSI52 +... 213800KLHG79RR4RVR16 +... 213800KNMQ53LTJQBV92 +... 213800KUD8LAJWSQ9D15 +... 213800Q3CZMOFF9OE643 +... 213800REANX5GCW7AD17 +... 213800THICTTOSR1N623 +... 213800WWDZ5X6SRDF737 +... 213800WWNILTD76WIX72 +... 2594005N6NMJM5WSGE40 +... 2YXI7YIWYFWZG3QHF204 +... 315700EBSH5FQO0A2E52 +... 315700UUG8ME8T3NNN23 +... 337KMNHEWWWR6B7Q7W10 +... 391200J69OE1D0B3ZQ28 +... 3YO0DHNPQLJN0PYQXZ94 +... 5299007DT4PDT06SZM22 +... 5299008A9PK6IQEWE268 +... 529900TODVLNUTNSYF94 +... 529900UJX7YWK7YK5Z47 +... 529900WWBCVXKSBVKS40 +... 529900YGP0ANNLITEF34 +... 529900Z5WSAAJ3OTQU15 +... 549300001TP7X0VE9866 +... 54930000YBLXA2M5DV57 +... 54930007KCQLYRQLSU30 +... 5493000MYJ7H0E3KKG91 +... 54930017EFV0P0QWP015 +... 54930018TDVHWGLNZ954 +... 5493001BD9HCE74UH411 +... 5493004NJH3JGW7MVS62 +... 5493004QRTOY0WERIJ41 +... 54930066SVUPVIHE5U21 +... 5493006O7NV2IXKS4288 +... 5493007715JF1TY3M614 +... 5493007HHN4G8PA5MS11 +... 5493007PWOC8DW5KJM17 +... 5493008EWHY43YYP8R93 +... 5493008VZPPOQ8Y63J10 +... 549300EF33KFNMISKX67 +... 549300EUCOJ6XD50YM58 +... 549300FR4NAW0G8UFI80 +... 549300FRSHK45MQIBL14 +... 549300GF102RMNYVKB19 +... 549300H45ZBEKCVW0U40 +... 549300IDQBTGQCXJ5239 +... 549300IWFWPPXW87ZE72 +... 549300J8EHPRYOKF3869 +... 549300JMX497I8GHDT24 +... 549300LHQ6XOM0JUW406 +... 549300M3SJFSFVXG6X69 +... 549300NV50SCQMF8OC75 +... 549300O2F2PCD1D7PZ95 +... 549300O7ZFXE3YT1GH43 +... 549300OIVSR86BGJGT75 +... 549300OM88E30DLQTD78 +... 549300PATTPXQ660N070 +... 549300PFL3HXXEEOHS50 +... 549300SILMFILZ8Y4427 +... 549300SOEQOO5LPOD659 +... 549300TZLPZOAIIMJF22 +... 549300UKFZ3BD7TNKI26 +... 549300V6KHTZPJ4YVC33 +... 549300V6LZG40THFO450 +... 549300V885B988S1LJ49 +... 549300WTO22HTNIA0Z19 +... 549300X8N7DWRL7VBF44 +... 549300XBRMGPGXSSB667 +... 549300YBGK6ESSY6G874 +... 549300YPYUJBJGNGQO81 +... 5967007LIEEXZX850W58 +... 6354004RBF2LINM9VH78 +... 635400ID2ZOCFWX3LH70 +... 635400TSTDEIQBVFXR91 +... 7245005BAK6R2JQ1LU94 +... 7245006M2FC6DPMC6427 +... 724500PVWFYKZIJQAN07 +... 815600065E4EA9D08446 +... 8156004572781E3F9023 +... 815600E6B00CF4DBB722 +... 815600FC0039E657C985 +... 815600FF404253C67598 +... 959800Q824KQDPCZPV58 +... 96950091S6OFL0N15G96 +... 969500BL7YE3PXKDYT35 +... 969500YLLNN3TK3JSF66 +... 969500ZAUC3Z50DNZV77 +... FIR47I6FEYKYNJBYW622 +... GU00WJXK6DH4VHHFXQ16 +... NMMFE09VSMAF2TU16C07 +... RCJ8N5WH4YK7SVJ4BO12 +... TGXITECVNFSIBV316765 +... WT03B8BB1IX8WI9ZGV02 +... XNIO7KHWR2WD0BP1F484 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not lei.is_valid(x)] +[] From bb1712d6062a14f6c68f4464cccb0f75562c4061 Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Mon, 10 Apr 2017 22:32:32 +0200 Subject: [PATCH 072/572] Add simple online check example This adds the code that is used to find formats for which a supplied number is valid. This is the code that is used on https://arthurdejong.org/python-stdnum/check/ --- online_check/README | 18 + online_check/check.js | 96 + online_check/jquery-1.7.1.js | 9266 ++++++++++++++++++++++++++++++ online_check/jquery-1.7.1.min.js | 4 + online_check/stdnum.wsgi | 87 + online_check/template.html | 23 + 6 files changed, 9494 insertions(+) create mode 100644 online_check/README create mode 100644 online_check/check.js create mode 100644 online_check/jquery-1.7.1.js create mode 100644 online_check/jquery-1.7.1.min.js create mode 100755 online_check/stdnum.wsgi create mode 100644 online_check/template.html diff --git a/online_check/README b/online_check/README new file mode 100644 index 00000000..38841e2c --- /dev/null +++ b/online_check/README @@ -0,0 +1,18 @@ +This is a sample application that uses python-stdnum to see which number +formats are valid for a supplied number as can be seen online at: + https://arthurdejong.org/python-stdnum/check/ + +Configuring the WSGI application in Apache. + +# /path/to/wsgi is the directory containing the WSGI scripts +# /path/to/html is the directory containing the static files + +WSGIDaemonProcess stdnum threads=5 maximum-requests=100 display-name=%{GROUP} + + + WSGIProcessGroup stdnum + + +Alias /check /path/to/html +WSGIScriptAlias /check/stdnum.wsgi /path/to/wsgi/stdnum.wsgi +RewriteRule ^/check/$ /check/stdnum.wsgi/$1 [QSA,PT,L] diff --git a/online_check/check.js b/online_check/check.js new file mode 100644 index 00000000..b52633f4 --- /dev/null +++ b/online_check/check.js @@ -0,0 +1,96 @@ +/* + # check.js - simple application to check numbers + # + # Copyright (C) 2017 Arthur de Jong. + # + # This library is free software; you can redistribute it and/or + # modify it under the terms of the GNU Lesser General Public + # License as published by the Free Software Foundation; either + # version 2.1 of the License, or (at your option) any later version. + # + # This library is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # Lesser General Public License for more details. + # + # You should have received a copy of the GNU Lesser General Public + # License along with this library; if not, write to the Free Software + # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + # 02110-1301 USA + */ + +$( document ).ready(function() { + + function format(value) { + return $("
    ").text(value).html().replace( + /\n\n/g, "
    \n" + ).replace( + /^[*] (.*)$/gm, "
    • $1
    " + ).replace( + /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, + "$1" + ) + } + + function updateresults(field, results) { + // build HTML to present + var h = ["
      "]; + $.each(results, function(index, result) { + h.push( + "
    • ", + $("
      ").text(result["name"]).html(), + "
      ", + $("
      ").text(result["number"]).html(), + "

      ", + format(result["description"]), + "

    • ") + }); + h.push("
    "); + // replace the results div + $("#" + $(field).attr("id") + "_results").slideUp("quick", function() { + $(this).html(h.join("")); + $(this).slideDown("quick"); + }); + } + + function checkfield(field) { + var value = field.val(); + // only trigger update if value changed from previous validation + if (value != $(this).data("oldvalue")) { + $(this).data("oldvalue", value); + $.get('', {number: value}, function(data) { + updateresults(field, data); + }); + } + } + + // trigger a check when user stopped typing + $(".stdnum_check").on("input propertychange", function (event) { + if (window.event && event.type == "propertychange" && event.propertyName != "value") + return; + var field = $(this); + window.clearTimeout($(this).data("timeout")); + $(this).data("timeout", setTimeout(function () { + checkfield(field); + }, 2000)); + }); + + // trigger a check when losing focus + $(".stdnum_check").on("blur", function() { + window.clearTimeout($(this).data("timeout")); + checkfield($(this)); + }); + + // prevent enter from submitting the form + $(".stdnum_check").keydown(function(event) { + if(event.keyCode == 13) { + event.preventDefault(); + checkfield($(this)); + return false; + } + }); + + // hide the submit button + $(".stdnum_hide").hide(); + +}); diff --git a/online_check/jquery-1.7.1.js b/online_check/jquery-1.7.1.js new file mode 100644 index 00000000..8ccd0ea7 --- /dev/null +++ b/online_check/jquery-1.7.1.js @@ -0,0 +1,9266 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
    a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "
    " + + "" + + "
    "; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
    t
    "; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
    "; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + body.removeChild( container ); + div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var self = jQuery( this ), + args = [ parts[0], value ]; + + self.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

    "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
    "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
    ", "
    " ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + col: [ 2, "", "
    " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and