Replacer

replace words

As of 2024-12-20. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Replacer
// @namespace    http://tampermonkey.net/
// @version      2.1
// @license MIT
// @description  replace words
// @author       Shuraken007
// @include https://*/*
// @include http://*/*
// ==/UserScript==

/* jshint esversion: 9 */
'use strict';

const config = {
   "json_url": "https://www.npoint.io/docs/5ef4bedc09296d71cf5a",
   "traditional_to_simple_chinese": true,
   "delay_scroll_on_reload": 5000,
   "default_priority_level": 1,
};

const script_start = Date.now();

const loader_modes = {
   restore: 'restore_json_data_from_localStorage',
   norestore: 'always_load',
};

class ConfigLoader {
   constructor() {
      this.mode = loader_modes.restore;
      this.loaded_urls = {};
      this.is_data_updated = false;
      this.is_restored = false;
   }

   async load(url) {
      let data;
      if (this.mode == loader_modes.restore) {
         data = await localStorage.getItem(url);
      }
      if (data) {
         this.is_restored = true
         this.loaded_urls[url] = data;
         return data
      }

      data = await ConfigLoader.loadFile(url);
      // console.log(data);
      localStorage.setItem(url, data);

      if (!this.mode === loader_modes.norestore) return data;
      if (!this.loaded_urls[url]) return data;
      if (this.loaded_urls[url] !== data) {
         console.log('config updated');
         this.is_data_updated = true;
      }
      return data
   }

   static async loadFile(url) {
      let response = await fetch(url);
      if (response.status == 200) {
         return response.text();
      } else {
         let msg =
            `loading: ${url}
            status: ${response.status}
            response: ${response.response}
            `;

         throw Error(msg);
      }
   }

   resetOnError(err) {
      for (const k of Object.keys(this.loaded_urls)) {
         localStorage.removeItem(k);
         console.log(`storage with key ${k} removed`);
      }
      throw err
   }
}

const types = {
   Array: 'Array',
   Dict: 'Dict',
   String: 'String',
   Int: 'Int',
   Unknown: 'Unknown',
};

const known_keys = {
   urls: '__urls',
   include: '__include',
   level: '__level',
   contains: function (key) {
      return Object.values(this).includes(key);
   }
};

function get_type(x) {
   if (x instanceof Array) return types.Array;
   if (typeof x == 'object') return types.Dict;
   if (typeof x === 'string' || x instanceof String) return types.String;
   if (!Number.isNaN(x) && Number.isInteger(x)) return types.Int;

   return types.Unknown;
}

class ConfigBuilder {
   constructor(config_loader) {
      this.url = window.location.href;
      this.config_loader = config_loader;
   }

   async build(url) {
      let data = await this.config_loader.load(url);
      var json = JSON.parse(data);
      let known_nodes_map = new Map();
      this.collect_names(json, known_nodes_map);

      let replacements_by_priority_level = {};
      await this.collect_replacements(
         json,
         replacements_by_priority_level,
         known_nodes_map,
         config.default_priority_level
      );
      // console.log(replacements_by_priority_level)

      let replacements = this.union_replacements_by_level(replacements_by_priority_level);
      console.log(replacements)
      return replacements;
   }

   collect_names(node, known_nodes_map) {
      for (const [k, v] of Object.entries(node)) {
         if (known_keys.contains(k)) continue;
         if (get_type(v) !== types.Dict) continue;
         this.collect_names(v, known_nodes_map);
         if (known_nodes_map.has(k)) {
            console.log(`key ${k} already added`);
         }
         known_nodes_map.set(k, v);
      }
   }

   check_url(pattern_arr) {
      let obj_type = get_type(pattern_arr);
      if (obj_type != types.Array) {
         throw new Error(`field ${known_keys.urls} exptect to be Array, got ${obj_type}`);
      }
      for (const url_pattern of pattern_arr) {
         let url_token = tokenToRegex(url_pattern, true);
         if (!url_token.test(this.url)) continue;
         return true;
      }
      return false;
   }

   validate_lvl(lvl, root) {
      let lvl_type = get_type(lvl);
      if (lvl_type !== types.Int) {
         console.log(`field ${known_keys.level} must be number, got ${lvl_type}
            root: ${root}`);
         return false;
      }
      return true;
   }

   validate_include(include, known_nodes_map, root) {
      if (include.includes('http')) return false;
      if (!known_nodes_map.has(include)) {
         console.log(`include '${include}' not founded
            root: ${root}`);
         return false;
      }
      if (root.hasOwnProperty(include)) {
         console.log(`current node already has key '${include}'
            root: ${root}`);
         return false;
      }
      return true;
   }

   isValidHttpUrl(string) {
      let url;

      try {
         url = new URL(string);
      } catch (_) {
         return false;
      }

      return url.protocol === "http:" || url.protocol === "https:";
   }

   async add_include(node_name, include, known_nodes_map, root) {
      let data;
      if (this.validate_include(include, known_nodes_map, root)) {
         data = known_nodes_map.get(include);
      } else if (this.isValidHttpUrl(include)) {
         try {
            data = await this.config_loader.load(include);
            data = JSON.parse(data);
         } catch (err) {
            localStorage.removeItem(include);
            console.log(`error on loading url include ${include}`)
            return;
         }
      }
      if (!data) return;
      root[node_name] = data;
   }

   async collect_replacements(node, collection_by_lvl, known_nodes_map, priority_lvl, is_matched = false) {
      let urls = node[known_keys.urls];
      if (urls) {
         if (!this.check_url(urls)) return;
         is_matched = true;
      }
      let lvl = node[known_keys.level];
      if (lvl !== undefined) {
         if (this.validate_lvl(lvl, node)) priority_lvl = lvl;
      }
      let includes = node[known_keys.include];
      if (includes) {
         for (const [node_name, include] of Object.entries(includes)) {
            await this.add_include(node_name, include, known_nodes_map, node);
         }
      }
      for (const [k, v] of Object.entries(node)) {
         if (known_keys.contains(k)) continue;
         let val_type = get_type(v);
         if (val_type == types.Array) {
            this.add_random_entity(k, v, collection_by_lvl, priority_lvl);
         } else if (val_type == types.Dict) {
            await this.collect_replacements(v, collection_by_lvl, known_nodes_map, priority_lvl, is_matched);
         } else if (val_type === types.String) {
            this.add_basic_entity(k, v, collection_by_lvl, priority_lvl);
         }
      }
   }

   add_random_entity(key, value, collection_by_lvl, priority_lvl) {
      if (get_type(value) != types.Array) {
         throw Error(
            `value expected to be Array, got ${get_type(value)}
            value: ${value}`
         );
      }
      if (config.traditional_to_simple_chinese) {
         key = t2s(key);
         value = value.map(e => t2s(e));
      }
      key = tokenToRegex(key);
      this.add_replacement_to_collection(key, value, collection_by_lvl, priority_lvl);
   }

   add_basic_entity(key, value, collection_by_lvl, priority_lvl) {
      if (get_type(value) != types.String) {
         throw Error(
            `value expected to be str, got ${get_type(value)}
            value: ${value}`
         );
      }
      if (config.traditional_to_simple_chinese) {
         key = t2s(key);
         value = t2s(value);
      }
      key = tokenToRegex(key);
      this.add_replacement_to_collection(key, value, collection_by_lvl, priority_lvl);
   }

