jdk/src/share/classes/sun/net/RegisteredDomain.java
changeset 9775 1b128726e887
child 11125 99b115114fa3
equal deleted inserted replaced
9774:50a2b28ca54c 9775:1b128726e887
       
     1 /*
       
     2  * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 package sun.net;
       
    26 
       
    27 import java.util.Arrays;
       
    28 import java.util.HashMap;
       
    29 import java.util.HashSet;
       
    30 import java.util.List;
       
    31 import java.util.Map;
       
    32 import java.util.Set;
       
    33 
       
    34 /*
       
    35  * The naming tables listed below were gathered from publicly available data such as
       
    36  * the subdomain registration websites listed for each top-level domain by the Internet
       
    37  * Assigned Numbers Authority and the website of the Internet Corporation for Assigned Names
       
    38  * and Numbers as well as Wikipedia.
       
    39  */
       
    40 
       
    41 public class RegisteredDomain {
       
    42 
       
    43 // XX.AA
       
    44 private static Set<String> top1Set = new HashSet<String>(Arrays.asList("asia", "biz", "cat", "coop",
       
    45         "edu", "info", "gov", "jobs", "travel", "am", "aq", "ax", "cc", "cf", "cg", "ch", "cv", "cz",
       
    46         "de", "dj", "dk", "fm", "fo", "ga", "gd", "gf", "gl", "gm", "gq", "gs", "gw", "hm",
       
    47         "li", "lu", "md", "mh", "mil", "mobi", "mq", "ms", "ms", "ne", "nl", "nu", "si",
       
    48         "sm", "sr", "su", "tc", "td", "tf", "tg", "tk", "tm", "tv", "va", "vg",
       
    49         /* ae */ "xn--mgbaam7a8h",      /* cn s */      "xn--fiqs8s",        /* cn t */ "xn--fiqz9s",
       
    50         /* eg */ "xn--wgbh1c",          /* hk */        "xn--j6w193g",       /* jo */   "xn--mgbayh7gpa",
       
    51         /* lk */ "xn--fzc2c9e2c",       /* ps */        "xn--ygbi2ammx",     /* ru */   "xn--p1ai",
       
    52         /* qa */ "xn--wgbl6a",          /* sa */        "xn--mgberp4a5d4ar", /* sg */   "xn--yfro4i67o",
       
    53         /* th */ "xn--o3cw4h",          /* tn */        "xn--pgbs0dh",       /* tw s */ "xn--kpry57d",
       
    54         /* tw */ "xn--kprw13d",         /* sg tamil */  "xn--clchc0ea0b2g2a9gcd"));
       
    55 
       
    56 // common pattern: XX.AA or XX.GOV.AA
       
    57 private static Set<String> top2Set = new HashSet<String>(Arrays.asList("as", "bf", "cd", "cx",
       
    58         "ie", "lt", "mr", "tl"));
       
    59 
       
    60 // common pattern: XX.AA or XX.COM.AA or XX.EDU.AA or XX.NET.AA or XX.ORG.AA or XX.GOV.AA
       
    61 private static Set<String> top4Set = new HashSet<String>(Arrays.asList("af", "bm", "bs", "bt",
       
    62         "bz", "dm", "ky", "lb", "lr", "mo", "sc", "sl", "ws"));
       
    63 
       
    64 // AA or less than 3 other XX.BB.AA possible matches
       
    65 private static Set<String> top3Set = new HashSet<String>(Arrays.asList("ad", "aw", "be", "bw",
       
    66         "cl", "fi", "int", "io", "mc"));
       
    67 
       
    68 // AA.UK exceptions
       
    69 private static Set<String> ukSet = new HashSet<String>(Arrays.asList( "bl", "british-library",
       
    70         "jet", "nhs", "nls", "parliament", "mod", "police"));
       
    71 
       
    72 // AA.AR exceptions
       
    73 private static Set<String> arSet = new HashSet<String>(Arrays.asList( "argentina", "educ",
       
    74         "gobiernoelectronico", "nic", "promocion", "retina", "uba"));
       
    75 
       
    76 // AA.OM exceptions
       
    77 private static Set<String> omSet = new HashSet<String>(Arrays.asList("mediaphone", "nawrastelecom",
       
    78         "nawras", "omanmobile", "omanpost", "omantel", "rakpetroleum", "siemens", "songfest",
       
    79         "statecouncil", "shura", "peie", "omran", "omnic", "omanet", "oman", "muriya", "kom"));
       
    80 
       
    81 // any XX.BB.AA
       
    82 private static Set<String> top5Set = new HashSet<String>(Arrays.asList("au", "arpa", "bd", "bn", "ck",
       
    83          "cy", "er", "et", "fj", "fk", "gt", "gu", "il", "jm", "ke", "kh", "kw",
       
    84          "mm", "mt", "mz", "ni", "np", "nz", "pg", "sb", "sv", "tz", "uy", "ve", "ye",
       
    85          "za", "zm", "zw"));
       
    86 
       
    87 // XX.CC.BB.JP
       
    88 private static Set<String> jpSet = new HashSet<String>(Arrays.asList("aichi", "akita", "aomori",
       
    89         "chiba", "ehime", "fukui", "fukuoka", "fukushima", "gifu", "gunma", "hiroshima", "hokkaido",
       
    90         "hyogo", "ibaraki", "ishikawa", "iwate", "kagawa", "kagoshima", "kanagawa", "kawasaki",
       
    91         "kitakyushu", "kobe", "kochi", "kumamoto", "kyoto", "mie", "miyagi", "miyazaki", "nagano",
       
    92         "nagasaki", "nagoya", "nara", "niigata", "oita", "okayama", "okinawa", "osaka", "saga",
       
    93         "saitama", "sapporo", "sendai", "shiga", "shimane", "shizuoka", "tochigi", "tokushima",
       
    94         "tokyo", "tottori", "toyama", "wakayama", "yamagata", "yamaguchi", "yamanashi", "yokohama"));
       
    95 
       
    96 // CC.BB.JP exceptions
       
    97 private static Set<String> jp2Set = new HashSet<String>(Arrays.asList("metro.tokyo.jp",
       
    98         "pref.aichi.jp", "pref.akita.jp", "pref.aomori.jp", "pref.chiba.jp", "pref.ehime.jp",
       
    99         "pref.fukui.jp", "pref.fukuoka.jp", "pref.fukushima.jp", "pref.gifu.jp", "pref.gunma.jp",
       
   100         "pref.hiroshima.jp", "pref.hokkaido.jp", "pref.hyogo.jp", "pref.ibaraki.jp", "pref.ishikawa.jp",
       
   101         "pref.iwate.jp", "pref.kagawa.jp", "pref.kagoshima.jp", "pref.kanagawa.jp", "pref.kochi.jp",
       
   102         "pref.kumamoto.jp", "pref.kyoto.jp", "pref.mie.jp", "pref.miyagi.jp", "pref.miyazaki.jp",
       
   103         "pref.nagano.jp", "pref.nagasaki.jp", "pref.nara.jp", "pref.niigata.jp", "pref.oita.jp",
       
   104         "pref.okayama.jp", "pref.okinawa.jp", "pref.osaka.jp", "pref.saga.jp", "pref.saitama.jp",
       
   105         "pref.shiga.jp", "pref.shimane.jp", "pref.shizuoka.jp", "pref.tochigi.jp", "pref.tokushima.jp",
       
   106         "pref.tottori.jp", "pref.toyama.jp", "pref.wakayama.jp", "pref.yamagata.jp", "pref.yamaguchi.jp",
       
   107         "pref.yamanashi.jp", "city.chiba.jp", "city.fukuoka.jp", "city.hamamatsu.jp", "city.hiroshima.jp", "city.kawasaki.jp",
       
   108         "city.kitakyushu.jp", "city.kobe.jp", "city.kyoto.jp", "city.nagoya.jp", "city.niigata.jp",
       
   109         "city.okayama.jp", "city.osaka.jp", "city.sagamihara.jp", "city.saitama.jp", "city.sapporo.jp", "city.sendai.jp",
       
   110         "city.shizuoka.jp", "city.yokohama.jp"));
       
   111 
       
   112 private static Set<String>  usStateSet = new HashSet<String>(Arrays.asList("ak",
       
   113                 "al", "ar", "as", "az", "ca", "co", "ct", "dc", "de", "fl", "ga", "gu", "hi", "ia",
       
   114                 "id", "il", "in", "ks", "ky", "la", "ma", "md", "me", "mi", "mn", "mo", "ms", "mt",
       
   115                 "nc", "nd", "ne", "nh", "nj", "nm", "nv", "ny", "oh", "ok", "or", "pa", "pr", "ri",
       
   116                 "sc", "sd", "tn", "tx", "ut", "vi", "vt", "va", "wa", "wi", "wv", "wy"));
       
   117 
       
   118 private static Set<String>  usSubStateSet = new HashSet<String>(Arrays.asList("state",
       
   119                 "lib", "k12", "cc", "tec", "gen", "cog", "mus", "dst"));
       
   120 
       
   121 private static Map<String,Set> topMap = new HashMap<String,Set>();
       
   122 private static Map<String,Set> top3Map = new HashMap<String,Set>();
       
   123 
       
   124 static {
       
   125     /*
       
   126      * XX.AA or XX.BB.AA
       
   127      */
       
   128     topMap.put("ac", new HashSet<String>(Arrays.asList("com", "co", "edu", "gov", "net", "mil", "org")));
       
   129     topMap.put("ae", new HashSet<String>(Arrays.asList("co", "net", "org", "sch", "ac", "gov", "mil")));
       
   130     topMap.put("aero", new HashSet<String>(Arrays.asList("accident-investigation",
       
   131                 "accident-prevention", "aerobatic", "aeroclub", "aerodrome", "agents", "aircraft",
       
   132                 "airline", "airport", "air-surveillance", "airtraffic", "air-traffic-control",
       
   133                 "ambulance", "amusement", "association", "author", "ballooning", "broker", "caa",
       
   134                 "cargo", "catering", "certification", "championship", "charter", "civilaviation",
       
   135                 "club", "conference", "consultant", "consulting", "control", "council", "crew",
       
   136                 "design", "dgca", "educator", "emergency", "engine", "engineer", "entertainment",
       
   137                 "equipment", "exchange", "express", "federation", "flight", "freight", "fuel",
       
   138                 "gliding", "government", "groundhandling", "group", "hanggliding", "homebuilt",
       
   139                 "insurance", "journal", "journalist", "leasing", "logistics", "magazine",
       
   140                 "maintenance", "marketplace", "media", "microlight", "modelling", "navigation",
       
   141                 "parachuting", "paragliding", "passenger-association", "pilot", "press", "production",
       
   142                 "recreation", "repbody", "res", "research", "rotorcraft", "safety", "scientist",
       
   143                 "services", "show", "skydiving", "software", "student", "taxi", "trader", "trading",
       
   144                 "trainer", "union", "workinggroup", "works" )));
       
   145     topMap.put( "ag", new HashSet<String>(Arrays.asList("com", "org", "net", "co", "nom")));
       
   146     topMap.put( "ai", new HashSet<String>(Arrays.asList("off", "com", "net", "org")));
       
   147     topMap.put( "al", new HashSet<String>(Arrays.asList("com", "edu", "gov", "mil", "net", "org")));
       
   148     topMap.put( "an", new HashSet<String>(Arrays.asList("com")));
       
   149     topMap.put( "ao", new HashSet<String>(Arrays.asList("ed", "gv", "og", "co", "pb", "it")));
       
   150     topMap.put( "at", new HashSet<String>(Arrays.asList("ac", "co", "gv", "or", "biz", "info", "priv")));
       
   151     topMap.put( "az", new HashSet<String>(Arrays.asList("com", "net", "int", "gov", "org", "edu", "info",
       
   152                 "pp", "mil", "name", "biz")));
       
   153     topMap.put( "ba", new HashSet<String>(Arrays.asList("org", "net", "edu", "gov", "mil", "unbi",
       
   154                 "unmo", "unsa", "untz", "unze", "co", "com", "rs")));
       
   155     topMap.put( "bb", new HashSet<String>(Arrays.asList("biz", "com", "edu", "gov", "info", "net", "org",
       
   156                 "store")));
       
   157     topMap.put( "bg", new HashSet<String>(Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
       
   158                 "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1",
       
   159                 "2", "3", "4", "5", "6", "7", "8", "9")));
       
   160     topMap.put( "bh", new HashSet<String>(Arrays.asList("com", "info", "cc", "edu", "biz", "net",
       
   161                 "org", "gov")));
       
   162     topMap.put( "bi", new HashSet<String>(Arrays.asList("co", "com", "edu", "gov", "info", "or", "org")));
       
   163     topMap.put( "bj", new HashSet<String>(Arrays.asList("asso", "barreau", "com", "edu", "gouv", "gov", "mil")));
       
   164     topMap.put( "bo", new HashSet<String>(Arrays.asList("com", "edu", "gov", "gob", "int", "org", "net",
       
   165                  "mil", "tv")));
       
   166     topMap.put( "br", new HashSet<String>(Arrays.asList("adm", "adv", "agr", "am", "arq", "art", "ato",
       
   167                 "b", "bio", "blog", "bmd", "cim", "cng", "cnt", "com", "coop", "ecn", "edu", "emp", "eng",
       
   168                 "esp", "etc", "eti", "far", "flog", "fm", "fnd", "fot", "fst", "g12", "ggf", "gov",
       
   169                 "imb", "ind", "inf", "jor", "jus", "lel", "mat", "med", "mil", "mus", "net", "nom",
       
   170                 "not", "ntr", "odo", "org", "ppg", "pro", "psc", "psi", "qsl", "radio", "rec", "slg",
       
   171                 "srv", "taxi", "teo", "tmp", "trd", "tur", "tv", "vet", "vlog", "wiki", "zlg")));
       
   172     topMap.put( "bw", new HashSet<String>(Arrays.asList("co", "gov", "org")));
       
   173     topMap.put( "by", new HashSet<String>(Arrays.asList("gov", "mil", "com", "of")));
       
   174     topMap.put( "ca", new HashSet<String>(Arrays.asList("ab", "bc", "mb", "nb", "nf",
       
   175                 "nl", "ns", "nt", "nu", "on", "pe", "qc", "sk", "yk", "gc")));
       
   176     topMap.put( "ci", new HashSet<String>(Arrays.asList("org", "or", "com", "co", "edu",
       
   177                 "ed", "ac", "net", "go", "asso", "xn--aroport-bya", "int",
       
   178                 "presse", "md", "gouv")));
       
   179     topMap.put( "com", new HashSet<String>(Arrays.asList("ad", "ar", "br", "cn", "de", "eu", "gb",
       
   180                 "gr", "hu", "jpn", "kr", "no", "qc", "ru", "sa", "se", "uk", "us", "uy", "za")));
       
   181     topMap.put( "cm", new HashSet<String>(Arrays.asList("co", "com", "gov", "net")));
       
   182     topMap.put( "cn", new HashSet<String>(Arrays.asList("ac", "com", "edu", "gov", "net",
       
   183                 "org", "mil", "xn--55qx5d", "xn--io0a7i",
       
   184                 "ah", "bj", "cq", "fj", "gd", "gs", "gz", "gx",
       
   185                 "ha", "hb", "he", "hi", "hl", "hn", "jl", "js", "jx", "ln", "nm", "nx", "qh",
       
   186                 "sc", "sd", "sh", "sn", "sx", "tj", "xj", "xz", "yn", "zj", "hk", "mo", "tw")));
       
   187     topMap.put( "co", new HashSet<String>(Arrays.asList("arts", "com", "edu", "firm", "gov", "info",
       
   188                 "int", "mil", "net", "nom", "org", "rec", "web")));
       
   189     topMap.put( "cr", new HashSet<String>(Arrays.asList("ac", "co", "ed", "fi", "go", "or", "sa")));
       
   190     topMap.put( "cu", new HashSet<String>(Arrays.asList("com", "edu", "org", "net", "gov", "inf")));
       
   191     topMap.put( "do", new HashSet<String>(Arrays.asList("com", "edu", "org", "net", "gov", "gob",
       
   192                 "web", "art", "sld", "mil")));
       
   193     topMap.put( "dz", new HashSet<String>(Arrays.asList("com", "org", "net", "gov", "edu", "asso",
       
   194                  "pol", "art")));
       
   195     topMap.put( "ec", new HashSet<String>(Arrays.asList("com", "info", "net", "fin", "k12", "med",
       
   196                 "pro", "org", "edu", "gov", "gob", "mil")));
       
   197     topMap.put( "ee", new HashSet<String>(Arrays.asList("edu", "gov", "riik", "lib", "med", "com",
       
   198                 "pri", "aip", "org", "fie")));
       
   199     topMap.put( "eg", new HashSet<String>(Arrays.asList("com", "edu", "eun", "gov", "mil", "name",
       
   200                 "net", "org", "sci")));
       
   201     topMap.put( "es", new HashSet<String>(Arrays.asList("com", "nom", "org", "gob", "edu")));
       
   202     topMap.put( "eu", new HashSet<String>(Arrays.asList("europa")));
       
   203     topMap.put( "fr", new HashSet<String>(Arrays.asList("com", "asso", "nom", "prd", "presse",
       
   204                 "tm", "aeroport", "assedic", "avocat", "avoues", "cci", "chambagri",
       
   205                 "chirurgiens-dentistes", "experts-comptables", "geometre-expert", "gouv", "greta",
       
   206                 "huissier-justice", "medecin", "notaires", "pharmacien", "port", "veterinaire")));
       
   207     topMap.put( "ge", new HashSet<String>(Arrays.asList("com", "edu", "gov", "org", "mil", "net", "pvt")));
       
   208     topMap.put( "gg", new HashSet<String>(Arrays.asList("co", "org", "net", "sch", "gov")));
       
   209     topMap.put( "gh", new HashSet<String>(Arrays.asList("com", "edu", "gov", "org", "mil")));
       
   210     topMap.put( "gi", new HashSet<String>(Arrays.asList("com", "ltd", "gov", "mod", "edu", "org")));
       
   211     topMap.put( "gn", new HashSet<String>(Arrays.asList("ac", "com", "edu", "gov", "org", "net")));
       
   212     topMap.put( "gp", new HashSet<String>(Arrays.asList("com", "net", "mobi", "edu", "org", "asso")));
       
   213     topMap.put( "gr", new HashSet<String>(Arrays.asList("com", "co", "net", "edu", "org", "gov",
       
   214                 "mil", "mod", "sch")));
       
   215     topMap.put( "gy", new HashSet<String>(Arrays.asList("co", "com", "net", "org", "edu", "gov")));
       
   216     topMap.put( "hk", new HashSet<String>(Arrays.asList("com", "edu", "gov", "idv", "net", "org",
       
   217                 /* com */ "xn--55qx5d", /* edu */ "xn--wcvs22d", /* gov */"xn--mxtq1m",
       
   218                 /* idv */ "xn--gmqw5a", /* net */ "xn--od0alg", /*org*/ "xn--uc0atv")));
       
   219     topMap.put( /* hk */  "xn--j6w193g", new HashSet<String>(Arrays.asList(
       
   220                 /* com */ "xn--55qx5d", /* edu */ "xn--wcvs22d", /* gov */"xn--mxtq1m",
       
   221                 /* idv */ "xn--gmqw5a", /* net */ "xn--od0alg", /*org*/ "xn--uc0atv")));
       
   222     topMap.put( "hn", new HashSet<String>(Arrays.asList("com", "edu", "org", "net", "mil", "gob")));
       
   223     topMap.put( "hr", new HashSet<String>(Arrays.asList("iz.hr", "from.hr", "name.hr", "com.hr")));
       
   224     topMap.put( "ht", new HashSet<String>(Arrays.asList("com", "shop", "firm", "info", "adult",
       
   225                 "net", "pro", "org", "med", "art", "coop", "pol", "asso", "edu", "rel", "gouv", "perso")));
       
   226     topMap.put( "hu", new HashSet<String>(Arrays.asList("co", "info", "org", "priv", "sport", "tm",
       
   227                 "2000", "agrar", "bolt", "casino", "city", "erotica", "erotika", "film", "forum",
       
   228                 "games", "hotel", "ingatlan", "jogasz", "konyvelo", "lakas", "media", "news", "reklam",
       
   229                 "sex", "shop", "suli", "szex", "tozsde", "utazas", "video")));
       
   230     topMap.put( "id", new HashSet<String>(Arrays.asList("ac", "co", "go", "mil", "net", "or", "sch",
       
   231                 "web")));
       
   232     topMap.put( "im", new HashSet<String>(Arrays.asList("co.im", "com", "net.im", "gov.im", "org.im",
       
   233                 "ac.im")));
       
   234     topMap.put( "in", new HashSet<String>(Arrays.asList("co", "firm", "ernet", "net", "org", "gen", "ind",
       
   235                 "nic", "ac", "edu", "res", "gov", "mil")));
       
   236     topMap.put( "iq", new HashSet<String>(Arrays.asList("gov", "edu", "mil", "com", "org", "net" )));
       
   237     topMap.put( "ir", new HashSet<String>(Arrays.asList("ac", "co", "gov", "id", "net", "org", "sch"
       
   238                 )));
       
   239     topMap.put( "is", new HashSet<String>(Arrays.asList("net", "com", "edu", "gov", "org", "int")));
       
   240     topMap.put( "it", new HashSet<String>(Arrays.asList("gov", "edu", "agrigento", "ag", "alessandria",
       
   241                 "al", "ancona", "an", "aosta", "aoste", "ao", "arezzo", "ar", "ascoli-piceno",
       
   242                 "ascolipiceno", "ap", "asti", "at", "avellino", "av", "bari", "ba",
       
   243                 "andria-barletta-trani", "andriabarlettatrani", "trani-barletta-andria",
       
   244                 "tranibarlettaandria", "barletta-trani-andria", "barlettatraniandria",
       
   245                 "andria-trani-barletta", "andriatranibarletta", "trani-andria-barletta",
       
   246                 "traniandriabarletta", "bt", "belluno", "bl", "benevento", "bn", "bergamo", "bg",
       
   247                 "biella", "bi", "bologna", "bo", "bolzano", "bozen", "balsan", "alto-adige",
       
   248                 "altoadige", "suedtirol", "bz", "brescia", "bs", "brindisi", "br", "cagliari",
       
   249                 "ca", "caltanissetta", "cl", "campobasso", "cb", "carboniaiglesias", "carbonia-iglesias",
       
   250                 "iglesias-carbonia", "iglesiascarbonia", "ci", "caserta", "ce", "catania", "ct",
       
   251                 "catanzaro", "cz", "chieti", "ch", "como", "co", "cosenza", "cs", "cremona", "cr",
       
   252                 "crotone", "kr", "cuneo", "cn", "dell-ogliastra", "dellogliastra", "ogliastra", "og",
       
   253                 "enna", "en", "ferrara", "fe", "fermo", "fm", "firenze", "florence", "fi", "foggia",
       
   254                 "fg", "forli-cesena", "forlicesena", "cesena-forli", "cesenaforli", "fc", "frosinone",
       
   255                 "fr", "genova", "genoa", "ge", "gorizia", "go", "grosseto", "gr", "imperia", "im",
       
   256                 "isernia", "is", "laquila", "aquila", "aq", "la-spezia", "laspezia", "sp", "latina",
       
   257                 "lt", "lecce", "le", "lecco", "lc", "livorno", "li", "lodi", "lo", "lucca", "lu",
       
   258                 "macerata", "mc", "mantova", "mn", "massa-carrara", "massacarrara", "carrara-massa",
       
   259                 "carraramassa", "ms", "matera", "mt", "medio-campidano", "mediocampidano",
       
   260                 "campidano-medio", "campidanomedio", "vs", "messina", "me", "milano", "milan",
       
   261                 "mi", "modena", "mo", "monza", "monza-brianza", "monzabrianza", "monzaebrianza",
       
   262                 "monzaedellabrianza", "monza-e-della-brianza", "mb", "napoli", "naples", "na",
       
   263                 "novara", "no", "nuoro", "nu", "oristano", "or", "padova", "padua", "pd", "palermo",
       
   264                 "pa", "parma", "pr", "pavia", "pv", "perugia", "pg", "pescara", "pe", "pesaro-urbino",
       
   265                 "pesarourbino", "urbino-pesaro", "urbinopesaro", "pu", "piacenza", "pc", "pisa",
       
   266                 "pi", "pistoia", "pt", "pordenone", "pn", "potenza", "pz", "prato", "po", "ragusa",
       
   267                 "rg", "ravenna", "ra", "reggio-calabria", "reggiocalabria", "rc", "reggio-emilia",
       
   268                 "reggioemilia", "re", "rieti", "ri", "rimini", "rn", "roma", "rome", "rm", "rovigo",
       
   269                 "ro", "salerno", "sa", "sassari", "ss", "savona", "sv", "siena", "si", "siracusa",
       
   270                 "sr", "sondrio", "so", "taranto", "ta", "tempio-olbia", "tempioolbia", "olbia-tempio",
       
   271                 "olbiatempio", "ot", "teramo", "te", "terni", "tr", "torino", "turin", "to",
       
   272                 "trapani", "tp", "trento", "trentino", "tn", "treviso", "tv", "trieste", "ts",
       
   273                 "udine", "ud", "varese", "va", "venezia", "venice", "ve", "verbania", "vb",
       
   274                 "vercelli", "vc", "verona", "vr", "vibo-valentia", "vibovalentia", "vv", "vicenza",
       
   275                 "vi", "viterbo", "vt")));
       
   276     topMap.put( "je", new HashSet<String>(Arrays.asList("co", "org", "net", "sch", "gov")));
       
   277     topMap.put( "jo", new HashSet<String>(Arrays.asList("com", "org", "net", "edu", "sch",
       
   278                 "gov", "mil", "name")));
       
   279     topMap.put( "jp", new HashSet<String>(Arrays.asList("ac", "ad", "co", "ed", "go", "gr", "lg",
       
   280                 "ne", "or")));
       
   281     topMap.put( "kg", new HashSet<String>(Arrays.asList("org", "net", "com", "edu", "gov", "mil")));
       
   282     topMap.put( "ki", new HashSet<String>(Arrays.asList("edu", "biz", "net", "org", "gov",
       
   283                  "info", "com")));
       
   284     topMap.put( "km", new HashSet<String>(Arrays.asList("org", "nom", "gov", "prd", "tm", "edu",
       
   285                 "mil", "ass", "com", "coop", "asso", "presse", "medecin", "notaires", "pharmaciens",
       
   286                 "veterinaire", "gouv")));
       
   287     topMap.put( "kn", new HashSet<String>(Arrays.asList("net", "org", "edu", "gov")));
       
   288     topMap.put( "kp", new HashSet<String>(Arrays.asList("com", "edu", "gov", "org", "rep", "tra")));
       
   289     topMap.put( "kr", new HashSet<String>(Arrays.asList("ac", "co", "es", "go", "hs", "kg", "mil",
       
   290                 "ms", "ne", "or", "pe", "re", "sc", "busan", "chungbuk", "chungnam", "daegu",
       
   291                 "daejeon", "gangwon", "gwangju", "gyeongbuk", "gyeonggi", "gyeongnam", "incheon",
       
   292                 "jeju", "jeonbuk", "jeonnam", "seoul", "ulsan")));
       
   293     topMap.put( "kz", new HashSet<String>(Arrays.asList("org", "edu", "net", "gov", "mil", "com")));
       
   294     topMap.put( "la", new HashSet<String>(Arrays.asList("int", "net", "info", "edu", "gov", "per",
       
   295                 "com", "org", "c")));
       
   296     topMap.put( "lc", new HashSet<String>(Arrays.asList("com", "net", "co", "org", "edu", "gov",
       
   297                 "l.lc", "p.lc")));
       
   298     topMap.put( "lk", new HashSet<String>(Arrays.asList("gov", "sch", "net", "int", "com", "org",
       
   299                 "edu", "ngo", "soc", "web", "ltd", "assn", "grp", "hotel")));
       
   300     topMap.put( "ls", new HashSet<String>(Arrays.asList("co", "gov", "ac", "org")));
       
   301     topMap.put( "lv", new HashSet<String>(Arrays.asList("com", "edu", "gov", "org", "mil",
       
   302                 "id", "net", "asn", "conf")));
       
   303     topMap.put( "ly", new HashSet<String>(Arrays.asList("com", "net", "gov", "plc", "edu", "sch",
       
   304                 "med", "org", "id")));
       
   305     topMap.put( "ma", new HashSet<String>(Arrays.asList("co", "net", "gov", "org", "ac", "press")));
       
   306     topMap.put( "me", new HashSet<String>(Arrays.asList("co", "net", "org", "edu", "ac", "gov",
       
   307                 "its", "priv")));
       
   308     topMap.put( "mg", new HashSet<String>(Arrays.asList("org", "nom", "gov", "prd", "tm",
       
   309                 "edu", "mil", "com")));
       
   310     topMap.put( "mk", new HashSet<String>(Arrays.asList("com", "org", "net", "edu", "gov", "inf",
       
   311                 "name", "pro")));
       
   312     topMap.put( "ml", new HashSet<String>(Arrays.asList("com", "edu", "gouv", "gov", "net",
       
   313                 "org", "presse")));
       
   314     topMap.put( "mn", new HashSet<String>(Arrays.asList("gov", "edu", "org")));
       
   315     topMap.put( "mp", new HashSet<String>(Arrays.asList("gov", "co", "org")));
       
   316     topMap.put( "mu", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "ac",
       
   317                 "co", "or")));
       
   318     topMap.put( "museum", new HashSet<String>(Arrays.asList("academy", "agriculture", "air",
       
   319                 "airguard", "alabama", "alaska", "amber", "ambulance", "american", "americana",
       
   320                 "americanantiques", "americanart", "amsterdam", "and", "annefrank", "anthro",
       
   321                 "anthropology", "antiques", "aquarium", "arboretum", "archaeological", "archaeology",
       
   322                 "architecture", "art", "artanddesign", "artcenter", "artdeco", "arteducation",
       
   323                 "artgallery", "arts", "artsandcrafts", "asmatart", "assassination", "assisi",
       
   324                 "association", "astronomy", "atlanta", "austin", "australia", "automotive", "aviation",
       
   325                 "axis", "badajoz", "baghdad", "bahn", "bale", "baltimore", "barcelona", "baseball",
       
   326                 "basel", "baths", "bauern", "beauxarts", "beeldengeluid", "bellevue", "bergbau",
       
   327                 "berkeley", "berlin", "bern", "bible", "bilbao", "bill", "birdart", "birthplace",
       
   328                 "bonn", "boston", "botanical", "botanicalgarden", "botanicgarden", "botany",
       
   329                 "brandywinevalley", "brasil", "bristol", "british", "britishcolumbia", "broadcast",
       
   330                 "brunel", "brussel", "brussels", "bruxelles", "building", "burghof", "bus", "bushey",
       
   331                 "cadaques", "california", "cambridge", "can", "canada", "capebreton", "carrier",
       
   332                 "cartoonart", "casadelamoneda", "castle", "castres", "celtic", "center", "chattanooga",
       
   333                 "cheltenham", "chesapeakebay", "chicago", "children", "childrens", "childrensgarden",
       
   334                 "chiropractic", "chocolate", "christiansburg", "cincinnati", "cinema", "circus",
       
   335                 "civilisation", "civilization", "civilwar", "clinton", "clock", "coal", "coastaldefence",
       
   336                 "cody", "coldwar", "collection", "colonialwilliamsburg", "coloradoplateau", "columbia",
       
   337                 "columbus", "communication", "communications", "community", "computer",
       
   338                 "computerhistory", "xn--comunicaes-v6a2o", "contemporary", "contemporaryart",
       
   339                 "convent", "copenhagen", "corporation", "xn--correios-e-telecomunicaes-ghc29a",
       
   340                 "corvette", "costume", "countryestate", "county", "crafts", "cranbrook", "creation",
       
   341                 "cultural", "culturalcenter", "culture", "cyber", "cymru", "dali", "dallas", "database",
       
   342                 "ddr", "decorativearts", "delaware", "delmenhorst", "denmark", "depot", "design",
       
   343                 "detroit", "dinosaur", "discovery", "dolls", "donostia", "durham", "eastafrica",
       
   344                 "eastcoast", "education", "educational", "egyptian", "eisenbahn", "elburg",
       
   345                 "elvendrell", "embroidery", "encyclopedic", "england", "entomology", "environment",
       
   346                 "environmentalconservation", "epilepsy", "essex", "estate", "ethnology", "exeter",
       
   347                 "exhibition", "family", "farm", "farmequipment", "farmers", "farmstead", "field",
       
   348                 "figueres", "filatelia", "film", "fineart", "finearts", "finland", "flanders", "florida",
       
   349                 "force", "fortmissoula", "fortworth", "foundation", "francaise", "frankfurt",
       
   350                 "franziskaner", "freemasonry", "freiburg", "fribourg", "frog", "fundacio", "furniture",
       
   351                 "gallery", "garden", "gateway", "geelvinck", "gemological", "geology", "georgia",
       
   352                 "giessen", "glas", "glass", "gorge", "grandrapids", "graz", "guernsey", "halloffame",
       
   353                 "hamburg", "handson", "harvestcelebration", "hawaii", "health", "heimatunduhren",
       
   354                 "hellas", "helsinki", "hembygdsforbund", "heritage", "histoire", "historical",
       
   355                 "historicalsociety", "historichouses", "historisch", "historisches", "history",
       
   356                 "historyofscience", "horology", "house", "humanities", "illustration", "imageandsound",
       
   357                 "indian", "indiana", "indianapolis", "indianmarket", "intelligence", "interactive",
       
   358                 "iraq", "iron", "isleofman", "jamison", "jefferson", "jerusalem", "jewelry",
       
   359                 "jewish", "jewishart", "jfk", "journalism", "judaica", "judygarland", "juedisches",
       
   360                 "juif", "karate", "karikatur", "kids", "koebenhavn", "koeln", "kunst", "kunstsammlung",
       
   361                 "kunstunddesign", "labor", "labour", "lajolla", "lancashire", "landes", "lans",
       
   362                 "xn--lns-qla", "larsson", "lewismiller", "lincoln", "linz", "living", "livinghistory",
       
   363                 "localhistory", "london", "losangeles", "louvre", "loyalist", "lucerne", "luxembourg",
       
   364                 "luzern", "mad", "madrid", "mallorca", "manchester", "mansion", "mansions", "manx",
       
   365                 "marburg", "maritime", "maritimo", "maryland", "marylhurst", "media", "medical",
       
   366                 "medizinhistorisches", "meeres", "memorial", "mesaverde", "michigan", "midatlantic",
       
   367                 "military", "mill", "miners", "mining", "minnesota", "missile", "missoula", "modern",
       
   368                 "moma", "money", "monmouth", "monticello", "montreal", "moscow", "motorcycle", "muenchen",
       
   369                 "muenster", "mulhouse", "muncie", "museet", "museumcenter", "museumvereniging", "music",
       
   370                 "national", "nationalfirearms", "nationalheritage", "nativeamerican", "naturalhistory",
       
   371                 "naturalhistorymuseum", "naturalsciences", "nature", "naturhistorisches",
       
   372                 "natuurwetenschappen", "naumburg", "naval", "nebraska", "neues", "newhampshire",
       
   373                 "newjersey", "newmexico", "newport", "newspaper", "newyork", "niepce", "norfolk",
       
   374                 "north", "nrw", "nuernberg", "nuremberg", "nyc", "nyny", "oceanographic",
       
   375                 "oceanographique", "omaha", "online", "ontario", "openair", "oregon", "oregontrail",
       
   376                 "otago", "oxford", "pacific", "paderborn", "palace", "paleo", "palmsprings", "panama",
       
   377                 "paris", "pasadena", "pharmacy", "philadelphia", "philadelphiaarea", "philately",
       
   378                 "phoenix", "photography", "pilots", "pittsburgh", "planetarium", "plantation",
       
   379                 "plants", "plaza", "portal", "portland", "portlligat", "posts-and-telecommunications",
       
   380                 "preservation", "presidio", "press", "project", "public", "pubol", "quebec",
       
   381                 "railroad", "railway", "research", "resistance", "riodejaneiro", "rochester", "rockart",
       
   382                 "roma", "russia", "saintlouis", "salem", "salvadordali", "salzburg", "sandiego",
       
   383                 "sanfrancisco", "santabarbara", "santacruz", "santafe", "saskatchewan", "satx",
       
   384                 "savannahga", "schlesisches", "schoenbrunn", "schokoladen", "school", "schweiz",
       
   385                 "science", "scienceandhistory", "scienceandindustry", "sciencecenter", "sciencecenters",
       
   386                 "science-fiction", "sciencehistory", "sciences", "sciencesnaturelles", "scotland",
       
   387                 "seaport", "settlement", "settlers", "shell", "sherbrooke", "sibenik", "silk", "ski",
       
   388                 "skole", "society", "sologne", "soundandvision", "southcarolina", "southwest", "space",
       
   389                 "spy", "square", "stadt", "stalbans", "starnberg", "state", "stateofdelaware",
       
   390                 "station", "steam", "steiermark", "stjohn", "stockholm", "stpetersburg", "stuttgart",
       
   391                 "suisse", "surgeonshall", "surrey", "svizzera", "sweden", "sydney", "tank", "tcm",
       
   392                 "technology", "telekommunikation", "television", "texas", "textile", "theater",
       
   393                 "time", "timekeeping", "topology", "torino", "touch", "town", "transport", "tree",
       
   394                 "trolley", "trust", "trustee", "uhren", "ulm", "undersea", "university", "usa",
       
   395                 "usantiques", "usarts", "uscountryestate", "usculture", "usdecorativearts", "usgarden",
       
   396                 "ushistory", "ushuaia", "uslivinghistory", "utah", "uvic", "valley", "vantaa",
       
   397                 "versailles", "viking", "village", "virginia", "virtual", "virtuel", "vlaanderen",
       
   398                 "volkenkunde", "wales", "wallonie", "war", "washingtondc", "watchandclock",
       
   399                 "watch-and-clock", "western", "westfalen", "whaling", "wildlife", "williamsburg",
       
   400                 "windmill", "workshop", "york", "yorkshire", "yosemite", "youth", "zoological",
       
   401                 "zoology", "xn--9dbhblg6di", "xn--h1aegh")));
       
   402     topMap.put( "mv", new HashSet<String>(Arrays.asList("aero", "biz", "com", "coop", "edu", "gov",
       
   403                 "info", "int", "mil", "museum", "name", "net", "org", "pro")));
       
   404     topMap.put( "mw", new HashSet<String>(Arrays.asList("ac", "biz", "co", "com", "coop", "edu",
       
   405                 "gov", "int", "museum", "net", "org")));
       
   406     topMap.put( "mx", new HashSet<String>(Arrays.asList("com", "org", "gob", "edu", "net")));
       
   407     topMap.put( "my", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu",
       
   408                  "mil", "name", "sch")));
       
   409     topMap.put( "na", new HashSet<String>(Arrays.asList("co", "com", "org", "edu", "edunet", "net",
       
   410                 "alt", "biz", "info")));
       
   411     topMap.put( "nc", new HashSet<String>(Arrays.asList("asso", "nom")));
       
   412     topMap.put( "net", new HashSet<String>(Arrays.asList("gb", "se", "uk", "za")));
       
   413     topMap.put( "ng", new HashSet<String>(Arrays.asList("name", "sch", "mil", "mobi", "com",
       
   414                 "edu", "gov", "net", "org")));
       
   415     topMap.put( "nf", new HashSet<String>(Arrays.asList("com", "net", "per", "rec", "web",
       
   416                 "arts", "firm", "info", "other", "store")));
       
   417     topMap.put( "no", new HashSet<String>(Arrays.asList("fhs", "vgs", "fylkesbibl", "folkebibl",
       
   418                 "museum", "idrett", "priv", "mil", "stat", "dep", "kommune", "herad", "aa",
       
   419                 "ah", "bu", "fm", "hl", "hm", "jan-mayen", "mr", "nl", "nt", "of", "ol", "oslo",
       
   420                 "rl", "sf", "st", "svalbard", "tm", "tr", "va", "vf", "akrehamn",
       
   421                 "xn--krehamn-dxa", "algard", "xn--lgrd-poac", "arna", "brumunddal",
       
   422                 "bryne", "bronnoysund", "xn--brnnysund-m8ac", "drobak",
       
   423                 "xn--drbak-wua", "egersund", "fetsund", "floro", "xn--flor-jra",
       
   424                 "fredrikstad", "hokksund", "honefoss", "xn--hnefoss-q1a",
       
   425                 "jessheim", "jorpeland", "xn--jrpeland-54a", "kirkenes", "kopervik",
       
   426                 "krokstadelva", "langevag", "xn--langevg-jxa", "leirvik", "mjondalen",
       
   427                 "xn--mjndalen-64a", "mo-i-rana", "mosjoen", "xn--mosjen-eya",
       
   428                 "nesoddtangen", "orkanger", "osoyro", "xn--osyro-wua",
       
   429                 "raholt", "xn--rholt-mra", "sandnessjoen", "xn--sandnessjen-ogb",
       
   430                 "skedsmokorset", "slattum", "spjelkavik", "stathelle", "stavern", "stjordalshalsen",
       
   431                 "xn--stjrdalshalsen-sqb", "tananger", "tranby", "vossevangen", "tranby",
       
   432                 "vossevangen", "afjord", "xn--fjord-lra", "agdenes", "al",
       
   433                 "xn--l-1fa", "alesund", "xn--lesund-hua",
       
   434                 "alstahaug", "alta", "xn--lt-liac", "alaheadju",
       
   435                 "xn--laheadju-7ya", "alvdal", "amli", "xn--mli-tla",
       
   436                 "amot", "xn--mot-tla", "andebu", "andoy", "xn--andy-ira",
       
   437                 "andasuolo", "ardal", "xn--rdal-poa", "aremark", "arendal",
       
   438                 "xn--s-1fa", "aseral", "xn--seral-lra",
       
   439                 "asker", "askim", "askvoll", "askoy", "xn--asky-ira",
       
   440                 "asnes", "xn--snes-poa", "audnedaln", "aukra", "aure", "aurland",
       
   441                 "aurskog-holand", "xn--aurskog-hland-jnb",
       
   442                 "austevoll", "austrheim", "averoy", "xn--avery-yua",
       
   443                 "balestrand", "ballangen", "balat", "xn--blt-elab",
       
   444                 "balsfjord", "bahccavuotna", "xn--bhccavuotna-k7a",
       
   445                 "bamble", "bardu", "beardu", "beiarn", "bajddar", "xn--bjddar-pta",
       
   446                 "baidar", "xn--bidr-5nac", "berg", "bergen", "berlevag", "xn--berlevg-jxa",
       
   447                 "bearalvahki", "xn--bearalvhki-y4a", "bindal", "birkenes", "bjarkoy",
       
   448                 "xn--bjarky-fya", "bjerkreim", "bjugn", "bodo", "xn--bod-2na",
       
   449                 "badaddja", "xn--bdddj-mrabd", "budejju", "bokn",
       
   450                 "bremanger", "bronnoy", "xn--brnny-wuac", "bygland",
       
   451                 "bykle", "barum", "xn--brum-voa", "bievat", "xn--bievt-0qa",
       
   452                 "bomlo", "xn--bmlo-gra", "batsfjord", "xn--btsfjord-9za", "bahcavuotna",
       
   453                 "xn--bhcavuotna-s4a", "dovre", "drammen", "drangedal", "dyroy",
       
   454                 "xn--dyry-ira", "donna", "xn--dnna-gra",
       
   455                 "eid", "eidfjord", "eidsberg", "eidskog", "eidsvoll", "eigersund", "elverum",
       
   456                 "enebakk", "engerdal", "etne", "etnedal", "evenes", "evenassi",
       
   457                 "xn--eveni-0qa01ga", "evje-og-hornnes", "farsund", "fauske",
       
   458                 "fuossko", "fuoisku", "fedje", "fet", "finnoy", "xn--finny-yua",
       
   459                 "fitjar", "fjaler", "fjell", "flakstad", "flatanger", "flekkefjord", "flesberg",
       
   460                 "flora", "fla", "xn--fl-zia", "folldal", "forsand", "fosnes", "frei",
       
   461                 "frogn", "froland", "frosta", "frana", "xn--frna-woa",
       
   462                 "froya", "xn--frya-hra", "fusa", "fyresdal", "forde",
       
   463                 "xn--frde-gra", "gamvik", "gangaviika", "xn--ggaviika-8ya47h",
       
   464                 "gaular", "gausdal", "gildeskal", "xn--gildeskl-g0a",
       
   465                 "giske", "gjemnes", "gjerdrum", "gjerstad", "gjesdal", "gjovik",
       
   466                 "xn--gjvik-wua", "gloppen", "gol", "gran", "grane", "granvin",
       
   467                 "gratangen", "grimstad", "grong", "kraanghke", "xn--kranghke-b0a",
       
   468                 "grue", "gulen", "hadsel", "halden", "halsa", "hamar", "hamaroy", "habmer",
       
   469                 "xn--hbmer-xqa",  "hapmir", "xn--hpmir-xqa",
       
   470                 "hammerfest", "hammarfeasta", "xn--hmmrfeasta-s4ac",
       
   471                 "haram", "hareid", "harstad", "hasvik", "aknoluokta", "xn--koluokta-7ya57h",
       
   472                 "hattfjelldal", "aarborte", "haugesund", "hemne", "hemnes", "hemsedal",
       
   473                 "hitra", "hjartdal", "hjelmeland",
       
   474                 "hobol", "xn--hobl-ira", "hof", "hol", "hole", "holmestrand", "holtalen",
       
   475                 "xn--holtlen-hxa", "hornindal", "horten", "hurdal", "hurum", "hvaler",
       
   476                 "hyllestad", "hagebostad", "xn--hgebostad-g3a",  "hoyanger",
       
   477                 "xn--hyanger-q1a", "hoylandet", "xn--hylandet-54a",
       
   478                 "ha", "xn--h-2fa", "ibestad", "inderoy", "xn--indery-fya",
       
   479                 "iveland", "jevnaker", "jondal", "jolster", "xn--jlster-bya",
       
   480                 "karasjok", "karasjohka", "xn--krjohka-hwab49j",
       
   481                 "karlsoy", "galsa", "xn--gls-elac", "karmoy",
       
   482                 "xn--karmy-yua", "kautokeino", "guovdageaidnu", "klepp", "klabu",
       
   483                 "xn--klbu-woa", "kongsberg", "kongsvinger", "kragero", "xn--krager-gya",
       
   484                 "kristiansand", "kristiansund", "krodsherad", "xn--krdsherad-m8a",
       
   485                 "kvalsund", "rahkkeravju", "xn--rhkkervju-01af",
       
   486                 "kvam", "kvinesdal", "kvinnherad", "kviteseid", "kvitsoy", "xn--kvitsy-fya",
       
   487                 "kvafjord", "xn--kvfjord-nxa", "giehtavuoatna", "kvanangen",
       
   488                 "xn--kvnangen-k0a", "navuotna", "xn--nvuotna-hwa",
       
   489                 "kafjord", "xn--kfjord-iua", "gaivuotna", "xn--givuotna-8ya",
       
   490                 "larvik", "lavangen", "lavagis", "loabat", "xn--loabt-0qa",
       
   491                 "lebesby", "davvesiida", "leikanger", "leirfjord", "leka", "leksvik", "lenvik",
       
   492                 "leangaviika", "xn--leagaviika-52b", "lesja", "levanger", "lier", "lierne",
       
   493                 "lillehammer", "lillesand", "lindesnes", "lindas", "xn--linds-pra",
       
   494                 "lom", "loppa", "lahppi", "xn--lhppi-xqa", "lund", "lunner", "luroy",
       
   495                 "xn--lury-ira", "luster", "lyngdal", "lyngen", "ivgu", "lardal", "lerdal",
       
   496                 "xn--lrdal-sra", "lodingen", "xn--ldingen-q1a", "lorenskog",
       
   497                 "xn--lrenskog-54a", "loten", "xn--lten-gra",  "malvik",
       
   498                 "masoy", "xn--msy-ula0h", "muosat", "xn--muost-0qa",
       
   499                 "mandal", "marker", "marnardal", "masfjorden", "meland", "meldal", "melhus",
       
   500                 "meloy", "xn--mely-ira", "meraker", "xn--merker-kua", "moareke",
       
   501                 "xn--moreke-jua", "midsund", "midtre-gauldal", "modalen", "modum",
       
   502                 "molde", "moskenes", "moss", "mosvik", "malselv", "xn--mlselv-iua",
       
   503                 "malatvuopmi", "xn--mlatvuopmi-s4a", "namdalseid", "aejrie", "namsos",
       
   504                 "namsskogan", "naamesjevuemie", "xn--nmesjevuemie-tcba",
       
   505                 "laakesvuemie", "nannestad", "narvik", "narviika", "naustdal", "nedre-eiker",
       
   506                 "nesna", "nesodden", "nesseby", "unjarga", "xn--unjrga-rta", "nesset",
       
   507                 "nissedal", "nittedal", "nord-aurdal", "nord-fron", "nord-odal", "norddal",
       
   508                 "nordkapp", "davvenjarga", "xn--davvenjrga-y4a", "nordre-land",
       
   509                 "nordreisa", "raisa", "xn--risa-5na", "nore-og-uvdal", "notodden", "naroy",
       
   510                 "xn--nry-yla5g", "notteroy", "xn--nttery-byae",
       
   511                 "odda", "oksnes", "xn--ksnes-uua", "oppdal", "oppegard",
       
   512                 "xn--oppegrd-ixa", "orkdal", "orland", "xn--rland-uua",
       
   513                 "orskog", "xn--rskog-uua", "orsta", "xn--rsta-fra",
       
   514                 "os.hedmark", "os.hordaland", "osen", "osteroy", "xn--ostery-fya",
       
   515                 "ostre-toten", "xn--stre-toten-zcb", "overhalla", "ovre-eiker",
       
   516                 "xn--vre-eiker-k8a", "oyer", "xn--yer-zna",
       
   517                 "oygarden", "xn--ygarden-p1a",  "oystre-slidre", "xn--ystre-slidre-ujb",
       
   518                 "porsanger", "porsangu", "xn--porsgu-sta26f", "porsgrunn",
       
   519                 "radoy", "xn--rady-ira", "rakkestad", "rana", "ruovat", "randaberg",
       
   520                 "rauma", "rendalen", "rennebu", "rennesoy", "xn--rennesy-v1a",
       
   521                 "rindal", "ringebu", "ringerike", "ringsaker", "rissa", "risor",
       
   522                 "xn--risr-ira", "roan", "rollag", "rygge", "ralingen", "xn--rlingen-mxa",
       
   523                 "rodoy", "xn--rdy-0nab", "romskog", "xn--rmskog-bya",
       
   524                 "roros", "xn--rros-gra", "rost", "xn--rst-0na",
       
   525                 "royken", "xn--ryken-vua", "royrvik", "xn--ryrvik-bya",
       
   526                 "rade", "xn--rde-ula", "salangen", "siellak", "saltdal", "salat",
       
   527                 "xn--slt-elab", "xn--slat-5na", "samnanger",
       
   528                 "sandefjord", "sandnes", "sandoy", "xn--sandy-yua", "sarpsborg",
       
   529                 "sauda", "sauherad", "sel", "selbu", "selje", "seljord", "sigdal", "siljan",
       
   530                 "sirdal", "skaun", "skedsmo", "ski", "skien", "skiptvet", "skjervoy",
       
   531                 "xn--skjervy-v1a", "skierva", "xn--skierv-uta",
       
   532                 "skjak", "xn--skjk-soa",  "skodje", "skanland", "xn--sknland-fxa",
       
   533                 "skanit", "xn--sknit-yqa",  "smola", "xn--smla-hra",
       
   534                 "snillfjord", "snasa", "xn--snsa-roa",  "snoasa", "snaase",
       
   535                 "xn--snase-nra", "sogndal", "sokndal", "sola", "solund", "songdalen",
       
   536                 "sortland", "spydeberg", "stange", "stavanger", "steigen", "steinkjer",
       
   537                 "stjordal", "xn--stjrdal-s1a", "stokke", "stor-elvdal", "stord", "stordal",
       
   538                 "storfjord", "omasvuotna", "strand", "stranda", "stryn", "sula", "suldal",
       
   539                 "sund", "sunndal", "surnadal", "sveio", "svelvik", "sykkylven", "sogne",
       
   540                 "xn--sgne-gra", "somna", "xn--smna-gra", "sondre-land",
       
   541                 "xn--sndre-land-0cb", "sor-aurdal", "xn--sr-aurdal-l8a",
       
   542                 "sor-fron", "xn--sr-fron-q1a", "sor-odal", "xn--sr-odal-q1a",
       
   543                 "sor-varanger", "xn--sr-varanger-ggb",  "matta-varjjat",
       
   544                 "xn--mtta-vrjjat-k7af", "sorfold", "xn--srfold-bya",
       
   545                 "sorreisa", "xn--srreisa-q1a", "sorum", "xn--srum-gra",
       
   546                 "tana", "deatnu", "time", "tingvoll", "tinn", "tjeldsund", "dielddanuorri",
       
   547                 "tjome", "xn--tjme-hra", "tokke", "tolga", "torsken", "tranoy",
       
   548                 "xn--trany-yua",  "tromso", "xn--troms-zua",  "tromsa", "romsa",
       
   549                 "trondheim", "troandin", "trysil", "trana", "xn--trna-woa",
       
   550                 "trogstad", "xn--trgstad-r1a",  "tvedestrand", "tydal", "tynset",
       
   551                 "tysfjord", "divtasvuodna", "divttasvuotna", "tysnes", "tysvar",
       
   552                 "xn--tysvr-vra",  "tonsberg", "xn--tnsberg-q1a",
       
   553                 "ullensaker", "ullensvang", "ulvik", "utsira", "vadso", "xn--vads-jra",
       
   554                 "cahcesuolo", "xn--hcesuolo-7ya35b",  "vaksdal", "valle", "vang",
       
   555                 "vanylven", "vardo", "xn--vard-jra",  "varggat", "xn--vrggt-xqad",
       
   556                 "vefsn", "vaapste", "vega", "vegarshei", "xn--vegrshei-c0a", "vennesla",
       
   557                 "verdal", "verran", "vestby", "vestnes", "vestre-slidre", "vestre-toten",
       
   558                 "vestvagoy", "xn--vestvgy-ixa6o", "vevelstad", "vik", "vikna",
       
   559                 "vindafjord", "volda", "voss", "varoy", "xn--vry-yla5g",
       
   560                 "vagan", "xn--vgan-qoa", "voagat", "vagsoy", "xn--vgsy-qoa0j",
       
   561                 "vaga", "xn--vg-yiab")));
       
   562 
       
   563     topMap.put( "nr", new HashSet<String>(Arrays.asList("biz", "info", "gov", "edu", "org",
       
   564                  "net", "com", "co")));
       
   565     topMap.put( "pa", new HashSet<String>(Arrays.asList("ac", "gob", "com", "org",
       
   566                 "sld", "edu", "net", "ing", "abo", "med", "nom")));
       
   567     topMap.put( "pe", new HashSet<String>(Arrays.asList("edu", "gob", "nom", "mil", "org", "com",
       
   568                 "net", "sld")));
       
   569     topMap.put( "pf", new HashSet<String>(Arrays.asList( "com")));
       
   570     topMap.put( "ph", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "ngo", "mil")));
       
   571     topMap.put( "pk", new HashSet<String>(Arrays.asList("com", "net", "edu", "org", "fam", "biz",
       
   572                 "web", "gov", "gob", "gok", "gon", "gop", "gos", "gog", "gkp", "info")));
       
   573     topMap.put( "pl", new HashSet<String>(Arrays.asList("aid", "agro", "atm", "auto", "biz", "com",
       
   574                 "edu", "gmina", "gsm", "info", "mail", "miasta", "media", "mil", "net", "nieruchomosci",
       
   575                 "nom", "org", "pc", "powiat", "priv", "realestate", "rel", "sex", "shop", "sklep",
       
   576                 "sos", "szkola", "targi", "tm", "tourism", "travel", "turystyka", "art",
       
   577                 "gov", "ngo", "augustow", "babia-gora", "bedzin", "beskidy",
       
   578                 "bialowieza", "bialystok", "bielawa", "bieszczady", "boleslawiec", "bydgoszcz",
       
   579                 "bytom", "cieszyn", "czeladz", "czest", "dlugoleka", "elblag", "elk", "glogow",
       
   580                 "gniezno", "gorlice", "grajewo", "ilawa", "jaworzno", "jelenia-gora", "jgora",
       
   581                 "kalisz", "kazimierz-dolny", "karpacz", "kartuzy", "kaszuby", "katowice", "kepno",
       
   582                 "ketrzyn", "klodzko", "kobierzyce", "kolobrzeg", "konin", "konskowola", "kutno",
       
   583                 "lapy", "lebork", "legnica", "lezajsk", "limanowa", "lomza", "lowicz", "lubin",
       
   584                 "lukow", "malbork", "malopolska", "mazowsze", "mazury", "mielec", "mielno", "mragowo",
       
   585                 "naklo", "nowaruda", "nysa", "olawa", "olecko", "olkusz", "olsztyn", "opoczno",
       
   586                 "opole", "ostroda", "ostroleka", "ostrowiec", "ostrowwlkp", "pila", "pisz", "podhale",
       
   587                 "podlasie", "polkowice", "pomorze", "pomorskie", "prochowice", "pruszkow", "przeworsk",
       
   588                 "pulawy", "radom", "rawa-maz", "rybnik", "rzeszow", "sanok", "sejny", "siedlce",
       
   589                 "slask", "slupsk", "sosnowiec", "stalowa-wola", "skoczow", "starachowice", "stargard",
       
   590                 "suwalki", "swidnica", "swiebodzin", "swinoujscie", "szczecin", "szczytno", "tarnobrzeg",
       
   591                 "tgory", "turek", "tychy", "ustka", "walbrzych", "warmia", "warszawa", "waw",
       
   592                 "wegrow", "wielun", "wlocl", "wloclawek", "wodzislaw", "wolomin", "wroclaw",
       
   593                 "zachpomor", "zagan", "zarow", "zgora", "zgorzelec", "gda", "gdansk",
       
   594                 "krakow", "poznan", "wroc", "co",
       
   595                 "lodz", "lublin", "torun")));
       
   596     topMap.put( "pn", new HashSet<String>(Arrays.asList("gov", "co", "org", "edu", "net")));
       
   597     topMap.put( "pr", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "isla",
       
   598                 "pro", "biz", "info", "name", "est", "prof", "ac", "gobierno")));
       
   599     topMap.put( "pro", new HashSet<String>(Arrays.asList("aca", "bar", "cpa", "jur", "law",
       
   600                  "med", "eng")));
       
   601     topMap.put( "ps", new HashSet<String>(Arrays.asList("edu", "gov", "sec", "plo", "com", "org", "net")));
       
   602     topMap.put( "pt", new HashSet<String>(Arrays.asList("net", "gov", "org", "edu", "int", "publ",
       
   603                  "com", "nome")));
       
   604     topMap.put( "pw", new HashSet<String>(Arrays.asList("co", "ne", "or", "ed", "go", "belau")));
       
   605     topMap.put( "qa", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "mil")));
       
   606     topMap.put( "re", new HashSet<String>(Arrays.asList("com", "asso", "nom")));
       
   607     topMap.put( "ro", new HashSet<String>(Arrays.asList("com", "org", "tm", "nt", "nom", "info",
       
   608                 "rec", "arts", "firm", "store", "www")));
       
   609     topMap.put( "rs", new HashSet<String>(Arrays.asList("co", "org", "edu", "ac", "gov", "in")));
       
   610     topMap.put( "ru", new HashSet<String>(Arrays.asList("ac", "com", "edu", "int", "net", "org",
       
   611                 "pp", "adygeya", "altai", "amur", "arkhangelsk", "astrakhan", "bashkiria",
       
   612                 "belgorod", "bir", "bryansk", "buryatia", "cap", "cbg", "chel", "chelyabinsk", "chita",
       
   613                 "chukotka", "dagestan", "e-burg", "grozny", "irkutsk",
       
   614                 "ivanovo", "izhevsk", "jar", "joshkar-ola", "kalmykia", "kaluga", "kamchatka",
       
   615                 "karelia", "kazan", "kchr", "kemerovo", "khabarovsk", "khakassia", "khv", "kirov",
       
   616                 "koenig", "komi", "kostroma", "krasnoyarsk", "kuban", "kurgan", "kursk", "lipetsk",
       
   617                 "magadan", "mari", "mari-el", "marine", "mordovia", "mosreg", "msk", "murmansk",
       
   618                 "nalchik", "nnov", "nov", "novosibirsk", "nsk", "omsk", "orenburg", "oryol",
       
   619                 "palana", "penza", "perm", "pskov", "ptz", "rnd", "ryazan", "sakhalin", "samara",
       
   620                 "saratov", "simbirsk", "smolensk", "spb", "stavropol", "stv", "surgut", "tambov",
       
   621                 "tatarstan", "tom", "tomsk", "tsaritsyn", "tsk", "tula", "tuva", "tver", "tyumen",
       
   622                 "udm", "udmurtia", "ulan-ude", "vladikavkaz", "vladimir", "vladivostok", "volgograd",
       
   623                 "vologda", "voronezh", "vrn", "vyatka", "yakutia", "yamal", "yaroslavl",
       
   624                 "yekaterinburg", "yuzhno-sakhalinsk", "amursk", "baikal", "cmw", "fareast",
       
   625                 "jamal", "kms", "k-uralsk", "kustanai", "kuzbass", "magnitka", "mytis",
       
   626                 "nakhodka", "nkz", "norilsk", "oskol", "pyatigorsk", "rubtsovsk", "snz", "syzran",
       
   627                 "vdonsk", "zgrad", "gov", "mil", "test")));
       
   628     topMap.put( "rw", new HashSet<String>(Arrays.asList("gov", "net", "edu", "ac", "com", "co",
       
   629                 "int", "mil", "gouv")));
       
   630     topMap.put( "sa", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "med", "pub",
       
   631                 "edu", "sch")));
       
   632     topMap.put( "sd", new HashSet<String>(Arrays.asList("com", "net", "org", "edu", "med", "gov",
       
   633                 "info", "tv")));
       
   634     topMap.put( "se", new HashSet<String>(Arrays.asList("a", "ac", "b", "bd", "brand", "c", "d",
       
   635                 "e", "f", "fh", "fhsk", "fhv", "g", "h", "i", "k", "komforb", "kommunalforbund",
       
   636                 "komvux", "l", "lanarb", "lanbib", "m", "n", "naturbruksgymn", "o", "org", "p", "parti",
       
   637                 "pp", "press", "r", "s", "sshn", "t", "tm", "u", "w", "x", "y", "z")));
       
   638     topMap.put( "sg", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "per")));
       
   639     topMap.put( "sh", new HashSet<String>(Arrays.asList("co", "com", "net", "org", "gov", "edu", "nom")));
       
   640     topMap.put( "sk", new HashSet<String>(Arrays.asList("gov", "edu")));
       
   641     topMap.put( "sn", new HashSet<String>(Arrays.asList("art", "com", "edu", "gouv", "org", "perso",
       
   642                 "univ")));
       
   643     topMap.put( "so", new HashSet<String>(Arrays.asList("com", "net", "org")));
       
   644     topMap.put( "sr", new HashSet<String>(Arrays.asList("co", "com", "consulado", "edu", "embaixada",
       
   645                 "gov", "mil", "net", "org", "principe", "saotome", "store")));
       
   646     topMap.put( "sy", new HashSet<String>(Arrays.asList("edu", "gov", "net", "mil", "com", "org", "news")));
       
   647     topMap.put( "sz", new HashSet<String>(Arrays.asList("co", "ac", "org")));
       
   648     topMap.put( "th", new HashSet<String>(Arrays.asList("ac", "co", "go", "in", "mi", "net", "or")));
       
   649     topMap.put( "tj", new HashSet<String>(Arrays.asList("ac", "biz", "co", "com", "edu", "go", "gov",
       
   650                 "int", "mil", "name", "net", "nic", "org", "test", "web")));
       
   651     topMap.put( "tn", new HashSet<String>(Arrays.asList("com", "ens", "fin", "gov", "ind", "intl",
       
   652                 "nat", "net", "org", "info", "perso", "tourism", "edunet", "rnrt", "rns", "rnu",
       
   653                 "mincom", "agrinet", "defense", "turen")));
       
   654     topMap.put( "to", new HashSet<String>(Arrays.asList("gov")));
       
   655     topMap.put( "tt", new HashSet<String>(Arrays.asList("co", "com", "org", "net", "biz", "info",
       
   656                 "pro", "int", "coop", "jobs", "mobi", "travel", "museum", "aero", "name", "gov",
       
   657                 "edu", "cat", "tel", "mil")));
       
   658     topMap.put( "tw", new HashSet<String>(Arrays.asList("edu", "gov", "mil", "com", "net", "org",
       
   659                 "idv", "game", "ebiz", "club", "xn--zf0ao64a", "xn--uc0atv", "xn--czrw28b")));
       
   660     topMap.put( "ua", new HashSet<String>(Arrays.asList("com", "edu", "gov", "in", "net", "org",
       
   661                 "cherkassy", "chernigov", "chernovtsy", "ck", "cn", "crimea", "cv", "dn",
       
   662                 "dnepropetrovsk", "donetsk", "dp", "if", "ivano-frankivsk", "kh", "kharkov",
       
   663                 "kherson", "kiev", "kirovograd", "km", "kr", "ks", "lg",
       
   664                 "lugansk", "lutsk", "lviv", "mk", "nikolaev", "od", "odessa", "pl", "poltava",
       
   665                 "rovno", "rv", "sebastopol", "sumy", "te", "ternopil", "uzhgorod", "vinnica", "vn",
       
   666                 "zaporizhzhe", "zp", "zhitomir", "zt", "cr", "lt", "lv", "sb", "sm", "tr",
       
   667                 "co", "biz", "in", "ne", "pp", "uz", "dominic")));
       
   668     topMap.put( "ug", new HashSet<String>(Arrays.asList("co", "ac", "sc", "go", "ne", "or", "org", "com")));
       
   669     topMap.put( "us", new HashSet<String>(Arrays.asList("dni", "fed", "isa", "kids", "nsn", "kyschools")));
       
   670     topMap.put( "uz", new HashSet<String>(Arrays.asList("co", "com", "org", "gov", "ac", "edu", "int", "pp", "net")));
       
   671     topMap.put( "vc", new HashSet<String>(Arrays.asList("com", "net", "org", "gov")));
       
   672     topMap.put( "vi", new HashSet<String>(Arrays.asList("co", "com", "k12", "net", "org")));
       
   673     topMap.put( "vn", new HashSet<String>(Arrays.asList( "com", "net", "org", "edu", "gov", "int",
       
   674                 "ac", "biz", "info", "name", "pro", "health")));
       
   675     topMap.put( "vu", new HashSet<String>(Arrays.asList("co", "com", "net", "org", "edu", "gov", "de")));
       
   676     topMap.put("org", new HashSet<String>(Arrays.asList("ae", "za")));
       
   677     topMap.put("pro", new HashSet<String>(Arrays.asList("aca", "bar", "cpa", "jur", "law", "med", "eng")));
       
   678 
       
   679     top3Map.put("au", new HashSet<String>(Arrays.asList("act.edu.au", "eq.edu.au",
       
   680                 "nsw.edu.au", "nt.edu.au", "qld.edu.au", "sa.edu.au", "tas.edu.au", "vic.edu.au",
       
   681                  "wa.edu.au", "act.gov.au", "nsw.gov.au", "nt.gov.au", "qld.gov.au", "sa.gov.au",
       
   682                  "tas.gov.au", "vic.gov.au", "wa.gov.au")));
       
   683     top3Map.put("im", new HashSet<String>(Arrays.asList("ltd.co.im", "plc.co.im")));
       
   684     top3Map.put("no", new HashSet<String>(Arrays.asList("gs.aa.no", "gs.ah.no", "gs.bu.no",
       
   685                 "gs.fm.no", "gs.hl.no", "gs.hm.no", "gs.jan-mayen.no", "gs.mr.no", "gs.nl.no",
       
   686                 "gs.nt.no", "gs.of.no", "gs.ol.no", "gs.oslo.no", "gs.rl.no", "gs.sf.no",
       
   687                 "gs.st.no", "gs.svalbard.no", "gs.tm.no", "gs.tr.no", "gs.va.no", "gs.vf.no",
       
   688                 "bo.telemark.no", "xn--b-5ga.telemark.no", "bo.nordland.no",
       
   689                 "xn--b-5ga.nordland.no", "heroy.more-og-romsdal.no",
       
   690                 "xn--hery-ira.xn--mre-og-romsdal-qqb.no", "heroy.nordland.no",
       
   691                 "xn--hery-ira.nordland.no", "nes.akershus.no", "nes.buskerud.no",
       
   692                 "os.hedmark.no", "os.hordaland.no",
       
   693                 "sande.more-og-romsdal.no", "sande.xn--mre-og-romsdal-qqb.no",
       
   694                 "sande.vestfold.no", "valer.ostfold.no", "xn--vler-qoa.xn--stfold-9xa.no",
       
   695                 "valer.hedmark.no", "xn--vler-qoa.hedmark.no")));
       
   696     top3Map.put("tr", new HashSet<String>(Arrays.asList("gov.nc.tr")));
       
   697 }
       
   698 
       
   699 
       
   700     /*
       
   701      * Return the registered part of a qualified domain
       
   702      * name or the original if no match is found.
       
   703      */
       
   704     public static String getRegisteredDomain(String cname) {
       
   705         int dot;
       
   706 
       
   707         /*
       
   708          * If one dot or less than just return.
       
   709          */
       
   710         dot = cname.lastIndexOf('.');
       
   711         if (dot == -1)
       
   712             return cname;
       
   713         if (dot == 0)
       
   714             return "";
       
   715         if (dot == cname.length() - 1) {
       
   716             cname = cname.substring(0, cname.length() -1);
       
   717             dot = cname.lastIndexOf('.');
       
   718             if (dot == -1)
       
   719                 return cname;
       
   720             if (dot == 0)
       
   721                 return "";
       
   722         }
       
   723         if (dot == cname.length() - 1)
       
   724             return "";
       
   725 
       
   726         /*
       
   727          * Break it up into seperate labels.
       
   728          */
       
   729         int second = cname.lastIndexOf('.', dot - 1);
       
   730         if (second == -1)
       
   731             return cname;
       
   732         if (second == 0)
       
   733             return "";
       
   734         int third = cname.lastIndexOf('.', second - 1);
       
   735         int fourth = -1;
       
   736         if (third > 0) {
       
   737             fourth = cname.lastIndexOf('.', third - 1);
       
   738         }
       
   739         int fifth = -1;
       
   740         if (fourth > 0) {
       
   741             fifth = cname.lastIndexOf('.', fourth - 1);
       
   742         }
       
   743         String s = cname.substring(dot + 1);
       
   744         String s2 = cname.substring(second + 1, dot);
       
   745 
       
   746         /*
       
   747          * Look for longest matches first.
       
   748          * XX.PVT.K12.MA.US etc.
       
   749          */
       
   750         if (fourth != -1 && s.equals("us") && usStateSet.contains(s2)) {
       
   751             String s3 = cname.substring(third + 1, second);
       
   752             String s4 = cname.substring(fourth + 1, third);
       
   753             if (s3.equals("k12")) {
       
   754                 if (s2.equals("ma") && (s4.equals("chtr") || s4.equals("paroch"))) {
       
   755                     return cname.substring(fifth + 1);
       
   756                 } else if (s4.equals("pvt")) {
       
   757                     return cname.substring(fifth + 1);
       
   758                 }
       
   759             }
       
   760         }
       
   761 
       
   762         /*
       
   763          * XX.K12.MA.US.
       
   764          */
       
   765         String str = cname.substring(third + 1);
       
   766         if (third != -1) {
       
   767             Set set = top3Map.get(s);
       
   768             if (set != null) {
       
   769                 if (set.contains(str)) {
       
   770                     return cname.substring(fourth + 1);
       
   771                 }
       
   772             } else if (s.equals("us") && usStateSet.contains(s2)) {
       
   773                 // check for known third level labels
       
   774                 String s3 = cname.substring(third + 1, second);
       
   775                 if (usSubStateSet.contains(s3)) {
       
   776                     return fourth != -1? cname.substring(fourth + 1): cname;
       
   777                 } else {
       
   778                     return cname.substring(third + 1);
       
   779                 }
       
   780             } else if (s.equals("uk")) {
       
   781                 if (s2.equals("sch")) {
       
   782                     return cname.substring(fourth + 1);
       
   783                 }
       
   784             } else if (s.equals("jp")) {
       
   785                 if (jpSet.contains(s2)) {
       
   786                     if (jp2Set.contains(str)) {
       
   787                         return cname.substring(third + 1);
       
   788                     }
       
   789                     return cname.substring(fourth + 1);
       
   790                 }
       
   791             }
       
   792         }
       
   793 
       
   794         /*
       
   795          * PREF.AKITA.JP etc.
       
   796          */
       
   797         if (jp2Set.contains(str)) {
       
   798             return cname.substring(third + 1);
       
   799         }
       
   800 
       
   801         /*
       
   802          * XX.MA.US.
       
   803          */
       
   804         Set topSet = topMap.get(s);
       
   805         if (topSet != null) {
       
   806             if (topSet.contains(s2)) {
       
   807                 return cname.substring(third + 1);
       
   808             }
       
   809             if (!((s.equals("us") && usStateSet.contains(s2)) || (s.equals("jp") && jpSet.contains(s2)))) {
       
   810                 return cname.substring(second + 1);
       
   811             }
       
   812         } else if (top2Set.contains(s)) {
       
   813             if (s2.equals("gov")) {
       
   814                 return cname.substring(third + 1);
       
   815             }
       
   816             return cname.substring(second + 1);
       
   817         } else if (top3Set.contains(s)) {
       
   818             if (s.equals("ad") && s2.equals("nom") ||
       
   819                 s.equals("aw") && s2.equals("com") ||
       
   820                 s.equals("be") && s2.equals("ac") ||
       
   821                 s.equals("cl") && s2.equals("gov") ||
       
   822                 s.equals("cl") && s2.equals("gob") ||
       
   823                 s.equals("fi") && s2.equals("aland") ||
       
   824                 s.equals("int") && s2.equals("eu") ||
       
   825                 s.equals("io") && s2.equals("com") ||
       
   826                 s.equals("mc") && s2.equals("tm") ||
       
   827                 s.equals("mc") && s2.equals("asso") ||
       
   828                 s.equals("vc") && s2.equals("com")) {
       
   829                 return cname.substring(third + 1);
       
   830             }
       
   831             return cname.substring(second + 1);
       
   832         } else if (top4Set.contains(s)) {
       
   833             if (s2.equals("com") || s2.equals("edu") || s2.equals("gov") ||
       
   834                 s2.equals("net") || s2.equals("org")) {
       
   835                 return cname.substring(third + 1);
       
   836             }
       
   837             return cname.substring(second + 1);
       
   838         } else if (top5Set.contains(s)) {
       
   839             return cname.substring(third + 1);
       
   840         }
       
   841 
       
   842         /*
       
   843          * BB.AA exception cases.
       
   844          */
       
   845         if (s.equals("tr")) {
       
   846             if (!s2.equals("nic") && !s2.equals("tsk")) {
       
   847                 return cname.substring(third + 1);
       
   848             }
       
   849             return cname.substring(second + 1);
       
   850         } else if (s.equals("uk")) {
       
   851             if (!ukSet.contains(s2)) {
       
   852                 return cname.substring(third + 1);
       
   853             }
       
   854             return cname.substring(second + 1);
       
   855         } else if (s.equals("ar")) {
       
   856             if (!arSet.contains(s2)) {
       
   857                 return cname.substring(third + 1);
       
   858             }
       
   859             return cname.substring(second + 1);
       
   860         } else if (s.equals("om")) {
       
   861             if (!omSet.contains(s2)) {
       
   862                 return cname.substring(third + 1);
       
   863             }
       
   864             return cname.substring(second + 1);
       
   865         }
       
   866 
       
   867         /*
       
   868          * XX.AA
       
   869          */
       
   870         if (top1Set.contains(s)) {
       
   871             return cname.substring(second + 1);
       
   872         }
       
   873 
       
   874         /*
       
   875          * Nothing matched so we can't shorten the string.
       
   876          */
       
   877         return cname;
       
   878      }
       
   879 }