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 */ getRegisteredDomain(String cname)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 } 880