   add_replacement_to_collection(key, value, collection_by_lvl, priority_lvl) {
      if (!collection_by_lvl.hasOwnProperty(priority_lvl)) {
         collection_by_lvl[priority_lvl] = [];
      }
      let collection_arr = collection_by_lvl[priority_lvl];

      for (let i = 0; i < collection_arr.length; i++) {
         let k = collection_arr[i][0];
         let k_as_str = k.toString().replace(/^\//, "").replace(/\/$/, "");
         let key_as_str = key.toString().replace(/^\//, "").replace(/\/\w*?$/, "");
         if (key_as_str == k_as_str) {
            console.log(`key: ${key} was added earlier, overriding`);
            collection_arr.splice(i, 1);
         }
         if (key_as_str.includes(k_as_str)) {
            // console.log(`replacement ${key} contains earlier added ${k}, moving up`);
            collection_arr.splice(i, 0, [key, value]);
            return;
         }
      }
      collection_arr.push([key, value]);
   }

   sort_str_keys_as_numbers(a, b) {
      let x = Number(a);
      let y = Number(b);
      if (x < y) return -1;
      if (x > y) return 1;
      return 0;
   }

   union_replacements_by_level(collection_by_lvl) {
      let replacements = [];

      let keys = Object.keys(collection_by_lvl);
      for (let key of keys.sort(this.sort_str_keys_as_numbers)) {
         replacements.push(...collection_by_lvl[key]);
      }
      return replacements;
   }

}

function run_mutations(mutations, replacements) {
   try {
      mutations.forEach(mutation => {
         if (mutation.type === "childList") {
            mutation.addedNodes.forEach(node => {
               replaceText(node, replacements);
            });
         }
      });
   } catch (err) {
      // wrong config
      config_loader.resetOnError(err);
   }
}

function replaceText(node, replacements) {
   // catch script from google analitics here
   // node.type: 'application/json'
   // type for other nodes not defined
   if (node.type && node.type === 'application/json') return;
   switch (node.nodeType) {
      case Node.ELEMENT_NODE:
         node.childNodes.forEach(n => replaceText(n, replacements));
         break;
      case Node.TEXT_NODE: {
         let text = node.textContent;
         if (!text.trim()) break;
         // console.log(node.nodeType, node.nodeValue)
         let new_text = make_replacements(text, replacements);
         if (text != new_text) {
            node.textContent = new_text;
            // console.log(new_text);
         }
         break;
      }
      case Node.DOCUMENT_NODE:
         node.childNodes.forEach(n => replaceText(n, replacements));
   }
}

function get_random(list) {
   return list[Math.floor((Math.random() * list.length))];
}

function make_replacements(text, replacements) {
   var are_letters_inserted = false;
   if (config.traditional_to_simple_chinese) {
      text = t2s(text);
   }
   for (let [regex, replacement] of replacements) {
      if (replacement instanceof Array) {
         replacement = get_random(replacement);
      }
      let not_glyph_letter_in_replacement = isLetter(replacement.charAt(0)) || isLetter(replacement.slice(-1));
      if (are_letters_inserted && not_glyph_letter_in_replacement) {
         text = replaceAllRespectSpaces(text, regex, replacement);
      } else {
         var new_text = text.replaceAll(regex, replacement);
         if (!are_letters_inserted && new_text != text && not_glyph_letter_in_replacement) {
            are_letters_inserted = true;
         }
         text = new_text;
      }
   }
   return text;
}

// prepareRegex by JoeSimmons
// used to take a string and ready it for use in new RegExp()
function prepareRegex(string) {
   // escape: []^&$.()?/\+{}|
   string = string.replace(/([\[\]\^\&\$\.\(\)\?\/\\\+\{\}\|])/g, '\\$1');
   // '*' -> '[^ ]*', but '\*' -> '*'
   string = string.replace(/\\?\*/g, function (fullMatch) {
      return fullMatch === '\\*' ? '*' : '[^ ]*';
   });
   return string;
}

function getRegFromString(string) {
   var a = string.split("/");
   let modifiers = a.pop();
   a.shift();
   let pattern = a.join("/");
   if (!modifiers.includes('g')) {
      modifiers += 'g';
   }
   // console.log(`pattern: ${pattern}, modifiers: ${modifiers}`)
   return new RegExp(pattern, modifiers);
}

const rIsRegexp = /^\/(.+)\/(\w+)?$/;
function tokenToRegex(string, is_prepared = false) {
   if (config.traditional_to_simple_chinese) {
      string = t2s(string);
   }
   if (string.match(rIsRegexp)) {
      // console.log(`user_regexp: ${string}`)
      return getRegFromString(string);
   }
   if (is_prepared) {
      string = prepareRegex(string);
      return new RegExp(string);
   }
   return string;
}

function isLetter(c) {
   return c.toLowerCase() != c.toUpperCase();
}

function is_space_required(text, index) {
   if (index == 0) { return false; }
   if (!isLetter(text.charAt(index - 1))) { return false; }
   return true;
}

function replaceAllRespectSpaces(text, re, replacement) {
   if (!isLetter(replacement.charAt(0))) { return text; }
   if (typeof re === 'string' || re instanceof String) {
      re = new RegExp(re);
   } else if (re instanceof RegExp && re.global) {
      re = new RegExp(re.source, re.flags.replace('g', ''));
   }
   var match;
   while (match = re.exec(text)) {
      if (is_space_required(text, match.index)) {
         text = text.replace(match, " " + replacement);
      } else {
         text = text.replace(match, replacement);
      }
   }
   return text;
}

// https://github.com/jyt0532/ChineseConverter/blob/master/transform.js
// added more hieroglyphs to t2sArray from issue
// added rIsChinese, change replacement to text.replace
const t2sArray = { "梦": "梦", "缘": "缘", "丢": "丢", "并": "并", "采": "采", "乱": "乱", "亘": "亘", "亚": "亚", "亸": "亸", "来": "来", "仑": "仑", "侣": "侣", "俣": "俣", "侠": "侠", "伥": "伥", "俩": "俩", "仓": "仓", "个": "个", "们": "们", "伦": "伦", "伟": "伟", "侧": "侧", "侦": "侦", "伪": "伪", "杰": "杰", "伧": "伧", "伞": "伞", "备": "备", "佣": "佣", "传": "传", "伛": "伛", "债": "债", "伤": "伤", "倾": "倾", "偻": "偻", "仅": "仅", "佥": "佥", "侨": "侨", "仆": "仆", "侥": "侥", "偾": "偾", "雇": "雇", "价": "价", "仪": "仪", "侬": "侬", "亿": "亿", "当": "当", "侩": "侩", "俭": "俭", "傧": "傧", "俦": "俦", "侪": "侪", "尽": "尽", "偿": "偿", "优": "优", "储": "储", "俪": "俪", "罗": "罗", "攒": "攒", "傩": "傩", "傥": "傥", "俨": "俨", "凶": "凶", "兑": "兑", "儿": "儿", "兖": "兖", "内": "内", "两": "两", "册": "册", "涂": "涂", "冻": "冻", "凛": "凛", "渎": "渎", "处": "处", "凯": "凯", "凭": "凭", "别": "别", "删": "删", "刬": "刬", "刭": "刭", "则": "则", "刚": "刚", "剥": "剥", "剐": "剐", "剀": "剀", "创": "创", "铲": "铲", "划": "划", "剧": "剧", "刘": "刘", "刽": "刽", "刿": "刿", "剑": "剑", "剂": "剂", "劲": "劲", "动": "动", "务": "务", "勚": "勚", "勋": "勋", "胜": "胜", "劳": "劳", "势": "势", "绩": "绩", "劢": "劢", "励": "励", "劝": "劝", "匀": "匀", "匦": "匦", "汇": "汇", "匮": "匮", "奁": "奁", "椟": "椟", "区": "区", "协": "协", "却": "却", "厍": "厍", "厅": "厅", "厕": "厕", "厌": "厌", "厂": "厂", "厉": "厉", "厣": "厣", "参": "参", "叆": "叆", "叇": "叇", "丛": "丛", "吴": "吴", "吕": "吕", "呙": "呙", "员": "员", "呗": "呗", "吣": "吣", "唝": "唝", "唡": "唡", "问": "问", "启": "启", "哑": "哑", "衔": "衔", "啰": "啰", "啴": "啴", "唤": "唤", "丧": "丧", "乔": "乔", "单": "单", "哟": "哟", "呛": "呛", "啬": "啬", "吗": "吗", "呜": "呜", "唢": "唢", "哔": "哔", "叹": "叹", "喽": "喽", "呕": "呕", "啧": "啧", "尝": "尝", "唛": "唛", "哗": "哗", "唠": "唠", "啸": "啸", "叽": "叽", "哓": "哓", "呒": "呒", "咴": "咴", "嘘": "嘘", "咝": "咝", "哒": "哒", "哝": "哝", "哕": "哕", "嗳": "嗳", "哙": "哙", "喷": "喷", "吨": "吨", "咛": "咛", "吓": "吓", "哜": "哜", "噜": "噜", "啮": "啮", "呖": "呖", "咙": "咙", "响": "响", "喾": "喾", "严": "严", "嘤": "嘤", "啭": "啭", "嗫": "嗫", "冁": "冁", "呓": "呓", "苏": "苏", "嘱": "嘱", "国": "国", "囵": "囵", "围": "围", "园": "园", "圆": "圆", "图": "图", "团": "团", "垧": "垧", "垯": "垯", "垱": "垱", "埯": "埯", "坝": "坝", "垭": "垭", "执": "执", "坚": "坚", "垩": "垩", "垴": "垴", "埚": "埚", "阶": "阶", "尧": "尧", "报": "报", "场": "场", "塆": "塆", "块": "块", "茔": "茔", "垲": "垲", "埘": "埘", "坞": "坞", "埙": "埙", "尘": "尘", "堑": "堑", "砖": "砖", "垫": "垫", "坠": "坠", "硗": "硗", "堕": "堕", "坛": "坛", "坟": "坟", "墙": "墙", "垦": "垦", "压": "压", "垒": "垒", "圹": "圹", "垆": "垆", "坏": "坏", "垄": "垄", "坜": "坜", "壮": "壮", "壸": "壸", "壶": "壶", "寿": "寿", "够": "够", "夹": "夹", "奂": "奂", "奥": "奥", "夺": "夺", "奋": "奋", "妆": "妆", "姗": "姗", "奸": "奸", "侄": "侄", "娱": "娱", "妩": "妩", "娄": "娄", "妇": "妇", "娅": "娅", "婳": "婳", "娲": "娲", "妫": "妫", "媪": "媪", "妈": "妈", "袅": "袅", "妪": "妪", "娴": "娴", "娆": "娆", "婵": "婵", "娇": "娇", "嫱": "嫱", "嫒": "嫒", "嬷": "嬷", "嫔": "嫔", "婴": "婴", "婶": "婶", "懒": "懒", "娈": "娈", "孙": "孙", "学": "学", "孪": "孪", "宫": "宫", "寝": "寝", "实": "实", "宁": "宁", "审": "审", "写": "写", "宽": "宽", "宠": "宠", "宝": "宝", "将": "将", "专": "专", "寻": "寻", "对": "对", "导": "导", "尴": "尴", "屃": "屃", "届": "届", "尸": "尸", "屉": "屉", "屡": "屡", "层": "层", "屦": "屦", "属": "属", "冈": "冈", "峃": "峃", "峣": "峣", "岘": "岘", "岛": "岛", "峡": "峡", "崄": "崄", "崃": "崃", "岗": "岗", "岽": "岽", "峥": "峥", "嵛": "嵛", "岚": "岚", "岁": "岁", "嵚": "嵚", "嵝": "嵝", "崭": "崭", "岖": "岖", "崂": "崂", "峤": "峤", "峄": "峄", "岙": "岙", "嵘": "嵘", "岭": "岭", "屿": "屿", "岿": "岿", "峦": "峦", "巅": "巅", "巯": "巯", "卺": "卺", "帅": "帅", "师": "师", "帐": "帐", "带": "带", "帧": "帧", "帏": "帏", "帼": "帼", "帻": "帻", "帜": "帜", "币": "币", "帮": "帮", "帱": "帱", "襕": "襕", "干": "干", "几": "几", "库": "库", "庼": "庼", "厢": "厢", "厦": "厦", "荫": "荫", "厨": "厨", "厮": "厮", "庙": "庙", "庑": "庑", "废": "废", "广": "广", "廪": "廪", "庐": "庐", "弪": "弪", "张": "张", "强": "强", "弹": "弹", "弥": "弥", "弯": "弯", "彟": "彟", "彦": "彦", "雕": "雕", "径": "径", "从": "从", "徕": "徕", "复": "复", "征": "征", "彻": "彻", "恒": "恒", "悦": "悦", "怅": "怅", "闷": "闷", "凄": "凄", "恼": "恼", "恽": "恽", "恻": "恻", "爱": "爱", "惬": "惬", "悫": "悫", "怆": "怆", "恺": "恺", "忾": "忾", "态": "态", "愠": "愠", "惨": "惨", "惭": "惭", "恸": "恸", "惯": "惯", "怄": "怄", "怂": "怂", "慭": "慭", "虑": "虑", "悭": "悭", "慑": "慑", "庆": "庆", "忧": "忧", "惫": "惫", "怜": "怜", "愦": "愦", "惮": "惮", "愤": "愤", "悯": "悯", "怃": "怃", "宪": "宪", "忆": "忆", "恳": "恳", "应": "应", "怿": "怿", "懔": "懔", "恹": "恹", "怼": "怼", "懑": "懑", "惩": "惩", "怀": "怀", "悬": "悬", "忏": "忏", "惧": "惧", "欢": "欢", "恋": "恋", "戆": "戆", "戋": "戋", "戗": "戗", "戬": "戬", "戏": "戏", "战": "战", "户": "户", "抛": "抛", "挜": "挜", "挦": "挦", "挟": "挟", "扪": "扪", "扫": "扫", "抡": "抡", "挣": "挣", "挂": "挂", "拣": "拣", "扬": "扬", "换": "换", "挥": "挥", "构": "构", "揿": "揿", "损": "损", "摇": "摇", "捣": "捣", "抢": "抢", "掴": "掴", "掼": "掼", "搂": "搂", "挚": "挚", "抠": "抠", "抟": "抟", "掺": "掺", "捞": "捞", "撑": "撑", "挠": "挠", "挢": "挢", "掸": "掸", "拨": "拨", "抚": "抚", "扑": "扑", "挞": "挞", "挝": "挝", "捡": "捡", "拥": "拥", "掳": "掳", "择": "择", "击": "击", "挡": "挡", "担": "担", "携": "携", "据": "据", "挤": "挤", "举": "举", "拟": "拟", "摈": "摈", "拧": "拧", "搁": "搁", "掷": "掷", "扩": "扩", "撷": "撷", "摆": "摆", "擞": "擞", "撸": "撸", "扰": "扰", "摅": "摅", "撵": "撵", "拢": "拢", "拦": "拦", "撄": "撄", "搀": "搀", "撺": "撺", "摄": "摄", "挛": "挛", "摊": "摊", "搅": "搅", "揽": "揽", "叙": "叙", "败": "败", "敌": "敌", "数": "数", "驱": "驱", "敛": "敛", "毙": "毙", "斓": "斓", "斩": "斩", "断": "断", "旸": "旸", "昽": "昽", "时": "时", "晋": "晋", "昼": "昼", "晕": "晕", "晖": "晖", "畅": "畅", "暂": "暂", "昵": "昵", "晔": "晔", "昙": "昙", "晓": "晓", "暧": "暧", "旷": "旷", "叠": "叠", "晒": "晒", "书": "书", "会": "会", "胧": "胧", "东": "东", "栅": "栅", "杆": "杆", "栀": "栀", "枧": "枧", "条": "条", "枭": "枭", "梼": "梼", "梾": "梾", "弃": "弃", "枨": "枨", "枣": "枣", "栋": "栋", "栈": "栈", "桊": "桊", "栖": "栖", "桠": "桠", "杨": "杨", "枫": "枫", "桢": "桢", "业": "业", "极": "极", "杩": "杩", "荣": "荣", "桤": "桤", "盘": "盘", "枪": "枪", "杠": "杠", "槚": "槚", "椠": "椠", "椁": "椁", "桨": "桨", "规": "规", "桩": "桩", "乐": "乐", "枞": "枞", "楼": "楼", "标": "标", "枢": "枢", "样": "样", "朴": "朴", "树": "树", "桦": "桦", "桡": "桡", "桥": "桥", "机": "机", "椭": "椭", "横": "横", "槔": "槔", "檩": "檩", "柽": "柽", "档": "档", "桧": "桧", "检": "检", "樯": "樯", "槟": "槟", "柠": "柠", "槛": "槛", "苘": "苘", "柜": "柜", "橹": "橹", "榈": "榈", "栉": "栉", "橼": "橼", "栎": "栎", "橱": "橱", "槠": "槠", "栌": "栌", "枥": "枥", "橥": "橥", "榇": "榇", "栊": "栊", "榉": "榉", "棂": "棂", "樱": "樱", "栏": "栏", "权": "权", "椤": "椤", "栾": "栾", "榄": "榄", "钦": "钦", "欧": "欧", "欤": "欤", "归": "归", "殁": "殁", "残": "残", "殒": "殒", "殇": "殇", "殚": "殚", "殓": "殓", "殡": "殡", "歼": "歼", "杀": "杀", "壳": "壳", "毁": "毁", "殴": "殴", "医": "医", "绒": "绒", "毵": "毵", "牦": "牦", "毡": "毡", "氇": "氇", "气": "气", "氢": "氢", "氩": "氩", "氲": "氲", "凼": "凼", "决": "决", "冱": "冱", "没": "没", "冲": "冲", "沨": "沨", "沵": "沵", "况": "况", "泄": "泄", "汹": "汹", "浉": "浉", "浐": "浐", "浕": "浕", "浃": "浃", "泾": "泾", "涢": "涢", "凉": "凉", "泪": "泪", "渌": "渌", "净": "净", "凌": "凌", "沦": "沦", "渊": "渊", "涞": "涞", "浅": "浅", "涣": "涣", "减": "减", "涡": "涡", "测": "测", "浑": "浑", "凑": "凑", "浈": "浈", "愍": "愍", "涌": "涌", "汤": "汤", "溇": "溇", "沩": "沩", "准": "准", "沟": "沟", "温": "温", "湿": "湿", "沧": "沧", "灭": "灭", "涤": "涤", "荥": "荥", "滪": "滪", "沪": "沪", "滞": "滞", "渗": "渗", "卤": "卤", "浒": "浒", "滚": "滚", "满": "满", "渔": "渔", "沤": "沤", "汉": "汉", "涟": "涟", "渍": "渍", "涨": "涨", "溆": "溆", "渐": "渐", "浆": "浆", "颍": "颍", "泼": "泼", "洁": "洁", "潜": "潜", "润": "润", "浔": "浔", "溃": "溃", "滗": "滗", "涠": "涠", "涩": "涩", "浇": "浇", "涝": "涝", "涧": "涧", "渑": "渑", "泽": "泽", "泶": "泶", "浍": "浍", "淀": "淀", "浊": "浊", "浓": "浓", "泞": "泞", "济": "济", "涛": "涛", "滥": "滥", "潍": "潍", "滨": "滨", "阔": "阔", "溅": "溅", "泺": "泺", "滤": "滤", "滢": "滢", "泻": "泻", "渖": "渖", "浏": "浏", "濒": "濒", "泸": "泸", "沥": "沥", "潇": "潇", "潆": "潆", "潴": "潴", "泷": "泷", "濑": "濑", "潋": "潋", "澜": "澜", "沣": "沣", "滠": "滠", "洒": "洒", "漓": "漓", "滩": "滩", "灏": "灏", "湾": "湾", "滦": "滦", "滟": "滟", "灾": "灾", "为": "为", "乌": "乌", "烃": "烃", "无": "无", "煅": "煅", "辉": "辉", "炼": "炼", "炜": "炜", "烟": "烟", "茕": "茕", "焕": "焕", "烦": "烦", "炀": "炀", "荧": "荧", "炝": "炝", "热": "热", "颎": "颎", "炽": "炽", "烨": "烨", "焰": "焰", "灯": "灯", "炖": "炖", "烧": "烧", "烫": "烫", "焖": "焖", "营": "营", "灿": "灿", "烛": "烛", "烩": "烩", "熏": "熏", "烬": "烬", "焘": "焘", "耀": "耀", "烁": "烁", "炉": "炉", "烂": "烂", "争": "争", "爷": "爷", "尔": "尔", "床": "床", "笺": "笺", "闸": "闸", "牍": "牍", "牵": "牵", "荦": "荦", "犊": "犊", "牺": "牺", "状": "状", "狝": "狝", "狭": "狭", "狈": "狈", "狰": "狰", "犹": "犹", "狲": "狲", "犸": "犸", "呆": "呆", "狱": "狱", "狮": "狮", "奖": "奖", "独": "独", "狯": "狯", "猃": "猃", "狞": "狞", "获": "获", "猎": "猎", "犷": "犷", "兽": "兽", "獭": "獭", "献": "献", "猕": "猕", "猡": "猡", "兹": "兹", "玙": "玙", "玚": "玚", "珏": "珏", "玱": "玱", "珰": "珰", "现": "现", "琎": "琎", "珲": "珲", "珉": "珉", "玮": "玮", "琐": "琐", "瑶": "瑶", "莹": "莹", "玛": "玛", "琏": "琏", "玑": "玑", "瑷": "瑷", "环": "环", "玺": "玺", "琼": "琼", "珑": "珑", "璎": "璎", "瓒": "瓒", "瓯": "瓯", "罂": "罂", "产": "产", "亩": "亩", "毕": "毕", "画": "画", "异": "异", "畴": "畴", "痉": "痉", "痖": "痖", "瘆": "瘆", "疯": "疯", "疡": "疡", "痪": "痪", "瘗": "瘗", "疮": "疮", "疟": "疟", "瘘": "瘘", "疗": "疗", "痨": "痨", "痫": "痫", "瘅": "瘅", "疠": "疠", "瘪": "瘪", "痴": "痴", "痒": "痒", "疖": "疖", "症": "症", "疬": "疬", "癞": "癞", "癣": "癣", "瘿": "瘿", "瘾": "瘾", "痈": "痈", "瘫": "瘫", "癫": "癫", "发": "发", "皑": "皑", "皲": "皲", "皱": "皱", "蔼": "蔼", "碍": "碍", "袄": "袄", "罢": "罢", "颁": "颁", "办": "办", "绊": "绊", "绑": "绑", "镑": "镑", "谤": "谤", "盗": "盗", "盏": "盏", "监": "监", "卢": "卢", "荡": "荡", "视": "视", "眬": "眬", "众": "众", "睁": "睁", "饱": "饱", "鲍": "鲍", "辈": "辈", "贝": "贝", "钡": "钡", "绷": "绷", "笔": "笔", "闭": "闭", "边": "边", "编": "编", "贬": "贬", "变": "变", "辩": "辩", "辫": "辫", "鳖": "鳖", "宾": "宾", "饼": "饼", "睐": "睐", "眍": "眍", "瞒": "瞒", "睑": "睑", "瞩": "瞩", "钵": "钵", "铂": "铂", "驳": "驳", "补": "补", "财": "财", "蚕": "蚕", "苍": "苍", "舱": "舱", "诧": "诧", "蝉": "蝉", "馋": "馋", "谗": "谗", "缠": "缠", "阐": "阐", "颤": "颤", "矫": "矫", "硁": "硁", "硙": "硙", "硚": "硚", "硖": "硖", "砗": "砗", "砚": "砚", "碜": "碜", "长": "长", "肠": "肠", "钞": "钞", "车": "车", "陈": "陈", "衬": "衬", "称": "称", "诚": "诚", "骋": "骋", "迟": "迟", "驰": "驰", "齿": "齿", "虫": "虫", "踌": "踌", "筹": "筹", "绸": "绸", "丑": "丑", "锄": "锄", "雏": "雏", "硕": "硕", "砀": "砀", "砜": "砜", "确": "确", "码": "码", "碛": "碛", "矶": "矶", "础": "础", "触": "触", "闯": "闯", "锤": "锤", "纯": "纯", "绰": "绰", "辞": "辞", "词": "词", "赐": "赐", "聪": "聪", "葱": "葱", "蹿": "蹿", "窜": "窜", "错": "错", "达": "达", "贷": "贷", "矿": "矿", "砺": "砺", "砾": "砾", "矾": "矾", "砻": "砻", "祎": "祎", "禄": "禄", "祸": "祸", "祯": "祯", "郸": "郸", "胆": "胆", "诞": "诞", "党": "党", "祷": "祷", "邓": "邓", "递": "递", "缔": "缔", "颠": "颠", "点": "点", "电": "电", "钓": "钓", "调": "调", "谍": "谍", "御": "御", "禅": "禅", "礼": "礼", "祢": "祢", "秃": "秃", "秾": "秾", "税": "税", "秆": "秆", "棱": "棱", "钉": "钉", "顶": "顶", "锭": "锭", "订": "订", "斗": "斗", "读": "读", "赌": "赌", "镀": "镀", "锻": "锻", "缎": "缎", "队": "队", "顿": "顿", "钝": "钝", "鹅": "鹅", "额": "额", "讹": "讹", "饿": "饿", "饵": "饵", "禀": "禀", "种": "种", "谷": "谷", "稣": "稣", "积": "积", "颖": "颖", "穑": "穑", "秽": "秽", "颓": "颓", "稳": "稳", "稆": "稆", "贰": "贰", "罚": "罚", "阀": "阀", "钒": "钒", "范": "范", "贩": "贩", "饭": "饭", "访": "访", "纺": "纺", "飞": "飞", "诽": "诽", "费": "费", "纷": "纷", "粪": "粪", "丰": "丰", "锋": "锋", "风": "风", "冯": "冯", "缝": "缝", "讽": "讽", "凤": "凤", "肤": "肤", "辐": "辐", "窝": "窝", "洼": "洼", "穷": "穷", "窑": "窑", "窭": "窭", "窥": "窥", "窍": "窍", "窦": "窦", "窃": "窃", "竖": "竖", "竞": "竞", "辅": "辅", "赋": "赋", "负": "负", "讣": "讣", "缚": "缚", "该": "该", "钙": "钙", "盖": "盖", "赶": "赶", "赣": "赣", "钢": "钢", "纲": "纲", "镐": "镐", "鸽": "鸽", "阁": "阁", "铬": "铬", "给": "给", "笋": "笋", "筜": "筜", "笕": "笕", "筝": "筝", "箓": "箓", "节": "节", "龚": "龚", "巩": "巩", "贡": "贡", "钩": "钩", "购": "购", "蛊": "蛊", "顾": "顾", "关": "关", "观": "观", "馆": "馆", "贯": "贯", "龟": "龟", "闺": "闺", "轨": "轨", "诡": "诡", "贵": "贵", "辊": "辊", "锅": "锅", "过": "过", "筑": "筑", "箧": "箧", "筱": "筱", "笃": "笃", "筛": "筛", "筚": "筚", "箦": "箦", "篓": "篓", "蓑": "蓑", "箪": "箪", "简": "简", "篑": "篑", "箫": "箫", "檐": "檐", "签": "签", "帘": "帘", "骇": "骇", "韩": "韩", "号": "号", "阂": "阂", "鹤": "鹤", "贺": "贺", "轰": "轰", "鸿": "鸿", "红": "红", "后": "后", "篮": "篮", "藤": "藤", "箨": "箨", "籁": "籁", "笼": "笼", "钥": "钥", "笾": "笾", "簖": "簖", "篱": "篱", "箩": "箩", "吁": "吁", "粤": "粤", "护": "护", "华": "华", "话": "话", "还": "还", "缓": "缓", "黄": "黄", "谎": "谎", "贿": "贿", "讳": "讳", "诲": "诲", "绘": "绘", "荤": "荤", "伙": "伙", "货": "货", "糁": "糁", "模": "模", "粮": "粮", "粝": "粝", "籴": "籴", "粜": "粜", "纠": "纠", "纪": "纪", "纣": "纣", "约": "约", "纡": "纡", "纥": "纥", "纨": "纨", "纫": "纫", "纹": "纹", "纳": "纳", "纽": "纽", "纾": "纾", "纰": "纰", "纼": "纼", "纱": "纱", "纮": "纮", "纸": "纸", "级": "级", "纭": "纭", "纴": "纴", "细": "细", "绂": "绂", "绁": "绁", "绅": "绅", "纻": "纻", "饥": "饥", "迹": "迹", "讥": "讥", "鸡": "鸡", "缉": "缉", "辑": "辑", "蓟": "蓟", "计": "计", "记": "记", "际": "际", "继": "继", "荚": "荚", "颊": "颊", "贾": "贾", "钾": "钾", "驾": "驾", "间": "间", "艰": "艰", "缄": "缄", "茧": "茧", "荐": "荐", "鉴": "鉴", "践": "践", "贱": "贱", "见": "见", "键": "键", "绍": "绍", "绀": "绀", "绋": "绋", "绐": "绐", "绌": "绌", "终": "终", "组": "组", "绗": "绗", "结": "结", "绝": "绝", "绦": "绦", "绔": "绔", "绞": "绞", "络": "络", "绚": "绚", "绖": "绖", "统": "统", "丝": "丝", "绛": "绛", "绢": "绢", "绡": "绡", "绠": "绠", "绨": "绨", "绣": "绣", "绤": "绤", "绥": "绥", "经": "经", "舰": "舰", "饯": "饯", "蒋": "蒋", "讲": "讲", "酱": "酱", "胶": "胶", "骄": "骄", "铰": "铰", "脚": "脚", "饺": "饺", "缴": "缴", "轿": "轿", "较": "较", "诫": "诫", "紧": "紧", "锦": "锦", "谨": "谨", "进": "进", "综": "综", "缍": "缍", "绿": "绿", "绻": "绻", "绶": "绶", "维": "维", "绹": "绹", "绾": "绾", "网": "网", "缀": "缀", "纶": "纶", "绺": "绺", "绮": "绮", "绽": "绽", "绫": "绫", "绵": "绵", "绲": "绲", "缁": "缁", "绯": "绯", "缗": "缗", "绪": "绪", "绬": "绬", "绱": "绱", "缃": "缃", "缂": "缂", "缌": "缌", "缅": "缅", "纬": "纬", "缑": "缑", "缈": "缈", "练": "练", "缏": "缏", "缇": "缇", "荆": "荆", "茎": "茎", "鲸": "鲸", "惊": "惊", "颈": "颈", "静": "静", "镜": "镜", "旧": "旧", "驹": "驹", "锯": "锯", "鹃": "鹃", "觉": "觉", "诀": "诀", "钧": "钧", "军": "军", "缊": "缊", "总": "总", "萦": "萦", "缙": "缙", "缢": "缢", "缒": "缒", "绉": "绉", "缣": "缣", "缞": "缞", "缜": "缜", "缟": "缟", "缛": "缛", "县": "县", "缡": "缡", "缩": "缩", "纵": "纵", "缧": "缧", "纤": "纤", "缦": "缦", "絷": "絷", "缕": "缕", "缥": "缥", "缫": "缫", "缪": "缪", "襁": "襁", "缯": "缯", "织": "织", "缮": "缮", "缭": "缭", "骏": "骏", "开": "开", "颗": "颗", "课": "课", "裤": "裤", "夸": "夸", "亏": "亏", "绕": "绕", "缋": "缋", "绳": "绳", "缰": "缰", "缳": "缳", "缲": "缲", "绎": "绎", "缤": "缤", "缱": "缱", "颣": "颣", "缬": "缬", "纩": "纩", "续": "续", "缨": "缨", "缵": "缵", "缆": "缆", "馈": "馈", "蜡": "蜡", "腊": "腊", "莱": "莱", "赖": "赖", "蓝": "蓝", "阑": "阑", "兰": "兰", "谰": "谰", "览": "览", "镭": "镭", "类": "类", "离": "离", "鲤": "鲤", "丽": "丽", "骂": "骂", "罴": "罴", "羁": "羁", "芈": "芈", "羟": "羟", "羡": "羡", "义": "义", "习": "习", "翙": "翙", "翚": "翚", "隶": "隶", "联": "联", "莲": "莲", "连": "连", "镰": "镰", "脸": "脸", "链": "链", "辆": "辆", "谅": "谅", "辽": "辽", "镣": "镣", "临": "临", "邻": "邻", "鳞": "鳞", "赁": "赁", "龄": "龄", "铃": "铃", "灵": "灵", "领": "领", "馏": "馏", "龙": "龙", "聋": "聋", "翘": "翘", "翱": "翱", "耧": "耧", "耢": "耢", "圣": "圣", "闻": "闻", "声": "声", "耸": "耸", "聩": "聩", "聂": "聂", "职": "职", "聍": "聍", "听": "听", "陇": "陇", "芦": "芦", "颅": "颅", "虏": "虏", "鲁": "鲁", "赂": "赂", "录": "录", "陆": "陆", "驴": "驴", "铝": "铝", "轮": "轮", "论": "论", "萝": "萝", "逻": "逻", "锣": "锣", "骡": "骡", "骆": "骆", "蚂": "蚂", "马": "马", "买": "买", "麦": "麦", "卖": "卖", "迈": "迈", "脉": "脉", "馒": "馒", "蛮": "蛮", "肃": "肃", "胁": "胁", "胫": "胫", "脱": "脱", "胀": "胀", "谩": "谩", "猫": "猫", "锚": "锚", "铆": "铆", "贸": "贸", "么": "么", "镁": "镁", "门": "门", "锰": "锰", "谜": "谜", "觅": "觅", "闽": "闽", "鸣": "鸣", "铭": "铭", "谬": "谬", "肾": "肾", "胨": "胨", "腘": "腘", "脶": "脶", "脑": "脑", "肿": "肿", "肷": "肷", "腽": "腽", "腻": "腻", "脍": "脍", "脓": "脓", "脐": "脐", "膑": "膑", "癯": "癯", "谋": "谋", "钠": "钠", "难": "难", "闹": "闹", "馁": "馁", "酿": "酿", "鸟": "鸟", "镊": "镊", "镍": "镍", "胪": "胪", "臜": "臜", "脏": "脏", "脔": "脔", "卧": "卧", "皋": "皋", "与": "与", "兴": "兴", "铺": "铺", "舣": "舣", "钮": "钮", "农": "农", "诺": "诺", "鸥": "鸥", "庞": "庞", "赔": "赔", "鹏": "鹏", "舻": "舻", "艳": "艳", "艹": "艹", "刍": "刍", "苎": "苎", "骗": "骗", "飘": "飘", "频": "频", "贫": "贫", "苹": "苹", "评": "评", "颇": "颇", "谱": "谱", "齐": "齐", "骑": "骑", "岂": "岂", "讫": "讫", "荙": "荙", "庄": "庄", "苋": "苋", "钎": "钎", "铅": "铅", "迁": "迁", "谦": "谦", "钱": "钱", "钳": "钳", "谴": "谴", "蔷": "蔷", "锹": "锹", "亲": "亲", "轻": "轻", "顷": "顷", "请": "请", "趋": "趋", "躯": "躯", "苌": "苌", "萚": "萚", "万": "万", "莴": "莴", "叶": "叶", "荭": "荭", "荮": "荮", "苇": "苇", "药": "药", "龋": "龋", "颧": "颧", "鹊": "鹊", "让": "让", "饶": "饶", "韧": "韧", "认": "认", "软": "软", "锐": "锐", "闰": "闰", "萨": "萨", "鳃": "鳃", "赛": "赛", "莼": "莼", "莳": "莳", "荪": "荪", "莜": "莜", "苁": "苁", "荜": "荜", "骚": "骚", "闪": "闪", "陕": "陕", "赡": "赡", "赏": "赏", "赊": "赊", "设": "设", "蒌": "蒌", "茑": "茑", "荨": "荨", "蒇": "蒇", "荞": "荞", "荬": "荬", "芸": "芸", "莸": "莸", "荛": "荛", "蒉": "蒉", "芜": "芜", "萧": "萧", "蓣": "蓣", "诗": "诗", "蚀": "蚀", "识": "识", "驶": "驶", "适": "适", "释": "释", "饰": "饰", "试": "试", "输": "输", "赎": "赎", "术": "术", "荟": "荟", "芗": "芗", "姜": "姜", "莶": "莶", "荠": "荠", "荩": "荩", "艺": "艺", "薮": "薮", "苈": "苈", "双": "双", "谁": "谁", "顺": "顺", "说": "说", "饲": "饲", "颂": "颂", "讼": "讼", "诵": "诵", "诉": "诉", "虽": "虽", "随": "随", "锁": "锁", "蔺": "蔺", "蕲": "蕲", "蕴": "蕴", "藓": "藓", "蔹": "蔹", "茏": "茏", "蓠": "蓠", "虚": "虚", "贪": "贪", "谭": "谭", "谈": "谈", "讨": "讨", "腾": "腾", "誊": "誊", "锑": "锑", "题": "题", "体": "体", "贴": "贴", "铁": "铁", "蛱": "蛱", "蜕": "蜕", "蚬": "蚬", "铜": "铜", "头": "头", "鸵": "鸵", "驮": "驮", "驼": "驼", "袜": "袜", "顽": "顽", "猬": "猬", "虾": "虾", "虱": "虱", "蜗": "蜗", "螀": "螀", "蛳": "蛳", "蚁": "蚁", "萤": "萤", "韦": "韦", "违": "违", "谓": "谓", "卫": "卫", "钨": "钨", "诬": "诬", "雾": "雾", "误": "误", "锡": "锡", "蝼": "蝼", "蛰": "蛰", "蝈": "蝈", "螨": "螨", "蟏": "蟏", "虮": "虮", "蛲": "蛲", "蛏": "蛏", "蝇": "蝇", "虿": "虿", "蝎": "蝎", "蛴": "蛴", "蝾": "蝾", "蛎": "蛎", "袭": "袭", "铣": "铣", "辖": "辖", "锨": "锨", "鲜": "鲜", "咸": "咸", "贤": "贤", "闲": "闲", "显": "显", "险": "险", "馅": "馅", "镶": "镶", "乡": "乡", "详": "详", "响": "响", "项": "项", "销": "销", "蔑": "蔑", "袆": "袆", "衮": "衮", "谐": "谐", "谢": "谢", "锌": "锌", "衅": "衅", "锈": "锈", "须": "须", "许": "许", "轩": "轩", "袯": "袯", "裈": "裈", "装": "装", "裢": "裢", "选": "选", "询": "询", "驯": "驯", "训": "训", "讯": "讯", "逊": "逊", "鸦": "鸦", "鸭": "鸭", "讶": "讶", "阉": "阉", "盐": "盐", "颜": "颜", "阎": "阎", "谚": "谚", "验": "验", "鸯": "鸯", "阳": "阳", "养": "养", "褛": "褛", "亵": "亵", "幞": "幞", "裥": "裥", "杂": "杂", "裣": "裣", "裆": "裆", "褴": "褴", "觃": "觃", "觇": "觇", "觋": "觋", "遥": "遥", "谣": "谣", "页": "页", "铱": "铱", "颐": "颐", "遗": "遗", "诣": "诣", "议": "议", "谊": "谊", "译": "译", "阴": "阴", "银": "银", "饮": "饮", "隐": "隐", "觍": "觍", "觎": "觎", "觊": "觊", "觏": "觏", "觑": "觑", "觐": "觐", "觌": "觌", "觞": "觞", "觯": "觯", "讠": "讠", "讧": "讧", "讦": "讦", "讱": "讱", "讪": "讪", "鹰": "鹰", "赢": "赢", "踊": "踊", "咏": "咏", "邮": "邮", "铀": "铀", "诱": "诱", "舆": "舆", "鱼": "鱼", "语": "语", "誉": "誉", "讷": "讷", "谌": "谌", "讻": "讻", "诃": "诃", "诊": "诊", "注": "注", "证": "证", "诂": "诂", "诋": "诋", "讵": "讵", "诈": "诈", "诒": "诒", "诏": "诏", "诐": "诐", "诇": "诇", "诎": "诎", "诅": "诅", "詟": "詟", "诩": "诩", "诟": "诟", "诠": "诠", "诘": "诘", "诜": "诜", "诙": "诙", "诖": "诖", "预": "预", "驭": "驭", "鸳": "鸳", "辕": "辕", "远": "远", "愿": "愿", "跃": "跃", "阅": "阅", "云": "云", "郧": "郧", "陨": "陨", "运": "运", "酝": "酝", "韵": "韵", "载": "载", "赞": "赞", "赃": "赃", "凿": "凿", "责": "责", "贼": "贼", "赠": "赠", "轧": "轧", "诔": "诔", "诛": "诛", "诓": "诓", "诳": "诳", "诶": "诶", "诮": "诮", "诰": "诰", "谇": "谇", "谄": "谄", "谆": "谆", "诿": "诿", "诤": "诤", "诹": "诹", "诼": "诼", "谂": "谂", "谀": "谀", "谞": "谞", "谝": "谝", "谥": "谥", "诨": "诨", "铡": "铡", "斋": "斋", "辗": "辗", "账": "账", "赵": "赵", "辙": "辙", "锗": "锗", "这": "这", "贞": "贞", "针": "针", "镇": "镇", "阵": "阵", "谔": "谔", "谛": "谛", "谏": "谏", "谕": "谕", "谙": "谙", "诸": "诸", "谖": "谖", "谒": "谒", "诌": "诌", "谧": "谧", "谑": "谑", "谡": "谡", "谟": "谟", "谪": "谪", "讴": "讴", "郑": "郑", "质": "质", "钟": "钟", "轴": "轴", "骤": "骤", "猪": "猪", "着": "着", "贮": "贮", "铸": "铸", "谲": "谲", "谮": "谮", "谯": "谯", "谵": "谵", "诪": "诪", "谫": "谫", "雠": "雠", "谶": "谶", "谠": "谠", "谳": "谳", "驻": "驻", "转": "转", "赚": "赚", "锥": "锥", "赘": "赘", "资": "资", "踪": "踪", "邹": "邹", "钻": "钻", "豮": "豮", "狸": "狸", "贠": "贠", "鼗": "鼗", "靥": "靥", "赝": "赝", "赜": "赜", "贳": "贳", "赀": "赀", "贶": "贶", "贻": "贻", "贲": "贲", "赅": "赅", "赈": "赈", "赇": "赇", "赒": "赒", "赉": "赉", "赓": "赓", "赕": "赕", "赍": "赍", "赆": "赆", "赗": "赗", "赙": "赙", "贽": "贽", "赟": "赟", "黉": "黉", "凫": "凫", "赑": "赑", "赪": "赪", "趱": "趱", "陉": "陉", "陧": "陧", "邝": "邝", "邬": "邬", "邺": "邺", "跶": "跶", "蜷": "蜷", "跄": "跄", "跸": "跸", "跖": "跖", "蹒": "蹒", "郏": "郏", "郐": "郐", "郄": "郄", "郓": "郓", "郦": "郦", "跷": "跷", "趸": "趸", "跻": "跻", "踯": "踯", "跞": "跞", "踬": "踬", "蹰": "蹰", "跹": "跹", "蹑": "蹑", "躜": "躜", "躏": "躏", "轪": "轪", "轫": "轫", "轭": "轭", "轷": "轷", "轸": "轸", "轱": "轱", "轵": "轵", "轺": "轺", "轲": "轲", "轶": "轶", "轼": "轼", "辂": "辂", "辁": "辁", "辀": "辀", "轾": "轾", "辄": "辄", "辎": "辎", "辋": "辋", "辍": "辍", "辇": "辇", "辌": "辌", "辏": "辏", "辒": "辒", "毂": "毂", "莺": "莺", "蓦": "蓦", "蓥": "蓥", "辘": "辘", "辚": "辚", "辔": "辔", "轹": "轹", "轳": "轳", "迩": "迩", "逦": "逦", "酦": "酦", "酾": "酾", "酽": "酽", "钆": "钆", "钇": "钇", "钌": "钌", "钊": "钊", "钋": "钋", "钐": "钐", "狍": "狍", "钏": "钏", "钗": "钗", "钍": "钍", "钕": "钕", "钯": "钯", "钫": "钫", "钘": "钘", "钭": "钭", "钚": "钚", "钤": "钤", "钣": "钣", "钑": "钑", "钬": "钬", "钛": "钛", "钪": "钪", "铌": "铌", "铈": "铈", "钶": "钶", "钴": "钴", "钹": "钹", "铍": "铍", "钰": "钰", "钸": "钸", "钿": "钿", "饧": "饧", "饨": "饨", "饩": "饩", "饪": "饪", "饫": "饫", "饬": "饬", "饴": "饴", "饷": "饷", "饽": "饽", "余": "余", "馄": "馄", "馇": "馇", "馊": "馊", "馍": "馍", "馐": "馐", "馑": "馑", "馓": "馓", "馔": "馔", "馕": "馕", "铊": "铊", "铉": "铉", "铋": "铋", "钷": "钷", "钺": "钺", "钲": "钲", "钼": "钼", "钽": "钽", "锎": "锎", "铏": "铏", "铒": "铒", "铪": "铪", "铳": "铳", "铚": "铚", "铨": "铨", "铢": "铢", "铫": "铫", "铦": "铦", "铑": "铑", "铷": "铷", "铟": "铟", "闩": "闩", "闫": "闫", "闱": "闱", "闳": "闳", "闵": "闵", "闶": "闶", "闼": "闼", "闾": "闾", "阃": "阃", "阄": "阄", "阆": "阆", "阈": "阈", "阊": "阊", "阋": "阋", "阌": "阌", "阍": "阍", "阏": "阏", "阒": "阒", "阕": "阕", "阖": "阖", "阗": "阗", "阙": "阙", "阚": "阚", "丬": "丬", "铵": "铵", "铥": "铥", "铕": "铕", "铯": "铯", "铐": "铐", "铞": "铞", "锉": "锉", "镅": "镅", "锒": "锒", "铤": "铤", "铗": "铗", "铻": "铻", "镯": "镯", "锊": "锊", "锓": "锓", "铘": "铘", "锃": "锃", "锔": "锔", "锇": "锇", "铓": "铓", "铖": "铖", "锆": "锆", "锂": "锂", "铽": "铽", "锍": "锍", "锞": "锞", "锖": "锖", "锫": "锫", "锩": "锩", "铔": "铔", "锕": "锕", "锟": "锟", "锱": "锱", "铮": "铮", "锛": "锛", "锬": "锬", "锜": "锜", "锠": "锠", "锢": "锢", "铼": "铼", "镎": "镎", "锝": "锝", "锪": "锪", "钔": "钔", "锴": "锴", "锳": "锳", "锷": "锷", "钖": "钖", "锽": "锽", "锸": "锸", "锲": "锲", "锘": "锘", "骞": "骞", "锾": "锾", "锶": "锶", "锿": "锿", "镕": "镕", "镉": "镉", "镈": "镈", "镃": "镃", "镏": "镏", "铠": "铠", "铩": "铩", "锼": "锼", "镒": "镒", "镋": "镋", "镓": "镓", "镌": "镌", "镞": "镞", "镟": "镟", "镆": "镆", "镙": "镙", "驵": "驵", "驷": "驷", "驸": "驸", "驺": "驺", "驿": "驿", "驽": "驽", "骀": "骀", "骁": "骁", "骅": "骅", "骈": "骈", "骊": "骊", "骐": "骐", "骒": "骒", "骓": "骓", "骖": "骖", "骘": "骘", "骛": "骛", "骜": "骜", "骝": "骝", "骟": "骟", "骠": "骠", "骢": "骢", "骣": "骣", "骥": "骥", "骧": "骧", "纟": "纟", "镠": "镠", "镝": "镝", "铿": "铿", "锵": "锵", "镗": "镗", "镘": "镘", "镛": "镛", "镖": "镖", "镂": "镂", "錾": "錾", "镚": "镚", "铧": "铧", "镤": "镤", "镪": "镪", "铙": "铙", "铴": "铴", "铹": "铹", "镦": "镦", "镡": "镡", "镫": "镫", "镢": "镢", "镨": "镨", "锏": "锏", "镄": "镄", "顼": "顼", "镮": "镮", "铎": "铎", "铛": "铛", "镱": "镱", "镬": "镬", "镔": "镔", "镲": "镲", "锧": "锧", "镴": "镴", "铄": "铄", "镳": "镳", "镥": "镥", "镧": "镧", "镵": "镵", "镩": "镩", "銮": "銮", "韪": "韪", "韫": "韫", "韬": "韬", "闬": "闬", "阇": "阇", "阘": "阘", "闿": "闿", "阓": "阓", "阛": "阛", "腼": "腼", "霁": "霁", "雳": "雳", "霭": "霭", "靓": "靓", "飑": "飑", "飒": "飒", "飓": "飓", "飕": "飕", "飙": "飙", "齑": "齑", "于": "于", "鞒": "鞒", "鞑": "鞑", "鞯": "鞯", "韨": "韨", "鞴": "鞴", "顸": "顸", "颀": "颀", "龛": "龛", "颃": "颃", "颌": "颌", "颉": "颉", "颏": "颏", "颒": "颒", "颋": "颋", "颕": "颕", "颔": "颔", "颚": "颚", "颙": "颙", "颛": "颛", "颡": "颡", "颟": "颟", "颢": "颢", "颥": "颥", "颦": "颦", "颞": "颞", "飐": "飐", "飔": "飔", "飖": "飖", "飗": "飗", "饤": "饤", "饦": "饦", "饳": "饳", "饸": "饸", "饹": "饹", "饻": "饻", "馂": "馂", "饾": "饾", "肴": "肴", "馃": "馃", "馉": "馉", "馎": "馎", "馌": "馌", "飨": "飨", "餍": "餍", "鸠": "鸠", "鸢": "鸢", "鸨": "鸨", "鸩": "鸩", "鸪": "鸪", "鸫": "鸫", "鸬": "鸬", "鸲": "鸲", "鸱": "鸱", "鸶": "鸶", "鸸": "鸸", "鸷": "鸷", "鸹": "鸹", "鸺": "鸺", "鸾": "鸾", "鹁": "鹁", "鹂": "鹂", "鹄": "鹄", "鹆": "鹆", "鹇": "鹇", "鹈": "鹈", "鹉": "鹉", "鹋": "鹋", "鹌": "鹌", "鹎": "鹎", "鹑": "鹑", "鹕": "鹕", "鹗": "鹗", "鹚": "鹚", "鹛": "鹛", "鹜": "鹜", "鹞": "鹞", "鹣": "鹣", "鹦": "鹦", "鹧": "鹧", "鹨": "鹨", "鹩": "鹩", "鹪": "鹪", "鹫": "鹫", "鹬": "鹬", "鹱": "鹱", "鹭": "鹭", "鹳": "鹳", "驲": "驲", "骃": "骃", "骎": "骎", "骍": "骍", "骔": "骔", "骙": "骙", "骕": "骕", "骦": "骦", "骉": "骉", "鲠": "鲠", "髅": "髅", "髌": "髌", "髋": "髋", "鬓": "鬓", "郁": "郁", "魉": "魉", "魇": "魇", "鱽": "鱽", "鱾": "鱾", "鲀": "鲀", "鲂": "鲂", "鱿": "鱿", "鲄": "鲄", "麸": "麸", "鲅": "鲅", "鲆": "鲆", "鲌": "鲌", "鲉": "鲉", "鲧": "鲧", "鲏": "鲏", "鲇": "鲇", "鲐": "鲐", "鲋": "鲋", "鲊": "鲊", "鲒": "鲒", "鲘": "鲘", "鲕": "鲕", "鲖": "鲖", "鲔": "鲔", "鲛": "鲛", "鲑": "鲑", "鲓": "鲓", "鲪": "鲪", "鳀": "鳀", "鲝": "鲝", "鲩": "鲩", "鲨": "鲨", "鲬": "鲬", "鲻": "鲻", "鲯": "鲯", "鲭": "鲭", "鲞": "鲞", "鲷": "鲷", "酰": "酰", "鹾": "鹾", "鲴": "鲴", "鲱": "鲱", "鲵": "鲵", "鲲": "鲲", "鲳": "鲳", "鲮": "鲮", "鲰": "鲰", "鲶": "鲶", "鲺": "鲺", "鲹": "鲹", "鲫": "鲫", "鳊": "鳊", "鳈": "鳈", "鲗": "鲗", "鳂": "鳂", "鲽": "鲽", "鳇": "鳇", "鳅": "鳅", "鲾": "鲾", "鳄": "鳄", "鳆": "鳆", "鳁": "鳁", "鳒": "鳒", "鳑": "鳑", "鳋": "鳋", "鲥": "鲥", "鳏": "鳏", "鳎": "鳎", "鳐": "鳐", "鳍": "鳍", "鲢": "鲢", "鳌": "鳌", "鳓": "鳓", "鳘": "鳘", "鲦": "鲦", "鲣": "鲣", "鳗": "鳗", "龀": "龀", "龃": "龃", "龅": "龅", "龆": "龆", "龇": "龇", "龈": "龈", "龉": "龉", "龊": "龊", "龌": "龌", "黾": "黾", "鼋": "鼋", "鼍": "鼍", "鲈": "鲈", "鲎": "鲎", "鲚": "鲚", "鲟": "鲟", "鲡": "鲡", "鲼": "鲼", "鳛": "鳛", "鳔": "鳔", "鳉": "鳉", "鳙": "鳙", "鳕": "鳕", "鳟": "鳟", "鳝": "鳝", "鳜": "鳜", "鲙": "鲙", "鳣": "鳣", "鳡": "鳡", "鳢": "鳢", "鲿": "鲿", "鳠": "鳠", "鹘": "鹘", "黩": "黩", "黪": "黪", "鼹": "鼹", "齄": "齄", "鸤": "鸤", "鸰": "鸰", "鸮": "鸮", "鸴": "鸴", "鸻": "鸻", "鸼": "鸼", "鹀": "鹀", "鹐": "鹐", "鹓": "鹓", "鹍": "鹍", "鹒": "鹒", "鹙": "鹙", "鹖": "鹖", "鸧": "鸧", "鹟": "鹟", "鹠": "鹠", "鹡": "鹡", "鹢": "鹢", "鹝": "鹝", "鹥": "鹥", "鹔": "鹔", "鹯": "鹯", "鹲": "鹲", "鹴": "鹴", "黡": "黡", "鼌": "鼌", "龁": "龁", "龂": "龂", "飚": "飚", "村": "村", "钜": "钜", "㖞": "㖞", "㧑": "㧑", "㧟": "㧟", "㱮": "㱮", "䁖": "䁖", "䇲": "䇲", "䌶": "䌶", "䌷": "䌷", "䌸": "䌸", "䌹": "䌹", "䌺": "䌺", "䍁": "䍁", "䞍": "䞍", "䴓": "䴓", "䴔": "䴔", "䴕": "䴕", "䴖": "䴖", "䴗": "䴗", "䴘": "䴘", "䴙": "䴙", "伣": "伣", "俫": "俫", "刹": "刹", "厐": "厐", "叁": "叁", "呐": "呐", "垅": "垅", "姹": "姹", "弑": "弑", "悮": "悮", "戯": "戯", "捝": "捝", "揾": "揾", "梿": "梿", "棁": "棁", "榅": "榅", "煴": "煴", "疭": "疭", "瞆": "瞆", "祃": "祃", "窎": "窎", "筼": "筼", "肮": "肮", "蔂": "蔂", "蕰": "蕰", "訚": "訚", "迳": "迳", "酂": "酂", "钅": "钅", "锺": "锺", "霡": "霡", "飏": "飏", "饣": "饣", "鲃": "鲃", "鳚": "鳚", "硷": "硷", "耻": "耻", "囱": "囱", "恶": "恶", "珐": "珐", "厩": "厩", "扦": "扦", "瓮": "瓮", "嚣": "嚣", "扎": "扎", "伫": "伫", "谘": "谘", "藁": "藁", "腌": "腌", "腭": "腭", "沓": "沓", "蚝": "蚝", "籼": "籼", "糇": "糇", "隽": "隽", "线": "线", "莅": "莅", "讬": "讬", "䜣": "䜣", "铇": "铇", "眦": "眦", "碱": "碱", "里": "里", "板": "板", "为": "为", "众": "众", "伪": "伪", "偬": "偬", "凄": "凄", "勋": "勋", "卤": "卤", "历": "历", "叠": "叠", "咤": "咤", "哗": "哗", "啮": "啮", "坂": "坂", "埙": "埙", "复": "复", "妫": "妫", "娴": "娴", "岳": "岳", "幂": "幂", "棂": "棂", "沩": "沩", "游": "游", "湿": "湿", "滟": "滟", "疱": "疱", "疴": "疴", "签": "签", "纟": "纟", "绦": "绦", "绱": "绱", "缰": "缰", "艳": "艳", "莼": "莼", "虬": "虬", "袅": "袅", "裥": "裥", "赍": "赍", "里": "里", "鉴": "鉴", "钵": "钵", "锏": "锏", "锨": "锨", "闲": "闲", "霉": "霉", "饥": "饥", "鸴": "鸴", "松": "松", "尝": "尝" };

const rIsChinese = /\p{sc=Han}/u;
function t2s(textStr) {
   if (!config.traditional_to_simple_chinese) {
      return textStr;
   } else if (typeof textStr === "undefined") {
      throw new Error("no input");
   } else if (typeof textStr != "string") {
      throw new Error("input is not string");
   } else if (!textStr.match(rIsChinese)) {
      return textStr;
   }
   var new_textStr = textStr.replace(/\p{sc=Han}/ug, function (m) {
      return t2sArray[m] || m;
   });
   // if (textStr != new_textStr) {
   //    console.log(`${textStr} -> ${new_textStr}`)
   // }
   return new_textStr;
}

function remember_scroll_pos() {
   if (script_initiate_reload) return;
   localStorage.setItem("yPos", window.scrollY);
   localStorage.setItem("last_url", window.location.href);
}

async function restore_scroll_pos() {
   // if (window.scrollY > 0) return;
   let prev_url = localStorage.getItem("last_url", window.location.href);
   if (!prev_url || prev_url !== window.location.href) return;
   let yPos = localStorage.getItem("yPos", window.scrollY);
   if (!yPos || yPos == 0) return;
   window.scrollTo(0, yPos);
}

async function main() {
   let replacements = await promised_replacements
      .catch(err => { config_loader.resetOnError(err) });
   // console.log(`main started in: ${Date.now() - script_start}`);

   let d = config.delay_scroll_on_reload;
   if (d && d >= 0) {
      setTimeout(restore_scroll_pos, config.delay_scroll_on_reload);
   }
   console.log("config loaded!");
   if (!replacements || replacements.size == 0) {
      console.log("no replacements for this site!");
      return;
   }

   observer = new MutationObserver((mutations) => { run_mutations(mutations, replacements); });
   observer.observe(document.body, { childList: true, subtree: true });

   try {
      replaceText(document.body, replacements);
   } catch (err) {
      config_loader.resetOnError(err);
   }

   // earlier we restore jsons from browser storage for fastloading
   if (!config_loader.is_restored) return;
   // if they restored - probably they changed
   config_loader.mode = loader_modes.norestore;
   await builder.build(config.json_url)
      .catch(err => { config_loader.resetOnError(err) });
   if (!config_loader.is_data_updated) return;
   script_initiate_reload = true;
   // if jsons changed - better reload page to start everything again
   location.reload();
}

let config_loader = new ConfigLoader();
let builder = new ConfigBuilder(config_loader);
let promised_replacements = builder.build(config.json_url);
let observer = null;
let script_initiate_reload = false;

function prevent_memory_leak() {
   config_loader = null;
   builder = null;
   promised_replacements = null;
   observer = null;
   script_initiate_reload = null;
}

document.readyState !== 'loading'
   ? main()
   : addEventListener("DOMContentLoaded", main);

addEventListener("beforeunload", prevent_memory_leak);
addEventListener("beforeunload", remember_scroll_pos);