From a9e540510cec7581c16ce95e59822bff749af045 Mon Sep 17 00:00:00 2001 From: Sergi Almacellas Abellana Date: Tue, 8 Nov 2016 18:04:18 +0100 Subject: [PATCH 001/523] 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 002/523] 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 003/523] 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 004/523] 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 005/523] 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 006/523] 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 007/523] 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 008/523] 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 009/523] 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 010/523] 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 011/523] 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 012/523] 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 013/523] 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 014/523] =?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 015/523] 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 016/523] 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 017/523] 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 018/523] 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 019/523] 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 020/523] 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 021/523] 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 022/523] 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 023/523] 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