summaryrefslogtreecommitdiff
path: root/data/extensions/jsr@javascriptrestrictor/nscl
diff options
context:
space:
mode:
authorRuben Rodriguez <ruben@trisquel.info>2022-09-08 20:18:54 -0400
committerRuben Rodriguez <ruben@trisquel.info>2022-09-08 20:18:54 -0400
commit5da28b0f8771834ae208d61431d632875e9f8e7d (patch)
tree688ecaff26197bad8abde617b4947b11d617309e /data/extensions/jsr@javascriptrestrictor/nscl
parent4a87716686104266a9cccc2d83cc249e312f3673 (diff)
Updated extensions:
* Upgraded Privacy Redirect to 1.1.49 and configured to use the 10 most reliable invidious instances * Removed ViewTube * Added torproxy@icecat.gnu based on 'Proxy toggle' extension * Added jShelter 0.11.1 * Upgraded LibreJS to 7.21.0 * Upgraded HTTPS Everywhere to 2021.7.13 * Upgraded SubmitMe to 1.9
Diffstat (limited to 'data/extensions/jsr@javascriptrestrictor/nscl')
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js266
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/log.js37
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js83
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js35
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js411
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/lib/browser-polyfill.js1276
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/lib/sha256.js518
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js221
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js83
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js44
10 files changed, 2974 insertions, 0 deletions
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js
new file mode 100644
index 0000000..1fb7955
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js
@@ -0,0 +1,266 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+"use strict";
+(() => {
+ let MOZILLA = "mozSystem" in XMLHttpRequest.prototype;
+ let ENDPOINT_ORIGIN = "https://[ff00::]";
+ let ENDPOINT_PREFIX = `${ENDPOINT_ORIGIN}/nscl/${browser.runtime.getURL("syncMessage")}?`;
+
+ if (browser.webRequest) {
+ if (typeof browser.runtime.onSyncMessage !== "object") {
+ // Background Script side
+
+ let pending = new Map();
+ if (MOZILLA) {
+ // we don't care this is async, as long as it get called before the
+ // sync XHR (we are not interested in the response on the content side)
+ browser.runtime.onMessage.addListener((m, sender) => {
+ let wrapper = m.__syncMessage__;
+ if (!wrapper) return;
+ let {id} = wrapper;
+ pending.set(id, wrapper);
+ wrapper.result = Promise.resolve(notifyListeners(JSON.stringify(wrapper.payload), sender));
+ return Promise.resolve(null);
+ });
+ }
+
+ let tabUrlCache = new Map();
+ let asyncResults = new Map();
+ let tabRemovalListener = null;
+ let CANCEL = {cancel: true};
+ let {TAB_ID_NONE} = browser.tabs;
+
+
+ let onBeforeRequest = request => { try {
+ let {url, tabId} = request;
+ let params = new URLSearchParams(url.split("?")[1]);
+ let msgId = params.get("id");
+ if (asyncResults.has(msgId)) {
+ return asyncRet(msgId);
+ }
+ let msg = params.get("msg");
+
+ if (MOZILLA || tabId === TAB_ID_NONE) {
+ // this shoud be a mozilla suspension request
+ if (pending.has(msgId)) {
+ let wrapper = pending.get(msgId);
+ pending.delete(msgId);
+ return (async () => {
+ try {
+ return ret({payload: (await wrapper.result)});
+ } catch (e) {
+ return ret({error: { message: e.message, stack: e.stack }});
+ }
+ })()
+ }
+ return CANCEL; // otherwise, bail
+ }
+ // CHROME from now on
+ let documentUrl = request.initiator || params.get("url");
+ let {frameAncestors, frameId} = request;
+ let isTop = frameId === 0 || !!params.get("top");
+ let tabUrl = frameAncestors && frameAncestors.length
+ && frameAncestors[frameAncestors.length - 1].url;
+
+ if (!tabUrl) {
+ if (isTop) {
+ tabUrlCache.set(tabId, tabUrl = documentUrl);
+ if (!tabRemovalListener) {
+ browser.tabs.onRemoved.addListener(tabRemovalListener = tab => {
+ tabUrlCache.delete(tab.id);
+ });
+ }
+ } else {
+ tabUrl = tabUrlCache.get(tabId);
+ }
+ }
+ let sender = {
+ tab: {
+ id: tabId,
+ url: tabUrl
+ },
+ frameId,
+ url: documentUrl,
+ timeStamp: Date.now()
+ };
+
+ if (!(msg !== null && sender)) {
+ return CANCEL;
+ }
+ let result = Promise.resolve(notifyListeners(msg, sender));
+ // On Chromium, if the promise is not resolved yet,
+ // we redirect the XHR to the same URL (hence same msgId)
+ // while the result get cached for asynchronous retrieval
+ result.then(r => storeAsyncRet(msgId, r));
+ return asyncResults.has(msgId)
+ ? asyncRet(msgId) // promise was already resolved
+ : {redirectUrl: url.replace(
+ /&redirects=(\d+)|$/, // redirects count to avoid loop detection
+ (all, count) => `&redirects=${parseInt(count) + 1 || 1}`)};
+ } catch(e) {
+ console.error(e);
+ return CANCEL;
+ } };
+
+ let onHeaderReceived = request => {
+ let replaced = "";
+ let {responseHeaders} = request;
+ let rxFP = /^feature-policy$/i;
+ for (let h of request.responseHeaders) {
+ if (rxFP.test(h.name)) {
+ h.value = h.value.replace(/\b(sync-xhr\s+)([^*][^;]*)/g,
+ (all, m1, m2) => replaced =
+ `${m1}${m2.replace(/'none'/, '')} 'self'`
+ );
+ }
+ }
+ return replaced ? {responseHeaders} : null;
+ };
+
+ let ret = r => ({redirectUrl: `data:application/json,${encodeURIComponent(JSON.stringify(r))}`});
+
+ let asyncRet = msgId => {
+ let chunks = asyncResults.get(msgId);
+ let chunk = chunks.shift();
+ let more = chunks.length;
+ if (more === 0) {
+ asyncResults.delete(msgId);
+ }
+ return ret({chunk, more});
+ };
+
+ const CHUNK_SIZE = 500000; // Work around any browser-dependent URL limit
+ let storeAsyncRet = (msgId, r) => {
+ r = JSON.stringify(r);
+ let len = r.length;
+ let chunksCount = Math.ceil(len / CHUNK_SIZE);
+ let chunks = [];
+ for (let j = 0; j < chunksCount; j++) {
+ chunks.push(r.substr(j * CHUNK_SIZE, CHUNK_SIZE));
+ }
+ asyncResults.set(msgId, chunks);
+ };
+
+ let listeners = new Set();
+ function notifyListeners(msg, sender) {
+ // Just like in the async runtime.sendMessage() API,
+ // we process the listeners in order until we find a not undefined
+ // result, then we return it (or undefined if none returns anything).
+ for (let l of listeners) {
+ try {
+ let result = l(JSON.parse(msg), sender);
+ if (result !== undefined) return result;
+ } catch (e) {
+ console.error("%o processing message %o from %o", e, msg, sender);
+ }
+ }
+ }
+ browser.runtime.onSyncMessage = Object.freeze({
+ ENDPOINT_PREFIX,
+ addListener(l) {
+ listeners.add(l);
+ if (listeners.size === 1) {
+ browser.webRequest.onBeforeRequest.addListener(onBeforeRequest,
+ {
+ urls: [`${ENDPOINT_PREFIX}*`],
+ types: ["xmlhttprequest"]
+ },
+ ["blocking"]
+ );
+ browser.webRequest.onHeadersReceived.addListener(onHeaderReceived,
+ {
+ urls: ["<all_urls>"],
+ types: ["main_frame", "sub_frame"]
+ },
+ ["blocking", "responseHeaders"]
+ );
+ }
+ },
+ removeListener(l) {
+ listeners.remove(l);
+ if (listeners.size === 0) {
+ browser.webRequest.onBeforeRequest.removeListener(onBeforeRequest);
+ browser.webRequest.onHeadersReceived.removeListener(onHeadersReceived);
+ }
+ },
+ hasListener(l) {
+ return listeners.has(l);
+ },
+ isMessageRequest(request) {
+ return request.type === "xmlhttprequest" && request.url.startsWith(ENDPOINT_PREFIX);
+ }
+ });
+ }
+ } else if (typeof browser.runtime.sendSyncMessage !== "function") {
+ // Content Script side
+ let uuid = () => (Math.random() * Date.now()).toString(16);
+ let docUrl = document.URL;
+ browser.runtime.sendSyncMessage = (msg, callback) => {
+ let msgId = `${uuid()},${docUrl}`;
+ let url = `${ENDPOINT_PREFIX}id=${encodeURIComponent(msgId)}` +
+ `&url=${encodeURIComponent(docUrl)}`;
+ if (window.top === window) {
+ // we add top URL information because Chromium doesn't know anything
+ // about frameAncestors
+ url += "&top=true";
+ }
+
+ if (MOZILLA) {
+ // on Firefox we first need to send an async message telling the
+ // background script about the tab ID, which does not get sent
+ // with "privileged" XHR
+ browser.runtime.sendMessage(
+ {__syncMessage__: {id: msgId, payload: msg}}
+ );
+ }
+ // then we send the payload using a privileged XHR, which is not subject
+ // to CORS but unfortunately doesn't carry any tab id except on Chromium
+
+ url += `&msg=${encodeURIComponent(JSON.stringify(msg))}`; // adding the payload
+ let r = new XMLHttpRequest();
+ let result;
+ let chunks = [];
+ for (;;) {
+ try {
+ r.open("GET", url, false);
+ r.send(null);
+ result = JSON.parse(r.responseText);
+ if ("chunk" in result) {
+ let {chunk, more} = result;
+ chunks.push(chunk);
+ if (more) {
+ continue;
+ }
+ result = JSON.parse(chunks.join(''));
+ } else {
+ if (result.error) throw result.error;
+ result = "payload" in result ? result.payload : result;
+ }
+ } catch(e) {
+ console.error(`syncMessage error in ${document.URL}: ${e.message} (response ${r.responseText})`);
+ }
+ break;
+ }
+ if (callback) callback(result);
+ return result;
+ };
+ }
+})();
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/log.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/log.js
new file mode 100644
index 0000000..7bc7739
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/log.js
@@ -0,0 +1,37 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+{
+ let PREFIX = typeof browser === "object" && typeof importScripts === "undefined"
+ ? `[${browser.runtime.getManifest().name}]` : '';
+
+ let debugCount = 0;
+
+ function log(msg, ...rest) {
+ console.log(`${PREFIX} ${msg}`, ...rest);
+ }
+
+ function debug(msg, ...rest) {
+ }
+
+ function error(e, msg, ...rest) {
+ console.error(`${PREFIX} ${msg}`, ...rest, e, e.message, e.stack);
+ }
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js
new file mode 100644
index 0000000..b9e357a
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js
@@ -0,0 +1,83 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+var tld = (() => {
+
+ const ipRx = /^(?:0\.|[1-9]\d{0,2}\.){3}(?:0|[1-9]\d{0,2})$|:.*:/i;
+
+ let tld = {
+ isIp(d) { return ipRx.test(d); },
+
+ normalize(host) {
+ return host.endsWith(".") ? host.slice(0, -1) : host;
+ },
+
+ getDomain(host) {
+ return this.parse(host).domain || host;
+ },
+
+ getPublicSuffix(host) {
+ return this.parse(host).tld;
+ },
+
+ parse(host, options = false) {
+ let excludePrivateTLD = options && options.exludePrivateTLD;
+ let excludeUnknownTLD = options && options.excludeUnknownTLD;
+ let preserveFQDNs = options && options.preserveFQDNs || this.preserveFQDNs;
+
+ if (!preserveFQDNs) host = this.normalize(host);
+
+ let parts = host.split(".");
+
+ let stack = "";
+ let level = -1;
+
+ let roots = excludePrivateTLD ? tlds.icann :
+ (tld.combined || (tld.combined = Object.assign({}, tlds.icann, tlds.private)));
+
+ for(let i = parts.length - 1, part; i >= 0; i--) {
+ part = parts[i];
+ stack = stack ? `${part}.${stack}` : part;
+ if(roots[stack])
+ level = roots[stack];
+ }
+
+ if (!excludeUnknownTLD) {
+ if(level === -1) {
+ if (this.isIp(host)) {
+ return {};
+ }
+ level = 1;
+ }
+ } else if(parts.length <= level || level == -1) {
+ throw new Error("Invalid TLD " + JSON.stringify({host, parts, level, excludeUnknownTLD}));
+ }
+ return {
+ tld : parts.slice(-level).join('.'),
+ domain : parts.slice(-level - 1).join('.'),
+ sub : parts.slice(0, (-level - 1)).join('.'),
+ };
+ }
+ };
+
+ const tlds = {"icann":{"ac":1,"com.ac":2,"edu.ac":2,"gov.ac":2,"net.ac":2,"mil.ac":2,"org.ac":2,"ad":1,"nom.ad":2,"ae":1,"co.ae":2,"net.ae":2,"org.ae":2,"sch.ae":2,"ac.ae":2,"gov.ae":2,"mil.ae":2,"aero":1,"accident-investigation.aero":2,"accident-prevention.aero":2,"aerobatic.aero":2,"aeroclub.aero":2,"aerodrome.aero":2,"agents.aero":2,"aircraft.aero":2,"airline.aero":2,"airport.aero":2,"air-surveillance.aero":2,"airtraffic.aero":2,"air-traffic-control.aero":2,"ambulance.aero":2,"amusement.aero":2,"association.aero":2,"author.aero":2,"ballooning.aero":2,"broker.aero":2,"caa.aero":2,"cargo.aero":2,"catering.aero":2,"certification.aero":2,"championship.aero":2,"charter.aero":2,"civilaviation.aero":2,"club.aero":2,"conference.aero":2,"consultant.aero":2,"consulting.aero":2,"control.aero":2,"council.aero":2,"crew.aero":2,"design.aero":2,"dgca.aero":2,"educator.aero":2,"emergency.aero":2,"engine.aero":2,"engineer.aero":2,"entertainment.aero":2,"equipment.aero":2,"exchange.aero":2,"express.aero":2,"federation.aero":2,"flight.aero":2,"fuel.aero":2,"gliding.aero":2,"government.aero":2,"groundhandling.aero":2,"group.aero":2,"hanggliding.aero":2,"homebuilt.aero":2,"insurance.aero":2,"journal.aero":2,"journalist.aero":2,"leasing.aero":2,"logistics.aero":2,"magazine.aero":2,"maintenance.aero":2,"media.aero":2,"microlight.aero":2,"modelling.aero":2,"navigation.aero":2,"parachuting.aero":2,"paragliding.aero":2,"passenger-association.aero":2,"pilot.aero":2,"press.aero":2,"production.aero":2,"recreation.aero":2,"repbody.aero":2,"res.aero":2,"research.aero":2,"rotorcraft.aero":2,"safety.aero":2,"scientist.aero":2,"services.aero":2,"show.aero":2,"skydiving.aero":2,"software.aero":2,"student.aero":2,"trader.aero":2,"trading.aero":2,"trainer.aero":2,"union.aero":2,"workinggroup.aero":2,"works.aero":2,"af":1,"gov.af":2,"com.af":2,"org.af":2,"net.af":2,"edu.af":2,"ag":1,"com.ag":2,"org.ag":2,"net.ag":2,"co.ag":2,"nom.ag":2,"ai":1,"off.ai":2,"com.ai":2,"net.ai":2,"org.ai":2,"al":1,"com.al":2,"edu.al":2,"gov.al":2,"mil.al":2,"net.al":2,"org.al":2,"am":1,"co.am":2,"com.am":2,"commune.am":2,"net.am":2,"org.am":2,"ao":1,"ed.ao":2,"gv.ao":2,"og.ao":2,"co.ao":2,"pb.ao":2,"it.ao":2,"aq":1,"ar":1,"bet.ar":2,"com.ar":2,"coop.ar":2,"edu.ar":2,"gob.ar":2,"gov.ar":2,"int.ar":2,"mil.ar":2,"musica.ar":2,"mutual.ar":2,"net.ar":2,"org.ar":2,"senasa.ar":2,"tur.ar":2,"arpa":1,"e164.arpa":2,"in-addr.arpa":2,"ip6.arpa":2,"iris.arpa":2,"uri.arpa":2,"urn.arpa":2,"as":1,"gov.as":2,"asia":1,"at":1,"ac.at":2,"co.at":2,"gv.at":2,"or.at":2,"sth.ac.at":3,"au":1,"com.au":2,"net.au":2,"org.au":2,"edu.au":2,"gov.au":2,"asn.au":2,"id.au":2,"info.au":2,"conf.au":2,"oz.au":2,"act.au":2,"nsw.au":2,"nt.au":2,"qld.au":2,"sa.au":2,"tas.au":2,"vic.au":2,"wa.au":2,"act.edu.au":3,"catholic.edu.au":3,"nsw.edu.au":3,"nt.edu.au":3,"qld.edu.au":3,"sa.edu.au":3,"tas.edu.au":3,"vic.edu.au":3,"wa.edu.au":3,"qld.gov.au":3,"sa.gov.au":3,"tas.gov.au":3,"vic.gov.au":3,"wa.gov.au":3,"schools.nsw.edu.au":4,"aw":1,"com.aw":2,"ax":1,"az":1,"com.az":2,"net.az":2,"int.az":2,"gov.az":2,"org.az":2,"edu.az":2,"info.az":2,"pp.az":2,"mil.az":2,"name.az":2,"pro.az":2,"biz.az":2,"ba":1,"com.ba":2,"edu.ba":2,"gov.ba":2,"mil.ba":2,"net.ba":2,"org.ba":2,"bb":1,"biz.bb":2,"co.bb":2,"com.bb":2,"edu.bb":2,"gov.bb":2,"info.bb":2,"net.bb":2,"org.bb":2,"store.bb":2,"tv.bb":2,"bd":2,"be":1,"ac.be":2,"bf":1,"gov.bf":2,"bg":1,"a.bg":2,"b.bg":2,"c.bg":2,"d.bg":2,"e.bg":2,"f.bg":2,"g.bg":2,"h.bg":2,"i.bg":2,"j.bg":2,"k.bg":2,"l.bg":2,"m.bg":2,"n.bg":2,"o.bg":2,"p.bg":2,"q.bg":2,"r.bg":2,"s.bg":2,"t.bg":2,"u.bg":2,"v.bg":2,"w.bg":2,"x.bg":2,"y.bg":2,"z.bg":2,"0.bg":2,"1.bg":2,"2.bg":2,"3.bg":2,"4.bg":2,"5.bg":2,"6.bg":2,"7.bg":2,"8.bg":2,"9.bg":2,"bh":1,"com.bh":2,"edu.bh":2,"net.bh":2,"org.bh":2,"gov.bh":2,"bi":1,"co.bi":2,"com.bi":2,"edu.bi":2,"or.bi":2,"org.bi":2,"biz":1,"bj":1,"asso.bj":2,"barreau.bj":2,"gouv.bj":2,"bm":1,"com.bm":2,"edu.bm":2,"gov.bm":2,"net.bm":2,"org.bm":2,"bn":1,"com.bn":2,"edu.bn":2,"gov.bn":2,"net.bn":2,"org.bn":2,"bo":1,"com.bo":2,"edu.bo":2,"gob.bo":2,"int.bo":2,"org.bo":2,"net.bo":2,"mil.bo":2,"tv.bo":2,"web.bo":2,"academia.bo":2,"agro.bo":2,"arte.bo":2,"blog.bo":2,"bolivia.bo":2,"ciencia.bo":2,"cooperativa.bo":2,"democracia.bo":2,"deporte.bo":2,"ecologia.bo":2,"economia.bo":2,"empresa.bo":2,"indigena.bo":2,"industria.bo":2,"info.bo":2,"medicina.bo":2,"movimiento.bo":2,"musica.bo":2,"natural.bo":2,"nombre.bo":2,"noticias.bo":2,"patria.bo":2,"politica.bo":2,"profesional.bo":2,"plurinacional.bo":2,"pueblo.bo":2,"revista.bo":2,"salud.bo":2,"tecnologia.bo":2,"tksat.bo":2,"transporte.bo":2,"wiki.bo":2,"br":1,"9guacu.br":2,"abc.br":2,"adm.br":2,"adv.br":2,"agr.br":2,"aju.br":2,"am.br":2,"anani.br":2,"aparecida.br":2,"app.br":2,"arq.br":2,"art.br":2,"ato.br":2,"b.br":2,"barueri.br":2,"belem.br":2,"bhz.br":2,"bib.br":2,"bio.br":2,"blog.br":2,"bmd.br":2,"boavista.br":2,"bsb.br":2,"campinagrande.br":2,"campinas.br":2,"caxias.br":2,"cim.br":2,"cng.br":2,"cnt.br":2,"com.br":2,"contagem.br":2,"coop.br":2,"coz.br":2,"cri.br":2,"cuiaba.br":2,"curitiba.br":2,"def.br":2,"des.br":2,"det.br":2,"dev.br":2,"ecn.br":2,"eco.br":2,"edu.br":2,"emp.br":2,"enf.br":2,"eng.br":2,"esp.br":2,"etc.br":2,"eti.br":2,"far.br":2,"feira.br":2,"flog.br":2,"floripa.br":2,"fm.br":2,"fnd.br":2,"fortal.br":2,"fot.br":2,"foz.br":2,"fst.br":2,"g12.br":2,"geo.br":2,"ggf.br":2,"goiania.br":2,"gov.br":2,"ac.gov.br":3,"al.gov.br":3,"am.gov.br":3,"ap.gov.br":3,"ba.gov.br":3,"ce.gov.br":3,"df.gov.br":3,"es.gov.br":3,"go.gov.br":3,"ma.gov.br":3,"mg.gov.br":3,"ms.gov.br":3,"mt.gov.br":3,"pa.gov.br":3,"pb.gov.br":3,"pe.gov.br":3,"pi.gov.br":3,"pr.gov.br":3,"rj.gov.br":3,"rn.gov.br":3,"ro.gov.br":3,"rr.gov.br":3,"rs.gov.br":3,"sc.gov.br":3,"se.gov.br":3,"sp.gov.br":3,"to.gov.br":3,"gru.br":2,"imb.br":2,"ind.br":2,"inf.br":2,"jab.br":2,"jampa.br":2,"jdf.br":2,"joinville.br":2,"jor.br":2,"jus.br":2,"leg.br":2,"lel.br":2,"log.br":2,"londrina.br":2,"macapa.br":2,"maceio.br":2,"manaus.br":2,"maringa.br":2,"mat.br":2,"med.br":2,"mil.br":2,"morena.br":2,"mp.br":2,"mus.br":2,"natal.br":2,"net.br":2,"niteroi.br":2,"nom.br":3,"not.br":2,"ntr.br":2,"odo.br":2,"ong.br":2,"org.br":2,"osasco.br":2,"palmas.br":2,"poa.br":2,"ppg.br":2,"pro.br":2,"psc.br":2,"psi.br":2,"pvh.br":2,"qsl.br":2,"radio.br":2,"rec.br":2,"recife.br":2,"rep.br":2,"ribeirao.br":2,"rio.br":2,"riobranco.br":2,"riopreto.br":2,"salvador.br":2,"sampa.br":2,"santamaria.br":2,"santoandre.br":2,"saobernardo.br":2,"saogonca.br":2,"seg.br":2,"sjc.br":2,"slg.br":2,"slz.br":2,"sorocaba.br":2,"srv.br":2,"taxi.br":2,"tc.br":2,"tec.br":2,"teo.br":2,"the.br":2,"tmp.br":2,"trd.br":2,"tur.br":2,"tv.br":2,"udi.br":2,"vet.br":2,"vix.br":2,"vlog.br":2,"wiki.br":2,"zlg.br":2,"bs":1,"com.bs":2,"net.bs":2,"org.bs":2,"edu.bs":2,"gov.bs":2,"bt":1,"com.bt":2,"edu.bt":2,"gov.bt":2,"net.bt":2,"org.bt":2,"bv":1,"bw":1,"co.bw":2,"org.bw":2,"by":1,"gov.by":2,"mil.by":2,"com.by":2,"of.by":2,"bz":1,"com.bz":2,"net.bz":2,"org.bz":2,"edu.bz":2,"gov.bz":2,"ca":1,"ab.ca":2,"bc.ca":2,"mb.ca":2,"nb.ca":2,"nf.ca":2,"nl.ca":2,"ns.ca":2,"nt.ca":2,"nu.ca":2,"on.ca":2,"pe.ca":2,"qc.ca":2,"sk.ca":2,"yk.ca":2,"gc.ca":2,"cat":1,"cc":1,"cd":1,"gov.cd":2,"cf":1,"cg":1,"ch":1,"ci":1,"org.ci":2,"or.ci":2,"com.ci":2,"co.ci":2,"edu.ci":2,"ed.ci":2,"ac.ci":2,"net.ci":2,"go.ci":2,"asso.ci":2,"xn--aroport-bya.ci":2,"int.ci":2,"presse.ci":2,"md.ci":2,"gouv.ci":2,"ck":2,"www.ck":1,"cl":1,"co.cl":2,"gob.cl":2,"gov.cl":2,"mil.cl":2,"cm":1,"co.cm":2,"com.cm":2,"gov.cm":2,"net.cm":2,"cn":1,"ac.cn":2,"com.cn":2,"edu.cn":2,"gov.cn":2,"net.cn":2,"org.cn":2,"mil.cn":2,"xn--55qx5d.cn":2,"xn--io0a7i.cn":2,"xn--od0alg.cn":2,"ah.cn":2,"bj.cn":2,"cq.cn":2,"fj.cn":2,"gd.cn":2,"gs.cn":2,"gz.cn":2,"gx.cn":2,"ha.cn":2,"hb.cn":2,"he.cn":2,"hi.cn":2,"hl.cn":2,"hn.cn":2,"jl.cn":2,"js.cn":2,"jx.cn":2,"ln.cn":2,"nm.cn":2,"nx.cn":2,"qh.cn":2,"sc.cn":2,"sd.cn":2,"sh.cn":2,"sn.cn":2,"sx.cn":2,"tj.cn":2,"xj.cn":2,"xz.cn":2,"yn.cn":2,"zj.cn":2,"hk.cn":2,"mo.cn":2,"tw.cn":2,"co":1,"arts.co":2,"com.co":2,"edu.co":2,"firm.co":2,"gov.co":2,"info.co":2,"int.co":2,"mil.co":2,"net.co":2,"nom.co":2,"org.co":2,"rec.co":2,"web.co":2,"com":1,"coop":1,"cr":1,"ac.cr":2,"co.cr":2,"ed.cr":2,"fi.cr":2,"go.cr":2,"or.cr":2,"sa.cr":2,"cu":1,"com.cu":2,"edu.cu":2,"org.cu":2,"net.cu":2,"gov.cu":2,"inf.cu":2,"cv":1,"com.cv":2,"edu.cv":2,"int.cv":2,"nome.cv":2,"org.cv":2,"cw":1,"com.cw":2,"edu.cw":2,"net.cw":2,"org.cw":2,"cx":1,"gov.cx":2,"cy":1,"ac.cy":2,"biz.cy":2,"com.cy":2,"ekloges.cy":2,"gov.cy":2,"ltd.cy":2,"mil.cy":2,"net.cy":2,"org.cy":2,"press.cy":2,"pro.cy":2,"tm.cy":2,"cz":1,"de":1,"dj":1,"dk":1,"dm":1,"com.dm":2,"net.dm":2,"org.dm":2,"edu.dm":2,"gov.dm":2,"do":1,"art.do":2,"com.do":2,"edu.do":2,"gob.do":2,"gov.do":2,"mil.do":2,"net.do":2,"org.do":2,"sld.do":2,"web.do":2,"dz":1,"art.dz":2,"asso.dz":2,"com.dz":2,"edu.dz":2,"gov.dz":2,"org.dz":2,"net.dz":2,"pol.dz":2,"soc.dz":2,"tm.dz":2,"ec":1,"com.ec":2,"info.ec":2,"net.ec":2,"fin.ec":2,"k12.ec":2,"med.ec":2,"pro.ec":2,"org.ec":2,"edu.ec":2,"gov.ec":2,"gob.ec":2,"mil.ec":2,"edu":1,"ee":1,"edu.ee":2,"gov.ee":2,"riik.ee":2,"lib.ee":2,"med.ee":2,"com.ee":2,"pri.ee":2,"aip.ee":2,"org.ee":2,"fie.ee":2,"eg":1,"com.eg":2,"edu.eg":2,"eun.eg":2,"gov.eg":2,"mil.eg":2,"name.eg":2,"net.eg":2,"org.eg":2,"sci.eg":2,"er":2,"es":1,"com.es":2,"nom.es":2,"org.es":2,"gob.es":2,"edu.es":2,"et":1,"com.et":2,"gov.et":2,"org.et":2,"edu.et":2,"biz.et":2,"name.et":2,"info.et":2,"net.et":2,"eu":1,"fi":1,"aland.fi":2,"fj":1,"ac.fj":2,"biz.fj":2,"com.fj":2,"gov.fj":2,"info.fj":2,"mil.fj":2,"name.fj":2,"net.fj":2,"org.fj":2,"pro.fj":2,"fk":2,"com.fm":2,"edu.fm":2,"net.fm":2,"org.fm":2,"fm":1,"fo":1,"fr":1,"asso.fr":2,"com.fr":2,"gouv.fr":2,"nom.fr":2,"prd.fr":2,"tm.fr":2,"aeroport.fr":2,"avocat.fr":2,"avoues.fr":2,"cci.fr":2,"chambagri.fr":2,"chirurgiens-dentistes.fr":2,"experts-comptables.fr":2,"geometre-expert.fr":2,"greta.fr":2,"huissier-justice.fr":2,"medecin.fr":2,"notaires.fr":2,"pharmacien.fr":2,"port.fr":2,"veterinaire.fr":2,"ga":1,"gb":1,"edu.gd":2,"gov.gd":2,"gd":1,"ge":1,"com.ge":2,"edu.ge":2,"gov.ge":2,"org.ge":2,"mil.ge":2,"net.ge":2,"pvt.ge":2,"gf":1,"gg":1,"co.gg":2,"net.gg":2,"org.gg":2,"gh":1,"com.gh":2,"edu.gh":2,"gov.gh":2,"org.gh":2,"mil.gh":2,"gi":1,"com.gi":2,"ltd.gi":2,"gov.gi":2,"mod.gi":2,"edu.gi":2,"org.gi":2,"gl":1,"co.gl":2,"com.gl":2,"edu.gl":2,"net.gl":2,"org.gl":2,"gm":1,"gn":1,"ac.gn":2,"com.gn":2,"edu.gn":2,"gov.gn":2,"org.gn":2,"net.gn":2,"gov":1,"gp":1,"com.gp":2,"net.gp":2,"mobi.gp":2,"edu.gp":2,"org.gp":2,"asso.gp":2,"gq":1,"gr":1,"com.gr":2,"edu.gr":2,"net.gr":2,"org.gr":2,"gov.gr":2,"gs":1,"gt":1,"com.gt":2,"edu.gt":2,"gob.gt":2,"ind.gt":2,"mil.gt":2,"net.gt":2,"org.gt":2,"gu":1,"com.gu":2,"edu.gu":2,"gov.gu":2,"guam.gu":2,"info.gu":2,"net.gu":2,"org.gu":2,"web.gu":2,"gw":1,"gy":1,"co.gy":2,"com.gy":2,"edu.gy":2,"gov.gy":2,"net.gy":2,"org.gy":2,"hk":1,"com.hk":2,"edu.hk":2,"gov.hk":2,"idv.hk":2,"net.hk":2,"org.hk":2,"xn--55qx5d.hk":2,"xn--wcvs22d.hk":2,"xn--lcvr32d.hk":2,"xn--mxtq1m.hk":2,"xn--gmqw5a.hk":2,"xn--ciqpn.hk":2,"xn--gmq050i.hk":2,"xn--zf0avx.hk":2,"xn--io0a7i.hk":2,"xn--mk0axi.hk":2,"xn--od0alg.hk":2,"xn--od0aq3b.hk":2,"xn--tn0ag.hk":2,"xn--uc0atv.hk":2,"xn--uc0ay4a.hk":2,"hm":1,"hn":1,"com.hn":2,"edu.hn":2,"org.hn":2,"net.hn":2,"mil.hn":2,"gob.hn":2,"hr":1,"iz.hr":2,"from.hr":2,"name.hr":2,"com.hr":2,"ht":1,"com.ht":2,"shop.ht":2,"firm.ht":2,"info.ht":2,"adult.ht":2,"net.ht":2,"pro.ht":2,"org.ht":2,"med.ht":2,"art.ht":2,"coop.ht":2,"pol.ht":2,"asso.ht":2,"edu.ht":2,"rel.ht":2,"gouv.ht":2,"perso.ht":2,"hu":1,"co.hu":2,"info.hu":2,"org.hu":2,"priv.hu":2,"sport.hu":2,"tm.hu":2,"2000.hu":2,"agrar.hu":2,"bolt.hu":2,"casino.hu":2,"city.hu":2,"erotica.hu":2,"erotika.hu":2,"film.hu":2,"forum.hu":2,"games.hu":2,"hotel.hu":2,"ingatlan.hu":2,"jogasz.hu":2,"konyvelo.hu":2,"lakas.hu":2,"media.hu":2,"news.hu":2,"reklam.hu":2,"sex.hu":2,"shop.hu":2,"suli.hu":2,"szex.hu":2,"tozsde.hu":2,"utazas.hu":2,"video.hu":2,"id":1,"ac.id":2,"biz.id":2,"co.id":2,"desa.id":2,"go.id":2,"mil.id":2,"my.id":2,"net.id":2,"or.id":2,"ponpes.id":2,"sch.id":2,"web.id":2,"ie":1,"gov.ie":2,"il":1,"ac.il":2,"co.il":2,"gov.il":2,"idf.il":2,"k12.il":2,"muni.il":2,"net.il":2,"org.il":2,"im":1,"ac.im":2,"co.im":2,"com.im":2,"ltd.co.im":3,"net.im":2,"org.im":2,"plc.co.im":3,"tt.im":2,"tv.im":2,"in":1,"co.in":2,"firm.in":2,"net.in":2,"org.in":2,"gen.in":2,"ind.in":2,"nic.in":2,"ac.in":2,"edu.in":2,"res.in":2,"gov.in":2,"mil.in":2,"info":1,"int":1,"eu.int":2,"io":1,"com.io":2,"iq":1,"gov.iq":2,"edu.iq":2,"mil.iq":2,"com.iq":2,"org.iq":2,"net.iq":2,"ir":1,"ac.ir":2,"co.ir":2,"gov.ir":2,"id.ir":2,"net.ir":2,"org.ir":2,"sch.ir":2,"xn--mgba3a4f16a.ir":2,"xn--mgba3a4fra.ir":2,"is":1,"net.is":2,"com.is":2,"edu.is":2,"gov.is":2,"org.is":2,"int.is":2,"it":1,"gov.it":2,"edu.it":2,"abr.it":2,"abruzzo.it":2,"aosta-valley.it":2,"aostavalley.it":2,"bas.it":2,"basilicata.it":2,"cal.it":2,"calabria.it":2,"cam.it":2,"campania.it":2,"emilia-romagna.it":2,"emiliaromagna.it":2,"emr.it":2,"friuli-v-giulia.it":2,"friuli-ve-giulia.it":2,"friuli-vegiulia.it":2,"friuli-venezia-giulia.it":2,"friuli-veneziagiulia.it":2,"friuli-vgiulia.it":2,"friuliv-giulia.it":2,"friulive-giulia.it":2,"friulivegiulia.it":2,"friulivenezia-giulia.it":2,"friuliveneziagiulia.it":2,"friulivgiulia.it":2,"fvg.it":2,"laz.it":2,"lazio.it":2,"lig.it":2,"liguria.it":2,"lom.it":2,"lombardia.it":2,"lombardy.it":2,"lucania.it":2,"mar.it":2,"marche.it":2,"mol.it":2,"molise.it":2,"piedmont.it":2,"piemonte.it":2,"pmn.it":2,"pug.it":2,"puglia.it":2,"sar.it":2,"sardegna.it":2,"sardinia.it":2,"sic.it":2,"sicilia.it":2,"sicily.it":2,"taa.it":2,"tos.it":2,"toscana.it":2,"trentin-sud-tirol.it":2,"xn--trentin-sd-tirol-rzb.it":2,"trentin-sudtirol.it":2,"xn--trentin-sdtirol-7vb.it":2,"trentin-sued-tirol.it":2,"trentin-suedtirol.it":2,"trentino-a-adige.it":2,"trentino-aadige.it":2,"trentino-alto-adige.it":2,"trentino-altoadige.it":2,"trentino-s-tirol.it":2,"trentino-stirol.it":2,"trentino-sud-tirol.it":2,"xn--trentino-sd-tirol-c3b.it":2,"trentino-sudtirol.it":2,"xn--trentino-sdtirol-szb.it":2,"trentino-sued-tirol.it":2,"trentino-suedtirol.it":2,"trentino.it":2,"trentinoa-adige.it":2,"trentinoaadige.it":2,"trentinoalto-adige.it":2,"trentinoaltoadige.it":2,"trentinos-tirol.it":2,"trentinostirol.it":2,"trentinosud-tirol.it":2,"xn--trentinosd-tirol-rzb.it":2,"trentinosudtirol.it":2,"xn--trentinosdtirol-7vb.it":2,"trentinosued-tirol.it":2,"trentinosuedtirol.it":2,"trentinsud-tirol.it":2,"xn--trentinsd-tirol-6vb.it":2,"trentinsudtirol.it":2,"xn--trentinsdtirol-nsb.it":2,"trentinsued-tirol.it":2,"trentinsuedtirol.it":2,"tuscany.it":2,"umb.it":2,"umbria.it":2,"val-d-aosta.it":2,"val-daosta.it":2,"vald-aosta.it":2,"valdaosta.it":2,"valle-aosta.it":2,"valle-d-aosta.it":2,"valle-daosta.it":2,"valleaosta.it":2,"valled-aosta.it":2,"valledaosta.it":2,"vallee-aoste.it":2,"xn--valle-aoste-ebb.it":2,"vallee-d-aoste.it":2,"xn--valle-d-aoste-ehb.it":2,"valleeaoste.it":2,"xn--valleaoste-e7a.it":2,"valleedaoste.it":2,"xn--valledaoste-ebb.it":2,"vao.it":2,"vda.it":2,"ven.it":2,"veneto.it":2,"ag.it":2,"agrigento.it":2,"al.it":2,"alessandria.it":2,"alto-adige.it":2,"altoadige.it":2,"an.it":2,"ancona.it":2,"andria-barletta-trani.it":2,"andria-trani-barletta.it":2,"andriabarlettatrani.it":2,"andriatranibarletta.it":2,"ao.it":2,"aosta.it":2,"aoste.it":2,"ap.it":2,"aq.it":2,"aquila.it":2,"ar.it":2,"arezzo.it":2,"ascoli-piceno.it":2,"ascolipiceno.it":2,"asti.it":2,"at.it":2,"av.it":2,"avellino.it":2,"ba.it":2,"balsan-sudtirol.it":2,"xn--balsan-sdtirol-nsb.it":2,"balsan-suedtirol.it":2,"balsan.it":2,"bari.it":2,"barletta-trani-andria.it":2,"barlettatraniandria.it":2,"belluno.it":2,"benevento.it":2,"bergamo.it":2,"bg.it":2,"bi.it":2,"biella.it":2,"bl.it":2,"bn.it":2,"bo.it":2,"bologna.it":2,"bolzano-altoadige.it":2,"bolzano.it":2,"bozen-sudtirol.it":2,"xn--bozen-sdtirol-2ob.it":2,"bozen-suedtirol.it":2,"bozen.it":2,"br.it":2,"brescia.it":2,"brindisi.it":2,"bs.it":2,"bt.it":2,"bulsan-sudtirol.it":2,"xn--bulsan-sdtirol-nsb.it":2,"bulsan-suedtirol.it":2,"bulsan.it":2,"bz.it":2,"ca.it":2,"cagliari.it":2,"caltanissetta.it":2,"campidano-medio.it":2,"campidanomedio.it":2,"campobasso.it":2,"carbonia-iglesias.it":2,"carboniaiglesias.it":2,"carrara-massa.it":2,"carraramassa.it":2,"caserta.it":2,"catania.it":2,"catanzaro.it":2,"cb.it":2,"ce.it":2,"cesena-forli.it":2,"xn--cesena-forl-mcb.it":2,"cesenaforli.it":2,"xn--cesenaforl-i8a.it":2,"ch.it":2,"chieti.it":2,"ci.it":2,"cl.it":2,"cn.it":2,"co.it":2,"como.it":2,"cosenza.it":2,"cr.it":2,"cremona.it":2,"crotone.it":2,"cs.it":2,"ct.it":2,"cuneo.it":2,"cz.it":2,"dell-ogliastra.it":2,"dellogliastra.it":2,"en.it":2,"enna.it":2,"fc.it":2,"fe.it":2,"fermo.it":2,"ferrara.it":2,"fg.it":2,"fi.it":2,"firenze.it":2,"florence.it":2,"fm.it":2,"foggia.it":2,"forli-cesena.it":2,"xn--forl-cesena-fcb.it":2,"forlicesena.it":2,"xn--forlcesena-c8a.it":2,"fr.it":2,"frosinone.it":2,"ge.it":2,"genoa.it":2,"genova.it":2,"go.it":2,"gorizia.it":2,"gr.it":2,"grosseto.it":2,"iglesias-carbonia.it":2,"iglesiascarbonia.it":2,"im.it":2,"imperia.it":2,"is.it":2,"isernia.it":2,"kr.it":2,"la-spezia.it":2,"laquila.it":2,"laspezia.it":2,"latina.it":2,"lc.it":2,"le.it":2,"lecce.it":2,"lecco.it":2,"li.it":2,"livorno.it":2,"lo.it":2,"lodi.it":2,"lt.it":2,"lu.it":2,"lucca.it":2,"macerata.it":2,"mantova.it":2,"massa-carrara.it":2,"massacarrara.it":2,"matera.it":2,"mb.it":2,"mc.it":2,"me.it":2,"medio-campidano.it":2,"mediocampidano.it":2,"messina.it":2,"mi.it":2,"milan.it":2,"milano.it":2,"mn.it":2,"mo.it":2,"modena.it":2,"monza-brianza.it":2,"monza-e-della-brianza.it":2,"monza.it":2,"monzabrianza.it":2,"monzaebrianza.it":2,"monzaedellabrianza.it":2,"ms.it":2,"mt.it":2,"na.it":2,"naples.it":2,"napoli.it":2,"no.it":2,"novara.it":2,"nu.it":2,"nuoro.it":2,"og.it":2,"ogliastra.it":2,"olbia-tempio.it":2,"olbiatempio.it":2,"or.it":2,"oristano.it":2,"ot.it":2,"pa.it":2,"padova.it":2,"padua.it":2,"palermo.it":2,"parma.it":2,"pavia.it":2,"pc.it":2,"pd.it":2,"pe.it":2,"perugia.it":2,"pesaro-urbino.it":2,"pesarourbino.it":2,"pescara.it":2,"pg.it":2,"pi.it":2,"piacenza.it":2,"pisa.it":2,"pistoia.it":2,"pn.it":2,"po.it":2,"pordenone.it":2,"potenza.it":2,"pr.it":2,"prato.it":2,"pt.it":2,"pu.it":2,"pv.it":2,"pz.it":2,"ra.it":2,"ragusa.it":2,"ravenna.it":2,"rc.it":2,"re.it":2,"reggio-calabria.it":2,"reggio-emilia.it":2,"reggiocalabria.it":2,"reggioemilia.it":2,"rg.it":2,"ri.it":2,"rieti.it":2,"rimini.it":2,"rm.it":2,"rn.it":2,"ro.it":2,"roma.it":2,"rome.it":2,"rovigo.it":2,"sa.it":2,"salerno.it":2,"sassari.it":2,"savona.it":2,"si.it":2,"siena.it":2,"siracusa.it":2,"so.it":2,"sondrio.it":2,"sp.it":2,"sr.it":2,"ss.it":2,"suedtirol.it":2,"xn--sdtirol-n2a.it":2,"sv.it":2,"ta.it":2,"taranto.it":2,"te.it":2,"tempio-olbia.it":2,"tempioolbia.it":2,"teramo.it":2,"terni.it":2,"tn.it":2,"to.it":2,"torino.it":2,"tp.it":2,"tr.it":2,"trani-andria-barletta.it":2,"trani-barletta-andria.it":2,"traniandriabarletta.it":2,"tranibarlettaandria.it":2,"trapani.it":2,"trento.it":2,"treviso.it":2,"trieste.it":2,"ts.it":2,"turin.it":2,"tv.it":2,"ud.it":2,"udine.it":2,"urbino-pesaro.it":2,"urbinopesaro.it":2,"va.it":2,"varese.it":2,"vb.it":2,"vc.it":2,"ve.it":2,"venezia.it":2,"venice.it":2,"verbania.it":2,"vercelli.it":2,"verona.it":2,"vi.it":2,"vibo-valentia.it":2,"vibovalentia.it":2,"vicenza.it":2,"viterbo.it":2,"vr.it":2,"vs.it":2,"vt.it":2,"vv.it":2,"je":1,"co.je":2,"net.je":2,"org.je":2,"jm":2,"jo":1,"com.jo":2,"org.jo":2,"net.jo":2,"edu.jo":2,"sch.jo":2,"gov.jo":2,"mil.jo":2,"name.jo":2,"jobs":1,"jp":1,"ac.jp":2,"ad.jp":2,"co.jp":2,"ed.jp":2,"go.jp":2,"gr.jp":2,"lg.jp":2,"ne.jp":2,"or.jp":2,"aichi.jp":2,"akita.jp":2,"aomori.jp":2,"chiba.jp":2,"ehime.jp":2,"fukui.jp":2,"fukuoka.jp":2,"fukushima.jp":2,"gifu.jp":2,"gunma.jp":2,"hiroshima.jp":2,"hokkaido.jp":2,"hyogo.jp":2,"ibaraki.jp":2,"ishikawa.jp":2,"iwate.jp":2,"kagawa.jp":2,"kagoshima.jp":2,"kanagawa.jp":2,"kochi.jp":2,"kumamoto.jp":2,"kyoto.jp":2,"mie.jp":2,"miyagi.jp":2,"miyazaki.jp":2,"nagano.jp":2,"nagasaki.jp":2,"nara.jp":2,"niigata.jp":2,"oita.jp":2,"okayama.jp":2,"okinawa.jp":2,"osaka.jp":2,"saga.jp":2,"saitama.jp":2,"shiga.jp":2,"shimane.jp":2,"shizuoka.jp":2,"tochigi.jp":2,"tokushima.jp":2,"tokyo.jp":2,"tottori.jp":2,"toyama.jp":2,"wakayama.jp":2,"yamagata.jp":2,"yamaguchi.jp":2,"yamanashi.jp":2,"xn--4pvxs.jp":2,"xn--vgu402c.jp":2,"xn--c3s14m.jp":2,"xn--f6qx53a.jp":2,"xn--8pvr4u.jp":2,"xn--uist22h.jp":2,"xn--djrs72d6uy.jp":2,"xn--mkru45i.jp":2,"xn--0trq7p7nn.jp":2,"xn--8ltr62k.jp":2,"xn--2m4a15e.jp":2,"xn--efvn9s.jp":2,"xn--32vp30h.jp":2,"xn--4it797k.jp":2,"xn--1lqs71d.jp":2,"xn--5rtp49c.jp":2,"xn--5js045d.jp":2,"xn--ehqz56n.jp":2,"xn--1lqs03n.jp":2,"xn--qqqt11m.jp":2,"xn--kbrq7o.jp":2,"xn--pssu33l.jp":2,"xn--ntsq17g.jp":2,"xn--uisz3g.jp":2,"xn--6btw5a.jp":2,"xn--1ctwo.jp":2,"xn--6orx2r.jp":2,"xn--rht61e.jp":2,"xn--rht27z.jp":2,"xn--djty4k.jp":2,"xn--nit225k.jp":2,"xn--rht3d.jp":2,"xn--klty5x.jp":2,"xn--kltx9a.jp":2,"xn--kltp7d.jp":2,"xn--uuwu58a.jp":2,"xn--zbx025d.jp":2,"xn--ntso0iqx3a.jp":2,"xn--elqq16h.jp":2,"xn--4it168d.jp":2,"xn--klt787d.jp":2,"xn--rny31h.jp":2,"xn--7t0a264c.jp":2,"xn--5rtq34k.jp":2,"xn--k7yn95e.jp":2,"xn--tor131o.jp":2,"xn--d5qv7z876c.jp":2,"kawasaki.jp":3,"kitakyushu.jp":3,"kobe.jp":3,"nagoya.jp":3,"sapporo.jp":3,"sendai.jp":3,"yokohama.jp":3,"city.kawasaki.jp":2,"city.kitakyushu.jp":2,"city.kobe.jp":2,"city.nagoya.jp":2,"city.sapporo.jp":2,"city.sendai.jp":2,"city.yokohama.jp":2,"aisai.aichi.jp":3,"ama.aichi.jp":3,"anjo.aichi.jp":3,"asuke.aichi.jp":3,"chiryu.aichi.jp":3,"chita.aichi.jp":3,"fuso.aichi.jp":3,"gamagori.aichi.jp":3,"handa.aichi.jp":3,"hazu.aichi.jp":3,"hekinan.aichi.jp":3,"higashiura.aichi.jp":3,"ichinomiya.aichi.jp":3,"inazawa.aichi.jp":3,"inuyama.aichi.jp":3,"isshiki.aichi.jp":3,"iwakura.aichi.jp":3,"kanie.aichi.jp":3,"kariya.aichi.jp":3,"kasugai.aichi.jp":3,"kira.aichi.jp":3,"kiyosu.aichi.jp":3,"komaki.aichi.jp":3,"konan.aichi.jp":3,"kota.aichi.jp":3,"mihama.aichi.jp":3,"miyoshi.aichi.jp":3,"nishio.aichi.jp":3,"nisshin.aichi.jp":3,"obu.aichi.jp":3,"oguchi.aichi.jp":3,"oharu.aichi.jp":3,"okazaki.aichi.jp":3,"owariasahi.aichi.jp":3,"seto.aichi.jp":3,"shikatsu.aichi.jp":3,"shinshiro.aichi.jp":3,"shitara.aichi.jp":3,"tahara.aichi.jp":3,"takahama.aichi.jp":3,"tobishima.aichi.jp":3,"toei.aichi.jp":3,"togo.aichi.jp":3,"tokai.aichi.jp":3,"tokoname.aichi.jp":3,"toyoake.aichi.jp":3,"toyohashi.aichi.jp":3,"toyokawa.aichi.jp":3,"toyone.aichi.jp":3,"toyota.aichi.jp":3,"tsushima.aichi.jp":3,"yatomi.aichi.jp":3,"akita.akita.jp":3,"daisen.akita.jp":3,"fujisato.akita.jp":3,"gojome.akita.jp":3,"hachirogata.akita.jp":3,"happou.akita.jp":3,"higashinaruse.akita.jp":3,"honjo.akita.jp":3,"honjyo.akita.jp":3,"ikawa.akita.jp":3,"kamikoani.akita.jp":3,"kamioka.akita.jp":3,"katagami.akita.jp":3,"kazuno.akita.jp":3,"kitaakita.akita.jp":3,"kosaka.akita.jp":3,"kyowa.akita.jp":3,"misato.akita.jp":3,"mitane.akita.jp":3,"moriyoshi.akita.jp":3,"nikaho.akita.jp":3,"noshiro.akita.jp":3,"odate.akita.jp":3,"oga.akita.jp":3,"ogata.akita.jp":3,"semboku.akita.jp":3,"yokote.akita.jp":3,"yurihonjo.akita.jp":3,"aomori.aomori.jp":3,"gonohe.aomori.jp":3,"hachinohe.aomori.jp":3,"hashikami.aomori.jp":3,"hiranai.aomori.jp":3,"hirosaki.aomori.jp":3,"itayanagi.aomori.jp":3,"kuroishi.aomori.jp":3,"misawa.aomori.jp":3,"mutsu.aomori.jp":3,"nakadomari.aomori.jp":3,"noheji.aomori.jp":3,"oirase.aomori.jp":3,"owani.aomori.jp":3,"rokunohe.aomori.jp":3,"sannohe.aomori.jp":3,"shichinohe.aomori.jp":3,"shingo.aomori.jp":3,"takko.aomori.jp":3,"towada.aomori.jp":3,"tsugaru.aomori.jp":3,"tsuruta.aomori.jp":3,"abiko.chiba.jp":3,"asahi.chiba.jp":3,"chonan.chiba.jp":3,"chosei.chiba.jp":3,"choshi.chiba.jp":3,"chuo.chiba.jp":3,"funabashi.chiba.jp":3,"futtsu.chiba.jp":3,"hanamigawa.chiba.jp":3,"ichihara.chiba.jp":3,"ichikawa.chiba.jp":3,"ichinomiya.chiba.jp":3,"inzai.chiba.jp":3,"isumi.chiba.jp":3,"kamagaya.chiba.jp":3,"kamogawa.chiba.jp":3,"kashiwa.chiba.jp":3,"katori.chiba.jp":3,"katsuura.chiba.jp":3,"kimitsu.chiba.jp":3,"kisarazu.chiba.jp":3,"kozaki.chiba.jp":3,"kujukuri.chiba.jp":3,"kyonan.chiba.jp":3,"matsudo.chiba.jp":3,"midori.chiba.jp":3,"mihama.chiba.jp":3,"minamiboso.chiba.jp":3,"mobara.chiba.jp":3,"mutsuzawa.chiba.jp":3,"nagara.chiba.jp":3,"nagareyama.chiba.jp":3,"narashino.chiba.jp":3,"narita.chiba.jp":3,"noda.chiba.jp":3,"oamishirasato.chiba.jp":3,"omigawa.chiba.jp":3,"onjuku.chiba.jp":3,"otaki.chiba.jp":3,"sakae.chiba.jp":3,"sakura.chiba.jp":3,"shimofusa.chiba.jp":3,"shirako.chiba.jp":3,"shiroi.chiba.jp":3,"shisui.chiba.jp":3,"sodegaura.chiba.jp":3,"sosa.chiba.jp":3,"tako.chiba.jp":3,"tateyama.chiba.jp":3,"togane.chiba.jp":3,"tohnosho.chiba.jp":3,"tomisato.chiba.jp":3,"urayasu.chiba.jp":3,"yachimata.chiba.jp":3,"yachiyo.chiba.jp":3,"yokaichiba.chiba.jp":3,"yokoshibahikari.chiba.jp":3,"yotsukaido.chiba.jp":3,"ainan.ehime.jp":3,"honai.ehime.jp":3,"ikata.ehime.jp":3,"imabari.ehime.jp":3,"iyo.ehime.jp":3,"kamijima.ehime.jp":3,"kihoku.ehime.jp":3,"kumakogen.ehime.jp":3,"masaki.ehime.jp":3,"matsuno.ehime.jp":3,"matsuyama.ehime.jp":3,"namikata.ehime.jp":3,"niihama.ehime.jp":3,"ozu.ehime.jp":3,"saijo.ehime.jp":3,"seiyo.ehime.jp":3,"shikokuchuo.ehime.jp":3,"tobe.ehime.jp":3,"toon.ehime.jp":3,"uchiko.ehime.jp":3,"uwajima.ehime.jp":3,"yawatahama.ehime.jp":3,"echizen.fukui.jp":3,"eiheiji.fukui.jp":3,"fukui.fukui.jp":3,"ikeda.fukui.jp":3,"katsuyama.fukui.jp":3,"mihama.fukui.jp":3,"minamiechizen.fukui.jp":3,"obama.fukui.jp":3,"ohi.fukui.jp":3,"ono.fukui.jp":3,"sabae.fukui.jp":3,"sakai.fukui.jp":3,"takahama.fukui.jp":3,"tsuruga.fukui.jp":3,"wakasa.fukui.jp":3,"ashiya.fukuoka.jp":3,"buzen.fukuoka.jp":3,"chikugo.fukuoka.jp":3,"chikuho.fukuoka.jp":3,"chikujo.fukuoka.jp":3,"chikushino.fukuoka.jp":3,"chikuzen.fukuoka.jp":3,"chuo.fukuoka.jp":3,"dazaifu.fukuoka.jp":3,"fukuchi.fukuoka.jp":3,"hakata.fukuoka.jp":3,"higashi.fukuoka.jp":3,"hirokawa.fukuoka.jp":3,"hisayama.fukuoka.jp":3,"iizuka.fukuoka.jp":3,"inatsuki.fukuoka.jp":3,"kaho.fukuoka.jp":3,"kasuga.fukuoka.jp":3,"kasuya.fukuoka.jp":3,"kawara.fukuoka.jp":3,"keisen.fukuoka.jp":3,"koga.fukuoka.jp":3,"kurate.fukuoka.jp":3,"kurogi.fukuoka.jp":3,"kurume.fukuoka.jp":3,"minami.fukuoka.jp":3,"miyako.fukuoka.jp":3,"miyama.fukuoka.jp":3,"miyawaka.fukuoka.jp":3,"mizumaki.fukuoka.jp":3,"munakata.fukuoka.jp":3,"nakagawa.fukuoka.jp":3,"nakama.fukuoka.jp":3,"nishi.fukuoka.jp":3,"nogata.fukuoka.jp":3,"ogori.fukuoka.jp":3,"okagaki.fukuoka.jp":3,"okawa.fukuoka.jp":3,"oki.fukuoka.jp":3,"omuta.fukuoka.jp":3,"onga.fukuoka.jp":3,"onojo.fukuoka.jp":3,"oto.fukuoka.jp":3,"saigawa.fukuoka.jp":3,"sasaguri.fukuoka.jp":3,"shingu.fukuoka.jp":3,"shinyoshitomi.fukuoka.jp":3,"shonai.fukuoka.jp":3,"soeda.fukuoka.jp":3,"sue.fukuoka.jp":3,"tachiarai.fukuoka.jp":3,"tagawa.fukuoka.jp":3,"takata.fukuoka.jp":3,"toho.fukuoka.jp":3,"toyotsu.fukuoka.jp":3,"tsuiki.fukuoka.jp":3,"ukiha.fukuoka.jp":3,"umi.fukuoka.jp":3,"usui.fukuoka.jp":3,"yamada.fukuoka.jp":3,"yame.fukuoka.jp":3,"yanagawa.fukuoka.jp":3,"yukuhashi.fukuoka.jp":3,"aizubange.fukushima.jp":3,"aizumisato.fukushima.jp":3,"aizuwakamatsu.fukushima.jp":3,"asakawa.fukushima.jp":3,"bandai.fukushima.jp":3,"date.fukushima.jp":3,"fukushima.fukushima.jp":3,"furudono.fukushima.jp":3,"futaba.fukushima.jp":3,"hanawa.fukushima.jp":3,"higashi.fukushima.jp":3,"hirata.fukushima.jp":3,"hirono.fukushima.jp":3,"iitate.fukushima.jp":3,"inawashiro.fukushima.jp":3,"ishikawa.fukushima.jp":3,"iwaki.fukushima.jp":3,"izumizaki.fukushima.jp":3,"kagamiishi.fukushima.jp":3,"kaneyama.fukushima.jp":3,"kawamata.fukushima.jp":3,"kitakata.fukushima.jp":3,"kitashiobara.fukushima.jp":3,"koori.fukushima.jp":3,"koriyama.fukushima.jp":3,"kunimi.fukushima.jp":3,"miharu.fukushima.jp":3,"mishima.fukushima.jp":3,"namie.fukushima.jp":3,"nango.fukushima.jp":3,"nishiaizu.fukushima.jp":3,"nishigo.fukushima.jp":3,"okuma.fukushima.jp":3,"omotego.fukushima.jp":3,"ono.fukushima.jp":3,"otama.fukushima.jp":3,"samegawa.fukushima.jp":3,"shimogo.fukushima.jp":3,"shirakawa.fukushima.jp":3,"showa.fukushima.jp":3,"soma.fukushima.jp":3,"sukagawa.fukushima.jp":3,"taishin.fukushima.jp":3,"tamakawa.fukushima.jp":3,"tanagura.fukushima.jp":3,"tenei.fukushima.jp":3,"yabuki.fukushima.jp":3,"yamato.fukushima.jp":3,"yamatsuri.fukushima.jp":3,"yanaizu.fukushima.jp":3,"yugawa.fukushima.jp":3,"anpachi.gifu.jp":3,"ena.gifu.jp":3,"gifu.gifu.jp":3,"ginan.gifu.jp":3,"godo.gifu.jp":3,"gujo.gifu.jp":3,"hashima.gifu.jp":3,"hichiso.gifu.jp":3,"hida.gifu.jp":3,"higashishirakawa.gifu.jp":3,"ibigawa.gifu.jp":3,"ikeda.gifu.jp":3,"kakamigahara.gifu.jp":3,"kani.gifu.jp":3,"kasahara.gifu.jp":3,"kasamatsu.gifu.jp":3,"kawaue.gifu.jp":3,"kitagata.gifu.jp":3,"mino.gifu.jp":3,"minokamo.gifu.jp":3,"mitake.gifu.jp":3,"mizunami.gifu.jp":3,"motosu.gifu.jp":3,"nakatsugawa.gifu.jp":3,"ogaki.gifu.jp":3,"sakahogi.gifu.jp":3,"seki.gifu.jp":3,"sekigahara.gifu.jp":3,"shirakawa.gifu.jp":3,"tajimi.gifu.jp":3,"takayama.gifu.jp":3,"tarui.gifu.jp":3,"toki.gifu.jp":3,"tomika.gifu.jp":3,"wanouchi.gifu.jp":3,"yamagata.gifu.jp":3,"yaotsu.gifu.jp":3,"yoro.gifu.jp":3,"annaka.gunma.jp":3,"chiyoda.gunma.jp":3,"fujioka.gunma.jp":3,"higashiagatsuma.gunma.jp":3,"isesaki.gunma.jp":3,"itakura.gunma.jp":3,"kanna.gunma.jp":3,"kanra.gunma.jp":3,"katashina.gunma.jp":3,"kawaba.gunma.jp":3,"kiryu.gunma.jp":3,"kusatsu.gunma.jp":3,"maebashi.gunma.jp":3,"meiwa.gunma.jp":3,"midori.gunma.jp":3,"minakami.gunma.jp":3,"naganohara.gunma.jp":3,"nakanojo.gunma.jp":3,"nanmoku.gunma.jp":3,"numata.gunma.jp":3,"oizumi.gunma.jp":3,"ora.gunma.jp":3,"ota.gunma.jp":3,"shibukawa.gunma.jp":3,"shimonita.gunma.jp":3,"shinto.gunma.jp":3,"showa.gunma.jp":3,"takasaki.gunma.jp":3,"takayama.gunma.jp":3,"tamamura.gunma.jp":3,"tatebayashi.gunma.jp":3,"tomioka.gunma.jp":3,"tsukiyono.gunma.jp":3,"tsumagoi.gunma.jp":3,"ueno.gunma.jp":3,"yoshioka.gunma.jp":3,"asaminami.hiroshima.jp":3,"daiwa.hiroshima.jp":3,"etajima.hiroshima.jp":3,"fuchu.hiroshima.jp":3,"fukuyama.hiroshima.jp":3,"hatsukaichi.hiroshima.jp":3,"higashihiroshima.hiroshima.jp":3,"hongo.hiroshima.jp":3,"jinsekikogen.hiroshima.jp":3,"kaita.hiroshima.jp":3,"kui.hiroshima.jp":3,"kumano.hiroshima.jp":3,"kure.hiroshima.jp":3,"mihara.hiroshima.jp":3,"miyoshi.hiroshima.jp":3,"naka.hiroshima.jp":3,"onomichi.hiroshima.jp":3,"osakikamijima.hiroshima.jp":3,"otake.hiroshima.jp":3,"saka.hiroshima.jp":3,"sera.hiroshima.jp":3,"seranishi.hiroshima.jp":3,"shinichi.hiroshima.jp":3,"shobara.hiroshima.jp":3,"takehara.hiroshima.jp":3,"abashiri.hokkaido.jp":3,"abira.hokkaido.jp":3,"aibetsu.hokkaido.jp":3,"akabira.hokkaido.jp":3,"akkeshi.hokkaido.jp":3,"asahikawa.hokkaido.jp":3,"ashibetsu.hokkaido.jp":3,"ashoro.hokkaido.jp":3,"assabu.hokkaido.jp":3,"atsuma.hokkaido.jp":3,"bibai.hokkaido.jp":3,"biei.hokkaido.jp":3,"bifuka.hokkaido.jp":3,"bihoro.hokkaido.jp":3,"biratori.hokkaido.jp":3,"chippubetsu.hokkaido.jp":3,"chitose.hokkaido.jp":3,"date.hokkaido.jp":3,"ebetsu.hokkaido.jp":3,"embetsu.hokkaido.jp":3,"eniwa.hokkaido.jp":3,"erimo.hokkaido.jp":3,"esan.hokkaido.jp":3,"esashi.hokkaido.jp":3,"fukagawa.hokkaido.jp":3,"fukushima.hokkaido.jp":3,"furano.hokkaido.jp":3,"furubira.hokkaido.jp":3,"haboro.hokkaido.jp":3,"hakodate.hokkaido.jp":3,"hamatonbetsu.hokkaido.jp":3,"hidaka.hokkaido.jp":3,"higashikagura.hokkaido.jp":3,"higashikawa.hokkaido.jp":3,"hiroo.hokkaido.jp":3,"hokuryu.hokkaido.jp":3,"hokuto.hokkaido.jp":3,"honbetsu.hokkaido.jp":3,"horokanai.hokkaido.jp":3,"horonobe.hokkaido.jp":3,"ikeda.hokkaido.jp":3,"imakane.hokkaido.jp":3,"ishikari.hokkaido.jp":3,"iwamizawa.hokkaido.jp":3,"iwanai.hokkaido.jp":3,"kamifurano.hokkaido.jp":3,"kamikawa.hokkaido.jp":3,"kamishihoro.hokkaido.jp":3,"kamisunagawa.hokkaido.jp":3,"kamoenai.hokkaido.jp":3,"kayabe.hokkaido.jp":3,"kembuchi.hokkaido.jp":3,"kikonai.hokkaido.jp":3,"kimobetsu.hokkaido.jp":3,"kitahiroshima.hokkaido.jp":3,"kitami.hokkaido.jp":3,"kiyosato.hokkaido.jp":3,"koshimizu.hokkaido.jp":3,"kunneppu.hokkaido.jp":3,"kuriyama.hokkaido.jp":3,"kuromatsunai.hokkaido.jp":3,"kushiro.hokkaido.jp":3,"kutchan.hokkaido.jp":3,"kyowa.hokkaido.jp":3,"mashike.hokkaido.jp":3,"matsumae.hokkaido.jp":3,"mikasa.hokkaido.jp":3,"minamifurano.hokkaido.jp":3,"mombetsu.hokkaido.jp":3,"moseushi.hokkaido.jp":3,"mukawa.hokkaido.jp":3,"muroran.hokkaido.jp":3,"naie.hokkaido.jp":3,"nakagawa.hokkaido.jp":3,"nakasatsunai.hokkaido.jp":3,"nakatombetsu.hokkaido.jp":3,"nanae.hokkaido.jp":3,"nanporo.hokkaido.jp":3,"nayoro.hokkaido.jp":3,"nemuro.hokkaido.jp":3,"niikappu.hokkaido.jp":3,"niki.hokkaido.jp":3,"nishiokoppe.hokkaido.jp":3,"noboribetsu.hokkaido.jp":3,"numata.hokkaido.jp":3,"obihiro.hokkaido.jp":3,"obira.hokkaido.jp":3,"oketo.hokkaido.jp":3,"okoppe.hokkaido.jp":3,"otaru.hokkaido.jp":3,"otobe.hokkaido.jp":3,"otofuke.hokkaido.jp":3,"otoineppu.hokkaido.jp":3,"oumu.hokkaido.jp":3,"ozora.hokkaido.jp":3,"pippu.hokkaido.jp":3,"rankoshi.hokkaido.jp":3,"rebun.hokkaido.jp":3,"rikubetsu.hokkaido.jp":3,"rishiri.hokkaido.jp":3,"rishirifuji.hokkaido.jp":3,"saroma.hokkaido.jp":3,"sarufutsu.hokkaido.jp":3,"shakotan.hokkaido.jp":3,"shari.hokkaido.jp":3,"shibecha.hokkaido.jp":3,"shibetsu.hokkaido.jp":3,"shikabe.hokkaido.jp":3,"shikaoi.hokkaido.jp":3,"shimamaki.hokkaido.jp":3,"shimizu.hokkaido.jp":3,"shimokawa.hokkaido.jp":3,"shinshinotsu.hokkaido.jp":3,"shintoku.hokkaido.jp":3,"shiranuka.hokkaido.jp":3,"shiraoi.hokkaido.jp":3,"shiriuchi.hokkaido.jp":3,"sobetsu.hokkaido.jp":3,"sunagawa.hokkaido.jp":3,"taiki.hokkaido.jp":3,"takasu.hokkaido.jp":3,"takikawa.hokkaido.jp":3,"takinoue.hokkaido.jp":3,"teshikaga.hokkaido.jp":3,"tobetsu.hokkaido.jp":3,"tohma.hokkaido.jp":3,"tomakomai.hokkaido.jp":3,"tomari.hokkaido.jp":3,"toya.hokkaido.jp":3,"toyako.hokkaido.jp":3,"toyotomi.hokkaido.jp":3,"toyoura.hokkaido.jp":3,"tsubetsu.hokkaido.jp":3,"tsukigata.hokkaido.jp":3,"urakawa.hokkaido.jp":3,"urausu.hokkaido.jp":3,"uryu.hokkaido.jp":3,"utashinai.hokkaido.jp":3,"wakkanai.hokkaido.jp":3,"wassamu.hokkaido.jp":3,"yakumo.hokkaido.jp":3,"yoichi.hokkaido.jp":3,"aioi.hyogo.jp":3,"akashi.hyogo.jp":3,"ako.hyogo.jp":3,"amagasaki.hyogo.jp":3,"aogaki.hyogo.jp":3,"asago.hyogo.jp":3,"ashiya.hyogo.jp":3,"awaji.hyogo.jp":3,"fukusaki.hyogo.jp":3,"goshiki.hyogo.jp":3,"harima.hyogo.jp":3,"himeji.hyogo.jp":3,"ichikawa.hyogo.jp":3,"inagawa.hyogo.jp":3,"itami.hyogo.jp":3,"kakogawa.hyogo.jp":3,"kamigori.hyogo.jp":3,"kamikawa.hyogo.jp":3,"kasai.hyogo.jp":3,"kasuga.hyogo.jp":3,"kawanishi.hyogo.jp":3,"miki.hyogo.jp":3,"minamiawaji.hyogo.jp":3,"nishinomiya.hyogo.jp":3,"nishiwaki.hyogo.jp":3,"ono.hyogo.jp":3,"sanda.hyogo.jp":3,"sannan.hyogo.jp":3,"sasayama.hyogo.jp":3,"sayo.hyogo.jp":3,"shingu.hyogo.jp":3,"shinonsen.hyogo.jp":3,"shiso.hyogo.jp":3,"sumoto.hyogo.jp":3,"taishi.hyogo.jp":3,"taka.hyogo.jp":3,"takarazuka.hyogo.jp":3,"takasago.hyogo.jp":3,"takino.hyogo.jp":3,"tamba.hyogo.jp":3,"tatsuno.hyogo.jp":3,"toyooka.hyogo.jp":3,"yabu.hyogo.jp":3,"yashiro.hyogo.jp":3,"yoka.hyogo.jp":3,"yokawa.hyogo.jp":3,"ami.ibaraki.jp":3,"asahi.ibaraki.jp":3,"bando.ibaraki.jp":3,"chikusei.ibaraki.jp":3,"daigo.ibaraki.jp":3,"fujishiro.ibaraki.jp":3,"hitachi.ibaraki.jp":3,"hitachinaka.ibaraki.jp":3,"hitachiomiya.ibaraki.jp":3,"hitachiota.ibaraki.jp":3,"ibaraki.ibaraki.jp":3,"ina.ibaraki.jp":3,"inashiki.ibaraki.jp":3,"itako.ibaraki.jp":3,"iwama.ibaraki.jp":3,"joso.ibaraki.jp":3,"kamisu.ibaraki.jp":3,"kasama.ibaraki.jp":3,"kashima.ibaraki.jp":3,"kasumigaura.ibaraki.jp":3,"koga.ibaraki.jp":3,"miho.ibaraki.jp":3,"mito.ibaraki.jp":3,"moriya.ibaraki.jp":3,"naka.ibaraki.jp":3,"namegata.ibaraki.jp":3,"oarai.ibaraki.jp":3,"ogawa.ibaraki.jp":3,"omitama.ibaraki.jp":3,"ryugasaki.ibaraki.jp":3,"sakai.ibaraki.jp":3,"sakuragawa.ibaraki.jp":3,"shimodate.ibaraki.jp":3,"shimotsuma.ibaraki.jp":3,"shirosato.ibaraki.jp":3,"sowa.ibaraki.jp":3,"suifu.ibaraki.jp":3,"takahagi.ibaraki.jp":3,"tamatsukuri.ibaraki.jp":3,"tokai.ibaraki.jp":3,"tomobe.ibaraki.jp":3,"tone.ibaraki.jp":3,"toride.ibaraki.jp":3,"tsuchiura.ibaraki.jp":3,"tsukuba.ibaraki.jp":3,"uchihara.ibaraki.jp":3,"ushiku.ibaraki.jp":3,"yachiyo.ibaraki.jp":3,"yamagata.ibaraki.jp":3,"yawara.ibaraki.jp":3,"yuki.ibaraki.jp":3,"anamizu.ishikawa.jp":3,"hakui.ishikawa.jp":3,"hakusan.ishikawa.jp":3,"kaga.ishikawa.jp":3,"kahoku.ishikawa.jp":3,"kanazawa.ishikawa.jp":3,"kawakita.ishikawa.jp":3,"komatsu.ishikawa.jp":3,"nakanoto.ishikawa.jp":3,"nanao.ishikawa.jp":3,"nomi.ishikawa.jp":3,"nonoichi.ishikawa.jp":3,"noto.ishikawa.jp":3,"shika.ishikawa.jp":3,"suzu.ishikawa.jp":3,"tsubata.ishikawa.jp":3,"tsurugi.ishikawa.jp":3,"uchinada.ishikawa.jp":3,"wajima.ishikawa.jp":3,"fudai.iwate.jp":3,"fujisawa.iwate.jp":3,"hanamaki.iwate.jp":3,"hiraizumi.iwate.jp":3,"hirono.iwate.jp":3,"ichinohe.iwate.jp":3,"ichinoseki.iwate.jp":3,"iwaizumi.iwate.jp":3,"iwate.iwate.jp":3,"joboji.iwate.jp":3,"kamaishi.iwate.jp":3,"kanegasaki.iwate.jp":3,"karumai.iwate.jp":3,"kawai.iwate.jp":3,"kitakami.iwate.jp":3,"kuji.iwate.jp":3,"kunohe.iwate.jp":3,"kuzumaki.iwate.jp":3,"miyako.iwate.jp":3,"mizusawa.iwate.jp":3,"morioka.iwate.jp":3,"ninohe.iwate.jp":3,"noda.iwate.jp":3,"ofunato.iwate.jp":3,"oshu.iwate.jp":3,"otsuchi.iwate.jp":3,"rikuzentakata.iwate.jp":3,"shiwa.iwate.jp":3,"shizukuishi.iwate.jp":3,"sumita.iwate.jp":3,"tanohata.iwate.jp":3,"tono.iwate.jp":3,"yahaba.iwate.jp":3,"yamada.iwate.jp":3,"ayagawa.kagawa.jp":3,"higashikagawa.kagawa.jp":3,"kanonji.kagawa.jp":3,"kotohira.kagawa.jp":3,"manno.kagawa.jp":3,"marugame.kagawa.jp":3,"mitoyo.kagawa.jp":3,"naoshima.kagawa.jp":3,"sanuki.kagawa.jp":3,"tadotsu.kagawa.jp":3,"takamatsu.kagawa.jp":3,"tonosho.kagawa.jp":3,"uchinomi.kagawa.jp":3,"utazu.kagawa.jp":3,"zentsuji.kagawa.jp":3,"akune.kagoshima.jp":3,"amami.kagoshima.jp":3,"hioki.kagoshima.jp":3,"isa.kagoshima.jp":3,"isen.kagoshima.jp":3,"izumi.kagoshima.jp":3,"kagoshima.kagoshima.jp":3,"kanoya.kagoshima.jp":3,"kawanabe.kagoshima.jp":3,"kinko.kagoshima.jp":3,"kouyama.kagoshima.jp":3,"makurazaki.kagoshima.jp":3,"matsumoto.kagoshima.jp":3,"minamitane.kagoshima.jp":3,"nakatane.kagoshima.jp":3,"nishinoomote.kagoshima.jp":3,"satsumasendai.kagoshima.jp":3,"soo.kagoshima.jp":3,"tarumizu.kagoshima.jp":3,"yusui.kagoshima.jp":3,"aikawa.kanagawa.jp":3,"atsugi.kanagawa.jp":3,"ayase.kanagawa.jp":3,"chigasaki.kanagawa.jp":3,"ebina.kanagawa.jp":3,"fujisawa.kanagawa.jp":3,"hadano.kanagawa.jp":3,"hakone.kanagawa.jp":3,"hiratsuka.kanagawa.jp":3,"isehara.kanagawa.jp":3,"kaisei.kanagawa.jp":3,"kamakura.kanagawa.jp":3,"kiyokawa.kanagawa.jp":3,"matsuda.kanagawa.jp":3,"minamiashigara.kanagawa.jp":3,"miura.kanagawa.jp":3,"nakai.kanagawa.jp":3,"ninomiya.kanagawa.jp":3,"odawara.kanagawa.jp":3,"oi.kanagawa.jp":3,"oiso.kanagawa.jp":3,"sagamihara.kanagawa.jp":3,"samukawa.kanagawa.jp":3,"tsukui.kanagawa.jp":3,"yamakita.kanagawa.jp":3,"yamato.kanagawa.jp":3,"yokosuka.kanagawa.jp":3,"yugawara.kanagawa.jp":3,"zama.kanagawa.jp":3,"zushi.kanagawa.jp":3,"aki.kochi.jp":3,"geisei.kochi.jp":3,"hidaka.kochi.jp":3,"higashitsuno.kochi.jp":3,"ino.kochi.jp":3,"kagami.kochi.jp":3,"kami.kochi.jp":3,"kitagawa.kochi.jp":3,"kochi.kochi.jp":3,"mihara.kochi.jp":3,"motoyama.kochi.jp":3,"muroto.kochi.jp":3,"nahari.kochi.jp":3,"nakamura.kochi.jp":3,"nankoku.kochi.jp":3,"nishitosa.kochi.jp":3,"niyodogawa.kochi.jp":3,"ochi.kochi.jp":3,"okawa.kochi.jp":3,"otoyo.kochi.jp":3,"otsuki.kochi.jp":3,"sakawa.kochi.jp":3,"sukumo.kochi.jp":3,"susaki.kochi.jp":3,"tosa.kochi.jp":3,"tosashimizu.kochi.jp":3,"toyo.kochi.jp":3,"tsuno.kochi.jp":3,"umaji.kochi.jp":3,"yasuda.kochi.jp":3,"yusuhara.kochi.jp":3,"amakusa.kumamoto.jp":3,"arao.kumamoto.jp":3,"aso.kumamoto.jp":3,"choyo.kumamoto.jp":3,"gyokuto.kumamoto.jp":3,"kamiamakusa.kumamoto.jp":3,"kikuchi.kumamoto.jp":3,"kumamoto.kumamoto.jp":3,"mashiki.kumamoto.jp":3,"mifune.kumamoto.jp":3,"minamata.kumamoto.jp":3,"minamioguni.kumamoto.jp":3,"nagasu.kumamoto.jp":3,"nishihara.kumamoto.jp":3,"oguni.kumamoto.jp":3,"ozu.kumamoto.jp":3,"sumoto.kumamoto.jp":3,"takamori.kumamoto.jp":3,"uki.kumamoto.jp":3,"uto.kumamoto.jp":3,"yamaga.kumamoto.jp":3,"yamato.kumamoto.jp":3,"yatsushiro.kumamoto.jp":3,"ayabe.kyoto.jp":3,"fukuchiyama.kyoto.jp":3,"higashiyama.kyoto.jp":3,"ide.kyoto.jp":3,"ine.kyoto.jp":3,"joyo.kyoto.jp":3,"kameoka.kyoto.jp":3,"kamo.kyoto.jp":3,"kita.kyoto.jp":3,"kizu.kyoto.jp":3,"kumiyama.kyoto.jp":3,"kyotamba.kyoto.jp":3,"kyotanabe.kyoto.jp":3,"kyotango.kyoto.jp":3,"maizuru.kyoto.jp":3,"minami.kyoto.jp":3,"minamiyamashiro.kyoto.jp":3,"miyazu.kyoto.jp":3,"muko.kyoto.jp":3,"nagaokakyo.kyoto.jp":3,"nakagyo.kyoto.jp":3,"nantan.kyoto.jp":3,"oyamazaki.kyoto.jp":3,"sakyo.kyoto.jp":3,"seika.kyoto.jp":3,"tanabe.kyoto.jp":3,"uji.kyoto.jp":3,"ujitawara.kyoto.jp":3,"wazuka.kyoto.jp":3,"yamashina.kyoto.jp":3,"yawata.kyoto.jp":3,"asahi.mie.jp":3,"inabe.mie.jp":3,"ise.mie.jp":3,"kameyama.mie.jp":3,"kawagoe.mie.jp":3,"kiho.mie.jp":3,"kisosaki.mie.jp":3,"kiwa.mie.jp":3,"komono.mie.jp":3,"kumano.mie.jp":3,"kuwana.mie.jp":3,"matsusaka.mie.jp":3,"meiwa.mie.jp":3,"mihama.mie.jp":3,"minamiise.mie.jp":3,"misugi.mie.jp":3,"miyama.mie.jp":3,"nabari.mie.jp":3,"shima.mie.jp":3,"suzuka.mie.jp":3,"tado.mie.jp":3,"taiki.mie.jp":3,"taki.mie.jp":3,"tamaki.mie.jp":3,"toba.mie.jp":3,"tsu.mie.jp":3,"udono.mie.jp":3,"ureshino.mie.jp":3,"watarai.mie.jp":3,"yokkaichi.mie.jp":3,"furukawa.miyagi.jp":3,"higashimatsushima.miyagi.jp":3,"ishinomaki.miyagi.jp":3,"iwanuma.miyagi.jp":3,"kakuda.miyagi.jp":3,"kami.miyagi.jp":3,"kawasaki.miyagi.jp":3,"marumori.miyagi.jp":3,"matsushima.miyagi.jp":3,"minamisanriku.miyagi.jp":3,"misato.miyagi.jp":3,"murata.miyagi.jp":3,"natori.miyagi.jp":3,"ogawara.miyagi.jp":3,"ohira.miyagi.jp":3,"onagawa.miyagi.jp":3,"osaki.miyagi.jp":3,"rifu.miyagi.jp":3,"semine.miyagi.jp":3,"shibata.miyagi.jp":3,"shichikashuku.miyagi.jp":3,"shikama.miyagi.jp":3,"shiogama.miyagi.jp":3,"shiroishi.miyagi.jp":3,"tagajo.miyagi.jp":3,"taiwa.miyagi.jp":3,"tome.miyagi.jp":3,"tomiya.miyagi.jp":3,"wakuya.miyagi.jp":3,"watari.miyagi.jp":3,"yamamoto.miyagi.jp":3,"zao.miyagi.jp":3,"aya.miyazaki.jp":3,"ebino.miyazaki.jp":3,"gokase.miyazaki.jp":3,"hyuga.miyazaki.jp":3,"kadogawa.miyazaki.jp":3,"kawaminami.miyazaki.jp":3,"kijo.miyazaki.jp":3,"kitagawa.miyazaki.jp":3,"kitakata.miyazaki.jp":3,"kitaura.miyazaki.jp":3,"kobayashi.miyazaki.jp":3,"kunitomi.miyazaki.jp":3,"kushima.miyazaki.jp":3,"mimata.miyazaki.jp":3,"miyakonojo.miyazaki.jp":3,"miyazaki.miyazaki.jp":3,"morotsuka.miyazaki.jp":3,"nichinan.miyazaki.jp":3,"nishimera.miyazaki.jp":3,"nobeoka.miyazaki.jp":3,"saito.miyazaki.jp":3,"shiiba.miyazaki.jp":3,"shintomi.miyazaki.jp":3,"takaharu.miyazaki.jp":3,"takanabe.miyazaki.jp":3,"takazaki.miyazaki.jp":3,"tsuno.miyazaki.jp":3,"achi.nagano.jp":3,"agematsu.nagano.jp":3,"anan.nagano.jp":3,"aoki.nagano.jp":3,"asahi.nagano.jp":3,"azumino.nagano.jp":3,"chikuhoku.nagano.jp":3,"chikuma.nagano.jp":3,"chino.nagano.jp":3,"fujimi.nagano.jp":3,"hakuba.nagano.jp":3,"hara.nagano.jp":3,"hiraya.nagano.jp":3,"iida.nagano.jp":3,"iijima.nagano.jp":3,"iiyama.nagano.jp":3,"iizuna.nagano.jp":3,"ikeda.nagano.jp":3,"ikusaka.nagano.jp":3,"ina.nagano.jp":3,"karuizawa.nagano.jp":3,"kawakami.nagano.jp":3,"kiso.nagano.jp":3,"kisofukushima.nagano.jp":3,"kitaaiki.nagano.jp":3,"komagane.nagano.jp":3,"komoro.nagano.jp":3,"matsukawa.nagano.jp":3,"matsumoto.nagano.jp":3,"miasa.nagano.jp":3,"minamiaiki.nagano.jp":3,"minamimaki.nagano.jp":3,"minamiminowa.nagano.jp":3,"minowa.nagano.jp":3,"miyada.nagano.jp":3,"miyota.nagano.jp":3,"mochizuki.nagano.jp":3,"nagano.nagano.jp":3,"nagawa.nagano.jp":3,"nagiso.nagano.jp":3,"nakagawa.nagano.jp":3,"nakano.nagano.jp":3,"nozawaonsen.nagano.jp":3,"obuse.nagano.jp":3,"ogawa.nagano.jp":3,"okaya.nagano.jp":3,"omachi.nagano.jp":3,"omi.nagano.jp":3,"ookuwa.nagano.jp":3,"ooshika.nagano.jp":3,"otaki.nagano.jp":3,"otari.nagano.jp":3,"sakae.nagano.jp":3,"sakaki.nagano.jp":3,"saku.nagano.jp":3,"sakuho.nagano.jp":3,"shimosuwa.nagano.jp":3,"shinanomachi.nagano.jp":3,"shiojiri.nagano.jp":3,"suwa.nagano.jp":3,"suzaka.nagano.jp":3,"takagi.nagano.jp":3,"takamori.nagano.jp":3,"takayama.nagano.jp":3,"tateshina.nagano.jp":3,"tatsuno.nagano.jp":3,"togakushi.nagano.jp":3,"togura.nagano.jp":3,"tomi.nagano.jp":3,"ueda.nagano.jp":3,"wada.nagano.jp":3,"yamagata.nagano.jp":3,"yamanouchi.nagano.jp":3,"yasaka.nagano.jp":3,"yasuoka.nagano.jp":3,"chijiwa.nagasaki.jp":3,"futsu.nagasaki.jp":3,"goto.nagasaki.jp":3,"hasami.nagasaki.jp":3,"hirado.nagasaki.jp":3,"iki.nagasaki.jp":3,"isahaya.nagasaki.jp":3,"kawatana.nagasaki.jp":3,"kuchinotsu.nagasaki.jp":3,"matsuura.nagasaki.jp":3,"nagasaki.nagasaki.jp":3,"obama.nagasaki.jp":3,"omura.nagasaki.jp":3,"oseto.nagasaki.jp":3,"saikai.nagasaki.jp":3,"sasebo.nagasaki.jp":3,"seihi.nagasaki.jp":3,"shimabara.nagasaki.jp":3,"shinkamigoto.nagasaki.jp":3,"togitsu.nagasaki.jp":3,"tsushima.nagasaki.jp":3,"unzen.nagasaki.jp":3,"ando.nara.jp":3,"gose.nara.jp":3,"heguri.nara.jp":3,"higashiyoshino.nara.jp":3,"ikaruga.nara.jp":3,"ikoma.nara.jp":3,"kamikitayama.nara.jp":3,"kanmaki.nara.jp":3,"kashiba.nara.jp":3,"kashihara.nara.jp":3,"katsuragi.nara.jp":3,"kawai.nara.jp":3,"kawakami.nara.jp":3,"kawanishi.nara.jp":3,"koryo.nara.jp":3,"kurotaki.nara.jp":3,"mitsue.nara.jp":3,"miyake.nara.jp":3,"nara.nara.jp":3,"nosegawa.nara.jp":3,"oji.nara.jp":3,"ouda.nara.jp":3,"oyodo.nara.jp":3,"sakurai.nara.jp":3,"sango.nara.jp":3,"shimoichi.nara.jp":3,"shimokitayama.nara.jp":3,"shinjo.nara.jp":3,"soni.nara.jp":3,"takatori.nara.jp":3,"tawaramoto.nara.jp":3,"tenkawa.nara.jp":3,"tenri.nara.jp":3,"uda.nara.jp":3,"yamatokoriyama.nara.jp":3,"yamatotakada.nara.jp":3,"yamazoe.nara.jp":3,"yoshino.nara.jp":3,"aga.niigata.jp":3,"agano.niigata.jp":3,"gosen.niigata.jp":3,"itoigawa.niigata.jp":3,"izumozaki.niigata.jp":3,"joetsu.niigata.jp":3,"kamo.niigata.jp":3,"kariwa.niigata.jp":3,"kashiwazaki.niigata.jp":3,"minamiuonuma.niigata.jp":3,"mitsuke.niigata.jp":3,"muika.niigata.jp":3,"murakami.niigata.jp":3,"myoko.niigata.jp":3,"nagaoka.niigata.jp":3,"niigata.niigata.jp":3,"ojiya.niigata.jp":3,"omi.niigata.jp":3,"sado.niigata.jp":3,"sanjo.niigata.jp":3,"seiro.niigata.jp":3,"seirou.niigata.jp":3,"sekikawa.niigata.jp":3,"shibata.niigata.jp":3,"tagami.niigata.jp":3,"tainai.niigata.jp":3,"tochio.niigata.jp":3,"tokamachi.niigata.jp":3,"tsubame.niigata.jp":3,"tsunan.niigata.jp":3,"uonuma.niigata.jp":3,"yahiko.niigata.jp":3,"yoita.niigata.jp":3,"yuzawa.niigata.jp":3,"beppu.oita.jp":3,"bungoono.oita.jp":3,"bungotakada.oita.jp":3,"hasama.oita.jp":3,"hiji.oita.jp":3,"himeshima.oita.jp":3,"hita.oita.jp":3,"kamitsue.oita.jp":3,"kokonoe.oita.jp":3,"kuju.oita.jp":3,"kunisaki.oita.jp":3,"kusu.oita.jp":3,"oita.oita.jp":3,"saiki.oita.jp":3,"taketa.oita.jp":3,"tsukumi.oita.jp":3,"usa.oita.jp":3,"usuki.oita.jp":3,"yufu.oita.jp":3,"akaiwa.okayama.jp":3,"asakuchi.okayama.jp":3,"bizen.okayama.jp":3,"hayashima.okayama.jp":3,"ibara.okayama.jp":3,"kagamino.okayama.jp":3,"kasaoka.okayama.jp":3,"kibichuo.okayama.jp":3,"kumenan.okayama.jp":3,"kurashiki.okayama.jp":3,"maniwa.okayama.jp":3,"misaki.okayama.jp":3,"nagi.okayama.jp":3,"niimi.okayama.jp":3,"nishiawakura.okayama.jp":3,"okayama.okayama.jp":3,"satosho.okayama.jp":3,"setouchi.okayama.jp":3,"shinjo.okayama.jp":3,"shoo.okayama.jp":3,"soja.okayama.jp":3,"takahashi.okayama.jp":3,"tamano.okayama.jp":3,"tsuyama.okayama.jp":3,"wake.okayama.jp":3,"yakage.okayama.jp":3,"aguni.okinawa.jp":3,"ginowan.okinawa.jp":3,"ginoza.okinawa.jp":3,"gushikami.okinawa.jp":3,"haebaru.okinawa.jp":3,"higashi.okinawa.jp":3,"hirara.okinawa.jp":3,"iheya.okinawa.jp":3,"ishigaki.okinawa.jp":3,"ishikawa.okinawa.jp":3,"itoman.okinawa.jp":3,"izena.okinawa.jp":3,"kadena.okinawa.jp":3,"kin.okinawa.jp":3,"kitadaito.okinawa.jp":3,"kitanakagusuku.okinawa.jp":3,"kumejima.okinawa.jp":3,"kunigami.okinawa.jp":3,"minamidaito.okinawa.jp":3,"motobu.okinawa.jp":3,"nago.okinawa.jp":3,"naha.okinawa.jp":3,"nakagusuku.okinawa.jp":3,"nakijin.okinawa.jp":3,"nanjo.okinawa.jp":3,"nishihara.okinawa.jp":3,"ogimi.okinawa.jp":3,"okinawa.okinawa.jp":3,"onna.okinawa.jp":3,"shimoji.okinawa.jp":3,"taketomi.okinawa.jp":3,"tarama.okinawa.jp":3,"tokashiki.okinawa.jp":3,"tomigusuku.okinawa.jp":3,"tonaki.okinawa.jp":3,"urasoe.okinawa.jp":3,"uruma.okinawa.jp":3,"yaese.okinawa.jp":3,"yomitan.okinawa.jp":3,"yonabaru.okinawa.jp":3,"yonaguni.okinawa.jp":3,"zamami.okinawa.jp":3,"abeno.osaka.jp":3,"chihayaakasaka.osaka.jp":3,"chuo.osaka.jp":3,"daito.osaka.jp":3,"fujiidera.osaka.jp":3,"habikino.osaka.jp":3,"hannan.osaka.jp":3,"higashiosaka.osaka.jp":3,"higashisumiyoshi.osaka.jp":3,"higashiyodogawa.osaka.jp":3,"hirakata.osaka.jp":3,"ibaraki.osaka.jp":3,"ikeda.osaka.jp":3,"izumi.osaka.jp":3,"izumiotsu.osaka.jp":3,"izumisano.osaka.jp":3,"kadoma.osaka.jp":3,"kaizuka.osaka.jp":3,"kanan.osaka.jp":3,"kashiwara.osaka.jp":3,"katano.osaka.jp":3,"kawachinagano.osaka.jp":3,"kishiwada.osaka.jp":3,"kita.osaka.jp":3,"kumatori.osaka.jp":3,"matsubara.osaka.jp":3,"minato.osaka.jp":3,"minoh.osaka.jp":3,"misaki.osaka.jp":3,"moriguchi.osaka.jp":3,"neyagawa.osaka.jp":3,"nishi.osaka.jp":3,"nose.osaka.jp":3,"osakasayama.osaka.jp":3,"sakai.osaka.jp":3,"sayama.osaka.jp":3,"sennan.osaka.jp":3,"settsu.osaka.jp":3,"shijonawate.osaka.jp":3,"shimamoto.osaka.jp":3,"suita.osaka.jp":3,"tadaoka.osaka.jp":3,"taishi.osaka.jp":3,"tajiri.osaka.jp":3,"takaishi.osaka.jp":3,"takatsuki.osaka.jp":3,"tondabayashi.osaka.jp":3,"toyonaka.osaka.jp":3,"toyono.osaka.jp":3,"yao.osaka.jp":3,"ariake.saga.jp":3,"arita.saga.jp":3,"fukudomi.saga.jp":3,"genkai.saga.jp":3,"hamatama.saga.jp":3,"hizen.saga.jp":3,"imari.saga.jp":3,"kamimine.saga.jp":3,"kanzaki.saga.jp":3,"karatsu.saga.jp":3,"kashima.saga.jp":3,"kitagata.saga.jp":3,"kitahata.saga.jp":3,"kiyama.saga.jp":3,"kouhoku.saga.jp":3,"kyuragi.saga.jp":3,"nishiarita.saga.jp":3,"ogi.saga.jp":3,"omachi.saga.jp":3,"ouchi.saga.jp":3,"saga.saga.jp":3,"shiroishi.saga.jp":3,"taku.saga.jp":3,"tara.saga.jp":3,"tosu.saga.jp":3,"yoshinogari.saga.jp":3,"arakawa.saitama.jp":3,"asaka.saitama.jp":3,"chichibu.saitama.jp":3,"fujimi.saitama.jp":3,"fujimino.saitama.jp":3,"fukaya.saitama.jp":3,"hanno.saitama.jp":3,"hanyu.saitama.jp":3,"hasuda.saitama.jp":3,"hatogaya.saitama.jp":3,"hatoyama.saitama.jp":3,"hidaka.saitama.jp":3,"higashichichibu.saitama.jp":3,"higashimatsuyama.saitama.jp":3,"honjo.saitama.jp":3,"ina.saitama.jp":3,"iruma.saitama.jp":3,"iwatsuki.saitama.jp":3,"kamiizumi.saitama.jp":3,"kamikawa.saitama.jp":3,"kamisato.saitama.jp":3,"kasukabe.saitama.jp":3,"kawagoe.saitama.jp":3,"kawaguchi.saitama.jp":3,"kawajima.saitama.jp":3,"kazo.saitama.jp":3,"kitamoto.saitama.jp":3,"koshigaya.saitama.jp":3,"kounosu.saitama.jp":3,"kuki.saitama.jp":3,"kumagaya.saitama.jp":3,"matsubushi.saitama.jp":3,"minano.saitama.jp":3,"misato.saitama.jp":3,"miyashiro.saitama.jp":3,"miyoshi.saitama.jp":3,"moroyama.saitama.jp":3,"nagatoro.saitama.jp":3,"namegawa.saitama.jp":3,"niiza.saitama.jp":3,"ogano.saitama.jp":3,"ogawa.saitama.jp":3,"ogose.saitama.jp":3,"okegawa.saitama.jp":3,"omiya.saitama.jp":3,"otaki.saitama.jp":3,"ranzan.saitama.jp":3,"ryokami.saitama.jp":3,"saitama.saitama.jp":3,"sakado.saitama.jp":3,"satte.saitama.jp":3,"sayama.saitama.jp":3,"shiki.saitama.jp":3,"shiraoka.saitama.jp":3,"soka.saitama.jp":3,"sugito.saitama.jp":3,"toda.saitama.jp":3,"tokigawa.saitama.jp":3,"tokorozawa.saitama.jp":3,"tsurugashima.saitama.jp":3,"urawa.saitama.jp":3,"warabi.saitama.jp":3,"yashio.saitama.jp":3,"yokoze.saitama.jp":3,"yono.saitama.jp":3,"yorii.saitama.jp":3,"yoshida.saitama.jp":3,"yoshikawa.saitama.jp":3,"yoshimi.saitama.jp":3,"aisho.shiga.jp":3,"gamo.shiga.jp":3,"higashiomi.shiga.jp":3,"hikone.shiga.jp":3,"koka.shiga.jp":3,"konan.shiga.jp":3,"kosei.shiga.jp":3,"koto.shiga.jp":3,"kusatsu.shiga.jp":3,"maibara.shiga.jp":3,"moriyama.shiga.jp":3,"nagahama.shiga.jp":3,"nishiazai.shiga.jp":3,"notogawa.shiga.jp":3,"omihachiman.shiga.jp":3,"otsu.shiga.jp":3,"ritto.shiga.jp":3,"ryuoh.shiga.jp":3,"takashima.shiga.jp":3,"takatsuki.shiga.jp":3,"torahime.shiga.jp":3,"toyosato.shiga.jp":3,"yasu.shiga.jp":3,"akagi.shimane.jp":3,"ama.shimane.jp":3,"gotsu.shimane.jp":3,"hamada.shimane.jp":3,"higashiizumo.shimane.jp":3,"hikawa.shimane.jp":3,"hikimi.shimane.jp":3,"izumo.shimane.jp":3,"kakinoki.shimane.jp":3,"masuda.shimane.jp":3,"matsue.shimane.jp":3,"misato.shimane.jp":3,"nishinoshima.shimane.jp":3,"ohda.shimane.jp":3,"okinoshima.shimane.jp":3,"okuizumo.shimane.jp":3,"shimane.shimane.jp":3,"tamayu.shimane.jp":3,"tsuwano.shimane.jp":3,"unnan.shimane.jp":3,"yakumo.shimane.jp":3,"yasugi.shimane.jp":3,"yatsuka.shimane.jp":3,"arai.shizuoka.jp":3,"atami.shizuoka.jp":3,"fuji.shizuoka.jp":3,"fujieda.shizuoka.jp":3,"fujikawa.shizuoka.jp":3,"fujinomiya.shizuoka.jp":3,"fukuroi.shizuoka.jp":3,"gotemba.shizuoka.jp":3,"haibara.shizuoka.jp":3,"hamamatsu.shizuoka.jp":3,"higashiizu.shizuoka.jp":3,"ito.shizuoka.jp":3,"iwata.shizuoka.jp":3,"izu.shizuoka.jp":3,"izunokuni.shizuoka.jp":3,"kakegawa.shizuoka.jp":3,"kannami.shizuoka.jp":3,"kawanehon.shizuoka.jp":3,"kawazu.shizuoka.jp":3,"kikugawa.shizuoka.jp":3,"kosai.shizuoka.jp":3,"makinohara.shizuoka.jp":3,"matsuzaki.shizuoka.jp":3,"minamiizu.shizuoka.jp":3,"mishima.shizuoka.jp":3,"morimachi.shizuoka.jp":3,"nishiizu.shizuoka.jp":3,"numazu.shizuoka.jp":3,"omaezaki.shizuoka.jp":3,"shimada.shizuoka.jp":3,"shimizu.shizuoka.jp":3,"shimoda.shizuoka.jp":3,"shizuoka.shizuoka.jp":3,"susono.shizuoka.jp":3,"yaizu.shizuoka.jp":3,"yoshida.shizuoka.jp":3,"ashikaga.tochigi.jp":3,"bato.tochigi.jp":3,"haga.tochigi.jp":3,"ichikai.tochigi.jp":3,"iwafune.tochigi.jp":3,"kaminokawa.tochigi.jp":3,"kanuma.tochigi.jp":3,"karasuyama.tochigi.jp":3,"kuroiso.tochigi.jp":3,"mashiko.tochigi.jp":3,"mibu.tochigi.jp":3,"moka.tochigi.jp":3,"motegi.tochigi.jp":3,"nasu.tochigi.jp":3,"nasushiobara.tochigi.jp":3,"nikko.tochigi.jp":3,"nishikata.tochigi.jp":3,"nogi.tochigi.jp":3,"ohira.tochigi.jp":3,"ohtawara.tochigi.jp":3,"oyama.tochigi.jp":3,"sakura.tochigi.jp":3,"sano.tochigi.jp":3,"shimotsuke.tochigi.jp":3,"shioya.tochigi.jp":3,"takanezawa.tochigi.jp":3,"tochigi.tochigi.jp":3,"tsuga.tochigi.jp":3,"ujiie.tochigi.jp":3,"utsunomiya.tochigi.jp":3,"yaita.tochigi.jp":3,"aizumi.tokushima.jp":3,"anan.tokushima.jp":3,"ichiba.tokushima.jp":3,"itano.tokushima.jp":3,"kainan.tokushima.jp":3,"komatsushima.tokushima.jp":3,"matsushige.tokushima.jp":3,"mima.tokushima.jp":3,"minami.tokushima.jp":3,"miyoshi.tokushima.jp":3,"mugi.tokushima.jp":3,"nakagawa.tokushima.jp":3,"naruto.tokushima.jp":3,"sanagochi.tokushima.jp":3,"shishikui.tokushima.jp":3,"tokushima.tokushima.jp":3,"wajiki.tokushima.jp":3,"adachi.tokyo.jp":3,"akiruno.tokyo.jp":3,"akishima.tokyo.jp":3,"aogashima.tokyo.jp":3,"arakawa.tokyo.jp":3,"bunkyo.tokyo.jp":3,"chiyoda.tokyo.jp":3,"chofu.tokyo.jp":3,"chuo.tokyo.jp":3,"edogawa.tokyo.jp":3,"fuchu.tokyo.jp":3,"fussa.tokyo.jp":3,"hachijo.tokyo.jp":3,"hachioji.tokyo.jp":3,"hamura.tokyo.jp":3,"higashikurume.tokyo.jp":3,"higashimurayama.tokyo.jp":3,"higashiyamato.tokyo.jp":3,"hino.tokyo.jp":3,"hinode.tokyo.jp":3,"hinohara.tokyo.jp":3,"inagi.tokyo.jp":3,"itabashi.tokyo.jp":3,"katsushika.tokyo.jp":3,"kita.tokyo.jp":3,"kiyose.tokyo.jp":3,"kodaira.tokyo.jp":3,"koganei.tokyo.jp":3,"kokubunji.tokyo.jp":3,"komae.tokyo.jp":3,"koto.tokyo.jp":3,"kouzushima.tokyo.jp":3,"kunitachi.tokyo.jp":3,"machida.tokyo.jp":3,"meguro.tokyo.jp":3,"minato.tokyo.jp":3,"mitaka.tokyo.jp":3,"mizuho.tokyo.jp":3,"musashimurayama.tokyo.jp":3,"musashino.tokyo.jp":3,"nakano.tokyo.jp":3,"nerima.tokyo.jp":3,"ogasawara.tokyo.jp":3,"okutama.tokyo.jp":3,"ome.tokyo.jp":3,"oshima.tokyo.jp":3,"ota.tokyo.jp":3,"setagaya.tokyo.jp":3,"shibuya.tokyo.jp":3,"shinagawa.tokyo.jp":3,"shinjuku.tokyo.jp":3,"suginami.tokyo.jp":3,"sumida.tokyo.jp":3,"tachikawa.tokyo.jp":3,"taito.tokyo.jp":3,"tama.tokyo.jp":3,"toshima.tokyo.jp":3,"chizu.tottori.jp":3,"hino.tottori.jp":3,"kawahara.tottori.jp":3,"koge.tottori.jp":3,"kotoura.tottori.jp":3,"misasa.tottori.jp":3,"nanbu.tottori.jp":3,"nichinan.tottori.jp":3,"sakaiminato.tottori.jp":3,"tottori.tottori.jp":3,"wakasa.tottori.jp":3,"yazu.tottori.jp":3,"yonago.tottori.jp":3,"asahi.toyama.jp":3,"fuchu.toyama.jp":3,"fukumitsu.toyama.jp":3,"funahashi.toyama.jp":3,"himi.toyama.jp":3,"imizu.toyama.jp":3,"inami.toyama.jp":3,"johana.toyama.jp":3,"kamiichi.toyama.jp":3,"kurobe.toyama.jp":3,"nakaniikawa.toyama.jp":3,"namerikawa.toyama.jp":3,"nanto.toyama.jp":3,"nyuzen.toyama.jp":3,"oyabe.toyama.jp":3,"taira.toyama.jp":3,"takaoka.toyama.jp":3,"tateyama.toyama.jp":3,"toga.toyama.jp":3,"tonami.toyama.jp":3,"toyama.toyama.jp":3,"unazuki.toyama.jp":3,"uozu.toyama.jp":3,"yamada.toyama.jp":3,"arida.wakayama.jp":3,"aridagawa.wakayama.jp":3,"gobo.wakayama.jp":3,"hashimoto.wakayama.jp":3,"hidaka.wakayama.jp":3,"hirogawa.wakayama.jp":3,"inami.wakayama.jp":3,"iwade.wakayama.jp":3,"kainan.wakayama.jp":3,"kamitonda.wakayama.jp":3,"katsuragi.wakayama.jp":3,"kimino.wakayama.jp":3,"kinokawa.wakayama.jp":3,"kitayama.wakayama.jp":3,"koya.wakayama.jp":3,"koza.wakayama.jp":3,"kozagawa.wakayama.jp":3,"kudoyama.wakayama.jp":3,"kushimoto.wakayama.jp":3,"mihama.wakayama.jp":3,"misato.wakayama.jp":3,"nachikatsuura.wakayama.jp":3,"shingu.wakayama.jp":3,"shirahama.wakayama.jp":3,"taiji.wakayama.jp":3,"tanabe.wakayama.jp":3,"wakayama.wakayama.jp":3,"yuasa.wakayama.jp":3,"yura.wakayama.jp":3,"asahi.yamagata.jp":3,"funagata.yamagata.jp":3,"higashine.yamagata.jp":3,"iide.yamagata.jp":3,"kahoku.yamagata.jp":3,"kaminoyama.yamagata.jp":3,"kaneyama.yamagata.jp":3,"kawanishi.yamagata.jp":3,"mamurogawa.yamagata.jp":3,"mikawa.yamagata.jp":3,"murayama.yamagata.jp":3,"nagai.yamagata.jp":3,"nakayama.yamagata.jp":3,"nanyo.yamagata.jp":3,"nishikawa.yamagata.jp":3,"obanazawa.yamagata.jp":3,"oe.yamagata.jp":3,"oguni.yamagata.jp":3,"ohkura.yamagata.jp":3,"oishida.yamagata.jp":3,"sagae.yamagata.jp":3,"sakata.yamagata.jp":3,"sakegawa.yamagata.jp":3,"shinjo.yamagata.jp":3,"shirataka.yamagata.jp":3,"shonai.yamagata.jp":3,"takahata.yamagata.jp":3,"tendo.yamagata.jp":3,"tozawa.yamagata.jp":3,"tsuruoka.yamagata.jp":3,"yamagata.yamagata.jp":3,"yamanobe.yamagata.jp":3,"yonezawa.yamagata.jp":3,"yuza.yamagata.jp":3,"abu.yamaguchi.jp":3,"hagi.yamaguchi.jp":3,"hikari.yamaguchi.jp":3,"hofu.yamaguchi.jp":3,"iwakuni.yamaguchi.jp":3,"kudamatsu.yamaguchi.jp":3,"mitou.yamaguchi.jp":3,"nagato.yamaguchi.jp":3,"oshima.yamaguchi.jp":3,"shimonoseki.yamaguchi.jp":3,"shunan.yamaguchi.jp":3,"tabuse.yamaguchi.jp":3,"tokuyama.yamaguchi.jp":3,"toyota.yamaguchi.jp":3,"ube.yamaguchi.jp":3,"yuu.yamaguchi.jp":3,"chuo.yamanashi.jp":3,"doshi.yamanashi.jp":3,"fuefuki.yamanashi.jp":3,"fujikawa.yamanashi.jp":3,"fujikawaguchiko.yamanashi.jp":3,"fujiyoshida.yamanashi.jp":3,"hayakawa.yamanashi.jp":3,"hokuto.yamanashi.jp":3,"ichikawamisato.yamanashi.jp":3,"kai.yamanashi.jp":3,"kofu.yamanashi.jp":3,"koshu.yamanashi.jp":3,"kosuge.yamanashi.jp":3,"minami-alps.yamanashi.jp":3,"minobu.yamanashi.jp":3,"nakamichi.yamanashi.jp":3,"nanbu.yamanashi.jp":3,"narusawa.yamanashi.jp":3,"nirasaki.yamanashi.jp":3,"nishikatsura.yamanashi.jp":3,"oshino.yamanashi.jp":3,"otsuki.yamanashi.jp":3,"showa.yamanashi.jp":3,"tabayama.yamanashi.jp":3,"tsuru.yamanashi.jp":3,"uenohara.yamanashi.jp":3,"yamanakako.yamanashi.jp":3,"yamanashi.yamanashi.jp":3,"ke":1,"ac.ke":2,"co.ke":2,"go.ke":2,"info.ke":2,"me.ke":2,"mobi.ke":2,"ne.ke":2,"or.ke":2,"sc.ke":2,"kg":1,"org.kg":2,"net.kg":2,"com.kg":2,"edu.kg":2,"gov.kg":2,"mil.kg":2,"kh":2,"ki":1,"edu.ki":2,"biz.ki":2,"net.ki":2,"org.ki":2,"gov.ki":2,"info.ki":2,"com.ki":2,"km":1,"org.km":2,"nom.km":2,"gov.km":2,"prd.km":2,"tm.km":2,"edu.km":2,"mil.km":2,"ass.km":2,"com.km":2,"coop.km":2,"asso.km":2,"presse.km":2,"medecin.km":2,"notaires.km":2,"pharmaciens.km":2,"veterinaire.km":2,"gouv.km":2,"kn":1,"net.kn":2,"org.kn":2,"edu.kn":2,"gov.kn":2,"kp":1,"com.kp":2,"edu.kp":2,"gov.kp":2,"org.kp":2,"rep.kp":2,"tra.kp":2,"kr":1,"ac.kr":2,"co.kr":2,"es.kr":2,"go.kr":2,"hs.kr":2,"kg.kr":2,"mil.kr":2,"ms.kr":2,"ne.kr":2,"or.kr":2,"pe.kr":2,"re.kr":2,"sc.kr":2,"busan.kr":2,"chungbuk.kr":2,"chungnam.kr":2,"daegu.kr":2,"daejeon.kr":2,"gangwon.kr":2,"gwangju.kr":2,"gyeongbuk.kr":2,"gyeonggi.kr":2,"gyeongnam.kr":2,"incheon.kr":2,"jeju.kr":2,"jeonbuk.kr":2,"jeonnam.kr":2,"seoul.kr":2,"ulsan.kr":2,"kw":1,"com.kw":2,"edu.kw":2,"emb.kw":2,"gov.kw":2,"ind.kw":2,"net.kw":2,"org.kw":2,"ky":1,"com.ky":2,"edu.ky":2,"net.ky":2,"org.ky":2,"kz":1,"org.kz":2,"edu.kz":2,"net.kz":2,"gov.kz":2,"mil.kz":2,"com.kz":2,"la":1,"int.la":2,"net.la":2,"info.la":2,"edu.la":2,"gov.la":2,"per.la":2,"com.la":2,"org.la":2,"lb":1,"com.lb":2,"edu.lb":2,"gov.lb":2,"net.lb":2,"org.lb":2,"lc":1,"com.lc":2,"net.lc":2,"co.lc":2,"org.lc":2,"edu.lc":2,"gov.lc":2,"li":1,"lk":1,"gov.lk":2,"sch.lk":2,"net.lk":2,"int.lk":2,"com.lk":2,"org.lk":2,"edu.lk":2,"ngo.lk":2,"soc.lk":2,"web.lk":2,"ltd.lk":2,"assn.lk":2,"grp.lk":2,"hotel.lk":2,"ac.lk":2,"lr":1,"com.lr":2,"edu.lr":2,"gov.lr":2,"org.lr":2,"net.lr":2,"ls":1,"ac.ls":2,"biz.ls":2,"co.ls":2,"edu.ls":2,"gov.ls":2,"info.ls":2,"net.ls":2,"org.ls":2,"sc.ls":2,"lt":1,"gov.lt":2,"lu":1,"lv":1,"com.lv":2,"edu.lv":2,"gov.lv":2,"org.lv":2,"mil.lv":2,"id.lv":2,"net.lv":2,"asn.lv":2,"conf.lv":2,"ly":1,"com.ly":2,"net.ly":2,"gov.ly":2,"plc.ly":2,"edu.ly":2,"sch.ly":2,"med.ly":2,"org.ly":2,"id.ly":2,"ma":1,"co.ma":2,"net.ma":2,"gov.ma":2,"org.ma":2,"ac.ma":2,"press.ma":2,"mc":1,"tm.mc":2,"asso.mc":2,"md":1,"me":1,"co.me":2,"net.me":2,"org.me":2,"edu.me":2,"ac.me":2,"gov.me":2,"its.me":2,"priv.me":2,"mg":1,"org.mg":2,"nom.mg":2,"gov.mg":2,"prd.mg":2,"tm.mg":2,"edu.mg":2,"mil.mg":2,"com.mg":2,"co.mg":2,"mh":1,"mil":1,"mk":1,"com.mk":2,"org.mk":2,"net.mk":2,"edu.mk":2,"gov.mk":2,"inf.mk":2,"name.mk":2,"ml":1,"com.ml":2,"edu.ml":2,"gouv.ml":2,"gov.ml":2,"net.ml":2,"org.ml":2,"presse.ml":2,"mm":2,"mn":1,"gov.mn":2,"edu.mn":2,"org.mn":2,"mo":1,"com.mo":2,"net.mo":2,"org.mo":2,"edu.mo":2,"gov.mo":2,"mobi":1,"mp":1,"mq":1,"mr":1,"gov.mr":2,"ms":1,"com.ms":2,"edu.ms":2,"gov.ms":2,"net.ms":2,"org.ms":2,"mt":1,"com.mt":2,"edu.mt":2,"net.mt":2,"org.mt":2,"mu":1,"com.mu":2,"net.mu":2,"org.mu":2,"gov.mu":2,"ac.mu":2,"co.mu":2,"or.mu":2,"museum":1,"academy.museum":2,"agriculture.museum":2,"air.museum":2,"airguard.museum":2,"alabama.museum":2,"alaska.museum":2,"amber.museum":2,"ambulance.museum":2,"american.museum":2,"americana.museum":2,"americanantiques.museum":2,"americanart.museum":2,"amsterdam.museum":2,"and.museum":2,"annefrank.museum":2,"anthro.museum":2,"anthropology.museum":2,"antiques.museum":2,"aquarium.museum":2,"arboretum.museum":2,"archaeological.museum":2,"archaeology.museum":2,"architecture.museum":2,"art.museum":2,"artanddesign.museum":2,"artcenter.museum":2,"artdeco.museum":2,"arteducation.museum":2,"artgallery.museum":2,"arts.museum":2,"artsandcrafts.museum":2,"asmatart.museum":2,"assassination.museum":2,"assisi.museum":2,"association.museum":2,"astronomy.museum":2,"atlanta.museum":2,"austin.museum":2,"australia.museum":2,"automotive.museum":2,"aviation.museum":2,"axis.museum":2,"badajoz.museum":2,"baghdad.museum":2,"bahn.museum":2,"bale.museum":2,"baltimore.museum":2,"barcelona.museum":2,"baseball.museum":2,"basel.museum":2,"baths.museum":2,"bauern.museum":2,"beauxarts.museum":2,"beeldengeluid.museum":2,"bellevue.museum":2,"bergbau.museum":2,"berkeley.museum":2,"berlin.museum":2,"bern.museum":2,"bible.museum":2,"bilbao.museum":2,"bill.museum":2,"birdart.museum":2,"birthplace.museum":2,"bonn.museum":2,"boston.museum":2,"botanical.museum":2,"botanicalgarden.museum":2,"botanicgarden.museum":2,"botany.museum":2,"brandywinevalley.museum":2,"brasil.museum":2,"bristol.museum":2,"british.museum":2,"britishcolumbia.museum":2,"broadcast.museum":2,"brunel.museum":2,"brussel.museum":2,"brussels.museum":2,"bruxelles.museum":2,"building.museum":2,"burghof.museum":2,"bus.museum":2,"bushey.museum":2,"cadaques.museum":2,"california.museum":2,"cambridge.museum":2,"can.museum":2,"canada.museum":2,"capebreton.museum":2,"carrier.museum":2,"cartoonart.museum":2,"casadelamoneda.museum":2,"castle.museum":2,"castres.museum":2,"celtic.museum":2,"center.museum":2,"chattanooga.museum":2,"cheltenham.museum":2,"chesapeakebay.museum":2,"chicago.museum":2,"children.museum":2,"childrens.museum":2,"childrensgarden.museum":2,"chiropractic.museum":2,"chocolate.museum":2,"christiansburg.museum":2,"cincinnati.museum":2,"cinema.museum":2,"circus.museum":2,"civilisation.museum":2,"civilization.museum":2,"civilwar.museum":2,"clinton.museum":2,"clock.museum":2,"coal.museum":2,"coastaldefence.museum":2,"cody.museum":2,"coldwar.museum":2,"collection.museum":2,"colonialwilliamsburg.museum":2,"coloradoplateau.museum":2,"columbia.museum":2,"columbus.museum":2,"communication.museum":2,"communications.museum":2,"community.museum":2,"computer.museum":2,"computerhistory.museum":2,"xn--comunicaes-v6a2o.museum":2,"contemporary.museum":2,"contemporaryart.museum":2,"convent.museum":2,"copenhagen.museum":2,"corporation.museum":2,"xn--correios-e-telecomunicaes-ghc29a.museum":2,"corvette.museum":2,"costume.museum":2,"countryestate.museum":2,"county.museum":2,"crafts.museum":2,"cranbrook.museum":2,"creation.museum":2,"cultural.museum":2,"culturalcenter.museum":2,"culture.museum":2,"cyber.museum":2,"cymru.museum":2,"dali.museum":2,"dallas.museum":2,"database.museum":2,"ddr.museum":2,"decorativearts.museum":2,"delaware.museum":2,"delmenhorst.museum":2,"denmark.museum":2,"depot.museum":2,"design.museum":2,"detroit.museum":2,"dinosaur.museum":2,"discovery.museum":2,"dolls.museum":2,"donostia.museum":2,"durham.museum":2,"eastafrica.museum":2,"eastcoast.museum":2,"education.museum":2,"educational.museum":2,"egyptian.museum":2,"eisenbahn.museum":2,"elburg.museum":2,"elvendrell.museum":2,"embroidery.museum":2,"encyclopedic.museum":2,"england.museum":2,"entomology.museum":2,"environment.museum":2,"environmentalconservation.museum":2,"epilepsy.museum":2,"essex.museum":2,"estate.museum":2,"ethnology.museum":2,"exeter.museum":2,"exhibition.museum":2,"family.museum":2,"farm.museum":2,"farmequipment.museum":2,"farmers.museum":2,"farmstead.museum":2,"field.museum":2,"figueres.museum":2,"filatelia.museum":2,"film.museum":2,"fineart.museum":2,"finearts.museum":2,"finland.museum":2,"flanders.museum":2,"florida.museum":2,"force.museum":2,"fortmissoula.museum":2,"fortworth.museum":2,"foundation.museum":2,"francaise.museum":2,"frankfurt.museum":2,"franziskaner.museum":2,"freemasonry.museum":2,"freiburg.museum":2,"fribourg.museum":2,"frog.museum":2,"fundacio.museum":2,"furniture.museum":2,"gallery.museum":2,"garden.museum":2,"gateway.museum":2,"geelvinck.museum":2,"gemological.museum":2,"geology.museum":2,"georgia.museum":2,"giessen.museum":2,"glas.museum":2,"glass.museum":2,"gorge.museum":2,"grandrapids.museum":2,"graz.museum":2,"guernsey.museum":2,"halloffame.museum":2,"hamburg.museum":2,"handson.museum":2,"harvestcelebration.museum":2,"hawaii.museum":2,"health.museum":2,"heimatunduhren.museum":2,"hellas.museum":2,"helsinki.museum":2,"hembygdsforbund.museum":2,"heritage.museum":2,"histoire.museum":2,"historical.museum":2,"historicalsociety.museum":2,"historichouses.museum":2,"historisch.museum":2,"historisches.museum":2,"history.museum":2,"historyofscience.museum":2,"horology.museum":2,"house.museum":2,"humanities.museum":2,"illustration.museum":2,"imageandsound.museum":2,"indian.museum":2,"indiana.museum":2,"indianapolis.museum":2,"indianmarket.museum":2,"intelligence.museum":2,"interactive.museum":2,"iraq.museum":2,"iron.museum":2,"isleofman.museum":2,"jamison.museum":2,"jefferson.museum":2,"jerusalem.museum":2,"jewelry.museum":2,"jewish.museum":2,"jewishart.museum":2,"jfk.museum":2,"journalism.museum":2,"judaica.museum":2,"judygarland.museum":2,"juedisches.museum":2,"juif.museum":2,"karate.museum":2,"karikatur.museum":2,"kids.museum":2,"koebenhavn.museum":2,"koeln.museum":2,"kunst.museum":2,"kunstsammlung.museum":2,"kunstunddesign.museum":2,"labor.museum":2,"labour.museum":2,"lajolla.museum":2,"lancashire.museum":2,"landes.museum":2,"lans.museum":2,"xn--lns-qla.museum":2,"larsson.museum":2,"lewismiller.museum":2,"lincoln.museum":2,"linz.museum":2,"living.museum":2,"livinghistory.museum":2,"localhistory.museum":2,"london.museum":2,"losangeles.museum":2,"louvre.museum":2,"loyalist.museum":2,"lucerne.museum":2,"luxembourg.museum":2,"luzern.museum":2,"mad.museum":2,"madrid.museum":2,"mallorca.museum":2,"manchester.museum":2,"mansion.museum":2,"mansions.museum":2,"manx.museum":2,"marburg.museum":2,"maritime.museum":2,"maritimo.museum":2,"maryland.museum":2,"marylhurst.museum":2,"media.museum":2,"medical.museum":2,"medizinhistorisches.museum":2,"meeres.museum":2,"memorial.museum":2,"mesaverde.museum":2,"michigan.museum":2,"midatlantic.museum":2,"military.museum":2,"mill.museum":2,"miners.museum":2,"mining.museum":2,"minnesota.museum":2,"missile.museum":2,"missoula.museum":2,"modern.museum":2,"moma.museum":2,"money.museum":2,"monmouth.museum":2,"monticello.museum":2,"montreal.museum":2,"moscow.museum":2,"motorcycle.museum":2,"muenchen.museum":2,"muenster.museum":2,"mulhouse.museum":2,"muncie.museum":2,"museet.museum":2,"museumcenter.museum":2,"museumvereniging.museum":2,"music.museum":2,"national.museum":2,"nationalfirearms.museum":2,"nationalheritage.museum":2,"nativeamerican.museum":2,"naturalhistory.museum":2,"naturalhistorymuseum.museum":2,"naturalsciences.museum":2,"nature.museum":2,"naturhistorisches.museum":2,"natuurwetenschappen.museum":2,"naumburg.museum":2,"naval.museum":2,"nebraska.museum":2,"neues.museum":2,"newhampshire.museum":2,"newjersey.museum":2,"newmexico.museum":2,"newport.museum":2,"newspaper.museum":2,"newyork.museum":2,"niepce.museum":2,"norfolk.museum":2,"north.museum":2,"nrw.museum":2,"nyc.museum":2,"nyny.museum":2,"oceanographic.museum":2,"oceanographique.museum":2,"omaha.museum":2,"online.museum":2,"ontario.museum":2,"openair.museum":2,"oregon.museum":2,"oregontrail.museum":2,"otago.museum":2,"oxford.museum":2,"pacific.museum":2,"paderborn.museum":2,"palace.museum":2,"paleo.museum":2,"palmsprings.museum":2,"panama.museum":2,"paris.museum":2,"pasadena.museum":2,"pharmacy.museum":2,"philadelphia.museum":2,"philadelphiaarea.museum":2,"philately.museum":2,"phoenix.museum":2,"photography.museum":2,"pilots.museum":2,"pittsburgh.museum":2,"planetarium.museum":2,"plantation.museum":2,"plants.museum":2,"plaza.museum":2,"portal.museum":2,"portland.museum":2,"portlligat.museum":2,"posts-and-telecommunications.museum":2,"preservation.museum":2,"presidio.museum":2,"press.museum":2,"project.museum":2,"public.museum":2,"pubol.museum":2,"quebec.museum":2,"railroad.museum":2,"railway.museum":2,"research.museum":2,"resistance.museum":2,"riodejaneiro.museum":2,"rochester.museum":2,"rockart.museum":2,"roma.museum":2,"russia.museum":2,"saintlouis.museum":2,"salem.museum":2,"salvadordali.museum":2,"salzburg.museum":2,"sandiego.museum":2,"sanfrancisco.museum":2,"santabarbara.museum":2,"santacruz.museum":2,"santafe.museum":2,"saskatchewan.museum":2,"satx.museum":2,"savannahga.museum":2,"schlesisches.museum":2,"schoenbrunn.museum":2,"schokoladen.museum":2,"school.museum":2,"schweiz.museum":2,"science.museum":2,"scienceandhistory.museum":2,"scienceandindustry.museum":2,"sciencecenter.museum":2,"sciencecenters.museum":2,"science-fiction.museum":2,"sciencehistory.museum":2,"sciences.museum":2,"sciencesnaturelles.museum":2,"scotland.museum":2,"seaport.museum":2,"settlement.museum":2,"settlers.museum":2,"shell.museum":2,"sherbrooke.museum":2,"sibenik.museum":2,"silk.museum":2,"ski.museum":2,"skole.museum":2,"society.museum":2,"sologne.museum":2,"soundandvision.museum":2,"southcarolina.museum":2,"southwest.museum":2,"space.museum":2,"spy.museum":2,"square.museum":2,"stadt.museum":2,"stalbans.museum":2,"starnberg.museum":2,"state.museum":2,"stateofdelaware.museum":2,"station.museum":2,"steam.museum":2,"steiermark.museum":2,"stjohn.museum":2,"stockholm.museum":2,"stpetersburg.museum":2,"stuttgart.museum":2,"suisse.museum":2,"surgeonshall.museum":2,"surrey.museum":2,"svizzera.museum":2,"sweden.museum":2,"sydney.museum":2,"tank.museum":2,"tcm.museum":2,"technology.museum":2,"telekommunikation.museum":2,"television.museum":2,"texas.museum":2,"textile.museum":2,"theater.museum":2,"time.museum":2,"timekeeping.museum":2,"topology.museum":2,"torino.museum":2,"touch.museum":2,"town.museum":2,"transport.museum":2,"tree.museum":2,"trolley.museum":2,"trust.museum":2,"trustee.museum":2,"uhren.museum":2,"ulm.museum":2,"undersea.museum":2,"university.museum":2,"usa.museum":2,"usantiques.museum":2,"usarts.museum":2,"uscountryestate.museum":2,"usculture.museum":2,"usdecorativearts.museum":2,"usgarden.museum":2,"ushistory.museum":2,"ushuaia.museum":2,"uslivinghistory.museum":2,"utah.museum":2,"uvic.museum":2,"valley.museum":2,"vantaa.museum":2,"versailles.museum":2,"viking.museum":2,"village.museum":2,"virginia.museum":2,"virtual.museum":2,"virtuel.museum":2,"vlaanderen.museum":2,"volkenkunde.museum":2,"wales.museum":2,"wallonie.museum":2,"war.museum":2,"washingtondc.museum":2,"watchandclock.museum":2,"watch-and-clock.museum":2,"western.museum":2,"westfalen.museum":2,"whaling.museum":2,"wildlife.museum":2,"williamsburg.museum":2,"windmill.museum":2,"workshop.museum":2,"york.museum":2,"yorkshire.museum":2,"yosemite.museum":2,"youth.museum":2,"zoological.museum":2,"zoology.museum":2,"xn--9dbhblg6di.museum":2,"xn--h1aegh.museum":2,"mv":1,"aero.mv":2,"biz.mv":2,"com.mv":2,"coop.mv":2,"edu.mv":2,"gov.mv":2,"info.mv":2,"int.mv":2,"mil.mv":2,"museum.mv":2,"name.mv":2,"net.mv":2,"org.mv":2,"pro.mv":2,"mw":1,"ac.mw":2,"biz.mw":2,"co.mw":2,"com.mw":2,"coop.mw":2,"edu.mw":2,"gov.mw":2,"int.mw":2,"museum.mw":2,"net.mw":2,"org.mw":2,"mx":1,"com.mx":2,"org.mx":2,"gob.mx":2,"edu.mx":2,"net.mx":2,"my":1,"biz.my":2,"com.my":2,"edu.my":2,"gov.my":2,"mil.my":2,"name.my":2,"net.my":2,"org.my":2,"mz":1,"ac.mz":2,"adv.mz":2,"co.mz":2,"edu.mz":2,"gov.mz":2,"mil.mz":2,"net.mz":2,"org.mz":2,"na":1,"info.na":2,"pro.na":2,"name.na":2,"school.na":2,"or.na":2,"dr.na":2,"us.na":2,"mx.na":2,"ca.na":2,"in.na":2,"cc.na":2,"tv.na":2,"ws.na":2,"mobi.na":2,"co.na":2,"com.na":2,"org.na":2,"name":1,"nc":1,"asso.nc":2,"nom.nc":2,"ne":1,"net":1,"nf":1,"com.nf":2,"net.nf":2,"per.nf":2,"rec.nf":2,"web.nf":2,"arts.nf":2,"firm.nf":2,"info.nf":2,"other.nf":2,"store.nf":2,"ng":1,"com.ng":2,"edu.ng":2,"gov.ng":2,"i.ng":2,"mil.ng":2,"mobi.ng":2,"name.ng":2,"net.ng":2,"org.ng":2,"sch.ng":2,"ni":1,"ac.ni":2,"biz.ni":2,"co.ni":2,"com.ni":2,"edu.ni":2,"gob.ni":2,"in.ni":2,"info.ni":2,"int.ni":2,"mil.ni":2,"net.ni":2,"nom.ni":2,"org.ni":2,"web.ni":2,"nl":1,"no":1,"fhs.no":2,"vgs.no":2,"fylkesbibl.no":2,"folkebibl.no":2,"museum.no":2,"idrett.no":2,"priv.no":2,"mil.no":2,"stat.no":2,"dep.no":2,"kommune.no":2,"herad.no":2,"aa.no":2,"ah.no":2,"bu.no":2,"fm.no":2,"hl.no":2,"hm.no":2,"jan-mayen.no":2,"mr.no":2,"nl.no":2,"nt.no":2,"of.no":2,"ol.no":2,"oslo.no":2,"rl.no":2,"sf.no":2,"st.no":2,"svalbard.no":2,"tm.no":2,"tr.no":2,"va.no":2,"vf.no":2,"gs.aa.no":3,"gs.ah.no":3,"gs.bu.no":3,"gs.fm.no":3,"gs.hl.no":3,"gs.hm.no":3,"gs.jan-mayen.no":3,"gs.mr.no":3,"gs.nl.no":3,"gs.nt.no":3,"gs.of.no":3,"gs.ol.no":3,"gs.oslo.no":3,"gs.rl.no":3,"gs.sf.no":3,"gs.st.no":3,"gs.svalbard.no":3,"gs.tm.no":3,"gs.tr.no":3,"gs.va.no":3,"gs.vf.no":3,"akrehamn.no":2,"xn--krehamn-dxa.no":2,"algard.no":2,"xn--lgrd-poac.no":2,"arna.no":2,"brumunddal.no":2,"bryne.no":2,"bronnoysund.no":2,"xn--brnnysund-m8ac.no":2,"drobak.no":2,"xn--drbak-wua.no":2,"egersund.no":2,"fetsund.no":2,"floro.no":2,"xn--flor-jra.no":2,"fredrikstad.no":2,"hokksund.no":2,"honefoss.no":2,"xn--hnefoss-q1a.no":2,"jessheim.no":2,"jorpeland.no":2,"xn--jrpeland-54a.no":2,"kirkenes.no":2,"kopervik.no":2,"krokstadelva.no":2,"langevag.no":2,"xn--langevg-jxa.no":2,"leirvik.no":2,"mjondalen.no":2,"xn--mjndalen-64a.no":2,"mo-i-rana.no":2,"mosjoen.no":2,"xn--mosjen-eya.no":2,"nesoddtangen.no":2,"orkanger.no":2,"osoyro.no":2,"xn--osyro-wua.no":2,"raholt.no":2,"xn--rholt-mra.no":2,"sandnessjoen.no":2,"xn--sandnessjen-ogb.no":2,"skedsmokorset.no":2,"slattum.no":2,"spjelkavik.no":2,"stathelle.no":2,"stavern.no":2,"stjordalshalsen.no":2,"xn--stjrdalshalsen-sqb.no":2,"tananger.no":2,"tranby.no":2,"vossevangen.no":2,"afjord.no":2,"xn--fjord-lra.no":2,"agdenes.no":2,"al.no":2,"xn--l-1fa.no":2,"alesund.no":2,"xn--lesund-hua.no":2,"alstahaug.no":2,"alta.no":2,"xn--lt-liac.no":2,"alaheadju.no":2,"xn--laheadju-7ya.no":2,"alvdal.no":2,"amli.no":2,"xn--mli-tla.no":2,"amot.no":2,"xn--mot-tla.no":2,"andebu.no":2,"andoy.no":2,"xn--andy-ira.no":2,"andasuolo.no":2,"ardal.no":2,"xn--rdal-poa.no":2,"aremark.no":2,"arendal.no":2,"xn--s-1fa.no":2,"aseral.no":2,"xn--seral-lra.no":2,"asker.no":2,"askim.no":2,"askvoll.no":2,"askoy.no":2,"xn--asky-ira.no":2,"asnes.no":2,"xn--snes-poa.no":2,"audnedaln.no":2,"aukra.no":2,"aure.no":2,"aurland.no":2,"aurskog-holand.no":2,"xn--aurskog-hland-jnb.no":2,"austevoll.no":2,"austrheim.no":2,"averoy.no":2,"xn--avery-yua.no":2,"balestrand.no":2,"ballangen.no":2,"balat.no":2,"xn--blt-elab.no":2,"balsfjord.no":2,"bahccavuotna.no":2,"xn--bhccavuotna-k7a.no":2,"bamble.no":2,"bardu.no":2,"beardu.no":2,"beiarn.no":2,"bajddar.no":2,"xn--bjddar-pta.no":2,"baidar.no":2,"xn--bidr-5nac.no":2,"berg.no":2,"bergen.no":2,"berlevag.no":2,"xn--berlevg-jxa.no":2,"bearalvahki.no":2,"xn--bearalvhki-y4a.no":2,"bindal.no":2,"birkenes.no":2,"bjarkoy.no":2,"xn--bjarky-fya.no":2,"bjerkreim.no":2,"bjugn.no":2,"bodo.no":2,"xn--bod-2na.no":2,"badaddja.no":2,"xn--bdddj-mrabd.no":2,"budejju.no":2,"bokn.no":2,"bremanger.no":2,"bronnoy.no":2,"xn--brnny-wuac.no":2,"bygland.no":2,"bykle.no":2,"barum.no":2,"xn--brum-voa.no":2,"bo.telemark.no":3,"xn--b-5ga.telemark.no":3,"bo.nordland.no":3,"xn--b-5ga.nordland.no":3,"bievat.no":2,"xn--bievt-0qa.no":2,"bomlo.no":2,"xn--bmlo-gra.no":2,"batsfjord.no":2,"xn--btsfjord-9za.no":2,"bahcavuotna.no":2,"xn--bhcavuotna-s4a.no":2,"dovre.no":2,"drammen.no":2,"drangedal.no":2,"dyroy.no":2,"xn--dyry-ira.no":2,"donna.no":2,"xn--dnna-gra.no":2,"eid.no":2,"eidfjord.no":2,"eidsberg.no":2,"eidskog.no":2,"eidsvoll.no":2,"eigersund.no":2,"elverum.no":2,"enebakk.no":2,"engerdal.no":2,"etne.no":2,"etnedal.no":2,"evenes.no":2,"evenassi.no":2,"xn--eveni-0qa01ga.no":2,"evje-og-hornnes.no":2,"farsund.no":2,"fauske.no":2,"fuossko.no":2,"fuoisku.no":2,"fedje.no":2,"fet.no":2,"finnoy.no":2,"xn--finny-yua.no":2,"fitjar.no":2,"fjaler.no":2,"fjell.no":2,"flakstad.no":2,"flatanger.no":2,"flekkefjord.no":2,"flesberg.no":2,"flora.no":2,"fla.no":2,"xn--fl-zia.no":2,"folldal.no":2,"forsand.no":2,"fosnes.no":2,"frei.no":2,"frogn.no":2,"froland.no":2,"frosta.no":2,"frana.no":2,"xn--frna-woa.no":2,"froya.no":2,"xn--frya-hra.no":2,"fusa.no":2,"fyresdal.no":2,"forde.no":2,"xn--frde-gra.no":2,"gamvik.no":2,"gangaviika.no":2,"xn--ggaviika-8ya47h.no":2,"gaular.no":2,"gausdal.no":2,"gildeskal.no":2,"xn--gildeskl-g0a.no":2,"giske.no":2,"gjemnes.no":2,"gjerdrum.no":2,"gjerstad.no":2,"gjesdal.no":2,"gjovik.no":2,"xn--gjvik-wua.no":2,"gloppen.no":2,"gol.no":2,"gran.no":2,"grane.no":2,"granvin.no":2,"gratangen.no":2,"grimstad.no":2,"grong.no":2,"kraanghke.no":2,"xn--kranghke-b0a.no":2,"grue.no":2,"gulen.no":2,"hadsel.no":2,"halden.no":2,"halsa.no":2,"hamar.no":2,"hamaroy.no":2,"habmer.no":2,"xn--hbmer-xqa.no":2,"hapmir.no":2,"xn--hpmir-xqa.no":2,"hammerfest.no":2,"hammarfeasta.no":2,"xn--hmmrfeasta-s4ac.no":2,"haram.no":2,"hareid.no":2,"harstad.no":2,"hasvik.no":2,"aknoluokta.no":2,"xn--koluokta-7ya57h.no":2,"hattfjelldal.no":2,"aarborte.no":2,"haugesund.no":2,"hemne.no":2,"hemnes.no":2,"hemsedal.no":2,"heroy.more-og-romsdal.no":3,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":3,"heroy.nordland.no":3,"xn--hery-ira.nordland.no":3,"hitra.no":2,"hjartdal.no":2,"hjelmeland.no":2,"hobol.no":2,"xn--hobl-ira.no":2,"hof.no":2,"hol.no":2,"hole.no":2,"holmestrand.no":2,"holtalen.no":2,"xn--holtlen-hxa.no":2,"hornindal.no":2,"horten.no":2,"hurdal.no":2,"hurum.no":2,"hvaler.no":2,"hyllestad.no":2,"hagebostad.no":2,"xn--hgebostad-g3a.no":2,"hoyanger.no":2,"xn--hyanger-q1a.no":2,"hoylandet.no":2,"xn--hylandet-54a.no":2,"ha.no":2,"xn--h-2fa.no":2,"ibestad.no":2,"inderoy.no":2,"xn--indery-fya.no":2,"iveland.no":2,"jevnaker.no":2,"jondal.no":2,"jolster.no":2,"xn--jlster-bya.no":2,"karasjok.no":2,"karasjohka.no":2,"xn--krjohka-hwab49j.no":2,"karlsoy.no":2,"galsa.no":2,"xn--gls-elac.no":2,"karmoy.no":2,"xn--karmy-yua.no":2,"kautokeino.no":2,"guovdageaidnu.no":2,"klepp.no":2,"klabu.no":2,"xn--klbu-woa.no":2,"kongsberg.no":2,"kongsvinger.no":2,"kragero.no":2,"xn--krager-gya.no":2,"kristiansand.no":2,"kristiansund.no":2,"krodsherad.no":2,"xn--krdsherad-m8a.no":2,"kvalsund.no":2,"rahkkeravju.no":2,"xn--rhkkervju-01af.no":2,"kvam.no":2,"kvinesdal.no":2,"kvinnherad.no":2,"kviteseid.no":2,"kvitsoy.no":2,"xn--kvitsy-fya.no":2,"kvafjord.no":2,"xn--kvfjord-nxa.no":2,"giehtavuoatna.no":2,"kvanangen.no":2,"xn--kvnangen-k0a.no":2,"navuotna.no":2,"xn--nvuotna-hwa.no":2,"kafjord.no":2,"xn--kfjord-iua.no":2,"gaivuotna.no":2,"xn--givuotna-8ya.no":2,"larvik.no":2,"lavangen.no":2,"lavagis.no":2,"loabat.no":2,"xn--loabt-0qa.no":2,"lebesby.no":2,"davvesiida.no":2,"leikanger.no":2,"leirfjord.no":2,"leka.no":2,"leksvik.no":2,"lenvik.no":2,"leangaviika.no":2,"xn--leagaviika-52b.no":2,"lesja.no":2,"levanger.no":2,"lier.no":2,"lierne.no":2,"lillehammer.no":2,"lillesand.no":2,"lindesnes.no":2,"lindas.no":2,"xn--linds-pra.no":2,"lom.no":2,"loppa.no":2,"lahppi.no":2,"xn--lhppi-xqa.no":2,"lund.no":2,"lunner.no":2,"luroy.no":2,"xn--lury-ira.no":2,"luster.no":2,"lyngdal.no":2,"lyngen.no":2,"ivgu.no":2,"lardal.no":2,"lerdal.no":2,"xn--lrdal-sra.no":2,"lodingen.no":2,"xn--ldingen-q1a.no":2,"lorenskog.no":2,"xn--lrenskog-54a.no":2,"loten.no":2,"xn--lten-gra.no":2,"malvik.no":2,"masoy.no":2,"xn--msy-ula0h.no":2,"muosat.no":2,"xn--muost-0qa.no":2,"mandal.no":2,"marker.no":2,"marnardal.no":2,"masfjorden.no":2,"meland.no":2,"meldal.no":2,"melhus.no":2,"meloy.no":2,"xn--mely-ira.no":2,"meraker.no":2,"xn--merker-kua.no":2,"moareke.no":2,"xn--moreke-jua.no":2,"midsund.no":2,"midtre-gauldal.no":2,"modalen.no":2,"modum.no":2,"molde.no":2,"moskenes.no":2,"moss.no":2,"mosvik.no":2,"malselv.no":2,"xn--mlselv-iua.no":2,"malatvuopmi.no":2,"xn--mlatvuopmi-s4a.no":2,"namdalseid.no":2,"aejrie.no":2,"namsos.no":2,"namsskogan.no":2,"naamesjevuemie.no":2,"xn--nmesjevuemie-tcba.no":2,"laakesvuemie.no":2,"nannestad.no":2,"narvik.no":2,"narviika.no":2,"naustdal.no":2,"nedre-eiker.no":2,"nes.akershus.no":3,"nes.buskerud.no":3,"nesna.no":2,"nesodden.no":2,"nesseby.no":2,"unjarga.no":2,"xn--unjrga-rta.no":2,"nesset.no":2,"nissedal.no":2,"nittedal.no":2,"nord-aurdal.no":2,"nord-fron.no":2,"nord-odal.no":2,"norddal.no":2,"nordkapp.no":2,"davvenjarga.no":2,"xn--davvenjrga-y4a.no":2,"nordre-land.no":2,"nordreisa.no":2,"raisa.no":2,"xn--risa-5na.no":2,"nore-og-uvdal.no":2,"notodden.no":2,"naroy.no":2,"xn--nry-yla5g.no":2,"notteroy.no":2,"xn--nttery-byae.no":2,"odda.no":2,"oksnes.no":2,"xn--ksnes-uua.no":2,"oppdal.no":2,"oppegard.no":2,"xn--oppegrd-ixa.no":2,"orkdal.no":2,"orland.no":2,"xn--rland-uua.no":2,"orskog.no":2,"xn--rskog-uua.no":2,"orsta.no":2,"xn--rsta-fra.no":2,"os.hedmark.no":3,"os.hordaland.no":3,"osen.no":2,"osteroy.no":2,"xn--ostery-fya.no":2,"ostre-toten.no":2,"xn--stre-toten-zcb.no":2,"overhalla.no":2,"ovre-eiker.no":2,"xn--vre-eiker-k8a.no":2,"oyer.no":2,"xn--yer-zna.no":2,"oygarden.no":2,"xn--ygarden-p1a.no":2,"oystre-slidre.no":2,"xn--ystre-slidre-ujb.no":2,"porsanger.no":2,"porsangu.no":2,"xn--porsgu-sta26f.no":2,"porsgrunn.no":2,"radoy.no":2,"xn--rady-ira.no":2,"rakkestad.no":2,"rana.no":2,"ruovat.no":2,"randaberg.no":2,"rauma.no":2,"rendalen.no":2,"rennebu.no":2,"rennesoy.no":2,"xn--rennesy-v1a.no":2,"rindal.no":2,"ringebu.no":2,"ringerike.no":2,"ringsaker.no":2,"rissa.no":2,"risor.no":2,"xn--risr-ira.no":2,"roan.no":2,"rollag.no":2,"rygge.no":2,"ralingen.no":2,"xn--rlingen-mxa.no":2,"rodoy.no":2,"xn--rdy-0nab.no":2,"romskog.no":2,"xn--rmskog-bya.no":2,"roros.no":2,"xn--rros-gra.no":2,"rost.no":2,"xn--rst-0na.no":2,"royken.no":2,"xn--ryken-vua.no":2,"royrvik.no":2,"xn--ryrvik-bya.no":2,"rade.no":2,"xn--rde-ula.no":2,"salangen.no":2,"siellak.no":2,"saltdal.no":2,"salat.no":2,"xn--slt-elab.no":2,"xn--slat-5na.no":2,"samnanger.no":2,"sande.more-og-romsdal.no":3,"sande.xn--mre-og-romsdal-qqb.no":3,"sande.vestfold.no":3,"sandefjord.no":2,"sandnes.no":2,"sandoy.no":2,"xn--sandy-yua.no":2,"sarpsborg.no":2,"sauda.no":2,"sauherad.no":2,"sel.no":2,"selbu.no":2,"selje.no":2,"seljord.no":2,"sigdal.no":2,"siljan.no":2,"sirdal.no":2,"skaun.no":2,"skedsmo.no":2,"ski.no":2,"skien.no":2,"skiptvet.no":2,"skjervoy.no":2,"xn--skjervy-v1a.no":2,"skierva.no":2,"xn--skierv-uta.no":2,"skjak.no":2,"xn--skjk-soa.no":2,"skodje.no":2,"skanland.no":2,"xn--sknland-fxa.no":2,"skanit.no":2,"xn--sknit-yqa.no":2,"smola.no":2,"xn--smla-hra.no":2,"snillfjord.no":2,"snasa.no":2,"xn--snsa-roa.no":2,"snoasa.no":2,"snaase.no":2,"xn--snase-nra.no":2,"sogndal.no":2,"sokndal.no":2,"sola.no":2,"solund.no":2,"songdalen.no":2,"sortland.no":2,"spydeberg.no":2,"stange.no":2,"stavanger.no":2,"steigen.no":2,"steinkjer.no":2,"stjordal.no":2,"xn--stjrdal-s1a.no":2,"stokke.no":2,"stor-elvdal.no":2,"stord.no":2,"stordal.no":2,"storfjord.no":2,"omasvuotna.no":2,"strand.no":2,"stranda.no":2,"stryn.no":2,"sula.no":2,"suldal.no":2,"sund.no":2,"sunndal.no":2,"surnadal.no":2,"sveio.no":2,"svelvik.no":2,"sykkylven.no":2,"sogne.no":2,"xn--sgne-gra.no":2,"somna.no":2,"xn--smna-gra.no":2,"sondre-land.no":2,"xn--sndre-land-0cb.no":2,"sor-aurdal.no":2,"xn--sr-aurdal-l8a.no":2,"sor-fron.no":2,"xn--sr-fron-q1a.no":2,"sor-odal.no":2,"xn--sr-odal-q1a.no":2,"sor-varanger.no":2,"xn--sr-varanger-ggb.no":2,"matta-varjjat.no":2,"xn--mtta-vrjjat-k7af.no":2,"sorfold.no":2,"xn--srfold-bya.no":2,"sorreisa.no":2,"xn--srreisa-q1a.no":2,"sorum.no":2,"xn--srum-gra.no":2,"tana.no":2,"deatnu.no":2,"time.no":2,"tingvoll.no":2,"tinn.no":2,"tjeldsund.no":2,"dielddanuorri.no":2,"tjome.no":2,"xn--tjme-hra.no":2,"tokke.no":2,"tolga.no":2,"torsken.no":2,"tranoy.no":2,"xn--trany-yua.no":2,"tromso.no":2,"xn--troms-zua.no":2,"tromsa.no":2,"romsa.no":2,"trondheim.no":2,"troandin.no":2,"trysil.no":2,"trana.no":2,"xn--trna-woa.no":2,"trogstad.no":2,"xn--trgstad-r1a.no":2,"tvedestrand.no":2,"tydal.no":2,"tynset.no":2,"tysfjord.no":2,"divtasvuodna.no":2,"divttasvuotna.no":2,"tysnes.no":2,"tysvar.no":2,"xn--tysvr-vra.no":2,"tonsberg.no":2,"xn--tnsberg-q1a.no":2,"ullensaker.no":2,"ullensvang.no":2,"ulvik.no":2,"utsira.no":2,"vadso.no":2,"xn--vads-jra.no":2,"cahcesuolo.no":2,"xn--hcesuolo-7ya35b.no":2,"vaksdal.no":2,"valle.no":2,"vang.no":2,"vanylven.no":2,"vardo.no":2,"xn--vard-jra.no":2,"varggat.no":2,"xn--vrggt-xqad.no":2,"vefsn.no":2,"vaapste.no":2,"vega.no":2,"vegarshei.no":2,"xn--vegrshei-c0a.no":2,"vennesla.no":2,"verdal.no":2,"verran.no":2,"vestby.no":2,"vestnes.no":2,"vestre-slidre.no":2,"vestre-toten.no":2,"vestvagoy.no":2,"xn--vestvgy-ixa6o.no":2,"vevelstad.no":2,"vik.no":2,"vikna.no":2,"vindafjord.no":2,"volda.no":2,"voss.no":2,"varoy.no":2,"xn--vry-yla5g.no":2,"vagan.no":2,"xn--vgan-qoa.no":2,"voagat.no":2,"vagsoy.no":2,"xn--vgsy-qoa0j.no":2,"vaga.no":2,"xn--vg-yiab.no":2,"valer.ostfold.no":3,"xn--vler-qoa.xn--stfold-9xa.no":3,"valer.hedmark.no":3,"xn--vler-qoa.hedmark.no":3,"np":2,"nr":1,"biz.nr":2,"info.nr":2,"gov.nr":2,"edu.nr":2,"org.nr":2,"net.nr":2,"com.nr":2,"nu":1,"nz":1,"ac.nz":2,"co.nz":2,"cri.nz":2,"geek.nz":2,"gen.nz":2,"govt.nz":2,"health.nz":2,"iwi.nz":2,"kiwi.nz":2,"maori.nz":2,"mil.nz":2,"xn--mori-qsa.nz":2,"net.nz":2,"org.nz":2,"parliament.nz":2,"school.nz":2,"om":1,"co.om":2,"com.om":2,"edu.om":2,"gov.om":2,"med.om":2,"museum.om":2,"net.om":2,"org.om":2,"pro.om":2,"onion":1,"org":1,"pa":1,"ac.pa":2,"gob.pa":2,"com.pa":2,"org.pa":2,"sld.pa":2,"edu.pa":2,"net.pa":2,"ing.pa":2,"abo.pa":2,"med.pa":2,"nom.pa":2,"pe":1,"edu.pe":2,"gob.pe":2,"nom.pe":2,"mil.pe":2,"org.pe":2,"com.pe":2,"net.pe":2,"pf":1,"com.pf":2,"org.pf":2,"edu.pf":2,"pg":2,"ph":1,"com.ph":2,"net.ph":2,"org.ph":2,"gov.ph":2,"edu.ph":2,"ngo.ph":2,"mil.ph":2,"i.ph":2,"pk":1,"com.pk":2,"net.pk":2,"edu.pk":2,"org.pk":2,"fam.pk":2,"biz.pk":2,"web.pk":2,"gov.pk":2,"gob.pk":2,"gok.pk":2,"gon.pk":2,"gop.pk":2,"gos.pk":2,"info.pk":2,"pl":1,"com.pl":2,"net.pl":2,"org.pl":2,"aid.pl":2,"agro.pl":2,"atm.pl":2,"auto.pl":2,"biz.pl":2,"edu.pl":2,"gmina.pl":2,"gsm.pl":2,"info.pl":2,"mail.pl":2,"miasta.pl":2,"media.pl":2,"mil.pl":2,"nieruchomosci.pl":2,"nom.pl":2,"pc.pl":2,"powiat.pl":2,"priv.pl":2,"realestate.pl":2,"rel.pl":2,"sex.pl":2,"shop.pl":2,"sklep.pl":2,"sos.pl":2,"szkola.pl":2,"targi.pl":2,"tm.pl":2,"tourism.pl":2,"travel.pl":2,"turystyka.pl":2,"gov.pl":2,"ap.gov.pl":3,"ic.gov.pl":3,"is.gov.pl":3,"us.gov.pl":3,"kmpsp.gov.pl":3,"kppsp.gov.pl":3,"kwpsp.gov.pl":3,"psp.gov.pl":3,"wskr.gov.pl":3,"kwp.gov.pl":3,"mw.gov.pl":3,"ug.gov.pl":3,"um.gov.pl":3,"umig.gov.pl":3,"ugim.gov.pl":3,"upow.gov.pl":3,"uw.gov.pl":3,"starostwo.gov.pl":3,"pa.gov.pl":3,"po.gov.pl":3,"psse.gov.pl":3,"pup.gov.pl":3,"rzgw.gov.pl":3,"sa.gov.pl":3,"so.gov.pl":3,"sr.gov.pl":3,"wsa.gov.pl":3,"sko.gov.pl":3,"uzs.gov.pl":3,"wiih.gov.pl":3,"winb.gov.pl":3,"pinb.gov.pl":3,"wios.gov.pl":3,"witd.gov.pl":3,"wzmiuw.gov.pl":3,"piw.gov.pl":3,"wiw.gov.pl":3,"griw.gov.pl":3,"wif.gov.pl":3,"oum.gov.pl":3,"sdn.gov.pl":3,"zp.gov.pl":3,"uppo.gov.pl":3,"mup.gov.pl":3,"wuoz.gov.pl":3,"konsulat.gov.pl":3,"oirm.gov.pl":3,"augustow.pl":2,"babia-gora.pl":2,"bedzin.pl":2,"beskidy.pl":2,"bialowieza.pl":2,"bialystok.pl":2,"bielawa.pl":2,"bieszczady.pl":2,"boleslawiec.pl":2,"bydgoszcz.pl":2,"bytom.pl":2,"cieszyn.pl":2,"czeladz.pl":2,"czest.pl":2,"dlugoleka.pl":2,"elblag.pl":2,"elk.pl":2,"glogow.pl":2,"gniezno.pl":2,"gorlice.pl":2,"grajewo.pl":2,"ilawa.pl":2,"jaworzno.pl":2,"jelenia-gora.pl":2,"jgora.pl":2,"kalisz.pl":2,"kazimierz-dolny.pl":2,"karpacz.pl":2,"kartuzy.pl":2,"kaszuby.pl":2,"katowice.pl":2,"kepno.pl":2,"ketrzyn.pl":2,"klodzko.pl":2,"kobierzyce.pl":2,"kolobrzeg.pl":2,"konin.pl":2,"konskowola.pl":2,"kutno.pl":2,"lapy.pl":2,"lebork.pl":2,"legnica.pl":2,"lezajsk.pl":2,"limanowa.pl":2,"lomza.pl":2,"lowicz.pl":2,"lubin.pl":2,"lukow.pl":2,"malbork.pl":2,"malopolska.pl":2,"mazowsze.pl":2,"mazury.pl":2,"mielec.pl":2,"mielno.pl":2,"mragowo.pl":2,"naklo.pl":2,"nowaruda.pl":2,"nysa.pl":2,"olawa.pl":2,"olecko.pl":2,"olkusz.pl":2,"olsztyn.pl":2,"opoczno.pl":2,"opole.pl":2,"ostroda.pl":2,"ostroleka.pl":2,"ostrowiec.pl":2,"ostrowwlkp.pl":2,"pila.pl":2,"pisz.pl":2,"podhale.pl":2,"podlasie.pl":2,"polkowice.pl":2,"pomorze.pl":2,"pomorskie.pl":2,"prochowice.pl":2,"pruszkow.pl":2,"przeworsk.pl":2,"pulawy.pl":2,"radom.pl":2,"rawa-maz.pl":2,"rybnik.pl":2,"rzeszow.pl":2,"sanok.pl":2,"sejny.pl":2,"slask.pl":2,"slupsk.pl":2,"sosnowiec.pl":2,"stalowa-wola.pl":2,"skoczow.pl":2,"starachowice.pl":2,"stargard.pl":2,"suwalki.pl":2,"swidnica.pl":2,"swiebodzin.pl":2,"swinoujscie.pl":2,"szczecin.pl":2,"szczytno.pl":2,"tarnobrzeg.pl":2,"tgory.pl":2,"turek.pl":2,"tychy.pl":2,"ustka.pl":2,"walbrzych.pl":2,"warmia.pl":2,"warszawa.pl":2,"waw.pl":2,"wegrow.pl":2,"wielun.pl":2,"wlocl.pl":2,"wloclawek.pl":2,"wodzislaw.pl":2,"wolomin.pl":2,"wroclaw.pl":2,"zachpomor.pl":2,"zagan.pl":2,"zarow.pl":2,"zgora.pl":2,"zgorzelec.pl":2,"pm":1,"pn":1,"gov.pn":2,"co.pn":2,"org.pn":2,"edu.pn":2,"net.pn":2,"post":1,"pr":1,"com.pr":2,"net.pr":2,"org.pr":2,"gov.pr":2,"edu.pr":2,"isla.pr":2,"pro.pr":2,"biz.pr":2,"info.pr":2,"name.pr":2,"est.pr":2,"prof.pr":2,"ac.pr":2,"pro":1,"aaa.pro":2,"aca.pro":2,"acct.pro":2,"avocat.pro":2,"bar.pro":2,"cpa.pro":2,"eng.pro":2,"jur.pro":2,"law.pro":2,"med.pro":2,"recht.pro":2,"ps":1,"edu.ps":2,"gov.ps":2,"sec.ps":2,"plo.ps":2,"com.ps":2,"org.ps":2,"net.ps":2,"pt":1,"net.pt":2,"gov.pt":2,"org.pt":2,"edu.pt":2,"int.pt":2,"publ.pt":2,"com.pt":2,"nome.pt":2,"pw":1,"co.pw":2,"ne.pw":2,"or.pw":2,"ed.pw":2,"go.pw":2,"belau.pw":2,"py":1,"com.py":2,"coop.py":2,"edu.py":2,"gov.py":2,"mil.py":2,"net.py":2,"org.py":2,"qa":1,"com.qa":2,"edu.qa":2,"gov.qa":2,"mil.qa":2,"name.qa":2,"net.qa":2,"org.qa":2,"sch.qa":2,"re":1,"asso.re":2,"com.re":2,"nom.re":2,"ro":1,"arts.ro":2,"com.ro":2,"firm.ro":2,"info.ro":2,"nom.ro":2,"nt.ro":2,"org.ro":2,"rec.ro":2,"store.ro":2,"tm.ro":2,"www.ro":2,"rs":1,"ac.rs":2,"co.rs":2,"edu.rs":2,"gov.rs":2,"in.rs":2,"org.rs":2,"ru":1,"rw":1,"ac.rw":2,"co.rw":2,"coop.rw":2,"gov.rw":2,"mil.rw":2,"net.rw":2,"org.rw":2,"sa":1,"com.sa":2,"net.sa":2,"org.sa":2,"gov.sa":2,"med.sa":2,"pub.sa":2,"edu.sa":2,"sch.sa":2,"sb":1,"com.sb":2,"edu.sb":2,"gov.sb":2,"net.sb":2,"org.sb":2,"sc":1,"com.sc":2,"gov.sc":2,"net.sc":2,"org.sc":2,"edu.sc":2,"sd":1,"com.sd":2,"net.sd":2,"org.sd":2,"edu.sd":2,"med.sd":2,"tv.sd":2,"gov.sd":2,"info.sd":2,"se":1,"a.se":2,"ac.se":2,"b.se":2,"bd.se":2,"brand.se":2,"c.se":2,"d.se":2,"e.se":2,"f.se":2,"fh.se":2,"fhsk.se":2,"fhv.se":2,"g.se":2,"h.se":2,"i.se":2,"k.se":2,"komforb.se":2,"kommunalforbund.se":2,"komvux.se":2,"l.se":2,"lanbib.se":2,"m.se":2,"n.se":2,"naturbruksgymn.se":2,"o.se":2,"org.se":2,"p.se":2,"parti.se":2,"pp.se":2,"press.se":2,"r.se":2,"s.se":2,"t.se":2,"tm.se":2,"u.se":2,"w.se":2,"x.se":2,"y.se":2,"z.se":2,"sg":1,"com.sg":2,"net.sg":2,"org.sg":2,"gov.sg":2,"edu.sg":2,"per.sg":2,"sh":1,"com.sh":2,"net.sh":2,"gov.sh":2,"org.sh":2,"mil.sh":2,"si":1,"sj":1,"sk":1,"sl":1,"com.sl":2,"net.sl":2,"edu.sl":2,"gov.sl":2,"org.sl":2,"sm":1,"sn":1,"art.sn":2,"com.sn":2,"edu.sn":2,"gouv.sn":2,"org.sn":2,"perso.sn":2,"univ.sn":2,"so":1,"com.so":2,"edu.so":2,"gov.so":2,"me.so":2,"net.so":2,"org.so":2,"sr":1,"ss":1,"biz.ss":2,"com.ss":2,"edu.ss":2,"gov.ss":2,"me.ss":2,"net.ss":2,"org.ss":2,"sch.ss":2,"st":1,"co.st":2,"com.st":2,"consulado.st":2,"edu.st":2,"embaixada.st":2,"mil.st":2,"net.st":2,"org.st":2,"principe.st":2,"saotome.st":2,"store.st":2,"su":1,"sv":1,"com.sv":2,"edu.sv":2,"gob.sv":2,"org.sv":2,"red.sv":2,"sx":1,"gov.sx":2,"sy":1,"edu.sy":2,"gov.sy":2,"net.sy":2,"mil.sy":2,"com.sy":2,"org.sy":2,"sz":1,"co.sz":2,"ac.sz":2,"org.sz":2,"tc":1,"td":1,"tel":1,"tf":1,"tg":1,"th":1,"ac.th":2,"co.th":2,"go.th":2,"in.th":2,"mi.th":2,"net.th":2,"or.th":2,"tj":1,"ac.tj":2,"biz.tj":2,"co.tj":2,"com.tj":2,"edu.tj":2,"go.tj":2,"gov.tj":2,"int.tj":2,"mil.tj":2,"name.tj":2,"net.tj":2,"nic.tj":2,"org.tj":2,"test.tj":2,"web.tj":2,"tk":1,"tl":1,"gov.tl":2,"tm":1,"com.tm":2,"co.tm":2,"org.tm":2,"net.tm":2,"nom.tm":2,"gov.tm":2,"mil.tm":2,"edu.tm":2,"tn":1,"com.tn":2,"ens.tn":2,"fin.tn":2,"gov.tn":2,"ind.tn":2,"info.tn":2,"intl.tn":2,"mincom.tn":2,"nat.tn":2,"net.tn":2,"org.tn":2,"perso.tn":2,"tourism.tn":2,"to":1,"com.to":2,"gov.to":2,"net.to":2,"org.to":2,"edu.to":2,"mil.to":2,"tr":1,"av.tr":2,"bbs.tr":2,"bel.tr":2,"biz.tr":2,"com.tr":2,"dr.tr":2,"edu.tr":2,"gen.tr":2,"gov.tr":2,"info.tr":2,"mil.tr":2,"k12.tr":2,"kep.tr":2,"name.tr":2,"net.tr":2,"org.tr":2,"pol.tr":2,"tel.tr":2,"tsk.tr":2,"tv.tr":2,"web.tr":2,"nc.tr":2,"gov.nc.tr":3,"tt":1,"co.tt":2,"com.tt":2,"org.tt":2,"net.tt":2,"biz.tt":2,"info.tt":2,"pro.tt":2,"int.tt":2,"coop.tt":2,"jobs.tt":2,"mobi.tt":2,"travel.tt":2,"museum.tt":2,"aero.tt":2,"name.tt":2,"gov.tt":2,"edu.tt":2,"tv":1,"tw":1,"edu.tw":2,"gov.tw":2,"mil.tw":2,"com.tw":2,"net.tw":2,"org.tw":2,"idv.tw":2,"game.tw":2,"ebiz.tw":2,"club.tw":2,"xn--zf0ao64a.tw":2,"xn--uc0atv.tw":2,"xn--czrw28b.tw":2,"tz":1,"ac.tz":2,"co.tz":2,"go.tz":2,"hotel.tz":2,"info.tz":2,"me.tz":2,"mil.tz":2,"mobi.tz":2,"ne.tz":2,"or.tz":2,"sc.tz":2,"tv.tz":2,"ua":1,"com.ua":2,"edu.ua":2,"gov.ua":2,"in.ua":2,"net.ua":2,"org.ua":2,"cherkassy.ua":2,"cherkasy.ua":2,"chernigov.ua":2,"chernihiv.ua":2,"chernivtsi.ua":2,"chernovtsy.ua":2,"ck.ua":2,"cn.ua":2,"cr.ua":2,"crimea.ua":2,"cv.ua":2,"dn.ua":2,"dnepropetrovsk.ua":2,"dnipropetrovsk.ua":2,"donetsk.ua":2,"dp.ua":2,"if.ua":2,"ivano-frankivsk.ua":2,"kh.ua":2,"kharkiv.ua":2,"kharkov.ua":2,"kherson.ua":2,"khmelnitskiy.ua":2,"khmelnytskyi.ua":2,"kiev.ua":2,"kirovograd.ua":2,"km.ua":2,"kr.ua":2,"krym.ua":2,"ks.ua":2,"kv.ua":2,"kyiv.ua":2,"lg.ua":2,"lt.ua":2,"lugansk.ua":2,"lutsk.ua":2,"lv.ua":2,"lviv.ua":2,"mk.ua":2,"mykolaiv.ua":2,"nikolaev.ua":2,"od.ua":2,"odesa.ua":2,"odessa.ua":2,"pl.ua":2,"poltava.ua":2,"rivne.ua":2,"rovno.ua":2,"rv.ua":2,"sb.ua":2,"sebastopol.ua":2,"sevastopol.ua":2,"sm.ua":2,"sumy.ua":2,"te.ua":2,"ternopil.ua":2,"uz.ua":2,"uzhgorod.ua":2,"vinnica.ua":2,"vinnytsia.ua":2,"vn.ua":2,"volyn.ua":2,"yalta.ua":2,"zaporizhzhe.ua":2,"zaporizhzhia.ua":2,"zhitomir.ua":2,"zhytomyr.ua":2,"zp.ua":2,"zt.ua":2,"ug":1,"co.ug":2,"or.ug":2,"ac.ug":2,"sc.ug":2,"go.ug":2,"ne.ug":2,"com.ug":2,"org.ug":2,"uk":1,"ac.uk":2,"co.uk":2,"gov.uk":2,"ltd.uk":2,"me.uk":2,"net.uk":2,"nhs.uk":2,"org.uk":2,"plc.uk":2,"police.uk":2,"sch.uk":3,"us":1,"dni.us":2,"fed.us":2,"isa.us":2,"kids.us":2,"nsn.us":2,"ak.us":2,"al.us":2,"ar.us":2,"as.us":2,"az.us":2,"ca.us":2,"co.us":2,"ct.us":2,"dc.us":2,"de.us":2,"fl.us":2,"ga.us":2,"gu.us":2,"hi.us":2,"ia.us":2,"id.us":2,"il.us":2,"in.us":2,"ks.us":2,"ky.us":2,"la.us":2,"ma.us":2,"md.us":2,"me.us":2,"mi.us":2,"mn.us":2,"mo.us":2,"ms.us":2,"mt.us":2,"nc.us":2,"nd.us":2,"ne.us":2,"nh.us":2,"nj.us":2,"nm.us":2,"nv.us":2,"ny.us":2,"oh.us":2,"ok.us":2,"or.us":2,"pa.us":2,"pr.us":2,"ri.us":2,"sc.us":2,"sd.us":2,"tn.us":2,"tx.us":2,"ut.us":2,"vi.us":2,"vt.us":2,"va.us":2,"wa.us":2,"wi.us":2,"wv.us":2,"wy.us":2,"k12.ak.us":3,"k12.al.us":3,"k12.ar.us":3,"k12.as.us":3,"k12.az.us":3,"k12.ca.us":3,"k12.co.us":3,"k12.ct.us":3,"k12.dc.us":3,"k12.de.us":3,"k12.fl.us":3,"k12.ga.us":3,"k12.gu.us":3,"k12.ia.us":3,"k12.id.us":3,"k12.il.us":3,"k12.in.us":3,"k12.ks.us":3,"k12.ky.us":3,"k12.la.us":3,"k12.ma.us":3,"k12.md.us":3,"k12.me.us":3,"k12.mi.us":3,"k12.mn.us":3,"k12.mo.us":3,"k12.ms.us":3,"k12.mt.us":3,"k12.nc.us":3,"k12.ne.us":3,"k12.nh.us":3,"k12.nj.us":3,"k12.nm.us":3,"k12.nv.us":3,"k12.ny.us":3,"k12.oh.us":3,"k12.ok.us":3,"k12.or.us":3,"k12.pa.us":3,"k12.pr.us":3,"k12.sc.us":3,"k12.tn.us":3,"k12.tx.us":3,"k12.ut.us":3,"k12.vi.us":3,"k12.vt.us":3,"k12.va.us":3,"k12.wa.us":3,"k12.wi.us":3,"k12.wy.us":3,"cc.ak.us":3,"cc.al.us":3,"cc.ar.us":3,"cc.as.us":3,"cc.az.us":3,"cc.ca.us":3,"cc.co.us":3,"cc.ct.us":3,"cc.dc.us":3,"cc.de.us":3,"cc.fl.us":3,"cc.ga.us":3,"cc.gu.us":3,"cc.hi.us":3,"cc.ia.us":3,"cc.id.us":3,"cc.il.us":3,"cc.in.us":3,"cc.ks.us":3,"cc.ky.us":3,"cc.la.us":3,"cc.ma.us":3,"cc.md.us":3,"cc.me.us":3,"cc.mi.us":3,"cc.mn.us":3,"cc.mo.us":3,"cc.ms.us":3,"cc.mt.us":3,"cc.nc.us":3,"cc.nd.us":3,"cc.ne.us":3,"cc.nh.us":3,"cc.nj.us":3,"cc.nm.us":3,"cc.nv.us":3,"cc.ny.us":3,"cc.oh.us":3,"cc.ok.us":3,"cc.or.us":3,"cc.pa.us":3,"cc.pr.us":3,"cc.ri.us":3,"cc.sc.us":3,"cc.sd.us":3,"cc.tn.us":3,"cc.tx.us":3,"cc.ut.us":3,"cc.vi.us":3,"cc.vt.us":3,"cc.va.us":3,"cc.wa.us":3,"cc.wi.us":3,"cc.wv.us":3,"cc.wy.us":3,"lib.ak.us":3,"lib.al.us":3,"lib.ar.us":3,"lib.as.us":3,"lib.az.us":3,"lib.ca.us":3,"lib.co.us":3,"lib.ct.us":3,"lib.dc.us":3,"lib.fl.us":3,"lib.ga.us":3,"lib.gu.us":3,"lib.hi.us":3,"lib.ia.us":3,"lib.id.us":3,"lib.il.us":3,"lib.in.us":3,"lib.ks.us":3,"lib.ky.us":3,"lib.la.us":3,"lib.ma.us":3,"lib.md.us":3,"lib.me.us":3,"lib.mi.us":3,"lib.mn.us":3,"lib.mo.us":3,"lib.ms.us":3,"lib.mt.us":3,"lib.nc.us":3,"lib.nd.us":3,"lib.ne.us":3,"lib.nh.us":3,"lib.nj.us":3,"lib.nm.us":3,"lib.nv.us":3,"lib.ny.us":3,"lib.oh.us":3,"lib.ok.us":3,"lib.or.us":3,"lib.pa.us":3,"lib.pr.us":3,"lib.ri.us":3,"lib.sc.us":3,"lib.sd.us":3,"lib.tn.us":3,"lib.tx.us":3,"lib.ut.us":3,"lib.vi.us":3,"lib.vt.us":3,"lib.va.us":3,"lib.wa.us":3,"lib.wi.us":3,"lib.wy.us":3,"pvt.k12.ma.us":4,"chtr.k12.ma.us":4,"paroch.k12.ma.us":4,"ann-arbor.mi.us":3,"cog.mi.us":3,"dst.mi.us":3,"eaton.mi.us":3,"gen.mi.us":3,"mus.mi.us":3,"tec.mi.us":3,"washtenaw.mi.us":3,"uy":1,"com.uy":2,"edu.uy":2,"gub.uy":2,"mil.uy":2,"net.uy":2,"org.uy":2,"uz":1,"co.uz":2,"com.uz":2,"net.uz":2,"org.uz":2,"va":1,"vc":1,"com.vc":2,"net.vc":2,"org.vc":2,"gov.vc":2,"mil.vc":2,"edu.vc":2,"ve":1,"arts.ve":2,"bib.ve":2,"co.ve":2,"com.ve":2,"e12.ve":2,"edu.ve":2,"firm.ve":2,"gob.ve":2,"gov.ve":2,"info.ve":2,"int.ve":2,"mil.ve":2,"net.ve":2,"nom.ve":2,"org.ve":2,"rar.ve":2,"rec.ve":2,"store.ve":2,"tec.ve":2,"web.ve":2,"vg":1,"vi":1,"co.vi":2,"com.vi":2,"k12.vi":2,"net.vi":2,"org.vi":2,"vn":1,"com.vn":2,"net.vn":2,"org.vn":2,"edu.vn":2,"gov.vn":2,"int.vn":2,"ac.vn":2,"biz.vn":2,"info.vn":2,"name.vn":2,"pro.vn":2,"health.vn":2,"vu":1,"com.vu":2,"edu.vu":2,"net.vu":2,"org.vu":2,"wf":1,"ws":1,"com.ws":2,"net.ws":2,"org.ws":2,"gov.ws":2,"edu.ws":2,"yt":1,"xn--mgbaam7a8h":1,"xn--y9a3aq":1,"xn--54b7fta0cc":1,"xn--90ae":1,"xn--mgbcpq6gpa1a":1,"xn--90ais":1,"xn--fiqs8s":1,"xn--fiqz9s":1,"xn--lgbbat1ad8j":1,"xn--wgbh1c":1,"xn--e1a4c":1,"xn--qxa6a":1,"xn--mgbah1a3hjkrd":1,"xn--node":1,"xn--qxam":1,"xn--j6w193g":1,"xn--55qx5d.xn--j6w193g":2,"xn--wcvs22d.xn--j6w193g":2,"xn--mxtq1m.xn--j6w193g":2,"xn--gmqw5a.xn--j6w193g":2,"xn--od0alg.xn--j6w193g":2,"xn--uc0atv.xn--j6w193g":2,"xn--2scrj9c":1,"xn--3hcrj9c":1,"xn--45br5cyl":1,"xn--h2breg3eve":1,"xn--h2brj9c8c":1,"xn--mgbgu82a":1,"xn--rvc1e0am3e":1,"xn--h2brj9c":1,"xn--mgbbh1a":1,"xn--mgbbh1a71e":1,"xn--fpcrj9c3d":1,"xn--gecrj9c":1,"xn--s9brj9c":1,"xn--45brj9c":1,"xn--xkc2dl3a5ee0h":1,"xn--mgba3a4f16a":1,"xn--mgba3a4fra":1,"xn--mgbtx2b":1,"xn--mgbayh7gpa":1,"xn--3e0b707e":1,"xn--80ao21a":1,"xn--q7ce6a":1,"xn--fzc2c9e2c":1,"xn--xkc2al3hye2a":1,"xn--mgbc0a9azcg":1,"xn--d1alf":1,"xn--l1acc":1,"xn--mix891f":1,"xn--mix082f":1,"xn--mgbx4cd0ab":1,"xn--mgb9awbf":1,"xn--mgbai9azgqp6j":1,"xn--mgbai9a5eva00b":1,"xn--ygbi2ammx":1,"xn--90a3ac":1,"xn--o1ac.xn--90a3ac":2,"xn--c1avg.xn--90a3ac":2,"xn--90azh.xn--90a3ac":2,"xn--d1at.xn--90a3ac":2,"xn--o1ach.xn--90a3ac":2,"xn--80au.xn--90a3ac":2,"xn--p1ai":1,"xn--wgbl6a":1,"xn--mgberp4a5d4ar":1,"xn--mgberp4a5d4a87g":1,"xn--mgbqly7c0a67fbc":1,"xn--mgbqly7cvafr":1,"xn--mgbpl2fh":1,"xn--yfro4i67o":1,"xn--clchc0ea0b2g2a9gcd":1,"xn--ogbpf8fl":1,"xn--mgbtf8fl":1,"xn--o3cw4h":1,"xn--12c1fe0br.xn--o3cw4h":2,"xn--12co0c3b4eva.xn--o3cw4h":2,"xn--h3cuzk1di.xn--o3cw4h":2,"xn--o3cyx2a.xn--o3cw4h":2,"xn--m3ch0j3a.xn--o3cw4h":2,"xn--12cfi8ixb8l.xn--o3cw4h":2,"xn--pgbs0dh":1,"xn--kpry57d":1,"xn--kprw13d":1,"xn--nnx388a":1,"xn--j1amh":1,"xn--mgb2ddes":1,"xxx":1,"ye":1,"com.ye":2,"edu.ye":2,"gov.ye":2,"net.ye":2,"mil.ye":2,"org.ye":2,"ac.za":2,"agric.za":2,"alt.za":2,"co.za":2,"edu.za":2,"gov.za":2,"grondar.za":2,"law.za":2,"mil.za":2,"net.za":2,"ngo.za":2,"nic.za":2,"nis.za":2,"nom.za":2,"org.za":2,"school.za":2,"tm.za":2,"web.za":2,"zm":1,"ac.zm":2,"biz.zm":2,"co.zm":2,"com.zm":2,"edu.zm":2,"gov.zm":2,"info.zm":2,"mil.zm":2,"net.zm":2,"org.zm":2,"sch.zm":2,"zw":1,"ac.zw":2,"co.zw":2,"gov.zw":2,"mil.zw":2,"org.zw":2,"aaa":1,"aarp":1,"abarth":1,"abb":1,"abbott":1,"abbvie":1,"abc":1,"able":1,"abogado":1,"abudhabi":1,"academy":1,"accenture":1,"accountant":1,"accountants":1,"aco":1,"actor":1,"adac":1,"ads":1,"adult":1,"aeg":1,"aetna":1,"afl":1,"africa":1,"agakhan":1,"agency":1,"aig":1,"airbus":1,"airforce":1,"airtel":1,"akdn":1,"alfaromeo":1,"alibaba":1,"alipay":1,"allfinanz":1,"allstate":1,"ally":1,"alsace":1,"alstom":1,"amazon":1,"americanexpress":1,"americanfamily":1,"amex":1,"amfam":1,"amica":1,"amsterdam":1,"analytics":1,"android":1,"anquan":1,"anz":1,"aol":1,"apartments":1,"app":1,"apple":1,"aquarelle":1,"arab":1,"aramco":1,"archi":1,"army":1,"art":1,"arte":1,"asda":1,"associates":1,"athleta":1,"attorney":1,"auction":1,"audi":1,"audible":1,"audio":1,"auspost":1,"author":1,"auto":1,"autos":1,"avianca":1,"aws":1,"axa":1,"azure":1,"baby":1,"baidu":1,"banamex":1,"bananarepublic":1,"band":1,"bank":1,"bar":1,"barcelona":1,"barclaycard":1,"barclays":1,"barefoot":1,"bargains":1,"baseball":1,"basketball":1,"bauhaus":1,"bayern":1,"bbc":1,"bbt":1,"bbva":1,"bcg":1,"bcn":1,"beats":1,"beauty":1,"beer":1,"bentley":1,"berlin":1,"best":1,"bestbuy":1,"bet":1,"bharti":1,"bible":1,"bid":1,"bike":1,"bing":1,"bingo":1,"bio":1,"black":1,"blackfriday":1,"blockbuster":1,"blog":1,"bloomberg":1,"blue":1,"bms":1,"bmw":1,"bnpparibas":1,"boats":1,"boehringer":1,"bofa":1,"bom":1,"bond":1,"boo":1,"book":1,"booking":1,"bosch":1,"bostik":1,"boston":1,"bot":1,"boutique":1,"box":1,"bradesco":1,"bridgestone":1,"broadway":1,"broker":1,"brother":1,"brussels":1,"bugatti":1,"build":1,"builders":1,"business":1,"buy":1,"buzz":1,"bzh":1,"cab":1,"cafe":1,"cal":1,"call":1,"calvinklein":1,"cam":1,"camera":1,"camp":1,"cancerresearch":1,"canon":1,"capetown":1,"capital":1,"capitalone":1,"car":1,"caravan":1,"cards":1,"care":1,"career":1,"careers":1,"cars":1,"casa":1,"case":1,"cash":1,"casino":1,"catering":1,"catholic":1,"cba":1,"cbn":1,"cbre":1,"cbs":1,"center":1,"ceo":1,"cern":1,"cfa":1,"cfd":1,"chanel":1,"channel":1,"charity":1,"chase":1,"chat":1,"cheap":1,"chintai":1,"christmas":1,"chrome":1,"church":1,"cipriani":1,"circle":1,"cisco":1,"citadel":1,"citi":1,"citic":1,"city":1,"cityeats":1,"claims":1,"cleaning":1,"click":1,"clinic":1,"clinique":1,"clothing":1,"cloud":1,"club":1,"clubmed":1,"coach":1,"codes":1,"coffee":1,"college":1,"cologne":1,"comcast":1,"commbank":1,"community":1,"company":1,"compare":1,"computer":1,"comsec":1,"condos":1,"construction":1,"consulting":1,"contact":1,"contractors":1,"cooking":1,"cookingchannel":1,"cool":1,"corsica":1,"country":1,"coupon":1,"coupons":1,"courses":1,"cpa":1,"credit":1,"creditcard":1,"creditunion":1,"cricket":1,"crown":1,"crs":1,"cruise":1,"cruises":1,"cuisinella":1,"cymru":1,"cyou":1,"dabur":1,"dad":1,"dance":1,"data":1,"date":1,"dating":1,"datsun":1,"day":1,"dclk":1,"dds":1,"deal":1,"dealer":1,"deals":1,"degree":1,"delivery":1,"dell":1,"deloitte":1,"delta":1,"democrat":1,"dental":1,"dentist":1,"desi":1,"design":1,"dev":1,"dhl":1,"diamonds":1,"diet":1,"digital":1,"direct":1,"directory":1,"discount":1,"discover":1,"dish":1,"diy":1,"dnp":1,"docs":1,"doctor":1,"dog":1,"domains":1,"dot":1,"download":1,"drive":1,"dtv":1,"dubai":1,"dunlop":1,"dupont":1,"durban":1,"dvag":1,"dvr":1,"earth":1,"eat":1,"eco":1,"edeka":1,"education":1,"email":1,"emerck":1,"energy":1,"engineer":1,"engineering":1,"enterprises":1,"epson":1,"equipment":1,"ericsson":1,"erni":1,"esq":1,"estate":1,"etisalat":1,"eurovision":1,"eus":1,"events":1,"exchange":1,"expert":1,"exposed":1,"express":1,"extraspace":1,"fage":1,"fail":1,"fairwinds":1,"faith":1,"family":1,"fan":1,"fans":1,"farm":1,"farmers":1,"fashion":1,"fast":1,"fedex":1,"feedback":1,"ferrari":1,"ferrero":1,"fiat":1,"fidelity":1,"fido":1,"film":1,"final":1,"finance":1,"financial":1,"fire":1,"firestone":1,"firmdale":1,"fish":1,"fishing":1,"fit":1,"fitness":1,"flickr":1,"flights":1,"flir":1,"florist":1,"flowers":1,"fly":1,"foo":1,"food":1,"foodnetwork":1,"football":1,"ford":1,"forex":1,"forsale":1,"forum":1,"foundation":1,"fox":1,"free":1,"fresenius":1,"frl":1,"frogans":1,"frontdoor":1,"frontier":1,"ftr":1,"fujitsu":1,"fun":1,"fund":1,"furniture":1,"futbol":1,"fyi":1,"gal":1,"gallery":1,"gallo":1,"gallup":1,"game":1,"games":1,"gap":1,"garden":1,"gay":1,"gbiz":1,"gdn":1,"gea":1,"gent":1,"genting":1,"george":1,"ggee":1,"gift":1,"gifts":1,"gives":1,"giving":1,"glass":1,"gle":1,"global":1,"globo":1,"gmail":1,"gmbh":1,"gmo":1,"gmx":1,"godaddy":1,"gold":1,"goldpoint":1,"golf":1,"goo":1,"goodyear":1,"goog":1,"google":1,"gop":1,"got":1,"grainger":1,"graphics":1,"gratis":1,"green":1,"gripe":1,"grocery":1,"group":1,"guardian":1,"gucci":1,"guge":1,"guide":1,"guitars":1,"guru":1,"hair":1,"hamburg":1,"hangout":1,"haus":1,"hbo":1,"hdfc":1,"hdfcbank":1,"health":1,"healthcare":1,"help":1,"helsinki":1,"here":1,"hermes":1,"hgtv":1,"hiphop":1,"hisamitsu":1,"hitachi":1,"hiv":1,"hkt":1,"hockey":1,"holdings":1,"holiday":1,"homedepot":1,"homegoods":1,"homes":1,"homesense":1,"honda":1,"horse":1,"hospital":1,"host":1,"hosting":1,"hot":1,"hoteles":1,"hotels":1,"hotmail":1,"house":1,"how":1,"hsbc":1,"hughes":1,"hyatt":1,"hyundai":1,"ibm":1,"icbc":1,"ice":1,"icu":1,"ieee":1,"ifm":1,"ikano":1,"imamat":1,"imdb":1,"immo":1,"immobilien":1,"inc":1,"industries":1,"infiniti":1,"ing":1,"ink":1,"institute":1,"insurance":1,"insure":1,"international":1,"intuit":1,"investments":1,"ipiranga":1,"irish":1,"ismaili":1,"ist":1,"istanbul":1,"itau":1,"itv":1,"jaguar":1,"java":1,"jcb":1,"jeep":1,"jetzt":1,"jewelry":1,"jio":1,"jll":1,"jmp":1,"jnj":1,"joburg":1,"jot":1,"joy":1,"jpmorgan":1,"jprs":1,"juegos":1,"juniper":1,"kaufen":1,"kddi":1,"kerryhotels":1,"kerrylogistics":1,"kerryproperties":1,"kfh":1,"kia":1,"kids":1,"kim":1,"kinder":1,"kindle":1,"kitchen":1,"kiwi":1,"koeln":1,"komatsu":1,"kosher":1,"kpmg":1,"kpn":1,"krd":1,"kred":1,"kuokgroup":1,"kyoto":1,"lacaixa":1,"lamborghini":1,"lamer":1,"lancaster":1,"lancia":1,"land":1,"landrover":1,"lanxess":1,"lasalle":1,"lat":1,"latino":1,"latrobe":1,"law":1,"lawyer":1,"lds":1,"lease":1,"leclerc":1,"lefrak":1,"legal":1,"lego":1,"lexus":1,"lgbt":1,"lidl":1,"life":1,"lifeinsurance":1,"lifestyle":1,"lighting":1,"like":1,"lilly":1,"limited":1,"limo":1,"lincoln":1,"linde":1,"link":1,"lipsy":1,"live":1,"living":1,"llc":1,"llp":1,"loan":1,"loans":1,"locker":1,"locus":1,"loft":1,"lol":1,"london":1,"lotte":1,"lotto":1,"love":1,"lpl":1,"lplfinancial":1,"ltd":1,"ltda":1,"lundbeck":1,"luxe":1,"luxury":1,"macys":1,"madrid":1,"maif":1,"maison":1,"makeup":1,"man":1,"management":1,"mango":1,"map":1,"market":1,"marketing":1,"markets":1,"marriott":1,"marshalls":1,"maserati":1,"mattel":1,"mba":1,"mckinsey":1,"med":1,"media":1,"meet":1,"melbourne":1,"meme":1,"memorial":1,"men":1,"menu":1,"merckmsd":1,"miami":1,"microsoft":1,"mini":1,"mint":1,"mit":1,"mitsubishi":1,"mlb":1,"mls":1,"mma":1,"mobile":1,"moda":1,"moe":1,"moi":1,"mom":1,"monash":1,"money":1,"monster":1,"mormon":1,"mortgage":1,"moscow":1,"moto":1,"motorcycles":1,"mov":1,"movie":1,"msd":1,"mtn":1,"mtr":1,"music":1,"mutual":1,"nab":1,"nagoya":1,"natura":1,"navy":1,"nba":1,"nec":1,"netbank":1,"netflix":1,"network":1,"neustar":1,"new":1,"news":1,"next":1,"nextdirect":1,"nexus":1,"nfl":1,"ngo":1,"nhk":1,"nico":1,"nike":1,"nikon":1,"ninja":1,"nissan":1,"nissay":1,"nokia":1,"northwesternmutual":1,"norton":1,"now":1,"nowruz":1,"nowtv":1,"nra":1,"nrw":1,"ntt":1,"nyc":1,"obi":1,"observer":1,"office":1,"okinawa":1,"olayan":1,"olayangroup":1,"oldnavy":1,"ollo":1,"omega":1,"one":1,"ong":1,"onl":1,"online":1,"ooo":1,"open":1,"oracle":1,"orange":1,"organic":1,"origins":1,"osaka":1,"otsuka":1,"ott":1,"ovh":1,"page":1,"panasonic":1,"paris":1,"pars":1,"partners":1,"parts":1,"party":1,"passagens":1,"pay":1,"pccw":1,"pet":1,"pfizer":1,"pharmacy":1,"phd":1,"philips":1,"phone":1,"photo":1,"photography":1,"photos":1,"physio":1,"pics":1,"pictet":1,"pictures":1,"pid":1,"pin":1,"ping":1,"pink":1,"pioneer":1,"pizza":1,"place":1,"play":1,"playstation":1,"plumbing":1,"plus":1,"pnc":1,"pohl":1,"poker":1,"politie":1,"porn":1,"pramerica":1,"praxi":1,"press":1,"prime":1,"prod":1,"productions":1,"prof":1,"progressive":1,"promo":1,"properties":1,"property":1,"protection":1,"pru":1,"prudential":1,"pub":1,"pwc":1,"qpon":1,"quebec":1,"quest":1,"racing":1,"radio":1,"read":1,"realestate":1,"realtor":1,"realty":1,"recipes":1,"red":1,"redstone":1,"redumbrella":1,"rehab":1,"reise":1,"reisen":1,"reit":1,"reliance":1,"ren":1,"rent":1,"rentals":1,"repair":1,"report":1,"republican":1,"rest":1,"restaurant":1,"review":1,"reviews":1,"rexroth":1,"rich":1,"richardli":1,"ricoh":1,"ril":1,"rio":1,"rip":1,"rocher":1,"rocks":1,"rodeo":1,"rogers":1,"room":1,"rsvp":1,"rugby":1,"ruhr":1,"run":1,"rwe":1,"ryukyu":1,"saarland":1,"safe":1,"safety":1,"sakura":1,"sale":1,"salon":1,"samsclub":1,"samsung":1,"sandvik":1,"sandvikcoromant":1,"sanofi":1,"sap":1,"sarl":1,"sas":1,"save":1,"saxo":1,"sbi":1,"sbs":1,"sca":1,"scb":1,"schaeffler":1,"schmidt":1,"scholarships":1,"school":1,"schule":1,"schwarz":1,"science":1,"scot":1,"search":1,"seat":1,"secure":1,"security":1,"seek":1,"select":1,"sener":1,"services":1,"ses":1,"seven":1,"sew":1,"sex":1,"sexy":1,"sfr":1,"shangrila":1,"sharp":1,"shaw":1,"shell":1,"shia":1,"shiksha":1,"shoes":1,"shop":1,"shopping":1,"shouji":1,"show":1,"showtime":1,"silk":1,"sina":1,"singles":1,"site":1,"ski":1,"skin":1,"sky":1,"skype":1,"sling":1,"smart":1,"smile":1,"sncf":1,"soccer":1,"social":1,"softbank":1,"software":1,"sohu":1,"solar":1,"solutions":1,"song":1,"sony":1,"soy":1,"spa":1,"space":1,"sport":1,"spot":1,"srl":1,"stada":1,"staples":1,"star":1,"statebank":1,"statefarm":1,"stc":1,"stcgroup":1,"stockholm":1,"storage":1,"store":1,"stream":1,"studio":1,"study":1,"style":1,"sucks":1,"supplies":1,"supply":1,"support":1,"surf":1,"surgery":1,"suzuki":1,"swatch":1,"swiss":1,"sydney":1,"systems":1,"tab":1,"taipei":1,"talk":1,"taobao":1,"target":1,"tatamotors":1,"tatar":1,"tattoo":1,"tax":1,"taxi":1,"tci":1,"tdk":1,"team":1,"tech":1,"technology":1,"temasek":1,"tennis":1,"teva":1,"thd":1,"theater":1,"theatre":1,"tiaa":1,"tickets":1,"tienda":1,"tiffany":1,"tips":1,"tires":1,"tirol":1,"tjmaxx":1,"tjx":1,"tkmaxx":1,"tmall":1,"today":1,"tokyo":1,"tools":1,"top":1,"toray":1,"toshiba":1,"total":1,"tours":1,"town":1,"toyota":1,"toys":1,"trade":1,"trading":1,"training":1,"travel":1,"travelchannel":1,"travelers":1,"travelersinsurance":1,"trust":1,"trv":1,"tube":1,"tui":1,"tunes":1,"tushu":1,"tvs":1,"ubank":1,"ubs":1,"unicom":1,"university":1,"uno":1,"uol":1,"ups":1,"vacations":1,"vana":1,"vanguard":1,"vegas":1,"ventures":1,"verisign":1,"versicherung":1,"vet":1,"viajes":1,"video":1,"vig":1,"viking":1,"villas":1,"vin":1,"vip":1,"virgin":1,"visa":1,"vision":1,"viva":1,"vivo":1,"vlaanderen":1,"vodka":1,"volkswagen":1,"volvo":1,"vote":1,"voting":1,"voto":1,"voyage":1,"vuelos":1,"wales":1,"walmart":1,"walter":1,"wang":1,"wanggou":1,"watch":1,"watches":1,"weather":1,"weatherchannel":1,"webcam":1,"weber":1,"website":1,"wedding":1,"weibo":1,"weir":1,"whoswho":1,"wien":1,"wiki":1,"williamhill":1,"win":1,"windows":1,"wine":1,"winners":1,"wme":1,"wolterskluwer":1,"woodside":1,"work":1,"works":1,"world":1,"wow":1,"wtc":1,"wtf":1,"xbox":1,"xerox":1,"xfinity":1,"xihuan":1,"xin":1,"xn--11b4c3d":1,"xn--1ck2e1b":1,"xn--1qqw23a":1,"xn--30rr7y":1,"xn--3bst00m":1,"xn--3ds443g":1,"xn--3pxu8k":1,"xn--42c2d9a":1,"xn--45q11c":1,"xn--4gbrim":1,"xn--55qw42g":1,"xn--55qx5d":1,"xn--5su34j936bgsg":1,"xn--5tzm5g":1,"xn--6frz82g":1,"xn--6qq986b3xl":1,"xn--80adxhks":1,"xn--80aqecdr1a":1,"xn--80asehdb":1,"xn--80aswg":1,"xn--8y0a063a":1,"xn--9dbq2a":1,"xn--9et52u":1,"xn--9krt00a":1,"xn--b4w605ferd":1,"xn--bck1b9a5dre4c":1,"xn--c1avg":1,"xn--c2br7g":1,"xn--cck2b3b":1,"xn--cckwcxetd":1,"xn--cg4bki":1,"xn--czr694b":1,"xn--czrs0t":1,"xn--czru2d":1,"xn--d1acj3b":1,"xn--eckvdtc9d":1,"xn--efvy88h":1,"xn--fct429k":1,"xn--fhbei":1,"xn--fiq228c5hs":1,"xn--fiq64b":1,"xn--fjq720a":1,"xn--flw351e":1,"xn--fzys8d69uvgm":1,"xn--g2xx48c":1,"xn--gckr3f0f":1,"xn--gk3at1e":1,"xn--hxt814e":1,"xn--i1b6b1a6a2e":1,"xn--imr513n":1,"xn--io0a7i":1,"xn--j1aef":1,"xn--jlq480n2rg":1,"xn--jlq61u9w7b":1,"xn--jvr189m":1,"xn--kcrx77d1x4a":1,"xn--kput3i":1,"xn--mgba3a3ejt":1,"xn--mgba7c0bbn0a":1,"xn--mgbaakc7dvf":1,"xn--mgbab2bd":1,"xn--mgbca7dzdo":1,"xn--mgbi4ecexp":1,"xn--mgbt3dhd":1,"xn--mk1bu44c":1,"xn--mxtq1m":1,"xn--ngbc5azd":1,"xn--ngbe9e0a":1,"xn--ngbrx":1,"xn--nqv7f":1,"xn--nqv7fs00ema":1,"xn--nyqy26a":1,"xn--otu796d":1,"xn--p1acf":1,"xn--pssy2u":1,"xn--q9jyb4c":1,"xn--qcka1pmc":1,"xn--rhqv96g":1,"xn--rovu88b":1,"xn--ses554g":1,"xn--t60b56a":1,"xn--tckwe":1,"xn--tiq49xqyj":1,"xn--unup4y":1,"xn--vermgensberater-ctb":1,"xn--vermgensberatung-pwb":1,"xn--vhquv":1,"xn--vuq861b":1,"xn--w4r85el8fhu5dnra":1,"xn--w4rs40l":1,"xn--xhq521b":1,"xn--zfr164b":1,"xyz":1,"yachts":1,"yahoo":1,"yamaxun":1,"yandex":1,"yodobashi":1,"yoga":1,"yokohama":1,"you":1,"youtube":1,"yun":1,"zappos":1,"zara":1,"zero":1,"zip":1,"zone":1,"zuerich":1},"private":{"cc.ua":2,"inf.ua":2,"ltd.ua":2,"611.to":2,"graphox.us":2,"devcdnaccesso.com":3,"adobeaemcloud.com":2,"dev.adobeaemcloud.com":4,"hlx.live":2,"adobeaemcloud.net":2,"hlx.page":2,"hlx3.page":2,"beep.pl":2,"airkitapps.com":2,"airkitapps-au.com":2,"airkitapps.eu":2,"aivencloud.com":2,"barsy.ca":2,"compute.estate":3,"alces.network":3,"kasserver.com":2,"altervista.org":2,"alwaysdata.net":2,"cloudfront.net":2,"compute.amazonaws.com":4,"compute-1.amazonaws.com":4,"compute.amazonaws.com.cn":5,"us-east-1.amazonaws.com":3,"cn-north-1.eb.amazonaws.com.cn":5,"cn-northwest-1.eb.amazonaws.com.cn":5,"elasticbeanstalk.com":2,"ap-northeast-1.elasticbeanstalk.com":3,"ap-northeast-2.elasticbeanstalk.com":3,"ap-northeast-3.elasticbeanstalk.com":3,"ap-south-1.elasticbeanstalk.com":3,"ap-southeast-1.elasticbeanstalk.com":3,"ap-southeast-2.elasticbeanstalk.com":3,"ca-central-1.elasticbeanstalk.com":3,"eu-central-1.elasticbeanstalk.com":3,"eu-west-1.elasticbeanstalk.com":3,"eu-west-2.elasticbeanstalk.com":3,"eu-west-3.elasticbeanstalk.com":3,"sa-east-1.elasticbeanstalk.com":3,"us-east-1.elasticbeanstalk.com":3,"us-east-2.elasticbeanstalk.com":3,"us-gov-west-1.elasticbeanstalk.com":3,"us-west-1.elasticbeanstalk.com":3,"us-west-2.elasticbeanstalk.com":3,"elb.amazonaws.com":4,"elb.amazonaws.com.cn":5,"awsglobalaccelerator.com":2,"s3.amazonaws.com":3,"s3-ap-northeast-1.amazonaws.com":3,"s3-ap-northeast-2.amazonaws.com":3,"s3-ap-south-1.amazonaws.com":3,"s3-ap-southeast-1.amazonaws.com":3,"s3-ap-southeast-2.amazonaws.com":3,"s3-ca-central-1.amazonaws.com":3,"s3-eu-central-1.amazonaws.com":3,"s3-eu-west-1.amazonaws.com":3,"s3-eu-west-2.amazonaws.com":3,"s3-eu-west-3.amazonaws.com":3,"s3-external-1.amazonaws.com":3,"s3-fips-us-gov-west-1.amazonaws.com":3,"s3-sa-east-1.amazonaws.com":3,"s3-us-gov-west-1.amazonaws.com":3,"s3-us-east-2.amazonaws.com":3,"s3-us-west-1.amazonaws.com":3,"s3-us-west-2.amazonaws.com":3,"s3.ap-northeast-2.amazonaws.com":4,"s3.ap-south-1.amazonaws.com":4,"s3.cn-north-1.amazonaws.com.cn":5,"s3.ca-central-1.amazonaws.com":4,"s3.eu-central-1.amazonaws.com":4,"s3.eu-west-2.amazonaws.com":4,"s3.eu-west-3.amazonaws.com":4,"s3.us-east-2.amazonaws.com":4,"s3.dualstack.ap-northeast-1.amazonaws.com":5,"s3.dualstack.ap-northeast-2.amazonaws.com":5,"s3.dualstack.ap-south-1.amazonaws.com":5,"s3.dualstack.ap-southeast-1.amazonaws.com":5,"s3.dualstack.ap-southeast-2.amazonaws.com":5,"s3.dualstack.ca-central-1.amazonaws.com":5,"s3.dualstack.eu-central-1.amazonaws.com":5,"s3.dualstack.eu-west-1.amazonaws.com":5,"s3.dualstack.eu-west-2.amazonaws.com":5,"s3.dualstack.eu-west-3.amazonaws.com":5,"s3.dualstack.sa-east-1.amazonaws.com":5,"s3.dualstack.us-east-1.amazonaws.com":5,"s3.dualstack.us-east-2.amazonaws.com":5,"s3-website-us-east-1.amazonaws.com":3,"s3-website-us-west-1.amazonaws.com":3,"s3-website-us-west-2.amazonaws.com":3,"s3-website-ap-northeast-1.amazonaws.com":3,"s3-website-ap-southeast-1.amazonaws.com":3,"s3-website-ap-southeast-2.amazonaws.com":3,"s3-website-eu-west-1.amazonaws.com":3,"s3-website-sa-east-1.amazonaws.com":3,"s3-website.ap-northeast-2.amazonaws.com":4,"s3-website.ap-south-1.amazonaws.com":4,"s3-website.ca-central-1.amazonaws.com":4,"s3-website.eu-central-1.amazonaws.com":4,"s3-website.eu-west-2.amazonaws.com":4,"s3-website.eu-west-3.amazonaws.com":4,"s3-website.us-east-2.amazonaws.com":4,"t3l3p0rt.net":2,"tele.amune.org":3,"apigee.io":2,"siiites.com":2,"appspacehosted.com":2,"appspaceusercontent.com":2,"appudo.net":2,"on-aptible.com":2,"user.aseinet.ne.jp":4,"gv.vc":2,"d.gv.vc":3,"user.party.eus":3,"pimienta.org":2,"poivron.org":2,"potager.org":2,"sweetpepper.org":2,"myasustor.com":2,"cdn.prod.atlassian-dev.net":4,"translated.page":2,"myfritz.net":2,"onavstack.net":2,"awdev.ca":3,"advisor.ws":3,"ecommerce-shop.pl":2,"b-data.io":2,"backplaneapp.io":2,"balena-devices.com":2,"rs.ba":2,"banzai.cloud":3,"app.banzaicloud.io":3,"backyards.banzaicloud.io":4,"base.ec":2,"official.ec":2,"buyshop.jp":2,"fashionstore.jp":2,"handcrafted.jp":2,"kawaiishop.jp":2,"supersale.jp":2,"theshop.jp":2,"shopselect.net":2,"base.shop":2,"beget.app":3,"betainabox.com":2,"bnr.la":2,"bitbucket.io":2,"blackbaudcdn.net":2,"of.je":2,"bluebite.io":2,"boomla.net":2,"boutir.com":2,"boxfuse.io":2,"square7.ch":2,"bplaced.com":2,"bplaced.de":2,"square7.de":2,"bplaced.net":2,"square7.net":2,"shop.brendly.rs":3,"browsersafetymark.io":2,"uk0.bigv.io":3,"dh.bytemark.co.uk":4,"vm.bytemark.co.uk":4,"cafjs.com":2,"mycd.eu":2,"drr.ac":2,"uwu.ai":2,"carrd.co":2,"crd.co":2,"ju.mp":2,"ae.org":2,"br.com":2,"cn.com":2,"com.de":2,"com.se":2,"de.com":2,"eu.com":2,"gb.net":2,"hu.net":2,"jp.net":2,"jpn.com":2,"mex.com":2,"ru.com":2,"sa.com":2,"se.net":2,"uk.com":2,"uk.net":2,"us.com":2,"za.bz":2,"za.com":2,"ar.com":2,"hu.com":2,"kr.com":2,"no.com":2,"qc.com":2,"uy.com":2,"africa.com":2,"gr.com":2,"in.net":2,"web.in":2,"us.org":2,"co.com":2,"aus.basketball":2,"nz.basketball":2,"radio.am":2,"radio.fm":2,"c.la":2,"certmgr.org":2,"cx.ua":2,"discourse.group":2,"discourse.team":2,"cleverapps.io":2,"clerk.app":2,"clerkstage.app":2,"lcl.dev":3,"lclstage.dev":3,"stg.dev":3,"stgstage.dev":3,"clickrising.net":2,"c66.me":2,"cloud66.ws":2,"cloud66.zone":2,"jdevcloud.com":2,"wpdevcloud.com":2,"cloudaccess.host":2,"freesite.host":2,"cloudaccess.net":2,"cloudcontrolled.com":2,"cloudcontrolapp.com":2,"cloudera.site":3,"pages.dev":2,"trycloudflare.com":2,"workers.dev":2,"wnext.app":2,"co.ca":2,"otap.co":3,"co.cz":2,"c.cdn77.org":3,"cdn77-ssl.net":2,"r.cdn77.net":3,"rsc.cdn77.org":3,"ssl.origin.cdn77-secure.org":4,"cloudns.asia":2,"cloudns.biz":2,"cloudns.club":2,"cloudns.cc":2,"cloudns.eu":2,"cloudns.in":2,"cloudns.info":2,"cloudns.org":2,"cloudns.pro":2,"cloudns.pw":2,"cloudns.us":2,"cnpy.gdn":2,"codeberg.page":2,"co.nl":2,"co.no":2,"webhosting.be":2,"hosting-cluster.nl":2,"ac.ru":2,"edu.ru":2,"gov.ru":2,"int.ru":2,"mil.ru":2,"test.ru":2,"dyn.cosidns.de":3,"dynamisches-dns.de":2,"dnsupdater.de":2,"internet-dns.de":2,"l-o-g-i-n.de":2,"dynamic-dns.info":2,"feste-ip.net":2,"knx-server.net":2,"static-access.net":2,"realm.cz":2,"cryptonomic.net":3,"cupcake.is":2,"curv.dev":2,"customer-oci.com":3,"oci.customer-oci.com":4,"ocp.customer-oci.com":4,"ocs.customer-oci.com":4,"cyon.link":2,"cyon.site":2,"fnwk.site":2,"folionetwork.site":2,"platform0.app":2,"daplie.me":2,"localhost.daplie.me":3,"dattolocal.com":2,"dattorelay.com":2,"dattoweb.com":2,"mydatto.com":2,"dattolocal.net":2,"mydatto.net":2,"biz.dk":2,"co.dk":2,"firm.dk":2,"reg.dk":2,"store.dk":2,"dyndns.dappnode.io":3,"dapps.earth":3,"bzz.dapps.earth":4,"builtwithdark.com":2,"demo.datadetect.com":3,"instance.datadetect.com":3,"edgestack.me":2,"ddns5.com":2,"debian.net":2,"deno.dev":2,"deno-staging.dev":2,"dedyn.io":2,"deta.app":2,"deta.dev":2,"rss.my.id":4,"diher.solutions":3,"discordsays.com":2,"discordsez.com":2,"jozi.biz":2,"dnshome.de":2,"online.th":2,"shop.th":2,"drayddns.com":2,"shoparena.pl":2,"dreamhosters.com":2,"mydrobo.com":2,"drud.io":2,"drud.us":2,"duckdns.org":2,"bip.sh":2,"bitbridge.net":2,"dy.fi":2,"tunk.org":2,"dyndns-at-home.com":2,"dyndns-at-work.com":2,"dyndns-blog.com":2,"dyndns-free.com":2,"dyndns-home.com":2,"dyndns-ip.com":2,"dyndns-mail.com":2,"dyndns-office.com":2,"dyndns-pics.com":2,"dyndns-remote.com":2,"dyndns-server.com":2,"dyndns-web.com":2,"dyndns-wiki.com":2,"dyndns-work.com":2,"dyndns.biz":2,"dyndns.info":2,"dyndns.org":2,"dyndns.tv":2,"at-band-camp.net":2,"ath.cx":2,"barrel-of-knowledge.info":2,"barrell-of-knowledge.info":2,"better-than.tv":2,"blogdns.com":2,"blogdns.net":2,"blogdns.org":2,"blogsite.org":2,"boldlygoingnowhere.org":2,"broke-it.net":2,"buyshouses.net":2,"cechire.com":2,"dnsalias.com":2,"dnsalias.net":2,"dnsalias.org":2,"dnsdojo.com":2,"dnsdojo.net":2,"dnsdojo.org":2,"does-it.net":2,"doesntexist.com":2,"doesntexist.org":2,"dontexist.com":2,"dontexist.net":2,"dontexist.org":2,"doomdns.com":2,"doomdns.org":2,"dvrdns.org":2,"dyn-o-saur.com":2,"dynalias.com":2,"dynalias.net":2,"dynalias.org":2,"dynathome.net":2,"dyndns.ws":2,"endofinternet.net":2,"endofinternet.org":2,"endoftheinternet.org":2,"est-a-la-maison.com":2,"est-a-la-masion.com":2,"est-le-patron.com":2,"est-mon-blogueur.com":2,"for-better.biz":2,"for-more.biz":2,"for-our.info":2,"for-some.biz":2,"for-the.biz":2,"forgot.her.name":3,"forgot.his.name":3,"from-ak.com":2,"from-al.com":2,"from-ar.com":2,"from-az.net":2,"from-ca.com":2,"from-co.net":2,"from-ct.com":2,"from-dc.com":2,"from-de.com":2,"from-fl.com":2,"from-ga.com":2,"from-hi.com":2,"from-ia.com":2,"from-id.com":2,"from-il.com":2,"from-in.com":2,"from-ks.com":2,"from-ky.com":2,"from-la.net":2,"from-ma.com":2,"from-md.com":2,"from-me.org":2,"from-mi.com":2,"from-mn.com":2,"from-mo.com":2,"from-ms.com":2,"from-mt.com":2,"from-nc.com":2,"from-nd.com":2,"from-ne.com":2,"from-nh.com":2,"from-nj.com":2,"from-nm.com":2,"from-nv.com":2,"from-ny.net":2,"from-oh.com":2,"from-ok.com":2,"from-or.com":2,"from-pa.com":2,"from-pr.com":2,"from-ri.com":2,"from-sc.com":2,"from-sd.com":2,"from-tn.com":2,"from-tx.com":2,"from-ut.com":2,"from-va.com":2,"from-vt.com":2,"from-wa.com":2,"from-wi.com":2,"from-wv.com":2,"from-wy.com":2,"ftpaccess.cc":2,"fuettertdasnetz.de":2,"game-host.org":2,"game-server.cc":2,"getmyip.com":2,"gets-it.net":2,"go.dyndns.org":3,"gotdns.com":2,"gotdns.org":2,"groks-the.info":2,"groks-this.info":2,"ham-radio-op.net":2,"here-for-more.info":2,"hobby-site.com":2,"hobby-site.org":2,"home.dyndns.org":3,"homedns.org":2,"homeftp.net":2,"homeftp.org":2,"homeip.net":2,"homelinux.com":2,"homelinux.net":2,"homelinux.org":2,"homeunix.com":2,"homeunix.net":2,"homeunix.org":2,"iamallama.com":2,"in-the-band.net":2,"is-a-anarchist.com":2,"is-a-blogger.com":2,"is-a-bookkeeper.com":2,"is-a-bruinsfan.org":2,"is-a-bulls-fan.com":2,"is-a-candidate.org":2,"is-a-caterer.com":2,"is-a-celticsfan.org":2,"is-a-chef.com":2,"is-a-chef.net":2,"is-a-chef.org":2,"is-a-conservative.com":2,"is-a-cpa.com":2,"is-a-cubicle-slave.com":2,"is-a-democrat.com":2,"is-a-designer.com":2,"is-a-doctor.com":2,"is-a-financialadvisor.com":2,"is-a-geek.com":2,"is-a-geek.net":2,"is-a-geek.org":2,"is-a-green.com":2,"is-a-guru.com":2,"is-a-hard-worker.com":2,"is-a-hunter.com":2,"is-a-knight.org":2,"is-a-landscaper.com":2,"is-a-lawyer.com":2,"is-a-liberal.com":2,"is-a-libertarian.com":2,"is-a-linux-user.org":2,"is-a-llama.com":2,"is-a-musician.com":2,"is-a-nascarfan.com":2,"is-a-nurse.com":2,"is-a-painter.com":2,"is-a-patsfan.org":2,"is-a-personaltrainer.com":2,"is-a-photographer.com":2,"is-a-player.com":2,"is-a-republican.com":2,"is-a-rockstar.com":2,"is-a-socialist.com":2,"is-a-soxfan.org":2,"is-a-student.com":2,"is-a-teacher.com":2,"is-a-techie.com":2,"is-a-therapist.com":2,"is-an-accountant.com":2,"is-an-actor.com":2,"is-an-actress.com":2,"is-an-anarchist.com":2,"is-an-artist.com":2,"is-an-engineer.com":2,"is-an-entertainer.com":2,"is-by.us":2,"is-certified.com":2,"is-found.org":2,"is-gone.com":2,"is-into-anime.com":2,"is-into-cars.com":2,"is-into-cartoons.com":2,"is-into-games.com":2,"is-leet.com":2,"is-lost.org":2,"is-not-certified.com":2,"is-saved.org":2,"is-slick.com":2,"is-uberleet.com":2,"is-very-bad.org":2,"is-very-evil.org":2,"is-very-good.org":2,"is-very-nice.org":2,"is-very-sweet.org":2,"is-with-theband.com":2,"isa-geek.com":2,"isa-geek.net":2,"isa-geek.org":2,"isa-hockeynut.com":2,"issmarterthanyou.com":2,"isteingeek.de":2,"istmein.de":2,"kicks-ass.net":2,"kicks-ass.org":2,"knowsitall.info":2,"land-4-sale.us":2,"lebtimnetz.de":2,"leitungsen.de":2,"likes-pie.com":2,"likescandy.com":2,"merseine.nu":2,"mine.nu":2,"misconfused.org":2,"mypets.ws":2,"myphotos.cc":2,"neat-url.com":2,"office-on-the.net":2,"on-the-web.tv":2,"podzone.net":2,"podzone.org":2,"readmyblog.org":2,"saves-the-whales.com":2,"scrapper-site.net":2,"scrapping.cc":2,"selfip.biz":2,"selfip.com":2,"selfip.info":2,"selfip.net":2,"selfip.org":2,"sells-for-less.com":2,"sells-for-u.com":2,"sells-it.net":2,"sellsyourhome.org":2,"servebbs.com":2,"servebbs.net":2,"servebbs.org":2,"serveftp.net":2,"serveftp.org":2,"servegame.org":2,"shacknet.nu":2,"simple-url.com":2,"space-to-rent.com":2,"stuff-4-sale.org":2,"stuff-4-sale.us":2,"teaches-yoga.com":2,"thruhere.net":2,"traeumtgerade.de":2,"webhop.biz":2,"webhop.info":2,"webhop.net":2,"webhop.org":2,"worse-than.tv":2,"writesthisblog.com":2,"ddnss.de":2,"dyn.ddnss.de":3,"dyndns.ddnss.de":3,"dyndns1.de":2,"dyn-ip24.de":2,"home-webserver.de":2,"dyn.home-webserver.de":3,"myhome-server.de":2,"ddnss.org":2,"definima.net":2,"definima.io":2,"ondigitalocean.app":2,"digitaloceanspaces.com":3,"bci.dnstrace.pro":3,"ddnsfree.com":2,"ddnsgeek.com":2,"giize.com":2,"gleeze.com":2,"kozow.com":2,"loseyourip.com":2,"ooguy.com":2,"theworkpc.com":2,"casacam.net":2,"dynu.net":2,"accesscam.org":2,"camdvr.org":2,"freeddns.org":2,"mywire.org":2,"webredirect.org":2,"myddns.rocks":2,"blogsite.xyz":2,"dynv6.net":2,"e4.cz":2,"eero.online":2,"eero-stage.online":2,"elementor.cloud":2,"elementor.cool":2,"en-root.fr":2,"mytuleap.com":2,"tuleap-partners.com":2,"encr.app":2,"encoreapi.com":2,"onred.one":2,"staging.onred.one":3,"eu.encoway.cloud":3,"eu.org":2,"al.eu.org":3,"asso.eu.org":3,"at.eu.org":3,"au.eu.org":3,"be.eu.org":3,"bg.eu.org":3,"ca.eu.org":3,"cd.eu.org":3,"ch.eu.org":3,"cn.eu.org":3,"cy.eu.org":3,"cz.eu.org":3,"de.eu.org":3,"dk.eu.org":3,"edu.eu.org":3,"ee.eu.org":3,"es.eu.org":3,"fi.eu.org":3,"fr.eu.org":3,"gr.eu.org":3,"hr.eu.org":3,"hu.eu.org":3,"ie.eu.org":3,"il.eu.org":3,"in.eu.org":3,"int.eu.org":3,"is.eu.org":3,"it.eu.org":3,"jp.eu.org":3,"kr.eu.org":3,"lt.eu.org":3,"lu.eu.org":3,"lv.eu.org":3,"mc.eu.org":3,"me.eu.org":3,"mk.eu.org":3,"mt.eu.org":3,"my.eu.org":3,"net.eu.org":3,"ng.eu.org":3,"nl.eu.org":3,"no.eu.org":3,"nz.eu.org":3,"paris.eu.org":3,"pl.eu.org":3,"pt.eu.org":3,"q-a.eu.org":3,"ro.eu.org":3,"ru.eu.org":3,"se.eu.org":3,"si.eu.org":3,"sk.eu.org":3,"tr.eu.org":3,"uk.eu.org":3,"us.eu.org":3,"eurodir.ru":2,"eu-1.evennode.com":3,"eu-2.evennode.com":3,"eu-3.evennode.com":3,"eu-4.evennode.com":3,"us-1.evennode.com":3,"us-2.evennode.com":3,"us-3.evennode.com":3,"us-4.evennode.com":3,"twmail.cc":2,"twmail.net":2,"twmail.org":2,"mymailer.com.tw":3,"url.tw":2,"onfabrica.com":2,"apps.fbsbx.com":3,"ru.net":2,"adygeya.ru":2,"bashkiria.ru":2,"bir.ru":2,"cbg.ru":2,"com.ru":2,"dagestan.ru":2,"grozny.ru":2,"kalmykia.ru":2,"kustanai.ru":2,"marine.ru":2,"mordovia.ru":2,"msk.ru":2,"mytis.ru":2,"nalchik.ru":2,"nov.ru":2,"pyatigorsk.ru":2,"spb.ru":2,"vladikavkaz.ru":2,"vladimir.ru":2,"abkhazia.su":2,"adygeya.su":2,"aktyubinsk.su":2,"arkhangelsk.su":2,"armenia.su":2,"ashgabad.su":2,"azerbaijan.su":2,"balashov.su":2,"bashkiria.su":2,"bryansk.su":2,"bukhara.su":2,"chimkent.su":2,"dagestan.su":2,"east-kazakhstan.su":2,"exnet.su":2,"georgia.su":2,"grozny.su":2,"ivanovo.su":2,"jambyl.su":2,"kalmykia.su":2,"kaluga.su":2,"karacol.su":2,"karaganda.su":2,"karelia.su":2,"khakassia.su":2,"krasnodar.su":2,"kurgan.su":2,"kustanai.su":2,"lenug.su":2,"mangyshlak.su":2,"mordovia.su":2,"msk.su":2,"murmansk.su":2,"nalchik.su":2,"navoi.su":2,"north-kazakhstan.su":2,"nov.su":2,"obninsk.su":2,"penza.su":2,"pokrovsk.su":2,"sochi.su":2,"spb.su":2,"tashkent.su":2,"termez.su":2,"togliatti.su":2,"troitsk.su":2,"tselinograd.su":2,"tula.su":2,"tuva.su":2,"vladikavkaz.su":2,"vladimir.su":2,"vologda.su":2,"channelsdvr.net":2,"u.channelsdvr.net":3,"edgecompute.app":2,"fastly-terrarium.com":2,"fastlylb.net":2,"map.fastlylb.net":3,"freetls.fastly.net":3,"map.fastly.net":3,"a.prod.fastly.net":4,"global.prod.fastly.net":4,"a.ssl.fastly.net":4,"b.ssl.fastly.net":4,"global.ssl.fastly.net":4,"fastvps-server.com":2,"fastvps.host":2,"myfast.host":2,"fastvps.site":2,"myfast.space":2,"fedorainfracloud.org":2,"fedorapeople.org":2,"cloud.fedoraproject.org":3,"app.os.fedoraproject.org":4,"app.os.stg.fedoraproject.org":5,"conn.uk":2,"copro.uk":2,"hosp.uk":2,"mydobiss.com":2,"fh-muenster.io":2,"filegear.me":2,"filegear-au.me":2,"filegear-de.me":2,"filegear-gb.me":2,"filegear-ie.me":2,"filegear-jp.me":2,"filegear-sg.me":2,"firebaseapp.com":2,"fireweb.app":2,"flap.id":2,"onflashdrive.app":2,"fldrv.com":2,"fly.dev":2,"edgeapp.net":2,"shw.io":2,"flynnhosting.net":2,"forgeblocks.com":2,"id.forgerock.io":3,"framer.app":2,"framercanvas.com":2,"frusky.de":3,"ravpage.co.il":3,"0e.vc":2,"freebox-os.com":2,"freeboxos.com":2,"fbx-os.fr":2,"fbxos.fr":2,"freebox-os.fr":2,"freeboxos.fr":2,"freedesktop.org":2,"freemyip.com":2,"wien.funkfeuer.at":3,"futurecms.at":3,"ex.futurecms.at":4,"in.futurecms.at":4,"futurehosting.at":2,"futuremailing.at":2,"ex.ortsinfo.at":4,"kunden.ortsinfo.at":4,"statics.cloud":3,"independent-commission.uk":2,"independent-inquest.uk":2,"independent-inquiry.uk":2,"independent-panel.uk":2,"independent-review.uk":2,"public-inquiry.uk":2,"royal-commission.uk":2,"campaign.gov.uk":3,"service.gov.uk":3,"api.gov.uk":3,"gehirn.ne.jp":3,"usercontent.jp":2,"gentapps.com":2,"gentlentapis.com":2,"lab.ms":2,"cdn-edges.net":2,"ghost.io":2,"gsj.bz":2,"githubusercontent.com":2,"githubpreview.dev":2,"github.io":2,"gitlab.io":2,"gitapp.si":2,"gitpage.si":2,"glitch.me":2,"nog.community":2,"co.ro":2,"shop.ro":2,"lolipop.io":2,"angry.jp":2,"babyblue.jp":2,"babymilk.jp":2,"backdrop.jp":2,"bambina.jp":2,"bitter.jp":2,"blush.jp":2,"boo.jp":2,"boy.jp":2,"boyfriend.jp":2,"but.jp":2,"candypop.jp":2,"capoo.jp":2,"catfood.jp":2,"cheap.jp":2,"chicappa.jp":2,"chillout.jp":2,"chips.jp":2,"chowder.jp":2,"chu.jp":2,"ciao.jp":2,"cocotte.jp":2,"coolblog.jp":2,"cranky.jp":2,"cutegirl.jp":2,"daa.jp":2,"deca.jp":2,"deci.jp":2,"digick.jp":2,"egoism.jp":2,"fakefur.jp":2,"fem.jp":2,"flier.jp":2,"floppy.jp":2,"fool.jp":2,"frenchkiss.jp":2,"girlfriend.jp":2,"girly.jp":2,"gloomy.jp":2,"gonna.jp":2,"greater.jp":2,"hacca.jp":2,"heavy.jp":2,"her.jp":2,"hiho.jp":2,"hippy.jp":2,"holy.jp":2,"hungry.jp":2,"icurus.jp":2,"itigo.jp":2,"jellybean.jp":2,"kikirara.jp":2,"kill.jp":2,"kilo.jp":2,"kuron.jp":2,"littlestar.jp":2,"lolitapunk.jp":2,"lomo.jp":2,"lovepop.jp":2,"lovesick.jp":2,"main.jp":2,"mods.jp":2,"mond.jp":2,"mongolian.jp":2,"moo.jp":2,"namaste.jp":2,"nikita.jp":2,"nobushi.jp":2,"noor.jp":2,"oops.jp":2,"parallel.jp":2,"parasite.jp":2,"pecori.jp":2,"peewee.jp":2,"penne.jp":2,"pepper.jp":2,"perma.jp":2,"pigboat.jp":2,"pinoko.jp":2,"punyu.jp":2,"pupu.jp":2,"pussycat.jp":2,"pya.jp":2,"raindrop.jp":2,"readymade.jp":2,"sadist.jp":2,"schoolbus.jp":2,"secret.jp":2,"staba.jp":2,"stripper.jp":2,"sub.jp":2,"sunnyday.jp":2,"thick.jp":2,"tonkotsu.jp":2,"under.jp":2,"upper.jp":2,"velvet.jp":2,"verse.jp":2,"versus.jp":2,"vivian.jp":2,"watson.jp":2,"weblike.jp":2,"whitesnow.jp":2,"zombie.jp":2,"heteml.net":2,"cloudapps.digital":2,"london.cloudapps.digital":3,"pymnt.uk":2,"homeoffice.gov.uk":3,"ro.im":2,"goip.de":2,"run.app":2,"a.run.app":3,"web.app":2,"0emm.com":3,"appspot.com":2,"r.appspot.com":4,"codespot.com":2,"googleapis.com":2,"googlecode.com":2,"pagespeedmobilizer.com":2,"publishproxy.com":2,"withgoogle.com":2,"withyoutube.com":2,"gateway.dev":3,"cloud.goog":2,"translate.goog":2,"usercontent.goog":3,"cloudfunctions.net":2,"blogspot.ae":2,"blogspot.al":2,"blogspot.am":2,"blogspot.ba":2,"blogspot.be":2,"blogspot.bg":2,"blogspot.bj":2,"blogspot.ca":2,"blogspot.cf":2,"blogspot.ch":2,"blogspot.cl":2,"blogspot.co.at":3,"blogspot.co.id":3,"blogspot.co.il":3,"blogspot.co.ke":3,"blogspot.co.nz":3,"blogspot.co.uk":3,"blogspot.co.za":3,"blogspot.com":2,"blogspot.com.ar":3,"blogspot.com.au":3,"blogspot.com.br":3,"blogspot.com.by":3,"blogspot.com.co":3,"blogspot.com.cy":3,"blogspot.com.ee":3,"blogspot.com.eg":3,"blogspot.com.es":3,"blogspot.com.mt":3,"blogspot.com.ng":3,"blogspot.com.tr":3,"blogspot.com.uy":3,"blogspot.cv":2,"blogspot.cz":2,"blogspot.de":2,"blogspot.dk":2,"blogspot.fi":2,"blogspot.fr":2,"blogspot.gr":2,"blogspot.hk":2,"blogspot.hr":2,"blogspot.hu":2,"blogspot.ie":2,"blogspot.in":2,"blogspot.is":2,"blogspot.it":2,"blogspot.jp":2,"blogspot.kr":2,"blogspot.li":2,"blogspot.lt":2,"blogspot.lu":2,"blogspot.md":2,"blogspot.mk":2,"blogspot.mr":2,"blogspot.mx":2,"blogspot.my":2,"blogspot.nl":2,"blogspot.no":2,"blogspot.pe":2,"blogspot.pt":2,"blogspot.qa":2,"blogspot.re":2,"blogspot.ro":2,"blogspot.rs":2,"blogspot.ru":2,"blogspot.se":2,"blogspot.sg":2,"blogspot.si":2,"blogspot.sk":2,"blogspot.sn":2,"blogspot.td":2,"blogspot.tw":2,"blogspot.ug":2,"blogspot.vn":2,"goupile.fr":2,"gov.nl":2,"awsmppl.com":2,"xn--gnstigbestellen-zvb.de":2,"xn--gnstigliefern-wob.de":2,"fin.ci":2,"free.hr":2,"caa.li":2,"ua.rs":2,"conf.se":2,"hs.zone":2,"hs.run":2,"hashbang.sh":2,"hasura.app":2,"hasura-app.io":2,"pages.it.hs-heilbronn.de":4,"hepforge.org":2,"herokuapp.com":2,"herokussl.com":2,"ravendb.cloud":2,"myravendb.com":2,"ravendb.community":2,"ravendb.me":2,"development.run":2,"ravendb.run":2,"homesklep.pl":2,"secaas.hk":2,"hoplix.shop":2,"orx.biz":2,"biz.gl":2,"col.ng":2,"firm.ng":2,"gen.ng":2,"ltd.ng":2,"ngo.ng":2,"edu.scot":2,"sch.so":2,"hostyhosting.io":2,"xn--hkkinen-5wa.fi":2,"moonscale.io":3,"moonscale.net":2,"iki.fi":2,"impertrixcdn.com":2,"impertrix.com":2,"smushcdn.com":2,"wphostedmail.com":2,"wpmucdn.com":2,"tempurl.host":2,"wpmudev.host":2,"dyn-berlin.de":2,"in-berlin.de":2,"in-brb.de":2,"in-butter.de":2,"in-dsl.de":2,"in-dsl.net":2,"in-dsl.org":2,"in-vpn.de":2,"in-vpn.net":2,"in-vpn.org":2,"biz.at":2,"info.at":2,"info.cx":2,"ac.leg.br":3,"al.leg.br":3,"am.leg.br":3,"ap.leg.br":3,"ba.leg.br":3,"ce.leg.br":3,"df.leg.br":3,"es.leg.br":3,"go.leg.br":3,"ma.leg.br":3,"mg.leg.br":3,"ms.leg.br":3,"mt.leg.br":3,"pa.leg.br":3,"pb.leg.br":3,"pe.leg.br":3,"pi.leg.br":3,"pr.leg.br":3,"rj.leg.br":3,"rn.leg.br":3,"ro.leg.br":3,"rr.leg.br":3,"rs.leg.br":3,"sc.leg.br":3,"se.leg.br":3,"sp.leg.br":3,"to.leg.br":3,"pixolino.com":2,"na4u.ru":2,"iopsys.se":2,"ipifony.net":2,"mein-iserv.de":2,"schulserver.de":2,"test-iserv.de":2,"iserv.dev":2,"iobb.net":2,"mel.cloudlets.com.au":4,"cloud.interhostsolutions.be":3,"users.scale.virtualcloud.com.br":5,"mycloud.by":2,"alp1.ae.flow.ch":4,"appengine.flow.ch":3,"es-1.axarnet.cloud":3,"diadem.cloud":2,"vip.jelastic.cloud":3,"jele.cloud":2,"it1.eur.aruba.jenv-aruba.cloud":5,"it1.jenv-aruba.cloud":3,"keliweb.cloud":2,"cs.keliweb.cloud":3,"oxa.cloud":2,"tn.oxa.cloud":3,"uk.oxa.cloud":3,"primetel.cloud":2,"uk.primetel.cloud":3,"ca.reclaim.cloud":3,"uk.reclaim.cloud":3,"us.reclaim.cloud":3,"ch.trendhosting.cloud":3,"de.trendhosting.cloud":3,"jele.club":2,"amscompute.com":2,"clicketcloud.com":2,"dopaas.com":2,"hidora.com":2,"paas.hosted-by-previder.com":3,"rag-cloud.hosteur.com":3,"rag-cloud-ch.hosteur.com":3,"jcloud.ik-server.com":3,"jcloud-ver-jpc.ik-server.com":3,"demo.jelastic.com":3,"kilatiron.com":2,"paas.massivegrid.com":3,"jed.wafaicloud.com":3,"lon.wafaicloud.com":3,"ryd.wafaicloud.com":3,"j.scaleforce.com.cy":4,"jelastic.dogado.eu":3,"fi.cloudplatform.fi":3,"demo.datacenter.fi":3,"paas.datacenter.fi":3,"jele.host":2,"mircloud.host":2,"paas.beebyte.io":3,"sekd1.beebyteapp.io":3,"jele.io":2,"cloud-fr1.unispace.io":3,"jc.neen.it":3,"cloud.jelastic.open.tim.it":5,"jcloud.kz":2,"upaas.kazteleport.kz":3,"cloudjiffy.net":2,"fra1-de.cloudjiffy.net":3,"west1-us.cloudjiffy.net":3,"jls-sto1.elastx.net":3,"jls-sto2.elastx.net":3,"jls-sto3.elastx.net":3,"faststacks.net":2,"fr-1.paas.massivegrid.net":4,"lon-1.paas.massivegrid.net":4,"lon-2.paas.massivegrid.net":4,"ny-1.paas.massivegrid.net":4,"ny-2.paas.massivegrid.net":4,"sg-1.paas.massivegrid.net":4,"jelastic.saveincloud.net":3,"nordeste-idc.saveincloud.net":3,"j.scaleforce.net":3,"jelastic.tsukaeru.net":3,"sdscloud.pl":2,"unicloud.pl":2,"mircloud.ru":2,"jelastic.regruhosting.ru":3,"enscaled.sg":2,"jele.site":2,"jelastic.team":2,"orangecloud.tn":2,"j.layershift.co.uk":4,"phx.enscaled.us":3,"mircloud.us":2,"myjino.ru":2,"hosting.myjino.ru":4,"landing.myjino.ru":4,"spectrum.myjino.ru":4,"vps.myjino.ru":4,"jotelulu.cloud":2,"triton.zone":3,"cns.joyent.com":4,"js.org":2,"kaas.gg":2,"khplay.nl":2,"ktistory.com":2,"kapsi.fi":2,"keymachine.de":2,"kinghost.net":2,"uni5.net":2,"knightpoint.systems":2,"koobin.events":2,"oya.to":2,"kuleuven.cloud":2,"ezproxy.kuleuven.be":3,"co.krd":2,"edu.krd":2,"krellian.net":2,"webthings.io":2,"git-repos.de":2,"lcube-server.de":2,"svn-repos.de":2,"leadpages.co":2,"lpages.co":2,"lpusercontent.com":2,"lelux.site":2,"co.business":2,"co.education":2,"co.events":2,"co.financial":2,"co.network":2,"co.place":2,"co.technology":2,"app.lmpm.com":3,"linkyard.cloud":2,"linkyard-cloud.ch":2,"members.linode.com":3,"nodebalancer.linode.com":4,"linodeobjects.com":3,"ip.linodeusercontent.com":3,"we.bs":2,"user.localcert.dev":4,"localzone.xyz":2,"loginline.app":2,"loginline.dev":2,"loginline.io":2,"loginline.services":2,"loginline.site":2,"servers.run":2,"lohmus.me":2,"krasnik.pl":2,"leczna.pl":2,"lubartow.pl":2,"lublin.pl":2,"poniatowa.pl":2,"swidnik.pl":2,"glug.org.uk":3,"lug.org.uk":3,"lugs.org.uk":3,"barsy.bg":2,"barsy.co.uk":3,"barsyonline.co.uk":3,"barsycenter.com":2,"barsyonline.com":2,"barsy.club":2,"barsy.de":2,"barsy.eu":2,"barsy.in":2,"barsy.info":2,"barsy.io":2,"barsy.me":2,"barsy.menu":2,"barsy.mobi":2,"barsy.net":2,"barsy.online":2,"barsy.org":2,"barsy.pro":2,"barsy.pub":2,"barsy.ro":2,"barsy.shop":2,"barsy.site":2,"barsy.support":2,"barsy.uk":2,"magentosite.cloud":3,"mayfirst.info":2,"mayfirst.org":2,"hb.cldmail.ru":3,"cn.vu":2,"mazeplay.com":2,"mcpe.me":2,"mcdir.me":2,"mcdir.ru":2,"mcpre.ru":2,"vps.mcdir.ru":3,"mediatech.by":2,"mediatech.dev":2,"hra.health":2,"miniserver.com":2,"memset.net":2,"cloud.metacentrum.cz":4,"custom.metacentrum.cz":3,"flt.cloud.muni.cz":4,"usr.cloud.muni.cz":4,"meteorapp.com":2,"eu.meteorapp.com":3,"co.pl":2,"azurecontainer.io":3,"azurewebsites.net":2,"azure-mobile.net":2,"cloudapp.net":2,"azurestaticapps.net":2,"1.azurestaticapps.net":3,"centralus.azurestaticapps.net":3,"eastasia.azurestaticapps.net":3,"eastus2.azurestaticapps.net":3,"westeurope.azurestaticapps.net":3,"westus2.azurestaticapps.net":3,"csx.cc":2,"mintere.site":2,"forte.id":2,"mozilla-iot.org":2,"bmoattachments.org":2,"net.ru":2,"org.ru":2,"pp.ru":2,"hostedpi.com":2,"customer.mythic-beasts.com":3,"caracal.mythic-beasts.com":3,"fentiger.mythic-beasts.com":3,"lynx.mythic-beasts.com":3,"ocelot.mythic-beasts.com":3,"oncilla.mythic-beasts.com":3,"onza.mythic-beasts.com":3,"sphinx.mythic-beasts.com":3,"vs.mythic-beasts.com":3,"x.mythic-beasts.com":3,"yali.mythic-beasts.com":3,"cust.retrosnub.co.uk":4,"ui.nabu.casa":3,"pony.club":2,"of.fashion":2,"in.london":2,"of.london":2,"from.marketing":2,"with.marketing":2,"for.men":2,"repair.men":2,"and.mom":2,"for.mom":2,"for.one":2,"under.one":2,"for.sale":2,"that.win":2,"from.work":2,"to.work":2,"cloud.nospamproxy.com":3,"netlify.app":2,"4u.com":2,"ngrok.io":2,"nh-serv.co.uk":3,"nfshost.com":2,"developer.app":3,"noop.app":2,"northflank.app":3,"build.run":3,"code.run":3,"database.run":3,"migration.run":3,"noticeable.news":2,"dnsking.ch":2,"mypi.co":2,"n4t.co":2,"001www.com":2,"ddnslive.com":2,"myiphost.com":2,"forumz.info":2,"16-b.it":2,"32-b.it":2,"64-b.it":2,"soundcast.me":2,"tcp4.me":2,"dnsup.net":2,"hicam.net":2,"now-dns.net":2,"ownip.net":2,"vpndns.net":2,"dynserv.org":2,"now-dns.org":2,"x443.pw":2,"now-dns.top":2,"ntdll.top":2,"freeddns.us":2,"crafting.xyz":2,"zapto.xyz":2,"nsupdate.info":2,"nerdpol.ovh":2,"blogsyte.com":2,"brasilia.me":2,"cable-modem.org":2,"ciscofreak.com":2,"collegefan.org":2,"couchpotatofries.org":2,"damnserver.com":2,"ddns.me":2,"ditchyourip.com":2,"dnsfor.me":2,"dnsiskinky.com":2,"dvrcam.info":2,"dynns.com":2,"eating-organic.net":2,"fantasyleague.cc":2,"geekgalaxy.com":2,"golffan.us":2,"health-carereform.com":2,"homesecuritymac.com":2,"homesecuritypc.com":2,"hopto.me":2,"ilovecollege.info":2,"loginto.me":2,"mlbfan.org":2,"mmafan.biz":2,"myactivedirectory.com":2,"mydissent.net":2,"myeffect.net":2,"mymediapc.net":2,"mypsx.net":2,"mysecuritycamera.com":2,"mysecuritycamera.net":2,"mysecuritycamera.org":2,"net-freaks.com":2,"nflfan.org":2,"nhlfan.net":2,"no-ip.ca":2,"no-ip.co.uk":3,"no-ip.net":2,"noip.us":2,"onthewifi.com":2,"pgafan.net":2,"point2this.com":2,"pointto.us":2,"privatizehealthinsurance.net":2,"quicksytes.com":2,"read-books.org":2,"securitytactics.com":2,"serveexchange.com":2,"servehumour.com":2,"servep2p.com":2,"servesarcasm.com":2,"stufftoread.com":2,"ufcfan.org":2,"unusualperson.com":2,"workisboring.com":2,"3utilities.com":2,"bounceme.net":2,"ddns.net":2,"ddnsking.com":2,"gotdns.ch":2,"hopto.org":2,"myftp.biz":2,"myftp.org":2,"myvnc.com":2,"no-ip.biz":2,"no-ip.info":2,"no-ip.org":2,"noip.me":2,"redirectme.net":2,"servebeer.com":2,"serveblog.net":2,"servecounterstrike.com":2,"serveftp.com":2,"servegame.com":2,"servehalflife.com":2,"servehttp.com":2,"serveirc.com":2,"serveminecraft.net":2,"servemp3.com":2,"servepics.com":2,"servequake.com":2,"sytes.net":2,"webhop.me":2,"zapto.org":2,"stage.nodeart.io":3,"pcloud.host":2,"nyc.mn":2,"static.observableusercontent.com":3,"cya.gg":2,"omg.lol":2,"cloudycluster.net":2,"omniwe.site":2,"service.one":2,"nid.io":2,"opensocial.site":2,"opencraft.hosting":2,"orsites.com":2,"operaunite.com":2,"tech.orange":2,"authgear-staging.com":2,"authgearapps.com":2,"skygearapp.com":2,"outsystemscloud.com":2,"webpaas.ovh.net":4,"hosting.ovh.net":4,"ownprovider.com":2,"own.pm":2,"owo.codes":3,"ox.rs":2,"oy.lc":2,"pgfog.com":2,"pagefrontapp.com":2,"pagexl.com":2,"paywhirl.com":3,"bar0.net":2,"bar1.net":2,"bar2.net":2,"rdv.to":2,"art.pl":2,"gliwice.pl":2,"krakow.pl":2,"poznan.pl":2,"wroc.pl":2,"zakopane.pl":2,"pantheonsite.io":2,"gotpantheon.com":2,"mypep.link":2,"perspecta.cloud":2,"lk3.ru":2,"on-web.fr":2,"bc.platform.sh":3,"ent.platform.sh":3,"eu.platform.sh":3,"us.platform.sh":3,"platformsh.site":3,"tst.site":3,"platter-app.com":2,"platter-app.dev":2,"platterp.us":2,"pdns.page":2,"plesk.page":2,"pleskns.com":2,"dyn53.io":2,"onporter.run":2,"co.bn":2,"postman-echo.com":2,"pstmn.io":2,"mock.pstmn.io":3,"httpbin.org":2,"prequalifyme.today":2,"xen.prgmr.com":3,"priv.at":2,"prvcy.page":2,"dweb.link":3,"protonet.io":2,"chirurgiens-dentistes-en-france.fr":2,"byen.site":2,"pubtls.org":2,"pythonanywhere.com":2,"eu.pythonanywhere.com":3,"qoto.io":2,"qualifioapp.com":2,"qbuser.com":2,"cloudsite.builders":2,"instances.spawn.cc":3,"instantcloud.cn":2,"ras.ru":2,"qa2.com":2,"qcx.io":2,"sys.qcx.io":4,"dev-myqnapcloud.com":2,"alpha-myqnapcloud.com":2,"myqnapcloud.com":2,"quipelements.com":3,"vapor.cloud":2,"vaporcloud.io":2,"rackmaze.com":2,"rackmaze.net":2,"g.vbrplsbx.io":3,"on-k3s.io":3,"on-rancher.cloud":3,"on-rio.io":3,"readthedocs.io":2,"rhcloud.com":2,"app.render.com":3,"onrender.com":2,"repl.co":2,"id.repl.co":3,"repl.run":2,"resindevice.io":2,"devices.resinstaging.io":3,"hzc.io":2,"wellbeingzone.eu":2,"wellbeingzone.co.uk":3,"adimo.co.uk":3,"itcouldbewor.se":2,"git-pages.rit.edu":3,"rocky.page":2,"xn--90amc.xn--p1acf":2,"xn--j1aef.xn--p1acf":2,"xn--j1ael8b.xn--p1acf":2,"xn--h1ahn.xn--p1acf":2,"xn--j1adp.xn--p1acf":2,"xn--c1avg.xn--p1acf":2,"xn--80aaa0cvac.xn--p1acf":2,"xn--h1aliz.xn--p1acf":2,"xn--90a1af.xn--p1acf":2,"xn--41a.xn--p1acf":2,"builder.code.com":3,"dev-builder.code.com":3,"stg-builder.code.com":3,"sandcats.io":2,"logoip.de":2,"logoip.com":2,"fr-par-1.baremetal.scw.cloud":4,"fr-par-2.baremetal.scw.cloud":4,"nl-ams-1.baremetal.scw.cloud":4,"fnc.fr-par.scw.cloud":4,"functions.fnc.fr-par.scw.cloud":5,"k8s.fr-par.scw.cloud":4,"nodes.k8s.fr-par.scw.cloud":5,"s3.fr-par.scw.cloud":4,"s3-website.fr-par.scw.cloud":4,"whm.fr-par.scw.cloud":4,"priv.instances.scw.cloud":4,"pub.instances.scw.cloud":4,"k8s.scw.cloud":3,"k8s.nl-ams.scw.cloud":4,"nodes.k8s.nl-ams.scw.cloud":5,"s3.nl-ams.scw.cloud":4,"s3-website.nl-ams.scw.cloud":4,"whm.nl-ams.scw.cloud":4,"k8s.pl-waw.scw.cloud":4,"nodes.k8s.pl-waw.scw.cloud":5,"s3.pl-waw.scw.cloud":4,"s3-website.pl-waw.scw.cloud":4,"scalebook.scw.cloud":3,"smartlabeling.scw.cloud":3,"dedibox.fr":2,"schokokeks.net":2,"gov.scot":2,"service.gov.scot":3,"scrysec.com":2,"firewall-gateway.com":2,"firewall-gateway.de":2,"my-gateway.de":2,"my-router.de":2,"spdns.de":2,"spdns.eu":2,"firewall-gateway.net":2,"my-firewall.org":2,"myfirewall.org":2,"spdns.org":2,"seidat.net":2,"sellfy.store":2,"senseering.net":2,"minisite.ms":2,"magnet.page":2,"biz.ua":2,"co.ua":2,"pp.ua":2,"shiftcrypto.dev":2,"shiftcrypto.io":2,"shiftedit.io":2,"myshopblocks.com":2,"myshopify.com":2,"shopitsite.com":2,"shopware.store":2,"mo-siemens.io":2,"1kapp.com":2,"appchizi.com":2,"applinzi.com":2,"sinaapp.com":2,"vipsinaapp.com":2,"siteleaf.net":2,"bounty-full.com":2,"alpha.bounty-full.com":3,"beta.bounty-full.com":3,"small-web.org":2,"vp4.me":2,"try-snowplow.com":2,"srht.site":2,"stackhero-network.com":2,"musician.io":2,"novecore.site":2,"static.land":2,"dev.static.land":3,"sites.static.land":3,"storebase.store":2,"vps-host.net":2,"atl.jelastic.vps-host.net":4,"njs.jelastic.vps-host.net":4,"ric.jelastic.vps-host.net":4,"playstation-cloud.com":2,"apps.lair.io":3,"stolos.io":3,"spacekit.io":2,"customer.speedpartner.de":3,"myspreadshop.at":2,"myspreadshop.com.au":3,"myspreadshop.be":2,"myspreadshop.ca":2,"myspreadshop.ch":2,"myspreadshop.com":2,"myspreadshop.de":2,"myspreadshop.dk":2,"myspreadshop.es":2,"myspreadshop.fi":2,"myspreadshop.fr":2,"myspreadshop.ie":2,"myspreadshop.it":2,"myspreadshop.net":2,"myspreadshop.nl":2,"myspreadshop.no":2,"myspreadshop.pl":2,"myspreadshop.se":2,"myspreadshop.co.uk":3,"api.stdlib.com":3,"storj.farm":2,"utwente.io":2,"soc.srcf.net":3,"user.srcf.net":3,"temp-dns.com":2,"supabase.co":2,"supabase.in":2,"supabase.net":2,"su.paba.se":3,"s5y.io":3,"sensiosite.cloud":3,"syncloud.it":2,"dscloud.biz":2,"direct.quickconnect.cn":3,"dsmynas.com":2,"familyds.com":2,"diskstation.me":2,"dscloud.me":2,"i234.me":2,"myds.me":2,"synology.me":2,"dscloud.mobi":2,"dsmynas.net":2,"familyds.net":2,"dsmynas.org":2,"familyds.org":2,"vpnplus.to":2,"direct.quickconnect.to":3,"tabitorder.co.il":3,"taifun-dns.de":2,"beta.tailscale.net":3,"ts.net":2,"gda.pl":2,"gdansk.pl":2,"gdynia.pl":2,"med.pl":2,"sopot.pl":2,"site.tb-hosting.com":3,"edugit.io":2,"s3.teckids.org":3,"telebit.app":2,"telebit.io":2,"telebit.xyz":3,"gwiddle.co.uk":3,"firenet.ch":3,"svc.firenet.ch":4,"reservd.com":2,"thingdustdata.com":2,"cust.dev.thingdust.io":4,"cust.disrec.thingdust.io":4,"cust.prod.thingdust.io":4,"cust.testing.thingdust.io":4,"reservd.dev.thingdust.io":4,"reservd.disrec.thingdust.io":4,"reservd.testing.thingdust.io":4,"tickets.io":2,"arvo.network":2,"azimuth.network":2,"tlon.network":2,"torproject.net":2,"pages.torproject.net":3,"bloxcms.com":2,"townnews-staging.com":2,"tbits.me":2,"12hp.at":2,"2ix.at":2,"4lima.at":2,"lima-city.at":2,"12hp.ch":2,"2ix.ch":2,"4lima.ch":2,"lima-city.ch":2,"trafficplex.cloud":2,"de.cool":2,"12hp.de":2,"2ix.de":2,"4lima.de":2,"lima-city.de":2,"1337.pictures":2,"clan.rip":2,"lima-city.rocks":2,"webspace.rocks":2,"lima.zone":2,"transurl.be":3,"transurl.eu":3,"transurl.nl":3,"site.transip.me":3,"tuxfamily.org":2,"dd-dns.de":2,"diskstation.eu":2,"diskstation.org":2,"dray-dns.de":2,"draydns.de":2,"dyn-vpn.de":2,"dynvpn.de":2,"mein-vigor.de":2,"my-vigor.de":2,"my-wan.de":2,"syno-ds.de":2,"synology-diskstation.de":2,"synology-ds.de":2,"typedream.app":2,"pro.typeform.com":3,"uber.space":2,"uberspace.de":3,"hk.com":2,"hk.org":2,"ltd.hk":2,"inc.hk":2,"name.pm":2,"sch.tf":2,"biz.wf":2,"sch.wf":2,"org.yt":2,"virtualuser.de":2,"virtual-user.de":2,"upli.io":2,"urown.cloud":2,"dnsupdate.info":2,"lib.de.us":3,"2038.io":2,"vercel.app":2,"vercel.dev":2,"now.sh":2,"router.management":2,"v-info.info":2,"voorloper.cloud":2,"neko.am":2,"nyaa.am":2,"be.ax":2,"cat.ax":2,"es.ax":2,"eu.ax":2,"gg.ax":2,"mc.ax":2,"us.ax":2,"xy.ax":2,"nl.ci":2,"xx.gl":2,"app.gp":2,"blog.gt":2,"de.gt":2,"to.gt":2,"be.gy":2,"cc.hn":2,"blog.kg":2,"io.kg":2,"jp.kg":2,"tv.kg":2,"uk.kg":2,"us.kg":2,"de.ls":2,"at.md":2,"de.md":2,"jp.md":2,"to.md":2,"indie.porn":2,"vxl.sh":2,"ch.tc":2,"me.tc":2,"we.tc":2,"nyan.to":2,"at.vg":2,"blog.vu":2,"dev.vu":2,"me.vu":2,"v.ua":2,"vultrobjects.com":3,"wafflecell.com":2,"webhare.dev":3,"reserve-online.net":2,"reserve-online.com":2,"bookonline.app":2,"hotelwithflight.com":2,"wedeploy.io":2,"wedeploy.me":2,"wedeploy.sh":2,"remotewd.com":2,"pages.wiardweb.com":3,"wmflabs.org":2,"toolforge.org":2,"wmcloud.org":2,"panel.gg":2,"daemon.panel.gg":3,"messwithdns.com":2,"woltlab-demo.com":2,"myforum.community":2,"community-pro.de":2,"diskussionsbereich.de":2,"community-pro.net":2,"meinforum.net":2,"affinitylottery.org.uk":3,"raffleentry.org.uk":3,"weeklylottery.org.uk":3,"wpenginepowered.com":2,"js.wpenginepowered.com":3,"wixsite.com":2,"editorx.io":2,"half.host":2,"xnbay.com":2,"u2.xnbay.com":3,"u2-local.xnbay.com":3,"cistron.nl":2,"demon.nl":2,"xs4all.space":2,"yandexcloud.net":2,"storage.yandexcloud.net":3,"website.yandexcloud.net":3,"official.academy":2,"yolasite.com":2,"ybo.faith":2,"yombo.me":2,"homelink.one":2,"ybo.party":2,"ybo.review":2,"ybo.science":2,"ybo.trade":2,"ynh.fr":2,"nohost.me":2,"noho.st":2,"za.net":2,"za.org":2,"bss.design":2,"basicserver.io":2,"virtualserver.io":2,"enterprisecloud.nu":2}};
+
+ return tld;
+})();
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js
new file mode 100644
index 0000000..bc8aecc
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js
@@ -0,0 +1,35 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+'use strict';
+
+function uuid() {
+ try {
+ return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,
+ c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4)
+ .toString(16));
+ } catch (e) {
+ // fallback, as the Tor Browser seems to fail above
+ uuid = () => 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+ let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
+ return v.toString(16);
+ });
+ }
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js b/data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js
new file mode 100644
index 0000000..f1485f9
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js
@@ -0,0 +1,411 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+// depends on /nscl/common/uuid.js
+
+"use strict";
+/**
+ * Injects code into page context in a cross-browser way, providing it
+ * with tools to wrap/patch the DOM and the JavaScript environment
+ * and propagating the changes to child windows created on the fly in order
+ * to prevent the modifications to be cancelled by hostile code.
+ *
+ * @param {function} patchingCallback
+ * the (semi)privileged wrapping code to be injected.
+ * Warning: this is not to be considered a closure, since Chromium
+ * injection needs it to be reparsed out of context.
+ * Use the env argument to propagate parameters.
+ * It will be called as patchingCallback(unwrappedWindow, env).
+ * @param {object} env
+ * a JSON-serializable object to made available to patchingCallback as
+ * its second argument. It gets augmented by two additional properties:
+ * 1. a Port (port: {postMessage(), onMessage()}) object
+ * allowing the injected script to communicate with
+ * the privileged content script by calling port.postMessage(msg, [event])
+ * and/or by listening to a port.onMessage(msg, event) user-defined callback.
+ * 2. A "xray" object property to help handling
+ * Firefox's XRAY wrappers.
+ * xray: {
+ * enabled: true, // false on Chromium
+ * unwrap(obj), // returns the XPC-wrapped object - or just obj on Chromium
+ * wrap(obj), // returns the XPC wrapper around the object - or just obj on Chromium
+ * forPage(obj), // returns cloneInto(obj) including functions and DOM objects - or just obj on Chromium
+ * window, // the XPC-wrapped version of unwrappedWindow, or unwrappedWindow itself on Chromium
+ * }
+ * @returns {object} port
+ * A Port object allowing the privileged content script to communicate
+ * with the injected script on the page by calling port.postMessage(msg, [event])
+ * and/or by listening to a port.onMessage(msg, event) user-defined callback.
+ */
+
+function patchWindow(patchingCallback, env = {}) {
+ if (typeof patchingCallback !== "function") {
+ patchingCallback = new Function("unwrappedWindow", "env", patchingCallback);
+ }
+ let eventId = this && this.eventId || `windowPatchMessages:${uuid()}`;
+ let { dispatchEvent, addEventListener } = window;
+
+ function Port(from, to) {
+ // we need a double dispatching dance and maintaining a stack of
+ // return values / thrown errors because Chromium seals the detail object
+ // (on Firefox we could just append further properties to it...)
+ let retStack = [];
+
+ function fire(e, detail, target = window) {
+ dispatchEvent.call(target, new CustomEvent(`${eventId}:${e}`, {detail, composed: true}));
+ }
+ this.postMessage = function(msg, target = window) {
+ retStack.push({});
+ let detail = {msg};
+ fire(to, detail, target);
+ let ret = retStack.pop();
+ if (ret.error) throw ret.error;
+ return ret.value;
+ };
+ addEventListener.call(window, `${eventId}:${from}`, event => {
+ if (typeof this.onMessage === "function" && event.detail) {
+ let ret = {};
+ try {
+ ret.value = this.onMessage(event.detail.msg, event);
+ } catch (error) {
+ ret.error = error;
+ }
+ fire(`return:${to}`, ret);
+ }
+ }, true);
+ addEventListener.call(window, `${eventId}:return:${from}`, event => {
+ let {detail} = event;
+ if (detail && retStack.length) {
+ retStack[retStack.length -1] = detail;
+ }
+ }, true);
+ this.onMessage = null;
+ }
+ let port = new Port("extension", "page");
+
+ let nativeExport = this && this.exportFunction || typeof exportFunction == "function";
+ if (!nativeExport) {
+ // Chromium
+ let exportFunction = (func, targetObject, {defineAs, original} = {}) => {
+ try {
+ let [propDef, getOrSet, propName] = defineAs && /^([gs]et)(?:\s+(\w+))$/.exec(defineAs) || [null, null, defineAs];
+ let propDes = propName && Object.getOwnPropertyDescriptor(targetObject, propName);
+ if (getOrSet && !propDes) { // escalate through prototype chain
+ for (let proto = Object.getPrototypeOf(targetObject); proto; proto = Object.getPrototypeOf(proto)) {
+ propDes = Object.getOwnPropertyDescriptor(proto, propName);
+ if (propDes) {
+ targetObject = proto;
+ break;
+ }
+ }
+ }
+
+ let toString = Function.prototype.toString;
+ let strVal;
+ if (!original) {
+ original = propDef && propDes ? propDes[getOrSet] : defineAs && targetObject[defineAs];
+ }
+ if (!original) {
+ // It seems to be a brand new function, rather than a replacement.
+ // Let's ensure it appears as a native one with little hack: we proxy a Promise callback ;)
+ Promise.resolve(new Promise(resolve => original = resolve));
+ let name = propDef && propDes ? `${getOrSet} ${propName}` : defineAs;
+ if (name) {
+ let nameDef = Reflect.getOwnPropertyDescriptor(original, "name");
+ nameDef.value = name;
+ Reflect.defineProperty(original, "name", nameDef);
+ strVal = toString.call(original).replace(/^function \(\)/, `function ${name}()`)
+ }
+ }
+
+ strVal = strVal || toString.call(original);
+
+ let proxy = new Proxy(original, {
+ apply(target, thisArg, args) {
+ return func.apply(thisArg, args);
+ }
+ });
+
+ if (!exportFunction._toStringMap) {
+ let map = new WeakMap();
+ exportFunction._toStringMap = map;
+ let toStringProxy = new Proxy(toString, {
+ apply(target, thisArg, args) {
+ return map.has(thisArg) ? map.get(thisArg) : Reflect.apply(target, thisArg, args);
+ }
+ });
+ map.set(toStringProxy, toString.apply(toString));
+ Function.prototype.toString = toStringProxy;
+ }
+ exportFunction._toStringMap.set(proxy, strVal);
+
+ if (propName) {
+ if (!propDes) {
+ targetObject[propName] = proxy;
+ } else {
+ if (getOrSet) {
+ propDes[getOrSet] = proxy;
+ } else {
+ if ("value" in propDes) {
+ propDes.value = proxy;
+ } else {
+ return exportFunction(() => proxy, targetObject, `get ${propName}`);
+ }
+ }
+ Object.defineProperty(targetObject, propName, propDes);
+ }
+ }
+ return proxy;
+ } catch (e) {
+ console.error(e, `setting ${targetObject}.${defineAs || original}`, func);
+ }
+ return null;
+ };
+ let cloneInto = (obj, targetObject) => {
+ return obj; // dummy for assignment
+ };
+ let script = document.createElement("script");
+ script.text = `
+ (() => {
+ let patchWindow = ${patchWindow};
+ let cloneInto = ${cloneInto};
+ let exportFunction = ${exportFunction};
+ let env = ${JSON.stringify(env)};
+ let eventId = ${JSON.stringify(eventId)};
+ env.port = new (${Port})("page", "extension");
+ ({
+ patchWindow,
+ exportFunction,
+ cloneInto,
+ eventId,
+ }).patchWindow(${patchingCallback}, env);
+ })();
+ `;
+ document.documentElement.insertBefore(script, document.documentElement.firstChild);
+ script.remove();
+ return port;
+ }
+
+ env.port = new Port("page", "extension");
+
+ function getSafeMethod(obj, method) {
+ return isDeadTarget(obj, method) ? xray.wrap(obj)[method] : obj[method];
+ }
+
+ function getSafeDescriptor(proto, prop, accessor) {
+ let des = Object.getOwnPropertyDescriptor(proto, prop);
+ return isDeadTarget(des, accessor) ?
+ Object.getOwnPropertyDescriptor(xray.wrap(proto), prop)
+ : des;
+ }
+
+ let xrayMake = (enabled, wrap, unwrap = wrap, forPage = wrap) => ({
+ enabled, wrap, unwrap, forPage,
+ getSafeMethod, getSafeDescriptor
+ });
+
+ let xray = typeof XPCNativeWrapper === "undefined"
+ ? xrayMake(false, o => o)
+ : xrayMake(true, o => XPCNativeWrapper(o), o => XPCNativeWrapper.unwrap(o),
+ function(obj, win = this.window || window) {
+ return cloneInto(obj, win, {cloneFunctions: true, wrapReflectors: true});
+ });
+
+ var isDeadTarget = xray.enabled && document.readyState === "complete" ?
+ (obj, method) => {
+ // We may be repatching this already loaded window during an extension update:
+ // beware of dead object from killed obsolete content script!
+ try {
+ obj[method].apply(null);
+ } catch (e) {
+ return e.message.includes("dead object");
+ }
+ return false;
+ }
+ : () => false;
+
+ const patchedWindows = new WeakSet(); // track them to avoid indirect recursion
+
+ // win: window object to modify.
+ function modifyWindow(win) {
+ try {
+ win = xray.unwrap(win);
+ env.xray = Object.assign({window: xray.wrap(win)}, xray);
+
+ if (patchedWindows.has(win)) return;
+ patchedWindows.add(win);
+ patchingCallback(win, env);
+ modifyWindowOpenMethod(win);
+ modifyFramingElements(win);
+ // we don't need to modify win.opener, read skriptimaahinen notes
+ // at https://forums.informaction.com/viewtopic.php?p=103754#p103754
+ } catch (e) {
+ if (e instanceof DOMException && e.name === "SecurityError") {
+ // In case someone tries to access SOP restricted window.
+ // We can just ignore this.
+ } else throw e;
+ }
+ }
+
+ function modifyWindowOpenMethod(win) {
+ let windowOpen = win.open;
+ exportFunction(function(...args) {
+ let newWin = windowOpen.call(this, ...args);
+ if (newWin) modifyWindow(newWin);
+ return newWin;
+ }, win, {defineAs: "open"});
+ }
+
+ function modifyFramingElements(win) {
+ for (let property of ["contentWindow", "contentDocument"]) {
+ for (let iface of ["Frame", "IFrame", "Object"]) {
+ let proto = win[`HTML${iface}Element`].prototype;
+ modifyContentProperties(proto, property)
+ }
+ }
+ // auto-trigger window patching whenever new elements are added to the DOM
+ let patchAll = () => {
+ for (let j = 0; j in win; j++) {
+ try {
+ modifyWindow(win[j]);
+ } catch (e) {
+ console.error(e, `Patching frames[${j}]`);
+ }
+ }
+ };
+
+ let xrayWin = xray.wrap(win);
+ let observer = new MutationObserver(patchAll);
+ observer.observe(win.document, { subtree: true, childList: true });
+ let patchHandler = {
+ apply(target, thisArg, args) {
+ let ret = Reflect.apply(target, thisArg, args);
+ thisArg = thisArg && xray.wrap(thisArg);
+ if (thisArg) {
+ thisArg = xray.wrap(thisArg);
+ if ((thisArg.ownerDocument || thisArg) === xrayWin.document) {
+ patchAll();
+ }
+ }
+ return ret ? xray.forPage(ret, win) : ret;
+ }
+ };
+
+ let domChangers = {
+ Element: [
+ "set innerHTML", "set outerHTML",
+ "after", "append", "appendChild",
+ "before",
+ "insertAdjacentElement", "insertAdjacentHTML", "insertBefore",
+ "prepend",
+ "replaceChildren", "replaceWith", "replaceChild",
+ "setHTML",
+ ],
+ Document: [
+ "append", "prepend", "replaceChildren",
+ "write", "writeln",
+ ]
+ };
+
+ function patch(proto, method) {
+ let accessor;
+ if (method.startsWith("set ")) {
+ accessor = "set";
+ method = method.replace("set ", "");
+ } else {
+ accessor = "value";
+ }
+ if (!(method in proto)) return;
+ while (!proto.hasOwnProperty(method)) {
+ proto = Object.getPrototypeOf(proto);
+ if (!proto) {
+ console.error(`Couldn't find property ${method} on the prototype chain!`);
+ return;
+ }
+ }
+ let des = getSafeDescriptor(proto, method, accessor);
+ des[accessor] = new Proxy(des[accessor], patchHandler);
+ win.Object.defineProperty(proto, method, xray.forPage(des, win));
+ }
+
+ for (let [obj, methods] of Object.entries(domChangers)) {
+ let proto = win[obj].prototype;
+ for (let method of methods) {
+ patch(proto, method);
+ }
+ }
+ if (patchWindow.onObject) patchWindow.onObject.add(patchAll);
+ }
+
+ function modifyContentProperties(proto, property) {
+ let descriptor = getSafeDescriptor(proto, property, "get");
+ let origGetter = descriptor.get;
+ let replacements = {
+ contentWindow() {
+ let win = origGetter.call(this);
+ if (win) modifyWindow(win);
+ return win;
+ },
+ contentDocument() {
+ let document = origGetter.call(this);
+ if (document && document.defaultView) modifyWindow(document.defaultView);
+ return document;
+ }
+ };
+
+ descriptor.get = exportFunction(replacements[property], proto, {defineAs: `get ${property}`});
+ Object.defineProperty(proto, property, descriptor);
+ }
+
+ modifyWindow(window);
+ return port;
+}
+
+if (typeof XPCNativeWrapper !== "undefined") {
+ // make up for object element initialization inconsistencies on Firefox
+ let callbacks = new Set();
+ patchWindow.onObject = {
+ add(callback) {
+ callbacks.add(callback);
+ },
+ fire() {
+ for (let callback of [...callbacks]) {
+ callback();
+ }
+ }
+ };
+
+ const eventId = "__nscl_patchWindow_onObject__";
+ const intercepted = new WeakSet();
+ addEventListener(eventId, e => {
+ let {target} = e;
+ if (target instanceof HTMLObjectElement &&
+ target.contentWindow &&
+ !intercepted.has(target.contentWindow)) {
+ intercepted.add(target.contentWindow);
+ e.stopImmediatePropagation();
+ patchWindow.onObject.fire();
+ }
+ }, true);
+
+ if (frameElement instanceof HTMLObjectElement) {
+ frameElement.dispatchEvent(new CustomEvent(eventId));
+ }
+} \ No newline at end of file
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/lib/browser-polyfill.js b/data/extensions/jsr@javascriptrestrictor/nscl/lib/browser-polyfill.js
new file mode 100644
index 0000000..e942c99
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/lib/browser-polyfill.js
@@ -0,0 +1,1276 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define("webextension-polyfill", ["module"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(module);
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod);
+ global.browser = mod.exports;
+ }
+})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) {
+ /* webextension-polyfill - v0.8.0 - Tue Apr 20 2021 11:27:38 */
+
+ /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+ /* vim: set sts=2 sw=2 et tw=80: */
+
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ "use strict";
+
+ if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object.prototype) {
+ const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.";
+ const SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor
+ // optimization for Firefox. Since Spidermonkey does not fully parse the
+ // contents of a function until the first time it's called, and since it will
+ // never actually need to be called, this allows the polyfill to be included
+ // in Firefox nearly for free.
+
+ const wrapAPIs = extensionAPIs => {
+ // NOTE: apiMetadata is associated to the content of the api-metadata.json file
+ // at build time by replacing the following "include" with the content of the
+ // JSON file.
+ const apiMetadata = {
+ "alarms": {
+ "clear": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "clearAll": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "get": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "getAll": {
+ "minArgs": 0,
+ "maxArgs": 0
+ }
+ },
+ "bookmarks": {
+ "create": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "get": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getChildren": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getRecent": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getSubTree": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getTree": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "move": {
+ "minArgs": 2,
+ "maxArgs": 2
+ },
+ "remove": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeTree": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "search": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "update": {
+ "minArgs": 2,
+ "maxArgs": 2
+ }
+ },
+ "browserAction": {
+ "disable": {
+ "minArgs": 0,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "enable": {
+ "minArgs": 0,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "getBadgeBackgroundColor": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getBadgeText": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getPopup": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getTitle": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "openPopup": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "setBadgeBackgroundColor": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "setBadgeText": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "setIcon": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "setPopup": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "setTitle": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ }
+ },
+ "browsingData": {
+ "remove": {
+ "minArgs": 2,
+ "maxArgs": 2
+ },
+ "removeCache": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeCookies": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeDownloads": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeFormData": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeHistory": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeLocalStorage": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removePasswords": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removePluginData": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "settings": {
+ "minArgs": 0,
+ "maxArgs": 0
+ }
+ },
+ "commands": {
+ "getAll": {
+ "minArgs": 0,
+ "maxArgs": 0
+ }
+ },
+ "contextMenus": {
+ "remove": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeAll": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "update": {
+ "minArgs": 2,
+ "maxArgs": 2
+ }
+ },
+ "cookies": {
+ "get": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getAll": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getAllCookieStores": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "remove": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "set": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ },
+ "devtools": {
+ "inspectedWindow": {
+ "eval": {
+ "minArgs": 1,
+ "maxArgs": 2,
+ "singleCallbackArg": false
+ }
+ },
+ "panels": {
+ "create": {
+ "minArgs": 3,
+ "maxArgs": 3,
+ "singleCallbackArg": true
+ },
+ "elements": {
+ "createSidebarPane": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ }
+ }
+ },
+ "downloads": {
+ "cancel": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "download": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "erase": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getFileIcon": {
+ "minArgs": 1,
+ "maxArgs": 2
+ },
+ "open": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "pause": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeFile": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "resume": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "search": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "show": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ }
+ },
+ "extension": {
+ "isAllowedFileSchemeAccess": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "isAllowedIncognitoAccess": {
+ "minArgs": 0,
+ "maxArgs": 0
+ }
+ },
+ "history": {
+ "addUrl": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "deleteAll": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "deleteRange": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "deleteUrl": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getVisits": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "search": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ },
+ "i18n": {
+ "detectLanguage": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getAcceptLanguages": {
+ "minArgs": 0,
+ "maxArgs": 0
+ }
+ },
+ "identity": {
+ "launchWebAuthFlow": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ },
+ "idle": {
+ "queryState": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ },
+ "management": {
+ "get": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getAll": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "getSelf": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "setEnabled": {
+ "minArgs": 2,
+ "maxArgs": 2
+ },
+ "uninstallSelf": {
+ "minArgs": 0,
+ "maxArgs": 1
+ }
+ },
+ "notifications": {
+ "clear": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "create": {
+ "minArgs": 1,
+ "maxArgs": 2
+ },
+ "getAll": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "getPermissionLevel": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "update": {
+ "minArgs": 2,
+ "maxArgs": 2
+ }
+ },
+ "pageAction": {
+ "getPopup": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getTitle": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "hide": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "setIcon": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "setPopup": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "setTitle": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ },
+ "show": {
+ "minArgs": 1,
+ "maxArgs": 1,
+ "fallbackToNoCallback": true
+ }
+ },
+ "permissions": {
+ "contains": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getAll": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "remove": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "request": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ },
+ "runtime": {
+ "getBackgroundPage": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "getPlatformInfo": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "openOptionsPage": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "requestUpdateCheck": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "sendMessage": {
+ "minArgs": 1,
+ "maxArgs": 3
+ },
+ "sendNativeMessage": {
+ "minArgs": 2,
+ "maxArgs": 2
+ },
+ "setUninstallURL": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ },
+ "sessions": {
+ "getDevices": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "getRecentlyClosed": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "restore": {
+ "minArgs": 0,
+ "maxArgs": 1
+ }
+ },
+ "storage": {
+ "local": {
+ "clear": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "get": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "getBytesInUse": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "remove": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "set": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ },
+ "managed": {
+ "get": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "getBytesInUse": {
+ "minArgs": 0,
+ "maxArgs": 1
+ }
+ },
+ "sync": {
+ "clear": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "get": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "getBytesInUse": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "remove": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "set": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ }
+ },
+ "tabs": {
+ "captureVisibleTab": {
+ "minArgs": 0,
+ "maxArgs": 2
+ },
+ "create": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "detectLanguage": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "discard": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "duplicate": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "executeScript": {
+ "minArgs": 1,
+ "maxArgs": 2
+ },
+ "get": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getCurrent": {
+ "minArgs": 0,
+ "maxArgs": 0
+ },
+ "getZoom": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "getZoomSettings": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "goBack": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "goForward": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "highlight": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "insertCSS": {
+ "minArgs": 1,
+ "maxArgs": 2
+ },
+ "move": {
+ "minArgs": 2,
+ "maxArgs": 2
+ },
+ "query": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "reload": {
+ "minArgs": 0,
+ "maxArgs": 2
+ },
+ "remove": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "removeCSS": {
+ "minArgs": 1,
+ "maxArgs": 2
+ },
+ "sendMessage": {
+ "minArgs": 2,
+ "maxArgs": 3
+ },
+ "setZoom": {
+ "minArgs": 1,
+ "maxArgs": 2
+ },
+ "setZoomSettings": {
+ "minArgs": 1,
+ "maxArgs": 2
+ },
+ "update": {
+ "minArgs": 1,
+ "maxArgs": 2
+ }
+ },
+ "topSites": {
+ "get": {
+ "minArgs": 0,
+ "maxArgs": 0
+ }
+ },
+ "webNavigation": {
+ "getAllFrames": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "getFrame": {
+ "minArgs": 1,
+ "maxArgs": 1
+ }
+ },
+ "webRequest": {
+ "handlerBehaviorChanged": {
+ "minArgs": 0,
+ "maxArgs": 0
+ }
+ },
+ "windows": {
+ "create": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "get": {
+ "minArgs": 1,
+ "maxArgs": 2
+ },
+ "getAll": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "getCurrent": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "getLastFocused": {
+ "minArgs": 0,
+ "maxArgs": 1
+ },
+ "remove": {
+ "minArgs": 1,
+ "maxArgs": 1
+ },
+ "update": {
+ "minArgs": 2,
+ "maxArgs": 2
+ }
+ }
+ };
+
+ if (Object.keys(apiMetadata).length === 0) {
+ throw new Error("api-metadata.json has not been included in browser-polyfill");
+ }
+ /**
+ * A WeakMap subclass which creates and stores a value for any key which does
+ * not exist when accessed, but behaves exactly as an ordinary WeakMap
+ * otherwise.
+ *
+ * @param {function} createItem
+ * A function which will be called in order to create the value for any
+ * key which does not exist, the first time it is accessed. The
+ * function receives, as its only argument, the key being created.
+ */
+
+
+ class DefaultWeakMap extends WeakMap {
+ constructor(createItem, items = undefined) {
+ super(items);
+ this.createItem = createItem;
+ }
+
+ get(key) {
+ if (!this.has(key)) {
+ this.set(key, this.createItem(key));
+ }
+
+ return super.get(key);
+ }
+
+ }
+ /**
+ * Returns true if the given object is an object with a `then` method, and can
+ * therefore be assumed to behave as a Promise.
+ *
+ * @param {*} value The value to test.
+ * @returns {boolean} True if the value is thenable.
+ */
+
+
+ const isThenable = value => {
+ return value && typeof value === "object" && typeof value.then === "function";
+ };
+ /**
+ * Creates and returns a function which, when called, will resolve or reject
+ * the given promise based on how it is called:
+ *
+ * - If, when called, `chrome.runtime.lastError` contains a non-null object,
+ * the promise is rejected with that value.
+ * - If the function is called with exactly one argument, the promise is
+ * resolved to that value.
+ * - Otherwise, the promise is resolved to an array containing all of the
+ * function's arguments.
+ *
+ * @param {object} promise
+ * An object containing the resolution and rejection functions of a
+ * promise.
+ * @param {function} promise.resolve
+ * The promise's resolution function.
+ * @param {function} promise.reject
+ * The promise's rejection function.
+ * @param {object} metadata
+ * Metadata about the wrapped method which has created the callback.
+ * @param {boolean} metadata.singleCallbackArg
+ * Whether or not the promise is resolved with only the first
+ * argument of the callback, alternatively an array of all the
+ * callback arguments is resolved. By default, if the callback
+ * function is invoked with only a single argument, that will be
+ * resolved to the promise, while all arguments will be resolved as
+ * an array if multiple are given.
+ *
+ * @returns {function}
+ * The generated callback function.
+ */
+
+
+ const makeCallback = (promise, metadata) => {
+ return (...callbackArgs) => {
+ if (extensionAPIs.runtime.lastError) {
+ promise.reject(new Error(extensionAPIs.runtime.lastError.message));
+ } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
+ promise.resolve(callbackArgs[0]);
+ } else {
+ promise.resolve(callbackArgs);
+ }
+ };
+ };
+
+ const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments";
+ /**
+ * Creates a wrapper function for a method with the given name and metadata.
+ *
+ * @param {string} name
+ * The name of the method which is being wrapped.
+ * @param {object} metadata
+ * Metadata about the method being wrapped.
+ * @param {integer} metadata.minArgs
+ * The minimum number of arguments which must be passed to the
+ * function. If called with fewer than this number of arguments, the
+ * wrapper will raise an exception.
+ * @param {integer} metadata.maxArgs
+ * The maximum number of arguments which may be passed to the
+ * function. If called with more than this number of arguments, the
+ * wrapper will raise an exception.
+ * @param {boolean} metadata.singleCallbackArg
+ * Whether or not the promise is resolved with only the first
+ * argument of the callback, alternatively an array of all the
+ * callback arguments is resolved. By default, if the callback
+ * function is invoked with only a single argument, that will be
+ * resolved to the promise, while all arguments will be resolved as
+ * an array if multiple are given.
+ *
+ * @returns {function(object, ...*)}
+ * The generated wrapper function.
+ */
+
+
+ const wrapAsyncFunction = (name, metadata) => {
+ return function asyncFunctionWrapper(target, ...args) {
+ if (args.length < metadata.minArgs) {
+ throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
+ }
+
+ if (args.length > metadata.maxArgs) {
+ throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
+ }
+
+ return new Promise((resolve, reject) => {
+ if (metadata.fallbackToNoCallback) {
+ // This API method has currently no callback on Chrome, but it return a promise on Firefox,
+ // and so the polyfill will try to call it with a callback first, and it will fallback
+ // to not passing the callback if the first call fails.
+ try {
+ target[name](...args, makeCallback({
+ resolve,
+ reject
+ }, metadata));
+ } catch (cbError) {
+ console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError);
+ target[name](...args); // Update the API method metadata, so that the next API calls will not try to
+ // use the unsupported callback anymore.
+
+ metadata.fallbackToNoCallback = false;
+ metadata.noCallback = true;
+ resolve();
+ }
+ } else if (metadata.noCallback) {
+ target[name](...args);
+ resolve();
+ } else {
+ target[name](...args, makeCallback({
+ resolve,
+ reject
+ }, metadata));
+ }
+ });
+ };
+ };
+ /**
+ * Wraps an existing method of the target object, so that calls to it are
+ * intercepted by the given wrapper function. The wrapper function receives,
+ * as its first argument, the original `target` object, followed by each of
+ * the arguments passed to the original method.
+ *
+ * @param {object} target
+ * The original target object that the wrapped method belongs to.
+ * @param {function} method
+ * The method being wrapped. This is used as the target of the Proxy
+ * object which is created to wrap the method.
+ * @param {function} wrapper
+ * The wrapper function which is called in place of a direct invocation
+ * of the wrapped method.
+ *
+ * @returns {Proxy<function>}
+ * A Proxy object for the given method, which invokes the given wrapper
+ * method in its place.
+ */
+
+
+ const wrapMethod = (target, method, wrapper) => {
+ return new Proxy(method, {
+ apply(targetMethod, thisObj, args) {
+ return wrapper.call(thisObj, target, ...args);
+ }
+
+ });
+ };
+
+ let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
+ /**
+ * Wraps an object in a Proxy which intercepts and wraps certain methods
+ * based on the given `wrappers` and `metadata` objects.
+ *
+ * @param {object} target
+ * The target object to wrap.
+ *
+ * @param {object} [wrappers = {}]
+ * An object tree containing wrapper functions for special cases. Any
+ * function present in this object tree is called in place of the
+ * method in the same location in the `target` object tree. These
+ * wrapper methods are invoked as described in {@see wrapMethod}.
+ *
+ * @param {object} [metadata = {}]
+ * An object tree containing metadata used to automatically generate
+ * Promise-based wrapper functions for asynchronous. Any function in
+ * the `target` object tree which has a corresponding metadata object
+ * in the same location in the `metadata` tree is replaced with an
+ * automatically-generated wrapper function, as described in
+ * {@see wrapAsyncFunction}
+ *
+ * @returns {Proxy<object>}
+ */
+
+ const wrapObject = (target, wrappers = {}, metadata = {}) => {
+ let cache = Object.create(null);
+ let handlers = {
+ has(proxyTarget, prop) {
+ return prop in target || prop in cache;
+ },
+
+ get(proxyTarget, prop, receiver) {
+ if (prop in cache) {
+ return cache[prop];
+ }
+
+ if (!(prop in target)) {
+ return undefined;
+ }
+
+ let value = target[prop];
+
+ if (typeof value === "function") {
+ // This is a method on the underlying object. Check if we need to do
+ // any wrapping.
+ if (typeof wrappers[prop] === "function") {
+ // We have a special-case wrapper for this method.
+ value = wrapMethod(target, target[prop], wrappers[prop]);
+ } else if (hasOwnProperty(metadata, prop)) {
+ // This is an async method that we have metadata for. Create a
+ // Promise wrapper for it.
+ let wrapper = wrapAsyncFunction(prop, metadata[prop]);
+ value = wrapMethod(target, target[prop], wrapper);
+ } else {
+ // This is a method that we don't know or care about. Return the
+ // original method, bound to the underlying object.
+ value = value.bind(target);
+ }
+ } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {
+ // This is an object that we need to do some wrapping for the children
+ // of. Create a sub-object wrapper for it with the appropriate child
+ // metadata.
+ value = wrapObject(value, wrappers[prop], metadata[prop]);
+ } else if (hasOwnProperty(metadata, "*")) {
+ // Wrap all properties in * namespace.
+ value = wrapObject(value, wrappers[prop], metadata["*"]);
+ } else {
+ // We don't need to do any wrapping for this property,
+ // so just forward all access to the underlying object.
+ Object.defineProperty(cache, prop, {
+ configurable: true,
+ enumerable: true,
+
+ get() {
+ return target[prop];
+ },
+
+ set(value) {
+ target[prop] = value;
+ }
+
+ });
+ return value;
+ }
+
+ cache[prop] = value;
+ return value;
+ },
+
+ set(proxyTarget, prop, value, receiver) {
+ if (prop in cache) {
+ cache[prop] = value;
+ } else {
+ target[prop] = value;
+ }
+
+ return true;
+ },
+
+ defineProperty(proxyTarget, prop, desc) {
+ return Reflect.defineProperty(cache, prop, desc);
+ },
+
+ deleteProperty(proxyTarget, prop) {
+ return Reflect.deleteProperty(cache, prop);
+ }
+
+ }; // Per contract of the Proxy API, the "get" proxy handler must return the
+ // original value of the target if that value is declared read-only and
+ // non-configurable. For this reason, we create an object with the
+ // prototype set to `target` instead of using `target` directly.
+ // Otherwise we cannot return a custom object for APIs that
+ // are declared read-only and non-configurable, such as `chrome.devtools`.
+ //
+ // The proxy handlers themselves will still use the original `target`
+ // instead of the `proxyTarget`, so that the methods and properties are
+ // dereferenced via the original targets.
+
+ let proxyTarget = Object.create(target);
+ return new Proxy(proxyTarget, handlers);
+ };
+ /**
+ * Creates a set of wrapper functions for an event object, which handles
+ * wrapping of listener functions that those messages are passed.
+ *
+ * A single wrapper is created for each listener function, and stored in a
+ * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`
+ * retrieve the original wrapper, so that attempts to remove a
+ * previously-added listener work as expected.
+ *
+ * @param {DefaultWeakMap<function, function>} wrapperMap
+ * A DefaultWeakMap object which will create the appropriate wrapper
+ * for a given listener function when one does not exist, and retrieve
+ * an existing one when it does.
+ *
+ * @returns {object}
+ */
+
+
+ const wrapEvent = wrapperMap => ({
+ addListener(target, listener, ...args) {
+ target.addListener(wrapperMap.get(listener), ...args);
+ },
+
+ hasListener(target, listener) {
+ return target.hasListener(wrapperMap.get(listener));
+ },
+
+ removeListener(target, listener) {
+ target.removeListener(wrapperMap.get(listener));
+ }
+
+ });
+
+ const onRequestFinishedWrappers = new DefaultWeakMap(listener => {
+ if (typeof listener !== "function") {
+ return listener;
+ }
+ /**
+ * Wraps an onRequestFinished listener function so that it will return a
+ * `getContent()` property which returns a `Promise` rather than using a
+ * callback API.
+ *
+ * @param {object} req
+ * The HAR entry object representing the network request.
+ */
+
+
+ return function onRequestFinished(req) {
+ const wrappedReq = wrapObject(req, {}
+ /* wrappers */
+ , {
+ getContent: {
+ minArgs: 0,
+ maxArgs: 0
+ }
+ });
+ listener(wrappedReq);
+ };
+ }); // Keep track if the deprecation warning has been logged at least once.
+
+ let loggedSendResponseDeprecationWarning = false;
+ const onMessageWrappers = new DefaultWeakMap(listener => {
+ if (typeof listener !== "function") {
+ return listener;
+ }
+ /**
+ * Wraps a message listener function so that it may send responses based on
+ * its return value, rather than by returning a sentinel value and calling a
+ * callback. If the listener function returns a Promise, the response is
+ * sent when the promise either resolves or rejects.
+ *
+ * @param {*} message
+ * The message sent by the other end of the channel.
+ * @param {object} sender
+ * Details about the sender of the message.
+ * @param {function(*)} sendResponse
+ * A callback which, when called with an arbitrary argument, sends
+ * that value as a response.
+ * @returns {boolean}
+ * True if the wrapped listener returned a Promise, which will later
+ * yield a response. False otherwise.
+ */
+
+
+ return function onMessage(message, sender, sendResponse) {
+ let didCallSendResponse = false;
+ let wrappedSendResponse;
+ let sendResponsePromise = new Promise(resolve => {
+ wrappedSendResponse = function (response) {
+ if (!loggedSendResponseDeprecationWarning) {
+ console.warn(SEND_RESPONSE_DEPRECATION_WARNING, new Error().stack);
+ loggedSendResponseDeprecationWarning = true;
+ }
+
+ didCallSendResponse = true;
+ resolve(response);
+ };
+ });
+ let result;
+
+ try {
+ result = listener(message, sender, wrappedSendResponse);
+ } catch (err) {
+ result = Promise.reject(err);
+ }
+
+ const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called
+ // wrappedSendResponse synchronously, we can exit earlier
+ // because there will be no response sent from this listener.
+
+ if (result !== true && !isResultThenable && !didCallSendResponse) {
+ return false;
+ } // A small helper to send the message if the promise resolves
+ // and an error if the promise rejects (a wrapped sendMessage has
+ // to translate the message into a resolved promise or a rejected
+ // promise).
+
+
+ const sendPromisedResult = promise => {
+ promise.then(msg => {
+ // send the message value.
+ sendResponse(msg);
+ }, error => {
+ // Send a JSON representation of the error if the rejected value
+ // is an instance of error, or the object itself otherwise.
+ let message;
+
+ if (error && (error instanceof Error || typeof error.message === "string")) {
+ message = error.message;
+ } else {
+ message = "An unexpected error occurred";
+ }
+
+ sendResponse({
+ __mozWebExtensionPolyfillReject__: true,
+ message
+ });
+ }).catch(err => {
+ // Print an error on the console if unable to send the response.
+ console.error("Failed to send onMessage rejected reply", err);
+ });
+ }; // If the listener returned a Promise, send the resolved value as a
+ // result, otherwise wait the promise related to the wrappedSendResponse
+ // callback to resolve and send it as a response.
+
+
+ if (isResultThenable) {
+ sendPromisedResult(result);
+ } else {
+ sendPromisedResult(sendResponsePromise);
+ } // Let Chrome know that the listener is replying.
+
+
+ return true;
+ };
+ });
+
+ const wrappedSendMessageCallback = ({
+ reject,
+ resolve
+ }, reply) => {
+ if (extensionAPIs.runtime.lastError) {
+ // Detect when none of the listeners replied to the sendMessage call and resolve
+ // the promise to undefined as in Firefox.
+ // See https://github.com/mozilla/webextension-polyfill/issues/130
+ if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
+ resolve();
+ } else {
+ reject(new Error(extensionAPIs.runtime.lastError.message));
+ }
+ } else if (reply && reply.__mozWebExtensionPolyfillReject__) {
+ // Convert back the JSON representation of the error into
+ // an Error instance.
+ reject(new Error(reply.message));
+ } else {
+ resolve(reply);
+ }
+ };
+
+ const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
+ if (args.length < metadata.minArgs) {
+ throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
+ }
+
+ if (args.length > metadata.maxArgs) {
+ throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
+ }
+
+ return new Promise((resolve, reject) => {
+ const wrappedCb = wrappedSendMessageCallback.bind(null, {
+ resolve,
+ reject
+ });
+ args.push(wrappedCb);
+ apiNamespaceObj.sendMessage(...args);
+ });
+ };
+
+ const staticWrappers = {
+ devtools: {
+ network: {
+ onRequestFinished: wrapEvent(onRequestFinishedWrappers)
+ }
+ },
+ runtime: {
+ onMessage: wrapEvent(onMessageWrappers),
+ onMessageExternal: wrapEvent(onMessageWrappers),
+ sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
+ minArgs: 1,
+ maxArgs: 3
+ })
+ },
+ tabs: {
+ sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
+ minArgs: 2,
+ maxArgs: 3
+ })
+ }
+ };
+ const settingMetadata = {
+ clear: {
+ minArgs: 1,
+ maxArgs: 1
+ },
+ get: {
+ minArgs: 1,
+ maxArgs: 1
+ },
+ set: {
+ minArgs: 1,
+ maxArgs: 1
+ }
+ };
+ apiMetadata.privacy = {
+ network: {
+ "*": settingMetadata
+ },
+ services: {
+ "*": settingMetadata
+ },
+ websites: {
+ "*": settingMetadata
+ }
+ };
+ return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
+ };
+
+ if (typeof chrome != "object" || !chrome || !chrome.runtime || !chrome.runtime.id) {
+ throw new Error("This script should only be loaded in a browser extension.");
+ } // The build process adds a UMD wrapper around this file, which makes the
+ // `module` variable available.
+
+
+ module.exports = wrapAPIs(chrome);
+ } else {
+ module.exports = browser;
+ }
+});
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/lib/sha256.js b/data/extensions/jsr@javascriptrestrictor/nscl/lib/sha256.js
new file mode 100644
index 0000000..14bcf45
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/lib/sha256.js
@@ -0,0 +1,518 @@
+/**
+ * [js-sha256]{@link https://github.com/emn178/js-sha256}
+ *
+ * @version 0.9.0
+ * @author Chen, Yi-Cyuan [emn178@gmail.com]
+ * @copyright Chen, Yi-Cyuan 2014-2017
+ * @license MIT
+ */
+/*jslint bitwise: true */
+(function () {
+ 'use strict';
+
+ var ERROR = 'input is invalid type';
+ var WINDOW = typeof window === 'object';
+ var root = WINDOW ? window : {};
+ if (root.JS_SHA256_NO_WINDOW) {
+ WINDOW = false;
+ }
+ var WEB_WORKER = !WINDOW && typeof self === 'object';
+ var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
+ if (NODE_JS) {
+ root = global;
+ } else if (WEB_WORKER) {
+ root = self;
+ }
+ var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports;
+ var AMD = typeof define === 'function' && define.amd;
+ var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
+ var HEX_CHARS = '0123456789abcdef'.split('');
+ var EXTRA = [-2147483648, 8388608, 32768, 128];
+ var SHIFT = [24, 16, 8, 0];
+ var K = [
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+ ];
+ var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
+
+ var blocks = [];
+
+ if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
+ Array.isArray = function (obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+ };
+ }
+
+ if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
+ ArrayBuffer.isView = function (obj) {
+ return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
+ };
+ }
+
+ var createOutputMethod = function (outputType, is224) {
+ return function (message) {
+ return new Sha256(is224, true).update(message)[outputType]();
+ };
+ };
+
+ var createMethod = function (is224) {
+ var method = createOutputMethod('hex', is224);
+ if (NODE_JS) {
+ method = nodeWrap(method, is224);
+ }
+ method.create = function () {
+ return new Sha256(is224);
+ };
+ method.update = function (message) {
+ return method.create().update(message);
+ };
+ for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
+ var type = OUTPUT_TYPES[i];
+ method[type] = createOutputMethod(type, is224);
+ }
+ return method;
+ };
+
+ var nodeWrap = function (method, is224) {
+ var crypto = eval("require('crypto')");
+ var Buffer = eval("require('buffer').Buffer");
+ var algorithm = is224 ? 'sha224' : 'sha256';
+ var nodeMethod = function (message) {
+ if (typeof message === 'string') {
+ return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
+ } else {
+ if (message === null || message === undefined) {
+ throw new Error(ERROR);
+ } else if (message.constructor === ArrayBuffer) {
+ message = new Uint8Array(message);
+ }
+ }
+ if (Array.isArray(message) || ArrayBuffer.isView(message) ||
+ message.constructor === Buffer) {
+ return crypto.createHash(algorithm).update(new Buffer(message)).digest('hex');
+ } else {
+ return method(message);
+ }
+ };
+ return nodeMethod;
+ };
+
+ var createHmacOutputMethod = function (outputType, is224) {
+ return function (key, message) {
+ return new HmacSha256(key, is224, true).update(message)[outputType]();
+ };
+ };
+
+ var createHmacMethod = function (is224) {
+ var method = createHmacOutputMethod('hex', is224);
+ method.create = function (key) {
+ return new HmacSha256(key, is224);
+ };
+ method.update = function (key, message) {
+ return method.create(key).update(message);
+ };
+ for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
+ var type = OUTPUT_TYPES[i];
+ method[type] = createHmacOutputMethod(type, is224);
+ }
+ return method;
+ };
+
+ function Sha256(is224, sharedMemory) {
+ if (sharedMemory) {
+ blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+ blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+ blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+ blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+ this.blocks = blocks;
+ } else {
+ this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+ }
+
+ if (is224) {
+ this.h0 = 0xc1059ed8;
+ this.h1 = 0x367cd507;
+ this.h2 = 0x3070dd17;
+ this.h3 = 0xf70e5939;
+ this.h4 = 0xffc00b31;
+ this.h5 = 0x68581511;
+ this.h6 = 0x64f98fa7;
+ this.h7 = 0xbefa4fa4;
+ } else { // 256
+ this.h0 = 0x6a09e667;
+ this.h1 = 0xbb67ae85;
+ this.h2 = 0x3c6ef372;
+ this.h3 = 0xa54ff53a;
+ this.h4 = 0x510e527f;
+ this.h5 = 0x9b05688c;
+ this.h6 = 0x1f83d9ab;
+ this.h7 = 0x5be0cd19;
+ }
+
+ this.block = this.start = this.bytes = this.hBytes = 0;
+ this.finalized = this.hashed = false;
+ this.first = true;
+ this.is224 = is224;
+ }
+
+ Sha256.prototype.update = function (message) {
+ if (this.finalized) {
+ return;
+ }
+ var notString, type = typeof message;
+ if (type !== 'string') {
+ if (type === 'object') {
+ if (message === null) {
+ throw new Error(ERROR);
+ } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
+ message = new Uint8Array(message);
+ } else if (!Array.isArray(message)) {
+ if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
+ throw new Error(ERROR);
+ }
+ }
+ } else {
+ throw new Error(ERROR);
+ }
+ notString = true;
+ }
+ var code, index = 0, i, length = message.length, blocks = this.blocks;
+
+ while (index < length) {
+ if (this.hashed) {
+ this.hashed = false;
+ blocks[0] = this.block;
+ blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+ blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+ blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+ blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+ }
+
+ if (notString) {
+ for (i = this.start; index < length && i < 64; ++index) {
+ blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
+ }
+ } else {
+ for (i = this.start; index < length && i < 64; ++index) {
+ code = message.charCodeAt(index);
+ if (code < 0x80) {
+ blocks[i >> 2] |= code << SHIFT[i++ & 3];
+ } else if (code < 0x800) {
+ blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+ } else if (code < 0xd800 || code >= 0xe000) {
+ blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+ } else {
+ code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
+ blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+ }
+ }
+ }
+
+ this.lastByteIndex = i;
+ this.bytes += i - this.start;
+ if (i >= 64) {
+ this.block = blocks[16];
+ this.start = i - 64;
+ this.hash();
+ this.hashed = true;
+ } else {
+ this.start = i;
+ }
+ }
+ if (this.bytes > 4294967295) {
+ this.hBytes += this.bytes / 4294967296 << 0;
+ this.bytes = this.bytes % 4294967296;
+ }
+ return this;
+ };
+
+ Sha256.prototype.finalize = function () {
+ if (this.finalized) {
+ return;
+ }
+ this.finalized = true;
+ var blocks = this.blocks, i = this.lastByteIndex;
+ blocks[16] = this.block;
+ blocks[i >> 2] |= EXTRA[i & 3];
+ this.block = blocks[16];
+ if (i >= 56) {
+ if (!this.hashed) {
+ this.hash();
+ }
+ blocks[0] = this.block;
+ blocks[16] = blocks[1] = blocks[2] = blocks[3] =
+ blocks[4] = blocks[5] = blocks[6] = blocks[7] =
+ blocks[8] = blocks[9] = blocks[10] = blocks[11] =
+ blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
+ }
+ blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
+ blocks[15] = this.bytes << 3;
+ this.hash();
+ };
+
+ Sha256.prototype.hash = function () {
+ var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,
+ h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
+
+ for (j = 16; j < 64; ++j) {
+ // rightrotate
+ t1 = blocks[j - 15];
+ s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
+ t1 = blocks[j - 2];
+ s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
+ blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
+ }
+
+ bc = b & c;
+ for (j = 0; j < 64; j += 4) {
+ if (this.first) {
+ if (this.is224) {
+ ab = 300032;
+ t1 = blocks[0] - 1413257819;
+ h = t1 - 150054599 << 0;
+ d = t1 + 24177077 << 0;
+ } else {
+ ab = 704751109;
+ t1 = blocks[0] - 210244248;
+ h = t1 - 1521486534 << 0;
+ d = t1 + 143694565 << 0;
+ }
+ this.first = false;
+ } else {
+ s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
+ s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
+ ab = a & b;
+ maj = ab ^ (a & c) ^ bc;
+ ch = (e & f) ^ (~e & g);
+ t1 = h + s1 + ch + K[j] + blocks[j];
+ t2 = s0 + maj;
+ h = d + t1 << 0;
+ d = t1 + t2 << 0;
+ }
+ s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
+ s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
+ da = d & a;
+ maj = da ^ (d & b) ^ ab;
+ ch = (h & e) ^ (~h & f);
+ t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
+ t2 = s0 + maj;
+ g = c + t1 << 0;
+ c = t1 + t2 << 0;
+ s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
+ s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
+ cd = c & d;
+ maj = cd ^ (c & a) ^ da;
+ ch = (g & h) ^ (~g & e);
+ t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
+ t2 = s0 + maj;
+ f = b + t1 << 0;
+ b = t1 + t2 << 0;
+ s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
+ s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
+ bc = b & c;
+ maj = bc ^ (b & d) ^ cd;
+ ch = (f & g) ^ (~f & h);
+ t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
+ t2 = s0 + maj;
+ e = a + t1 << 0;
+ a = t1 + t2 << 0;
+ }
+
+ this.h0 = this.h0 + a << 0;
+ this.h1 = this.h1 + b << 0;
+ this.h2 = this.h2 + c << 0;
+ this.h3 = this.h3 + d << 0;
+ this.h4 = this.h4 + e << 0;
+ this.h5 = this.h5 + f << 0;
+ this.h6 = this.h6 + g << 0;
+ this.h7 = this.h7 + h << 0;
+ };
+
+ Sha256.prototype.hex = function () {
+ this.finalize();
+
+ var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
+ h6 = this.h6, h7 = this.h7;
+
+ var hex = HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
+ HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
+ HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
+ HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
+ HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
+ HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
+ HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
+ HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
+ HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
+ HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
+ HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
+ HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
+ HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F] +
+ HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
+ HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
+ HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
+ HEX_CHARS[(h4 >> 28) & 0x0F] + HEX_CHARS[(h4 >> 24) & 0x0F] +
+ HEX_CHARS[(h4 >> 20) & 0x0F] + HEX_CHARS[(h4 >> 16) & 0x0F] +
+ HEX_CHARS[(h4 >> 12) & 0x0F] + HEX_CHARS[(h4 >> 8) & 0x0F] +
+ HEX_CHARS[(h4 >> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +
+ HEX_CHARS[(h5 >> 28) & 0x0F] + HEX_CHARS[(h5 >> 24) & 0x0F] +
+ HEX_CHARS[(h5 >> 20) & 0x0F] + HEX_CHARS[(h5 >> 16) & 0x0F] +
+ HEX_CHARS[(h5 >> 12) & 0x0F] + HEX_CHARS[(h5 >> 8) & 0x0F] +
+ HEX_CHARS[(h5 >> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +
+ HEX_CHARS[(h6 >> 28) & 0x0F] + HEX_CHARS[(h6 >> 24) & 0x0F] +
+ HEX_CHARS[(h6 >> 20) & 0x0F] + HEX_CHARS[(h6 >> 16) & 0x0F] +
+ HEX_CHARS[(h6 >> 12) & 0x0F] + HEX_CHARS[(h6 >> 8) & 0x0F] +
+ HEX_CHARS[(h6 >> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
+ if (!this.is224) {
+ hex += HEX_CHARS[(h7 >> 28) & 0x0F] + HEX_CHARS[(h7 >> 24) & 0x0F] +
+ HEX_CHARS[(h7 >> 20) & 0x0F] + HEX_CHARS[(h7 >> 16) & 0x0F] +
+ HEX_CHARS[(h7 >> 12) & 0x0F] + HEX_CHARS[(h7 >> 8) & 0x0F] +
+ HEX_CHARS[(h7 >> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];
+ }
+ return hex;
+ };
+
+ Sha256.prototype.toString = Sha256.prototype.hex;
+
+ Sha256.prototype.digest = function () {
+ this.finalize();
+
+ var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
+ h6 = this.h6, h7 = this.h7;
+
+ var arr = [
+ (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, h0 & 0xFF,
+ (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, h1 & 0xFF,
+ (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, h2 & 0xFF,
+ (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, h3 & 0xFF,
+ (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, h4 & 0xFF,
+ (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, h5 & 0xFF,
+ (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, h6 & 0xFF
+ ];
+ if (!this.is224) {
+ arr.push((h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, h7 & 0xFF);
+ }
+ return arr;
+ };
+
+ Sha256.prototype.array = Sha256.prototype.digest;
+
+ Sha256.prototype.arrayBuffer = function () {
+ this.finalize();
+
+ var buffer = new ArrayBuffer(this.is224 ? 28 : 32);
+ var dataView = new DataView(buffer);
+ dataView.setUint32(0, this.h0);
+ dataView.setUint32(4, this.h1);
+ dataView.setUint32(8, this.h2);
+ dataView.setUint32(12, this.h3);
+ dataView.setUint32(16, this.h4);
+ dataView.setUint32(20, this.h5);
+ dataView.setUint32(24, this.h6);
+ if (!this.is224) {
+ dataView.setUint32(28, this.h7);
+ }
+ return buffer;
+ };
+
+ function HmacSha256(key, is224, sharedMemory) {
+ var i, type = typeof key;
+ if (type === 'string') {
+ var bytes = [], length = key.length, index = 0, code;
+ for (i = 0; i < length; ++i) {
+ code = key.charCodeAt(i);
+ if (code < 0x80) {
+ bytes[index++] = code;
+ } else if (code < 0x800) {
+ bytes[index++] = (0xc0 | (code >> 6));
+ bytes[index++] = (0x80 | (code & 0x3f));
+ } else if (code < 0xd800 || code >= 0xe000) {
+ bytes[index++] = (0xe0 | (code >> 12));
+ bytes[index++] = (0x80 | ((code >> 6) & 0x3f));
+ bytes[index++] = (0x80 | (code & 0x3f));
+ } else {
+ code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));
+ bytes[index++] = (0xf0 | (code >> 18));
+ bytes[index++] = (0x80 | ((code >> 12) & 0x3f));
+ bytes[index++] = (0x80 | ((code >> 6) & 0x3f));
+ bytes[index++] = (0x80 | (code & 0x3f));
+ }
+ }
+ key = bytes;
+ } else {
+ if (type === 'object') {
+ if (key === null) {
+ throw new Error(ERROR);
+ } else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {
+ key = new Uint8Array(key);
+ } else if (!Array.isArray(key)) {
+ if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {
+ throw new Error(ERROR);
+ }
+ }
+ } else {
+ throw new Error(ERROR);
+ }
+ }
+
+ if (key.length > 64) {
+ key = (new Sha256(is224, true)).update(key).array();
+ }
+
+ var oKeyPad = [], iKeyPad = [];
+ for (i = 0; i < 64; ++i) {
+ var b = key[i] || 0;
+ oKeyPad[i] = 0x5c ^ b;
+ iKeyPad[i] = 0x36 ^ b;
+ }
+
+ Sha256.call(this, is224, sharedMemory);
+
+ this.update(iKeyPad);
+ this.oKeyPad = oKeyPad;
+ this.inner = true;
+ this.sharedMemory = sharedMemory;
+ }
+ HmacSha256.prototype = new Sha256();
+
+ HmacSha256.prototype.finalize = function () {
+ Sha256.prototype.finalize.call(this);
+ if (this.inner) {
+ this.inner = false;
+ var innerHash = this.array();
+ Sha256.call(this, this.is224, this.sharedMemory);
+ this.update(this.oKeyPad);
+ this.update(innerHash);
+ Sha256.prototype.finalize.call(this);
+ }
+ };
+
+ var exports = createMethod();
+ exports.sha256 = exports;
+ exports.sha224 = createMethod(true);
+ exports.sha256.hmac = createHmacMethod();
+ exports.sha224.hmac = createHmacMethod(true);
+
+ if (COMMON_JS) {
+ module.exports = exports;
+ } else {
+ root.sha256 = exports.sha256;
+ root.sha224 = exports.sha224;
+ if (AMD) {
+ define(function () {
+ return exports;
+ });
+ }
+ }
+})();
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js b/data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js
new file mode 100644
index 0000000..aae8e38
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js
@@ -0,0 +1,221 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+// depends on /nscl/lib/sha256.js
+// depends on /nscl/common/uuid.js
+
+"use strict";
+
+var DocStartInjection = (() => {
+ const MSG_ID = "__DocStartInjection__";
+ let repeating = !("contentScripts" in browser);
+ let scriptBuilders = new Set();
+ let getId = ({requestId, tabId, frameId, url}) => requestId || `${tabId}:${frameId}:${url}`;
+ let pending = new Map();
+
+ function onMessage(msg, sender) {
+ let payload = msg[MSG_ID];
+ if (!payload) return;
+ let {id, tabId, frameId, url} = payload;
+ let ret = false;
+ if (tabId === sender.tab.id && frameId === sender.frameId && url === sender.url) {
+ end(payload, true);
+ ret = true;
+ }
+ return Promise.resolve(ret);
+ }
+
+ async function begin(request) {
+ let scripts = new Set();
+ let {tabId, frameId, url} = request;
+ if (tabId < 0 || !/^(?:(?:https?|ftp|data|blob|file):|about:blank$)/.test(url)) return;
+
+ await Promise.all([...scriptBuilders].map(async buildScript => {
+ try {
+ let script = await buildScript({tabId, frameId, url});
+ if (script) scripts.add(`try {
+ ${typeof script === "function" ? `(${script})();` : script}
+ } catch (e) {
+ console.error("Error in DocStartInjection script", e);
+ }`);
+ } catch (e) {
+ error("Error calling DocStartInjection scriptBuilder", buildScript, e);
+ }
+ }));
+
+ if (scripts.size === 0) {
+ debug(`DocStartInjection: no script to inject in ${url}`);
+ return;
+ }
+
+ let id = getId(request);
+
+ if (repeating) {
+ let scriptsBlock = [...scripts].join("\n");
+ let injectionId = `injection:${uuid()}:${sha256(scriptsBlock)}`;
+ let args = {
+ code: `(() => {
+ let injectionId = ${JSON.stringify(injectionId)};
+ if (document.readyState === "complete" ||
+ window[injectionId] ||
+ document.URL !== ${JSON.stringify(url)}
+ ) return window[injectionId];
+ window[injectionId] = true;
+ ${scriptsBlock}
+ return document.readyState === "loading";
+ })();`,
+ runAt: "document_start",
+ frameId,
+ };
+ pending.set(id, args);
+ await run(request, true);
+ } else {
+ let matches = [url];
+ try {
+ let urlObj = new URL(url);
+ if (urlObj.port) {
+ urlObj.port = "";
+ matches[0] = urlObj.toString();
+ }
+ } catch (e) {}
+
+ let ackMsg = JSON.stringify({
+ [MSG_ID]: {id, tabId, frameId, url}
+ });
+ scripts.add(`if (document.readyState !== "complete") browser.runtime.sendMessage(${ackMsg});`);
+
+ let options = {
+ js: [...scripts].map(code => ({code})),
+ runAt: "document_start",
+ matchAboutBlank: true,
+ matches,
+ allFrames: true,
+ };
+ let current = pending.get(id);
+ if (current) {
+ current.unregister();
+ }
+ pending.set(id, await browser.contentScripts.register(options));
+ }
+ }
+
+ async function run(request, repeat = false) {
+ let id = getId(request);
+ let args = pending.get(id);
+ if (!args) return;
+ let {url, tabId} = request;
+ let attempts = 0, success = false;
+ for (; pending.has(id);) {
+ attempts++;
+ try {
+ if (attempts % 1000 === 0) {
+ let tab = await browser.tabs.get(request.tabId);
+ if (tab.url !== url) {
+ console.error(`Tab mismatch: ${tab.url} <> ${url} (download-triggered?)`);
+ break;
+ }
+ console.error(`DocStartInjection at ${url} ${attempts} failed attempts so far...`);
+ }
+ let ret = await browser.tabs.executeScript(tabId, args);
+ if (success = ret[0]) {
+ break;
+ }
+ } catch (e) {
+ if (/No tab\b/.test(e.message)) {
+ break;
+ }
+ if (!/\baccess\b/.test(e.message)) {
+ console.error(e.message);
+ }
+ if (attempts % 1000 === 0) {
+ console.error(`DocStartInjection at ${url} ${attempts} failed attempts`, e);
+ }
+ } finally {
+ if (!repeat) break;
+ }
+ }
+ pending.delete(id);
+ debug(`DocStartInjection at ${url}, ${attempts} attempts, success = ${success}, repeat = ${repeat}.`);
+ }
+
+ function end(request, immediate = false) {
+ let id = getId(request);
+ let script = pending.get(id);
+ if (script) {
+ if (repeating) {
+ run(request, false);
+ } else {
+ pending.delete(id);
+ if (immediate) {
+ script.unregister();
+ } else {
+ setTimeout(() => script.unregister(), 500);
+ }
+ }
+ }
+ }
+
+ let listeners = {
+ onBeforeNavigate: begin,
+ onErrorOccurred: end,
+ onCompleted: end,
+ }
+
+ function listen(enabled) {
+ let {webNavigation, webRequest} = browser;
+ let method = `${enabled ? "add" : "remove"}Listener`;
+ let reqFilter = {urls: ["<all_urls>"], types: ["main_frame", "sub_frame", "object"]};
+ function setup(api, eventName, listener, ...args) {
+ let event = api[eventName];
+ if (event) {
+ event[method].apply(event, enabled ? [listener, ...args] : [listener]);
+ }
+ }
+ if (repeating) {
+ // Just Chromium
+ setup(webRequest, "onResponseStarted", begin, reqFilter);
+ } else {
+ // add or remove Firefox's webNavigation listeners for non-http loads
+ // and asynchronous blocking onHeadersReceived for registration on http
+ let navFilter = enabled && {url: [{schemes: ["file", "ftp"]}]};
+ for (let [eventName, listener] of Object.entries(listeners)) {
+ setup(webNavigation, eventName, listener, navFilter)
+ }
+ setup(webRequest, "onHeadersReceived", begin, reqFilter, ["blocking"]);
+ browser.runtime.onMessage[method](onMessage);
+ }
+
+ // add or remove common webRequest listener
+ for (let [eventName, listener] of Object.entries(listeners)) {
+ setup(webRequest, eventName, listener, reqFilter);
+ }
+ }
+
+ return {
+ register(scriptBuilder) {
+ if (scriptBuilders.size === 0) listen(true);
+ scriptBuilders.add(scriptBuilder);
+ },
+ unregister(scriptBuilder) {
+ scriptBuilders.delete(scriptBuilder);
+ if (scriptBuilders.size() === 0) listen(false);
+ }
+ };
+})(); \ No newline at end of file
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js b/data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js
new file mode 100644
index 0000000..43ee91c
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js
@@ -0,0 +1,83 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+var NavCache = (() => {
+
+ let tabs = {};
+ let listeners = new Set();
+
+ let clone = structuredClone || (o => JSON.parse(JSON.stringify(o)));
+
+ browser.webNavigation.onCommitted.addListener(({tabId, frameId, url, parentFrameId}) => {
+ let tab = tabs[tabId];
+ let frame = tab && tab[frameId];
+ if (!tab || frameId == 0) {
+ tabs[tabId] = tab = {};
+ }
+ let previousUrl = frame && frame.url;
+ frame = tab[frameId] = {previousUrl, url, parentFrameId};
+ if (previousUrl !== url) {
+ for (let l of listeners) {
+ try {
+ l(Object.assign({tabId, frameId}, frame));
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ }
+ });
+
+ browser.tabs.onRemoved.addListener(tabId => {
+ tabs.delete(tabId);
+ });
+
+
+ (async () => {
+
+ async function populateFrames(tab) {
+ let tabId = tab.id;
+ let frames = await browser.webNavigation.getAllFrames({tabId});
+ if (!frames) return; // invalid tab
+ if (!tabs[tabId]) tabs[tabId] = {};
+ let top = tabs[tabId];
+ for ({frameId, url, parentFrameId} of frames) {
+ tab[frameId] = {url, parentFrameId};
+ }
+ }
+ await Promise.all((await browser.tabs.query({})).map(populateFrames));
+ })();
+
+ return {
+ getTab(tabId) {
+ return clone(tabs[tabId] || {});
+ },
+ getFrame(tabId, frameId) {
+ return clone((tabs[tabId] || {})[frameId]);
+ },
+ onUrlChanged: {
+ addListener(listener) {
+ listeners.add(listener);
+ },
+ removeListener(listener) {
+ listeners.remove(listeners);
+ }
+ }
+ };
+})();
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js b/data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js
new file mode 100644
index 0000000..79a01ea
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js
@@ -0,0 +1,44 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+var TabCache = (() => {
+
+ let cache = new Map();
+
+ browser.tabs.onUpdated.addListener((tabId, changes, tab) => {
+ cache.set(tabId, tab);
+ });
+
+ browser.tabs.onRemoved.addListener(tabId => {
+ cache.delete(tabId);
+ });
+
+ (async () => {
+ for (let tab of await browser.tabs.query({})) {
+ cache.set(tab.id, tab);
+ }
+ })();
+
+ return {
+ get(tabId) {
+ return cache.get(tabId);
+ }
+ };
+})();