UNPKG

tldts-icann

Version:

Library to work against complex domain names, subdomains and URIs. Only contains ICANN section.

563 lines (553 loc) 130 kB
'use strict'; /** * Check if `vhost` is a valid suffix of `hostname` (top-domain) * * It means that `vhost` needs to be a suffix of `hostname` and we then need to * make sure that: either they are equal, or the character preceding `vhost` in * `hostname` is a '.' (it should not be a partial label). * * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok */ function shareSameDomainSuffix(hostname, vhost) { if (hostname.endsWith(vhost)) { return (hostname.length === vhost.length || hostname[hostname.length - vhost.length - 1] === '.'); } return false; } /** * Given a hostname and its public suffix, extract the general domain. */ function extractDomainWithSuffix(hostname, publicSuffix) { // Locate the index of the last '.' in the part of the `hostname` preceding // the public suffix. // // examples: // 1. not.evil.co.uk => evil.co.uk // ^ ^ // | | start of public suffix // | index of the last dot // // 2. example.co.uk => example.co.uk // ^ ^ // | | start of public suffix // | // | (-1) no dot found before the public suffix const publicSuffixIndex = hostname.length - publicSuffix.length - 2; const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex); // No '.' found, then `hostname` is the general domain (no sub-domain) if (lastDotBeforeSuffixIndex === -1) { return hostname; } // Extract the part between the last '.' return hostname.slice(lastDotBeforeSuffixIndex + 1); } /** * Detects the domain based on rules and upon and a host string */ function getDomain$1(suffix, hostname, options) { // Check if `hostname` ends with a member of `validHosts`. if (options.validHosts !== null) { const validHosts = options.validHosts; for (const vhost of validHosts) { if ( /*@__INLINE__*/shareSameDomainSuffix(hostname, vhost)) { return vhost; } } } let numberOfLeadingDots = 0; if (hostname.startsWith('.')) { while (numberOfLeadingDots < hostname.length && hostname[numberOfLeadingDots] === '.') { numberOfLeadingDots += 1; } } // If `hostname` is a valid public suffix, then there is no domain to return. // Since we already know that `getPublicSuffix` returns a suffix of `hostname` // there is no need to perform a string comparison and we only compare the // size. if (suffix.length === hostname.length - numberOfLeadingDots) { return null; } // To extract the general domain, we start by identifying the public suffix // (if any), then consider the domain to be the public suffix with one added // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix: // `co.uk`, then we take one more level: `evil`, giving the final result: // `evil.co.uk`). return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix); } /** * Return the part of domain without suffix. * * Example: for domain 'foo.com', the result would be 'foo'. */ function getDomainWithoutSuffix$1(domain, suffix) { // Note: here `domain` and `suffix` cannot have the same length because in // this case we set `domain` to `null` instead. It is thus safe to assume // that `suffix` is shorter than `domain`. return domain.slice(0, -suffix.length - 1); } /** * @param url - URL we want to extract a hostname from. * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname. */ function extractHostname(url, urlIsValidHostname) { let start = 0; let end = url.length; let hasUpper = false; // If url is not already a valid hostname, then try to extract hostname. if (!urlIsValidHostname) { // Special handling of data URLs if (url.startsWith('data:')) { return null; } // Trim leading spaces while (start < url.length && url.charCodeAt(start) <= 32) { start += 1; } // Trim trailing spaces while (end > start + 1 && url.charCodeAt(end - 1) <= 32) { end -= 1; } // Skip scheme. if (url.charCodeAt(start) === 47 /* '/' */ && url.charCodeAt(start + 1) === 47 /* '/' */) { start += 2; } else { const indexOfProtocol = url.indexOf(':/', start); if (indexOfProtocol !== -1) { // Implement fast-path for common protocols. We expect most protocols // should be one of these 4 and thus we will not need to perform the // more expansive validity check most of the time. const protocolSize = indexOfProtocol - start; const c0 = url.charCodeAt(start); const c1 = url.charCodeAt(start + 1); const c2 = url.charCodeAt(start + 2); const c3 = url.charCodeAt(start + 3); const c4 = url.charCodeAt(start + 4); if (protocolSize === 5 && c0 === 104 /* 'h' */ && c1 === 116 /* 't' */ && c2 === 116 /* 't' */ && c3 === 112 /* 'p' */ && c4 === 115 /* 's' */) ; else if (protocolSize === 4 && c0 === 104 /* 'h' */ && c1 === 116 /* 't' */ && c2 === 116 /* 't' */ && c3 === 112 /* 'p' */) ; else if (protocolSize === 3 && c0 === 119 /* 'w' */ && c1 === 115 /* 's' */ && c2 === 115 /* 's' */) ; else if (protocolSize === 2 && c0 === 119 /* 'w' */ && c1 === 115 /* 's' */) ; else { // Check that scheme is valid for (let i = start; i < indexOfProtocol; i += 1) { const lowerCaseCode = url.charCodeAt(i) | 32; if (!(((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z] (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9] lowerCaseCode === 46 || // '.' lowerCaseCode === 45 || // '-' lowerCaseCode === 43) // '+' )) { return null; } } } // Skip 0, 1 or more '/' after ':/' start = indexOfProtocol + 2; while (url.charCodeAt(start) === 47 /* '/' */) { start += 1; } } } // Detect first occurrence of '/', '?' or '#'. We also keep track of the // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of // (respectively), identifier, ipv6 or port. let indexOfIdentifier = -1; let indexOfClosingBracket = -1; let indexOfPort = -1; for (let i = start; i < end; i += 1) { const code = url.charCodeAt(i); if (code === 35 || // '#' code === 47 || // '/' code === 63 // '?' ) { end = i; break; } else if (code === 64) { // '@' indexOfIdentifier = i; } else if (code === 93) { // ']' indexOfClosingBracket = i; } else if (code === 58) { // ':' indexOfPort = i; } else if (code >= 65 && code <= 90) { hasUpper = true; } } // Detect identifier: '@' if (indexOfIdentifier !== -1 && indexOfIdentifier > start && indexOfIdentifier < end) { start = indexOfIdentifier + 1; } // Handle ipv6 addresses if (url.charCodeAt(start) === 91 /* '[' */) { if (indexOfClosingBracket !== -1) { return url.slice(start + 1, indexOfClosingBracket).toLowerCase(); } return null; } else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) { // Detect port: ':' end = indexOfPort; } } // Trim trailing dots while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) { end -= 1; } const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url; if (hasUpper) { return hostname.toLowerCase(); } return hostname; } /** * Check if a hostname is an IP. You should be aware that this only works * because `hostname` is already garanteed to be a valid hostname! */ function isProbablyIpv4(hostname) { // Cannot be shorted than 1.1.1.1 if (hostname.length < 7) { return false; } // Cannot be longer than: 255.255.255.255 if (hostname.length > 15) { return false; } let numberOfDots = 0; for (let i = 0; i < hostname.length; i += 1) { const code = hostname.charCodeAt(i); if (code === 46 /* '.' */) { numberOfDots += 1; } else if (code < 48 /* '0' */ || code > 57 /* '9' */) { return false; } } return (numberOfDots === 3 && hostname.charCodeAt(0) !== 46 /* '.' */ && hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */); } /** * Similar to isProbablyIpv4. */ function isProbablyIpv6(hostname) { if (hostname.length < 3) { return false; } let start = hostname.startsWith('[') ? 1 : 0; let end = hostname.length; if (hostname[end - 1] === ']') { end -= 1; } // We only consider the maximum size of a normal IPV6. Note that this will // fail on so-called "IPv4 mapped IPv6 addresses" but this is a corner-case // and a proper validation library should be used for these. if (end - start > 39) { return false; } let hasColon = false; for (; start < end; start += 1) { const code = hostname.charCodeAt(start); if (code === 58 /* ':' */) { hasColon = true; } else if (!(((code >= 48 && code <= 57) || // 0-9 (code >= 97 && code <= 102) || // a-f (code >= 65 && code <= 90)) // A-F )) { return false; } } return hasColon; } /** * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4). * This *will not* work on any string. We need `hostname` to be a valid * hostname. */ function isIp(hostname) { return isProbablyIpv6(hostname) || isProbablyIpv4(hostname); } /** * Implements fast shallow verification of hostnames. This does not perform a * struct check on the content of labels (classes of Unicode characters, etc.) * but instead check that the structure is valid (number of labels, length of * labels, etc.). * * If you need stricter validation, consider using an external library. */ function isValidAscii(code) { return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127); } /** * Check if a hostname string is valid. It's usually a preliminary check before * trying to use getDomain or anything else. * * Beware: it does not check if the TLD exists. */ function isValidHostname (hostname) { if (hostname.length > 255) { return false; } if (hostname.length === 0) { return false; } if ( /*@__INLINE__*/ !isValidAscii(hostname.charCodeAt(0)) && hostname.charCodeAt(0) !== 46 && // '.' (dot) hostname.charCodeAt(0) !== 95 // '_' (underscore) ) { return false; } // Validate hostname according to RFC let lastDotIndex = -1; let lastCharCode = -1; const len = hostname.length; for (let i = 0; i < len; i += 1) { const code = hostname.charCodeAt(i); if (code === 46 /* '.' */) { if ( // Check that previous label is < 63 bytes long (64 = 63 + '.') i - lastDotIndex > 64 || // Check that previous character was not already a '.' lastCharCode === 46 || // Check that the previous label does not end with a '-' (dash) lastCharCode === 45 || // Check that the previous label does not end with a '_' (underscore) lastCharCode === 95) { return false; } lastDotIndex = i; } else if (!( /*@__INLINE__*/(isValidAscii(code) || code === 45 || code === 95))) { // Check if there is a forbidden character in the label return false; } lastCharCode = code; } return ( // Check that last label is shorter than 63 chars len - lastDotIndex - 1 <= 63 && // Check that the last character is an allowed trailing label character. // Since we already checked that the char is a valid hostname character, // we only need to check that it's different from '-'. lastCharCode !== 45); } function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) { return { allowIcannDomains, allowPrivateDomains, detectIp, extractHostname, mixedInputs, validHosts, validateHostname, }; } const DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({}); function setDefaults(options) { if (options === undefined) { return DEFAULT_OPTIONS; } return /*@__INLINE__*/ setDefaultsImpl(options); } /** * Returns the subdomain of a hostname string */ function getSubdomain$1(hostname, domain) { // If `hostname` and `domain` are the same, then there is no sub-domain if (domain.length === hostname.length) { return ''; } return hostname.slice(0, -domain.length - 1); } /** * Implement a factory allowing to plug different implementations of suffix * lookup (e.g.: using a trie or the packed hashes datastructures). This is used * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints. */ function getEmptyResult() { return { domain: null, domainWithoutSuffix: null, hostname: null, isIcann: null, isIp: null, isPrivate: null, publicSuffix: null, subdomain: null, }; } function resetResult(result) { result.domain = null; result.domainWithoutSuffix = null; result.hostname = null; result.isIcann = null; result.isIp = null; result.isPrivate = null; result.publicSuffix = null; result.subdomain = null; } function parseImpl(url, step, suffixLookup, partialOptions, result) { const options = /*@__INLINE__*/ setDefaults(partialOptions); // Very fast approximate check to make sure `url` is a string. This is needed // because the library will not necessarily be used in a typed setup and // values of arbitrary types might be given as argument. if (typeof url !== 'string') { return result; } // Extract hostname from `url` only if needed. This can be made optional // using `options.extractHostname`. This option will typically be used // whenever we are sure the inputs to `parse` are already hostnames and not // arbitrary URLs. // // `mixedInput` allows to specify if we expect a mix of URLs and hostnames // as input. If only hostnames are expected then `extractHostname` can be // set to `false` to speed-up parsing. If only URLs are expected then // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint // and will not change the behavior of the library. if (!options.extractHostname) { result.hostname = url; } else if (options.mixedInputs) { result.hostname = extractHostname(url, isValidHostname(url)); } else { result.hostname = extractHostname(url, false); } if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) { return result; } // Check if `hostname` is a valid ip address if (options.detectIp) { result.isIp = isIp(result.hostname); if (result.isIp) { return result; } } // Perform optional hostname validation. If hostname is not valid, no need to // go further as there will be no valid domain or sub-domain. if (options.validateHostname && options.extractHostname && !isValidHostname(result.hostname)) { result.hostname = null; return result; } // Extract public suffix suffixLookup(result.hostname, options, result); if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) { return result; } // Extract domain result.domain = getDomain$1(result.publicSuffix, result.hostname, options); if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) { return result; } // Extract subdomain result.subdomain = getSubdomain$1(result.hostname, result.domain); if (step === 4 /* FLAG.SUB_DOMAIN */) { return result; } // Extract domain without suffix result.domainWithoutSuffix = getDomainWithoutSuffix$1(result.domain, result.publicSuffix); return result; } function fastPathLookup (hostname, options, out) { // Fast path for very popular suffixes; this allows to by-pass lookup // completely as well as any extra allocation or string manipulation. if (!options.allowPrivateDomains && hostname.length > 3) { const last = hostname.length - 1; const c3 = hostname.charCodeAt(last); const c2 = hostname.charCodeAt(last - 1); const c1 = hostname.charCodeAt(last - 2); const c0 = hostname.charCodeAt(last - 3); if (c3 === 109 /* 'm' */ && c2 === 111 /* 'o' */ && c1 === 99 /* 'c' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'com'; return true; } else if (c3 === 103 /* 'g' */ && c2 === 114 /* 'r' */ && c1 === 111 /* 'o' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'org'; return true; } else if (c3 === 117 /* 'u' */ && c2 === 100 /* 'd' */ && c1 === 101 /* 'e' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'edu'; return true; } else if (c3 === 118 /* 'v' */ && c2 === 111 /* 'o' */ && c1 === 103 /* 'g' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'gov'; return true; } else if (c3 === 116 /* 't' */ && c2 === 101 /* 'e' */ && c1 === 110 /* 'n' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'net'; return true; } else if (c3 === 101 /* 'e' */ && c2 === 100 /* 'd' */ && c1 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'de'; return true; } } return false; } const exceptions = (function () { const _63 = [1, {}], _64 = [0, { "city": _63 }]; const exceptions = [0, { "ck": [0, { "www": _63 }], "jp": [0, { "kawasaki": _64, "kitakyushu": _64, "kobe": _64, "nagoya": _64, "sapporo": _64, "sendai": _64, "yokohama": _64 }] }]; return exceptions; })(); const rules = (function () { const _65 = [1, {}], _66 = [1, { "com": _65, "edu": _65, "gov": _65, "mil": _65, "net": _65, "org": _65 }], _67 = [1, { "com": _65, "edu": _65, "gov": _65, "net": _65, "org": _65 }], _68 = [1, { "gov": _65 }], _69 = [0, { "*": _65 }], _70 = [1, { "co": _65, "com": _65, "edu": _65, "gov": _65, "net": _65, "org": _65 }], _71 = [1, { "com": _65, "edu": _65, "net": _65, "org": _65 }], _72 = [1, { "co": _65, "net": _65, "org": _65 }], _73 = [1, { "co": _65, "com": _65, "edu": _65, "gov": _65, "mil": _65, "net": _65, "nom": _65, "org": _65 }], _74 = [1, { "biz": _65, "com": _65, "edu": _65, "gov": _65, "info": _65, "net": _65, "org": _65 }], _75 = [1, { "gs": _65 }], _76 = [0, { "nes": _65 }], _77 = [1, { "k12": _65, "cc": _65, "lib": _65 }], _78 = [1, { "cc": _65 }], _79 = [1, { "cc": _65, "lib": _65 }]; const rules = [0, { "ac": _66, "ad": _65, "ae": [1, { "ac": _65, "co": _65, "gov": _65, "mil": _65, "net": _65, "org": _65, "sch": _65 }], "aero": [1, { "airline": _65, "airport": _65, "accident-investigation": _65, "accident-prevention": _65, "aerobatic": _65, "aeroclub": _65, "aerodrome": _65, "agents": _65, "air-surveillance": _65, "air-traffic-control": _65, "aircraft": _65, "airtraffic": _65, "ambulance": _65, "association": _65, "author": _65, "ballooning": _65, "broker": _65, "caa": _65, "cargo": _65, "catering": _65, "certification": _65, "championship": _65, "charter": _65, "civilaviation": _65, "club": _65, "conference": _65, "consultant": _65, "consulting": _65, "control": _65, "council": _65, "crew": _65, "design": _65, "dgca": _65, "educator": _65, "emergency": _65, "engine": _65, "engineer": _65, "entertainment": _65, "equipment": _65, "exchange": _65, "express": _65, "federation": _65, "flight": _65, "freight": _65, "fuel": _65, "gliding": _65, "government": _65, "groundhandling": _65, "group": _65, "hanggliding": _65, "homebuilt": _65, "insurance": _65, "journal": _65, "journalist": _65, "leasing": _65, "logistics": _65, "magazine": _65, "maintenance": _65, "marketplace": _65, "media": _65, "microlight": _65, "modelling": _65, "navigation": _65, "parachuting": _65, "paragliding": _65, "passenger-association": _65, "pilot": _65, "press": _65, "production": _65, "recreation": _65, "repbody": _65, "res": _65, "research": _65, "rotorcraft": _65, "safety": _65, "scientist": _65, "services": _65, "show": _65, "skydiving": _65, "software": _65, "student": _65, "taxi": _65, "trader": _65, "trading": _65, "trainer": _65, "union": _65, "workinggroup": _65, "works": _65 }], "af": _67, "ag": [1, { "co": _65, "com": _65, "net": _65, "nom": _65, "org": _65 }], "ai": [1, { "com": _65, "net": _65, "off": _65, "org": _65 }], "al": _66, "am": [1, { "co": _65, "com": _65, "commune": _65, "net": _65, "org": _65 }], "ao": [1, { "co": _65, "ed": _65, "edu": _65, "gov": _65, "gv": _65, "it": _65, "og": _65, "org": _65, "pb": _65 }], "aq": _65, "ar": [1, { "bet": _65, "com": _65, "coop": _65, "edu": _65, "gob": _65, "gov": _65, "int": _65, "mil": _65, "musica": _65, "mutual": _65, "net": _65, "org": _65, "senasa": _65, "tur": _65 }], "arpa": [1, { "e164": _65, "home": _65, "in-addr": _65, "ip6": _65, "iris": _65, "uri": _65, "urn": _65 }], "as": _68, "asia": _65, "at": [1, { "ac": [1, { "sth": _65 }], "co": _65, "gv": _65, "or": _65 }], "au": [1, { "asn": _65, "com": _65, "edu": [1, { "act": _65, "catholic": _65, "nsw": [1, { "schools": _65 }], "nt": _65, "qld": _65, "sa": _65, "tas": _65, "vic": _65, "wa": _65 }], "gov": [1, { "qld": _65, "sa": _65, "tas": _65, "vic": _65, "wa": _65 }], "id": _65, "net": _65, "org": _65, "conf": _65, "oz": _65, "act": _65, "nsw": _65, "nt": _65, "qld": _65, "sa": _65, "tas": _65, "vic": _65, "wa": _65 }], "aw": [1, { "com": _65 }], "ax": _65, "az": [1, { "biz": _65, "co": _65, "com": _65, "edu": _65, "gov": _65, "info": _65, "int": _65, "mil": _65, "name": _65, "net": _65, "org": _65, "pp": _65, "pro": _65 }], "ba": _66, "bb": [1, { "biz": _65, "co": _65, "com": _65, "edu": _65, "gov": _65, "info": _65, "net": _65, "org": _65, "store": _65, "tv": _65 }], "bd": _69, "be": [1, { "ac": _65 }], "bf": _68, "bg": [1, { "0": _65, "1": _65, "2": _65, "3": _65, "4": _65, "5": _65, "6": _65, "7": _65, "8": _65, "9": _65, "a": _65, "b": _65, "c": _65, "d": _65, "e": _65, "f": _65, "g": _65, "h": _65, "i": _65, "j": _65, "k": _65, "l": _65, "m": _65, "n": _65, "o": _65, "p": _65, "q": _65, "r": _65, "s": _65, "t": _65, "u": _65, "v": _65, "w": _65, "x": _65, "y": _65, "z": _65 }], "bh": _67, "bi": [1, { "co": _65, "com": _65, "edu": _65, "or": _65, "org": _65 }], "biz": _65, "bj": [1, { "africa": _65, "agro": _65, "architectes": _65, "assur": _65, "avocats": _65, "co": _65, "com": _65, "eco": _65, "econo": _65, "edu": _65, "info": _65, "loisirs": _65, "money": _65, "net": _65, "org": _65, "ote": _65, "restaurant": _65, "resto": _65, "tourism": _65, "univ": _65 }], "bm": _67, "bn": _67, "bo": [1, { "com": _65, "edu": _65, "gob": _65, "int": _65, "mil": _65, "net": _65, "org": _65, "tv": _65, "web": _65, "academia": _65, "agro": _65, "arte": _65, "blog": _65, "bolivia": _65, "ciencia": _65, "cooperativa": _65, "democracia": _65, "deporte": _65, "ecologia": _65, "economia": _65, "empresa": _65, "indigena": _65, "industria": _65, "info": _65, "medicina": _65, "movimiento": _65, "musica": _65, "natural": _65, "nombre": _65, "noticias": _65, "patria": _65, "plurinacional": _65, "politica": _65, "profesional": _65, "pueblo": _65, "revista": _65, "salud": _65, "tecnologia": _65, "tksat": _65, "transporte": _65, "wiki": _65 }], "br": [1, { "9guacu": _65, "abc": _65, "adm": _65, "adv": _65, "agr": _65, "aju": _65, "am": _65, "anani": _65, "aparecida": _65, "app": _65, "arq": _65, "art": _65, "ato": _65, "b": _65, "barueri": _65, "belem": _65, "bet": _65, "bhz": _65, "bib": _65, "bio": _65, "blog": _65, "bmd": _65, "boavista": _65, "bsb": _65, "campinagrande": _65, "campinas": _65, "caxias": _65, "cim": _65, "cng": _65, "cnt": _65, "com": _65, "contagem": _65, "coop": _65, "coz": _65, "cri": _65, "cuiaba": _65, "curitiba": _65, "def": _65, "des": _65, "det": _65, "dev": _65, "ecn": _65, "eco": _65, "edu": _65, "emp": _65, "enf": _65, "eng": _65, "esp": _65, "etc": _65, "eti": _65, "far": _65, "feira": _65, "flog": _65, "floripa": _65, "fm": _65, "fnd": _65, "fortal": _65, "fot": _65, "foz": _65, "fst": _65, "g12": _65, "geo": _65, "ggf": _65, "goiania": _65, "gov": [1, { "ac": _65, "al": _65, "am": _65, "ap": _65, "ba": _65, "ce": _65, "df": _65, "es": _65, "go": _65, "ma": _65, "mg": _65, "ms": _65, "mt": _65, "pa": _65, "pb": _65, "pe": _65, "pi": _65, "pr": _65, "rj": _65, "rn": _65, "ro": _65, "rr": _65, "rs": _65, "sc": _65, "se": _65, "sp": _65, "to": _65 }], "gru": _65, "imb": _65, "ind": _65, "inf": _65, "jab": _65, "jampa": _65, "jdf": _65, "joinville": _65, "jor": _65, "jus": _65, "leg": _65, "leilao": _65, "lel": _65, "log": _65, "londrina": _65, "macapa": _65, "maceio": _65, "manaus": _65, "maringa": _65, "mat": _65, "med": _65, "mil": _65, "morena": _65, "mp": _65, "mus": _65, "natal": _65, "net": _65, "niteroi": _65, "nom": _69, "not": _65, "ntr": _65, "odo": _65, "ong": _65, "org": _65, "osasco": _65, "palmas": _65, "poa": _65, "ppg": _65, "pro": _65, "psc": _65, "psi": _65, "pvh": _65, "qsl": _65, "radio": _65, "rec": _65, "recife": _65, "rep": _65, "ribeirao": _65, "rio": _65, "riobranco": _65, "riopreto": _65, "salvador": _65, "sampa": _65, "santamaria": _65, "santoandre": _65, "saobernardo": _65, "saogonca": _65, "seg": _65, "sjc": _65, "slg": _65, "slz": _65, "sorocaba": _65, "srv": _65, "taxi": _65, "tc": _65, "tec": _65, "teo": _65, "the": _65, "tmp": _65, "trd": _65, "tur": _65, "tv": _65, "udi": _65, "vet": _65, "vix": _65, "vlog": _65, "wiki": _65, "zlg": _65 }], "bs": _67, "bt": _67, "bv": _65, "bw": [1, { "ac": _65, "co": _65, "gov": _65, "net": _65, "org": _65 }], "by": [1, { "gov": _65, "mil": _65, "com": _65, "of": _65 }], "bz": _70, "ca": [1, { "ab": _65, "bc": _65, "mb": _65, "nb": _65, "nf": _65, "nl": _65, "ns": _65, "nt": _65, "nu": _65, "on": _65, "pe": _65, "qc": _65, "sk": _65, "yk": _65, "gc": _65 }], "cat": _65, "cc": _65, "cd": _68, "cf": _65, "cg": _65, "ch": _65, "ci": [1, { "ac": _65, "xn--aroport-bya": _65, "aéroport": _65, "asso": _65, "co": _65, "com": _65, "ed": _65, "edu": _65, "go": _65, "gouv": _65, "int": _65, "net": _65, "or": _65, "org": _65 }], "ck": _69, "cl": [1, { "co": _65, "gob": _65, "gov": _65, "mil": _65 }], "cm": [1, { "co": _65, "com": _65, "gov": _65, "net": _65 }], "cn": [1, { "ac": _65, "com": _65, "edu": _65, "gov": _65, "mil": _65, "net": _65, "org": _65, "xn--55qx5d": _65, "公司": _65, "xn--od0alg": _65, "網絡": _65, "xn--io0a7i": _65, "网络": _65, "ah": _65, "bj": _65, "cq": _65, "fj": _65, "gd": _65, "gs": _65, "gx": _65, "gz": _65, "ha": _65, "hb": _65, "he": _65, "hi": _65, "hk": _65, "hl": _65, "hn": _65, "jl": _65, "js": _65, "jx": _65, "ln": _65, "mo": _65, "nm": _65, "nx": _65, "qh": _65, "sc": _65, "sd": _65, "sh": _65, "sn": _65, "sx": _65, "tj": _65, "tw": _65, "xj": _65, "xz": _65, "yn": _65, "zj": _65 }], "co": [1, { "com": _65, "edu": _65, "gov": _65, "mil": _65, "net": _65, "nom": _65, "org": _65 }], "com": _65, "coop": _65, "cr": [1, { "ac": _65, "co": _65, "ed": _65, "fi": _65, "go": _65, "or": _65, "sa": _65 }], "cu": [1, { "com": _65, "edu": _65, "gob": _65, "inf": _65, "nat": _65, "net": _65, "org": _65 }], "cv": [1, { "com": _65, "edu": _65, "id": _65, "int": _65, "net": _65, "nome": _65, "org": _65, "publ": _65 }], "cw": _71, "cx": _68, "cy": [1, { "ac": _65, "biz": _65, "com": _65, "ekloges": _65, "gov": _65, "ltd": _65, "mil": _65, "net": _65, "org": _65, "press": _65, "pro": _65, "tm": _65 }], "cz": _65, "de": _65, "dj": _65, "dk": _65, "dm": _70, "do": [1, { "art": _65, "com": _65, "edu": _65, "gob": _65, "gov": _65, "mil": _65, "net": _65, "org": _65, "sld": _65, "web": _65 }], "dz": [1, { "art": _65, "asso": _65, "com": _65, "edu": _65, "gov": _65, "net": _65, "org": _65, "pol": _65, "soc": _65, "tm": _65 }], "ec": [1, { "com": _65, "edu": _65, "fin": _65, "gob": _65, "gov": _65, "info": _65, "k12": _65, "med": _65, "mil": _65, "net": _65, "org": _65, "pro": _65 }], "edu": _65, "ee": [1, { "aip": _65, "com": _65, "edu": _65, "fie": _65, "gov": _65, "lib": _65, "med": _65, "org": _65, "pri": _65, "riik": _65 }], "eg": [1, { "ac": _65, "com": _65, "edu": _65, "eun": _65, "gov": _65, "info": _65, "me": _65, "mil": _65, "name": _65, "net": _65, "org": _65, "sci": _65, "sport": _65, "tv": _65 }], "er": _69, "es": [1, { "com": _65, "edu": _65, "gob": _65, "nom": _65, "org": _65 }], "et": [1, { "biz": _65, "com": _65, "edu": _65, "gov": _65, "info": _65, "name": _65, "net": _65, "org": _65 }], "eu": _65, "fi": [1, { "aland": _65 }], "fj": [1, { "ac": _65, "biz": _65, "com": _65, "gov": _65, "info": _65, "mil": _65, "name": _65, "net": _65, "org": _65, "pro": _65 }], "fk": _69, "fm": _71, "fo": _65, "fr": [1, { "asso": _65, "com": _65, "gouv": _65, "nom": _65, "prd": _65, "tm": _65, "avoues": _65, "cci": _65, "greta": _65, "huissier-justice": _65 }], "ga": _65, "gb": _65, "gd": [1, { "edu": _65, "gov": _65 }], "ge": [1, { "com": _65, "edu": _65, "gov": _65, "net": _65, "org": _65, "pvt": _65, "school": _65 }], "gf": _65, "gg": _72, "gh": [1, { "com": _65, "edu": _65, "gov": _65, "mil": _65, "org": _65 }], "gi": [1, { "com": _65, "edu": _65, "gov": _65, "ltd": _65, "mod": _65, "org": _65 }], "gl": [1, { "co": _65, "com": _65, "edu": _65, "net": _65, "org": _65 }], "gm": _65, "gn": [1, { "ac": _65, "com": _65, "edu": _65, "gov": _65, "net": _65, "org": _65 }], "gov": _65, "gp": [1, { "asso": _65, "com": _65, "edu": _65, "mobi": _65, "net": _65, "org": _65 }], "gq": _65, "gr": _67, "gs": _65, "gt": [1, { "com": _65, "edu": _65, "gob": _65, "ind": _65, "mil": _65, "net": _65, "org": _65 }], "gu": [1, { "com": _65, "edu": _65, "gov": _65, "guam": _65, "info": _65, "net": _65, "org": _65, "web": _65 }], "gw": _65, "gy": _70, "hk": [1, { "com": _65, "edu": _65, "gov": _65, "idv": _65, "net": _65, "org": _65, "xn--ciqpn": _65, "个人": _65, "xn--gmqw5a": _65, "個人": _65, "xn--55qx5d": _65, "公司": _65, "xn--mxtq1m": _65, "政府": _65, "xn--lcvr32d": _65, "敎育": _65, "xn--wcvs22d": _65, "教育": _65, "xn--gmq050i": _65, "箇人": _65, "xn--uc0atv": _65, "組織": _65, "xn--uc0ay4a": _65, "組织": _65, "xn--od0alg": _65, "網絡": _65, "xn--zf0avx": _65, "網络": _65, "xn--mk0axi": _65, "组織": _65, "xn--tn0ag": _65, "组织": _65, "xn--od0aq3b": _65, "网絡": _65, "xn--io0a7i": _65, "网络": _65 }], "hm": _65, "hn": [1, { "com": _65, "edu": _65, "gob": _65, "mil": _65, "net": _65, "org": _65 }], "hr": [1, { "com": _65, "from": _65, "iz": _65, "name": _65 }], "ht": [1, { "adult": _65, "art": _65, "asso": _65, "com": _65, "coop": _65, "edu": _65, "firm": _65, "gouv": _65, "info": _65, "med": _65, "net": _65, "org": _65, "perso": _65, "pol": _65, "pro": _65, "rel": _65, "shop": _65 }], "hu": [1, { "2000": _65, "agrar": _65, "bolt": _65, "casino": _65, "city": _65, "co": _65, "erotica": _65, "erotika": _65, "film": _65, "forum": _65, "games": _65, "hotel": _65, "info": _65, "ingatlan": _65, "jogasz": _65, "konyvelo": _65, "lakas": _65, "media": _65, "news": _65, "org": _65, "priv": _65, "reklam": _65, "sex": _65, "shop": _65, "sport": _65, "suli": _65, "szex": _65, "tm": _65, "tozsde": _65, "utazas": _65, "video": _65 }], "id": [1, { "ac": _65, "biz": _65, "co": _65, "desa": _65, "go": _65, "mil": _65, "my": _65, "net": _65, "or": _65, "ponpes": _65, "sch": _65, "web": _65 }], "ie": _68, "il": [1, { "ac": _65, "co": _65, "gov": _65, "idf": _65, "k12": _65, "muni": _65, "net": _65, "org": _65 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": _65, "xn--5dbhl8d": _65, "xn--8dbq2a": _65, "xn--hebda8b": _65 }], "ישראל": [1, { "אקדמיה": _65, "ישוב": _65, "צהל": _65, "ממשל": _65 }], "im": [1, { "ac": _65, "co": [1, { "ltd": _65, "plc": _65 }], "com": _65, "net": _65, "org": _65, "tt": _65, "tv": _65 }], "in": [1, { "5g": _65, "6g": _65, "ac": _65, "ai": _65, "am": _65, "bihar": _65, "biz": _65, "business": _65, "ca": _65, "cn": _65, "co": _65, "com": _65, "coop": _65, "cs": _65, "delhi": _65, "dr": _65, "edu": _65, "er": _65, "firm": _65, "gen": _65, "gov": _65, "gujarat": _65, "ind": _65, "info": _65, "int": _65, "internet": _65, "io": _65, "me": _65, "mil": _65, "net": _65, "nic": _65, "org": _65, "pg": _65, "post": _65, "pro": _65, "res": _65, "travel": _65, "tv": _65, "uk": _65, "up": _65, "us": _65 }], "info": _65, "int": [1, { "eu": _65 }], "io": _73, "iq": _66, "ir": [1, { "ac": _65, "co": _65, "gov": _65, "id": _65, "net": _65, "org": _65, "sch": _65, "xn--mgba3a4f16a": _65, "ایران": _65, "xn--mgba3a4fra": _65, "ايران": _65 }], "is": _65, "it": [1, { "edu": _65, "gov": _65, "abr": _65, "abruzzo": _65, "aosta-valley": _65, "aostavalley": _65, "bas": _65, "basilicata": _65, "cal": _65, "calabria": _65, "cam": _65, "campania": _65, "emilia-romagna": _65, "emiliaromagna": _65, "emr": _65, "friuli-v-giulia": _65, "friuli-ve-giulia": _65, "friuli-vegiulia": _65, "friuli-venezia-giulia": _65, "friuli-veneziagiulia": _65, "friuli-vgiulia": _65, "friuliv-giulia": _65, "friulive-giulia": _65, "friulivegiulia": _65, "friulivenezia-giulia": _65, "friuliveneziagiulia": _65, "friulivgiulia": _65, "fvg": _65, "laz": _65, "lazio": _65, "lig": _65, "liguria": _65, "lom": _65, "lombardia": _65, "lombardy": _65, "lucania": _65, "mar": _65, "marche": _65, "mol": _65, "molise": _65, "piedmont": _65, "piemonte": _65, "pmn": _65, "pug": _65, "puglia": _65, "sar": _65, "sardegna": _65, "sardinia": _65, "sic": _65, "sicilia": _65, "sicily": _65, "taa": _65, "tos": _65, "toscana": _65, "trentin-sud-tirol": _65, "xn--trentin-sd-tirol-rzb": _65, "trentin-süd-tirol": _65, "trentin-sudtirol": _65, "xn--trentin-sdtirol-7vb": _65, "trentin-südtirol": _65, "trentin-sued-tirol": _65, "trentin-suedtirol": _65, "trentino": _65, "trentino-a-adige": _65, "trentino-aadige": _65, "trentino-alto-adige": _65, "trentino-altoadige": _65, "trentino-s-tirol": _65, "trentino-stirol": _65, "trentino-sud-tirol": _65, "xn--trentino-sd-tirol-c3b": _65, "trentino-süd-tirol": _65, "trentino-sudtirol": _65, "xn--trentino-sdtirol-szb": _65, "trentino-südtirol": _65, "trentino-sued-tirol": _65, "trentino-suedtirol": _65, "trentinoa-adige": _65, "trentinoaadige": _65, "trentinoalto-adige": _65, "trentinoaltoadige": _65, "trentinos-tirol": _65, "trentinostirol": _65, "trentinosud-tirol": _65, "xn--trentinosd-tirol-rzb": _65, "trentinosüd-tirol": _65, "trentinosudtirol": _65, "xn--trentinosdtirol-7vb": _65, "trentinosüdtirol": _65, "trentinosued-tirol": _65, "trentinosuedtirol": _65, "trentinsud-tirol": _65, "xn--trentinsd-tirol-6vb": _65, "trentinsüd-tirol": _65, "trentinsudtirol": _65, "xn--trentinsdtirol-nsb": _65, "trentinsüdtirol": _65, "trentinsued-tirol": _65, "trentinsuedtirol": _65, "tuscany": _65, "umb": _65, "umbria": _65, "val-d-aosta": _65, "val-daosta": _65, "vald-aosta": _65, "valdaosta": _65, "valle-aosta": _65, "valle-d-aosta": _65, "valle-daosta": _65, "valleaosta": _65, "valled-aosta": _65, "valledaosta": _65, "vallee-aoste": _65, "xn--valle-aoste-ebb": _65, "vallée-aoste": _65, "vallee-d-aoste": _65, "xn--valle-d-aoste-ehb": _65, "vallée-d-aoste": _65, "valleeaoste": _65, "xn--valleaoste-e7a": _65, "valléeaoste": _65, "valleedaoste": _65, "xn--valledaoste-ebb": _65, "valléedaoste": _65, "vao": _65, "vda": _65, "ven": _65, "veneto": _65, "ag": _65, "agrigento": _65, "al": _65, "alessandria": _65, "alto-adige": _65, "altoadige": _65, "an": _65, "ancona": _65, "andria-barletta-trani": _65, "andria-trani-barletta": _65, "andriabarlettatrani": _65, "andriatranibarletta": _65, "ao": _65, "aosta": _65, "aoste": _65, "ap": _65, "aq": _65, "aquila": _65, "ar": _65, "arezzo": _65, "ascoli-piceno": _65, "ascolipiceno": _65, "asti": _65, "at": _65, "av": _65, "avellino": _65, "ba": _65, "balsan": _65, "balsan-sudtirol": _65, "xn--balsan-sdtirol-nsb": _65, "balsan-südtirol": _65, "balsan-suedtirol": _65, "bari": _65, "barletta-trani-andria": _65, "barlettatraniandria": _65, "belluno": _65, "benevento": _65, "bergamo": _65, "bg": _65, "bi": _65, "biella": _65, "bl": _65, "bn": _65, "bo": _65, "bologna": _65, "bolzano": _65, "bolzano-altoadige": _65, "bozen": _65, "bozen-sudtirol": _65, "xn--bozen-sdtirol-2ob": _65, "bozen-südtirol": _65, "bozen-suedtirol": _65, "br": _65, "brescia": _65, "brindisi": _65, "bs": _65, "bt": _65, "bulsan": _65, "bulsan-sudtirol": _65, "xn--bulsan-sdtirol-nsb": _65, "bulsan-südtirol": _65, "bulsan-suedtirol": _65, "bz": _65, "ca": _65, "cagliari": _65, "caltanissetta": _65, "campidano-medio": _65, "campidanomedio": _65, "campobasso": _65, "carbonia-iglesias": _65, "carboniaiglesias": _65, "carrara-massa": _65, "carraramassa": _65, "caserta": _65, "catania": _65, "catanzaro": _65, "cb": _65, "ce": _65, "cesena-forli": _65, "xn--cesena-forl-mcb": _65, "cesena-forlì": _65, "cesenaforli": _65, "xn--cesenaforl-i8a": _65, "cesenaforlì": _65, "ch": _65, "chieti": _65, "ci": _65, "cl": _65, "cn": _65, "co": _65, "como": _65, "cosenza": _65, "cr": _65, "cremona": _65, "crotone": _65, "cs": _65, "ct": _65, "cuneo": _65, "cz": _65, "dell-ogliastra": _65, "dellogliastra": _65, "en": _65, "enna": _65, "fc": _65, "fe": _65, "fermo": _65, "ferrara": _65, "fg": _65, "fi": _65, "firenze": _65, "florence": _65, "fm": _65, "foggia": _65, "forli-cesena": _65, "xn--forl-cesena-fcb": _65, "forlì-cesena": _65, "forlicesena": _65, "xn--forlcesena-c8a": _65, "forlìcesena": _65, "fr": _65, "frosinone": _65, "ge": _65, "genoa": _65, "genova": _65, "go": _65, "gorizia": _65, "gr": _65, "grosseto": _65, "iglesias-carbonia": _65, "iglesiascarbonia": _65, "im": _65, "imperia": _65, "is": _65, "isernia": _65, "kr": _65, "la-spezia": _65, "laquila": _65, "laspezia": _65, "latina": _65, "lc": _65, "le": _65, "lecce": _65, "lecco": _65, "li": _65, "livorno": _65, "lo": _65, "lodi": _65, "lt": _65, "lu": _65, "lucca": _65, "macerata": _65, "mantova": _65, "massa-carrara": _65, "massacarrara": _65, "matera": _65, "mb": _65, "mc": _65, "me": _65, "medio-campidano": _65, "mediocampidano": _65, "messina": _65, "mi": _65, "milan": _65, "milano": _65, "mn": _65, "mo": _65, "modena": _65, "monza": _65, "monza-brianza": _65, "monza-e-della-brianza": _65, "monzabrianza": _65, "monzaebrianza": _65, "monzaedellabrianza": _65, "ms": _65, "mt": _65, "na": _65, "naples": _65, "napoli": _65, "no": _65, "novara": _65, "nu": _65, "nuoro": _65, "og": _65, "ogliastra": _65, "olbia-tempio": _65, "olbiatempio": _65, "or": _65, "oristano": _65, "ot": _65, "pa": _65, "padova": _65, "padua": _65, "palermo": _65, "parma": _65, "pavia": _65, "pc": _65, "pd": _65, "pe": _65, "perugia": _65, "pesaro-urbino": _65, "pesarourbino": _65, "pescara": _65, "pg": _65, "pi": _65, "piacenza": _65, "pisa": _65, "pistoia": _65, "pn": _65, "po": _65, "pordenone": _65, "potenza": _65, "pr": _65, "prato": _65, "pt": _65, "pu": _65, "pv": _65, "pz": _65, "ra": _65, "ragusa": _65, "ravenna": _65, "rc": _65, "re": _65, "reggio-calabria": _65, "reggio-emilia": _65, "reggiocalabria": _65, "reggioemilia": _65, "rg": _65, "ri": _65, "rieti": _65, "rimini": _65, "rm": _65, "rn": _65, "ro": _65, "roma": _65, "rome": _65, "rovigo": _65, "sa": _65, "salerno": _65, "sassari": _65, "savona": _65, "si": _65, "siena": _65, "siracusa": _65, "so": _65, "sondrio": _65, "sp": _65, "sr": _65, "ss": _65, "xn--sdtirol-n2a": _65, "südtirol": _65, "suedtirol": _65, "sv": _65, "ta": _65, "taranto": _65, "te": _65, "tempio-olbia": _65, "tempioolbia": _65, "teramo": _65, "terni": _65, "tn": _65, "to": _65, "torino": _65, "tp": _65, "tr": _65, "trani-andria-barletta": _65, "trani-barletta-andria": _65, "traniandriabarletta": _65, "tranibarlettaandria": _65, "trapani": _65, "trento": _65, "treviso": _65, "trieste": _65, "ts": _65, "turin": _65, "tv": _65, "ud": _65, "udine": _65, "urbino-pesaro": _65, "urbinopesaro": _65, "va": _65, "varese": _65, "vb": _65, "vc": _65, "ve": _65, "venezia": _65, "venice": _65, "verbania": _65, "vercelli": _65, "verona": _65, "vi": _65, "vibo-valentia": _65, "vibovalentia": _65, "vicenza": _65, "viterbo": _65, "vr": _65, "vs": _65, "vt": _65, "vv": _65 }], "je": _72, "jm": _69, "jo": [1, { "agri": _65, "ai": _65, "com": _65, "edu": _65, "eng": _65, "fm": _65, "gov": _65, "mil": _65, "net": _65, "org": _65, "per": _65, "phd": _65, "sch": _65, "tv": _65 }], "jobs": _65, "jp": [1, { "ac": _65, "ad": _65, "co": _65, "ed": _65, "go": _65, "gr": _65, "lg": _65, "ne": _65, "or": _65, "aichi": [1, { "aisai": _65, "ama": _65, "anjo": _65, "asuke": _65, "chiryu": _65, "chita": _65, "fuso": _65, "gamagori": _65, "handa": _65, "hazu": _65, "hekinan": _65, "higashiura": _65, "ichinomiya": _65, "inazawa": _65, "inuyama": _65, "isshiki": _65, "iwakura": _65, "kanie": _65, "kariya": _65, "kasugai": _65, "kira": _65, "kiyosu": _65, "komaki": _65, "konan": _65, "kota": _65, "mihama": _65, "miyoshi": _65, "nishio": _65, "nisshin": _65, "obu": _65, "oguchi": _65, "oharu": _65, "okazaki": _65, "owariasahi": _65, "seto": _65, "shikatsu": _65, "shinshiro": _65, "shitara": _65, "tahara": _65, "takahama": _65, "tobishima": _65, "toei": _65, "togo": _65, "tokai": _65, "tokoname": _65, "toyoake": _65, "toyohashi": _65, "toyokawa": _65, "toyone": _65, "toyota": _65, "tsushima": _65, "yatomi": _65 }], "akita": [1, { "akita": _65, "daisen": _65, "fujisato": _65, "gojome": _65, "hachirogata": _65, "happou": _65, "higashinaruse": _65, "honjo": _65, "honjyo": _65, "ikawa": _65, "kamikoani": _65, "kamioka": _65, "katagami": _65, "kazuno": _65, "kitaakita": _65, "kosaka": _65, "kyowa": _65, "misato": _65, "mitane": _65, "moriyoshi": _65, "nikaho": _65, "noshiro": _65, "odate": _65, "oga": _65, "ogata": _65, "semboku": _65, "yokote": _65, "yurihonjo": _65 }], "aomori": [1, { "aomori": _65, "gonohe": _65, "hachinohe": _65, "hashikami": _65, "hiranai": _65, "hirosaki": _65, "itayanagi": _65, "kuroishi": _65, "misawa": _65, "mutsu": _65, "nakadomari": _65, "noheji": _65, "oirase": _65, "owani": _65, "rokunohe": _65, "sannohe": _65, "shichinohe": _65, "shingo": _65, "takko": _65, "towada": _65, "tsugaru": _65, "tsuruta": _65 }], "chiba": [1, { "abiko": _65, "asahi": _65, "chonan": _65, "chosei": _65, "choshi": _65, "chuo": _65, "funabashi": _65, "futtsu": _65, "hanamigawa": _65, "ichihara": _65, "ichikawa": _65, "ichinomiya": _65, "inzai": _65, "isumi": _65, "kamagaya": _65, "kamogawa": _65, "kashiwa": _65, "katori": _65, "katsuura": _65, "kimitsu": _65, "kisarazu": _65, "kozaki": _65, "kujukuri": _65, "kyonan": _65, "matsudo": _65, "midori": _65, "mihama": _65, "minamiboso": _65, "mobara": _65, "mutsuzawa": _65, "nagara": _65, "nagareyama": _65, "narashino": _65, "narita": _65, "noda": _65, "oamishirasato": _65, "omigawa": _65, "onjuku": _65, "otaki": _65, "sakae": _65, "sakura": _65, "shimofusa": _65, "shirako": _65, "shiroi": _65, "shisui": _65, "sodegaura": _65, "sosa": _65, "tako": _65, "tateyama": _65, "togane": _65, "tohnosho": _65, "tomisato": _65, "urayasu": _65, "yachimata": _65, "yachiyo": _65, "yokaichiba": _65, "yokoshibahikari": _65, "yotsukaido": _65 }], "ehime": [1, { "ainan": _65, "honai": _65, "ikata": _65, "imabari": _65, "iyo": _65, "kamijima": _65, "kihoku": _65, "kumakogen": _65, "masaki": _65, "matsuno": _65, "matsuyama": _65, "namikata": _65, "niihama": _65, "ozu": _65, "saijo": _65, "seiyo": _65, "shikokuchuo": _65, "tobe": _65, "toon": _65, "uchiko": _65, "uwajima": _65, "yawatahama": _65 }], "fukui": [1, { "echizen": _65, "eiheiji": _65, "fukui": _65, "ikeda": _65, "katsuyama": _65, "mihama": _65, "minamiechizen": _65, "obama": _65, "ohi": _65, "ono": _65, "sabae": _65, "sakai": _65, "takahama": _65, "tsuruga": _65, "wakasa": _65 }], "fukuoka": [1, { "ashiya": _65, "buzen": _65, "chikugo": _65, "chikuho": _65, "chikujo": _65, "chikushino": _65, "chikuzen": _65, "chuo": _65, "dazaifu": _65, "fukuchi": _65, "hakata": _65, "higashi": _65, "hirokawa": _65, "hisayama": _65, "iizuka": _65, "inatsuki": _65, "kaho": _65, "kasuga": _65, "kasuya": _65, "kawara": _65, "keisen": _65, "koga": _65, "kurate": _65, "kurogi": _65, "kurume": _65, "minami": _65, "miyako": _65, "miyama": _65, "miyawaka": _65, "mizumaki": _65, "munakata": _65, "nakagawa": _65, "nakama": _65, "nishi": _65, "nogata": _65, "ogori": _65, "okagaki": _65, "okawa": _65, "oki": _65, "omuta": _65, "onga": _65, "onojo": _65, "oto": _65, "saigawa": _65, "sasaguri": _65, "shingu": _65, "shinyoshitomi": _65, "shonai": _65, "soeda": _65, "sue": _65, "tachiarai": _65, "tagawa": _65, "takata": _65, "toho": _65, "toyotsu": _65, "tsuiki": _65, "ukiha": _65, "umi": _65, "usui": _65, "yamada": _65, "yame": _65, "yanagawa": _65, "yukuhashi": _65 }], "fukushima": [1, { "aizubange": _65, "aizumisato": _65, "aizuwakamatsu": _65, "asakawa": _65, "bandai": _65, "date": _65, "fukushima": _65, "furudono": _65, "futaba": _65, "hanawa": _65, "higashi": _65, "hirata": _65, "hirono": _65, "iitate": _65, "inawashiro": _65, "ishikawa": _65, "iwaki": _65, "izumizaki": _65, "kagamiishi": _65, "kaneyama": _65, "kawamata": _65, "kitakata": _65, "kitashiobara": _65, "koori": _65, "koriyama": _65, "kunimi": _65, "miharu": _65, "mishima": _65, "namie": _65, "nango": _65, "nishiaizu": _65, "nishigo": _65, "okuma": _65, "omotego": _65, "ono": _65, "otama": _65, "samegawa": _65, "shimogo": _65, "shirakawa": _65, "showa": _65, "soma": _65, "sukagawa": _65, "taishin": _65, "tamakawa": _65, "tanagura": _65, "tenei": _65, "yabuki": _65, "yamato": _65, "yamatsuri": _65, "yanaizu": _65, "yugawa": _65 }], "gifu": [1, { "anpachi": _65, "ena": _65, "gifu": _65, "ginan": _65, "godo": _65, "gujo": _65, "hashima": _65, "hichiso": _65, "hida": _65, "higashishirakawa": _65, "ibigawa": _65, "ikeda": _65, "kakamigahara": _65, "kani": _65, "kasahara": _65, "kasamatsu": _65, "kawaue": _65, "kitagata": _65, "mino": _65, "minokamo": _65, "mitake": _65, "mizunami": _65, "motosu": _65, "nakatsugawa": _65, "ogaki": _65, "sakahogi": _65, "seki": _65, "sekigahara": _65, "shirakawa": _65, "tajimi": _65, "takayama": _65, "tarui": _65, "toki": _65, "tomika": _65, "wanouchi": _65, "yamagata": _65, "yaotsu": _65, "yoro": _65 }], "gunma": [1, { "annaka": _65, "chiyoda": _65, "fujioka": _65, "higashiagatsuma": _65, "isesaki": _65, "itakura": _65, "kanna": _65, "kanra": _65, "katashina": _65, "kawaba": _65, "kiryu": _65, "kusatsu": _65, "maebashi": _65, "meiwa": _65, "midori": _65, "minakami": _65, "naganohara": _65, "nakanojo": _65, "nanmoku": _65, "numata": _65, "oizumi": _65, "ora": _65, "ota": _65, "shibukawa": _65, "shimonita": _65, "shinto": _65, "showa": _65, "takasaki": _65, "takayama": _65, "tamamura": _65, "tatebayashi": _65, "tomioka": _65, "tsukiyono": _65, "tsumagoi": _65, "ueno": _65, "yoshioka": _65 }], "hiroshima": [1, { "asaminami": _65, "daiwa": _65, "etajima": _65, "fuchu": _65, "fukuyama": _65, "hatsukaichi": _65, "higashihiroshima": _65, "hongo": _65, "jinsekikogen": _65, "kaita": _65, "kui": _65, "kumano": _65, "kure": _65, "mihara": _65, "miyoshi": _65, "naka": _65, "onomichi": _65, "osakikamijima": _65, "otake": _65, "saka": _65, "sera": _65, "seranishi": _65, "shinichi": _65, "shobara": _65, "takehara": _65 }], "hokkaido": [1, { "abashiri": _65, "abira": _65, "aibetsu": _65, "akabira": _65, "akkeshi": _65, "asahikawa": _65, "ashibetsu": _65, "ashoro": _65, "assabu": _65, "atsuma": _65, "bibai": _65, "biei": _65, "bifuka": _65, "bihoro": _65, "biratori": _65, "chippubetsu": _65, "chitose": _65, "date": _65, "ebetsu": _65, "embetsu": _65, "eniwa": _65, "erimo": _65, "esan": _65, "esashi": _65, "fukagawa": _65, "fukushima": _65, "furano": _65, "furubira": _65, "haboro": _65, "hakodate": _65, "hamatonbetsu": _65, "hidaka": _65, "higashikagura": _65, "higashikawa": _65, "hiroo": _65, "hokuryu": _65, "hokut