KevinHuSh
commited on
Commit
·
cdba7f7
1
Parent(s):
8c4ec99
use onnx models, new deepdoc (#68)
Browse files- api/apps/conversation_app.py +1 -1
- api/apps/dialog_app.py +34 -44
- api/db/db_models.py +0 -2
- deepdoc/__init__.py +0 -0
- {rag → deepdoc}/parser/__init__.py +1 -2
- {rag → deepdoc}/parser/docx_parser.py +0 -0
- {rag → deepdoc}/parser/excel_parser.py +0 -0
- {rag → deepdoc}/parser/pdf_parser.py +34 -14
- deepdoc/visual/__init__.py +2 -0
- deepdoc/visual/ocr.py +561 -0
- deepdoc/visual/ocr.res +6623 -0
- deepdoc/visual/operators.py +710 -0
- deepdoc/visual/postprocess.py +354 -0
- deepdoc/visual/recognizer.py +139 -0
- deepdoc/visual/seeit.py +83 -0
- rag/app/book.py +17 -8
- rag/app/laws.py +17 -6
- rag/app/manual.py +4 -4
- rag/app/naive.py +16 -4
- rag/app/paper.py +16 -4
- rag/app/presentation.py +16 -5
- rag/app/qa.py +15 -3
- rag/app/resume.py +55 -32
- rag/app/table.py +16 -3
- rag/nlp/huchunk.py +15 -3
- rag/svr/task_broker.py +1 -1
api/apps/conversation_app.py
CHANGED
|
@@ -198,7 +198,7 @@ def chat(dialog, messages, **kwargs):
|
|
| 198 |
return {"answer": prompt_config["empty_response"], "retrieval": kbinfos}
|
| 199 |
|
| 200 |
kwargs["knowledge"] = "\n".join(knowledges)
|
| 201 |
-
gen_conf = dialog.llm_setting
|
| 202 |
msg = [{"role": m["role"], "content": m["content"]} for m in messages if m["role"] != "system"]
|
| 203 |
used_token_count, msg = message_fit_in(msg, int(llm.max_tokens * 0.97))
|
| 204 |
if "max_tokens" in gen_conf:
|
|
|
|
| 198 |
return {"answer": prompt_config["empty_response"], "retrieval": kbinfos}
|
| 199 |
|
| 200 |
kwargs["knowledge"] = "\n".join(knowledges)
|
| 201 |
+
gen_conf = dialog.llm_setting
|
| 202 |
msg = [{"role": m["role"], "content": m["content"]} for m in messages if m["role"] != "system"]
|
| 203 |
used_token_count, msg = message_fit_in(msg, int(llm.max_tokens * 0.97))
|
| 204 |
if "max_tokens" in gen_conf:
|
api/apps/dialog_app.py
CHANGED
|
@@ -33,38 +33,17 @@ def set_dialog():
|
|
| 33 |
name = req.get("name", "New Dialog")
|
| 34 |
description = req.get("description", "A helpful Dialog")
|
| 35 |
language = req.get("language", "Chinese")
|
| 36 |
-
|
|
|
|
|
|
|
| 37 |
llm_setting = req.get("llm_setting", {
|
| 38 |
-
"
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
"max_tokens": 512
|
| 44 |
-
},
|
| 45 |
-
"Precise": {
|
| 46 |
-
"temperature": 0.1,
|
| 47 |
-
"top_p": 0.3,
|
| 48 |
-
"frequency_penalty": 0.7,
|
| 49 |
-
"presence_penalty": 0.4,
|
| 50 |
-
"max_tokens": 215
|
| 51 |
-
},
|
| 52 |
-
"Evenly": {
|
| 53 |
-
"temperature": 0.5,
|
| 54 |
-
"top_p": 0.5,
|
| 55 |
-
"frequency_penalty": 0.7,
|
| 56 |
-
"presence_penalty": 0.4,
|
| 57 |
-
"max_tokens": 215
|
| 58 |
-
},
|
| 59 |
-
"Custom": {
|
| 60 |
-
"temperature": 0.2,
|
| 61 |
-
"top_p": 0.3,
|
| 62 |
-
"frequency_penalty": 0.6,
|
| 63 |
-
"presence_penalty": 0.3,
|
| 64 |
-
"max_tokens": 215
|
| 65 |
-
},
|
| 66 |
})
|
| 67 |
-
|
| 68 |
"system": """你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包括“知识库中未找到您要的答案!”这句话。回答需要考虑聊天历史。
|
| 69 |
以下是知识库:
|
| 70 |
{knowledge}
|
|
@@ -74,30 +53,40 @@ def set_dialog():
|
|
| 74 |
{"key": "knowledge", "optional": False}
|
| 75 |
],
|
| 76 |
"empty_response": "Sorry! 知识库中未找到相关内容!"
|
| 77 |
-
}
|
|
|
|
| 78 |
|
| 79 |
-
if
|
| 80 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
|
| 82 |
for p in prompt_config["parameters"]:
|
| 83 |
-
if
|
|
|
|
| 84 |
return get_data_error_result(retmsg="Parameter '{}' is not used".format(p["key"]))
|
| 85 |
|
| 86 |
try:
|
| 87 |
e, tenant = TenantService.get_by_id(current_user.id)
|
| 88 |
-
if not e:return get_data_error_result(retmsg="Tenant not found!")
|
| 89 |
llm_id = req.get("llm_id", tenant.llm_id)
|
| 90 |
if not dialog_id:
|
|
|
|
| 91 |
dia = {
|
| 92 |
"id": get_uuid(),
|
| 93 |
"tenant_id": current_user.id,
|
| 94 |
"name": name,
|
|
|
|
| 95 |
"description": description,
|
| 96 |
"language": language,
|
| 97 |
"llm_id": llm_id,
|
| 98 |
-
"llm_setting_type": llm_setting_type,
|
| 99 |
"llm_setting": llm_setting,
|
| 100 |
-
"prompt_config": prompt_config
|
|
|
|
|
|
|
|
|
|
| 101 |
}
|
| 102 |
if not DialogService.save(**dia): return get_data_error_result(retmsg="Fail to new a dialog!")
|
| 103 |
e, dia = DialogService.get_by_id(dia["id"])
|
|
@@ -122,7 +111,7 @@ def set_dialog():
|
|
| 122 |
def get():
|
| 123 |
dialog_id = request.args["dialog_id"]
|
| 124 |
try:
|
| 125 |
-
e,dia = DialogService.get_by_id(dialog_id)
|
| 126 |
if not e: return get_data_error_result(retmsg="Dialog not found!")
|
| 127 |
dia = dia.to_dict()
|
| 128 |
dia["kb_ids"], dia["kb_names"] = get_kb_names(dia["kb_ids"])
|
|
@@ -130,20 +119,22 @@ def get():
|
|
| 130 |
except Exception as e:
|
| 131 |
return server_error_response(e)
|
| 132 |
|
|
|
|
| 133 |
def get_kb_names(kb_ids):
|
| 134 |
ids, nms = [], []
|
| 135 |
for kid in kb_ids:
|
| 136 |
e, kb = KnowledgebaseService.get_by_id(kid)
|
| 137 |
-
if not e or kb.status != StatusEnum.VALID.value:continue
|
| 138 |
ids.append(kid)
|
| 139 |
nms.append(kb.name)
|
| 140 |
return ids, nms
|
| 141 |
|
|
|
|
| 142 |
@manager.route('/list', methods=['GET'])
|
| 143 |
@login_required
|
| 144 |
def list():
|
| 145 |
try:
|
| 146 |
-
diags = DialogService.query(tenant_id=current_user.id, status=StatusEnum.VALID.value)
|
| 147 |
diags = [d.to_dict() for d in diags]
|
| 148 |
for d in diags:
|
| 149 |
d["kb_ids"], d["kb_names"] = get_kb_names(d["kb_ids"])
|
|
@@ -154,12 +145,11 @@ def list():
|
|
| 154 |
|
| 155 |
@manager.route('/rm', methods=['POST'])
|
| 156 |
@login_required
|
| 157 |
-
@validate_request("
|
| 158 |
def rm():
|
| 159 |
req = request.json
|
| 160 |
try:
|
| 161 |
-
|
| 162 |
-
return get_data_error_result(retmsg="Dialog not found!")
|
| 163 |
return get_json_result(data=True)
|
| 164 |
except Exception as e:
|
| 165 |
-
return server_error_response(e)
|
|
|
|
| 33 |
name = req.get("name", "New Dialog")
|
| 34 |
description = req.get("description", "A helpful Dialog")
|
| 35 |
language = req.get("language", "Chinese")
|
| 36 |
+
top_n = req.get("top_n", 6)
|
| 37 |
+
similarity_threshold = req.get("similarity_threshold", 0.1)
|
| 38 |
+
vector_similarity_weight = req.get("vector_similarity_weight", 0.3)
|
| 39 |
llm_setting = req.get("llm_setting", {
|
| 40 |
+
"temperature": 0.1,
|
| 41 |
+
"top_p": 0.3,
|
| 42 |
+
"frequency_penalty": 0.7,
|
| 43 |
+
"presence_penalty": 0.4,
|
| 44 |
+
"max_tokens": 215
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
})
|
| 46 |
+
default_prompt = {
|
| 47 |
"system": """你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包括“知识库中未找到您要的答案!”这句话。回答需要考虑聊天历史。
|
| 48 |
以下是知识库:
|
| 49 |
{knowledge}
|
|
|
|
| 53 |
{"key": "knowledge", "optional": False}
|
| 54 |
],
|
| 55 |
"empty_response": "Sorry! 知识库中未找到相关内容!"
|
| 56 |
+
}
|
| 57 |
+
prompt_config = req.get("prompt_config", default_prompt)
|
| 58 |
|
| 59 |
+
if not prompt_config["system"]: prompt_config["system"] = default_prompt["system"]
|
| 60 |
+
# if len(prompt_config["parameters"]) < 1:
|
| 61 |
+
# prompt_config["parameters"] = default_prompt["parameters"]
|
| 62 |
+
# for p in prompt_config["parameters"]:
|
| 63 |
+
# if p["key"] == "knowledge":break
|
| 64 |
+
# else: prompt_config["parameters"].append(default_prompt["parameters"][0])
|
| 65 |
|
| 66 |
for p in prompt_config["parameters"]:
|
| 67 |
+
if p["optional"]: continue
|
| 68 |
+
if prompt_config["system"].find("{%s}" % p["key"]) < 0:
|
| 69 |
return get_data_error_result(retmsg="Parameter '{}' is not used".format(p["key"]))
|
| 70 |
|
| 71 |
try:
|
| 72 |
e, tenant = TenantService.get_by_id(current_user.id)
|
| 73 |
+
if not e: return get_data_error_result(retmsg="Tenant not found!")
|
| 74 |
llm_id = req.get("llm_id", tenant.llm_id)
|
| 75 |
if not dialog_id:
|
| 76 |
+
if not req.get("kb_ids"):return get_data_error_result(retmsg="Fail! Please select knowledgebase!")
|
| 77 |
dia = {
|
| 78 |
"id": get_uuid(),
|
| 79 |
"tenant_id": current_user.id,
|
| 80 |
"name": name,
|
| 81 |
+
"kb_ids": req["kb_ids"],
|
| 82 |
"description": description,
|
| 83 |
"language": language,
|
| 84 |
"llm_id": llm_id,
|
|
|
|
| 85 |
"llm_setting": llm_setting,
|
| 86 |
+
"prompt_config": prompt_config,
|
| 87 |
+
"top_n": top_n,
|
| 88 |
+
"similarity_threshold": similarity_threshold,
|
| 89 |
+
"vector_similarity_weight": vector_similarity_weight
|
| 90 |
}
|
| 91 |
if not DialogService.save(**dia): return get_data_error_result(retmsg="Fail to new a dialog!")
|
| 92 |
e, dia = DialogService.get_by_id(dia["id"])
|
|
|
|
| 111 |
def get():
|
| 112 |
dialog_id = request.args["dialog_id"]
|
| 113 |
try:
|
| 114 |
+
e, dia = DialogService.get_by_id(dialog_id)
|
| 115 |
if not e: return get_data_error_result(retmsg="Dialog not found!")
|
| 116 |
dia = dia.to_dict()
|
| 117 |
dia["kb_ids"], dia["kb_names"] = get_kb_names(dia["kb_ids"])
|
|
|
|
| 119 |
except Exception as e:
|
| 120 |
return server_error_response(e)
|
| 121 |
|
| 122 |
+
|
| 123 |
def get_kb_names(kb_ids):
|
| 124 |
ids, nms = [], []
|
| 125 |
for kid in kb_ids:
|
| 126 |
e, kb = KnowledgebaseService.get_by_id(kid)
|
| 127 |
+
if not e or kb.status != StatusEnum.VALID.value: continue
|
| 128 |
ids.append(kid)
|
| 129 |
nms.append(kb.name)
|
| 130 |
return ids, nms
|
| 131 |
|
| 132 |
+
|
| 133 |
@manager.route('/list', methods=['GET'])
|
| 134 |
@login_required
|
| 135 |
def list():
|
| 136 |
try:
|
| 137 |
+
diags = DialogService.query(tenant_id=current_user.id, status=StatusEnum.VALID.value, reverse=True, order_by=DialogService.model.create_time)
|
| 138 |
diags = [d.to_dict() for d in diags]
|
| 139 |
for d in diags:
|
| 140 |
d["kb_ids"], d["kb_names"] = get_kb_names(d["kb_ids"])
|
|
|
|
| 145 |
|
| 146 |
@manager.route('/rm', methods=['POST'])
|
| 147 |
@login_required
|
| 148 |
+
@validate_request("dialog_ids")
|
| 149 |
def rm():
|
| 150 |
req = request.json
|
| 151 |
try:
|
| 152 |
+
DialogService.update_many_by_id([{"id": id, "status": StatusEnum.INVALID.value} for id in req["dialog_ids"]])
|
|
|
|
| 153 |
return get_json_result(data=True)
|
| 154 |
except Exception as e:
|
| 155 |
+
return server_error_response(e)
|
api/db/db_models.py
CHANGED
|
@@ -529,8 +529,6 @@ class Dialog(DataBaseModel):
|
|
| 529 |
icon = CharField(max_length=16, null=False, help_text="dialog icon")
|
| 530 |
language = CharField(max_length=32, null=True, default="Chinese", help_text="English|Chinese")
|
| 531 |
llm_id = CharField(max_length=32, null=False, help_text="default llm ID")
|
| 532 |
-
llm_setting_type = CharField(max_length=8, null=False, help_text="Creative|Precise|Evenly|Custom",
|
| 533 |
-
default="Creative")
|
| 534 |
llm_setting = JSONField(null=False, default={"temperature": 0.1, "top_p": 0.3, "frequency_penalty": 0.7,
|
| 535 |
"presence_penalty": 0.4, "max_tokens": 215})
|
| 536 |
prompt_type = CharField(max_length=16, null=False, default="simple", help_text="simple|advanced")
|
|
|
|
| 529 |
icon = CharField(max_length=16, null=False, help_text="dialog icon")
|
| 530 |
language = CharField(max_length=32, null=True, default="Chinese", help_text="English|Chinese")
|
| 531 |
llm_id = CharField(max_length=32, null=False, help_text="default llm ID")
|
|
|
|
|
|
|
| 532 |
llm_setting = JSONField(null=False, default={"temperature": 0.1, "top_p": 0.3, "frequency_penalty": 0.7,
|
| 533 |
"presence_penalty": 0.4, "max_tokens": 215})
|
| 534 |
prompt_type = CharField(max_length=16, null=False, default="simple", help_text="simple|advanced")
|
deepdoc/__init__.py
ADDED
|
File without changes
|
{rag → deepdoc}/parser/__init__.py
RENAMED
|
@@ -1,4 +1,3 @@
|
|
| 1 |
-
import copy
|
| 2 |
import random
|
| 3 |
|
| 4 |
from .pdf_parser import HuParser as PdfParser
|
|
@@ -10,7 +9,7 @@ import re
|
|
| 10 |
from nltk import word_tokenize
|
| 11 |
|
| 12 |
from rag.nlp import stemmer, huqie
|
| 13 |
-
from
|
| 14 |
|
| 15 |
BULLET_PATTERN = [[
|
| 16 |
r"第[零一二三四五六七八九十百0-9]+(分?编|部分)",
|
|
|
|
|
|
|
| 1 |
import random
|
| 2 |
|
| 3 |
from .pdf_parser import HuParser as PdfParser
|
|
|
|
| 9 |
from nltk import word_tokenize
|
| 10 |
|
| 11 |
from rag.nlp import stemmer, huqie
|
| 12 |
+
from rag.utils import num_tokens_from_string
|
| 13 |
|
| 14 |
BULLET_PATTERN = [[
|
| 15 |
r"第[零一二三四五六七八九十百0-9]+(分?编|部分)",
|
{rag → deepdoc}/parser/docx_parser.py
RENAMED
|
File without changes
|
{rag → deepdoc}/parser/excel_parser.py
RENAMED
|
File without changes
|
{rag → deepdoc}/parser/pdf_parser.py
RENAMED
|
@@ -1,7 +1,6 @@
|
|
| 1 |
# -*- coding: utf-8 -*-
|
| 2 |
import os
|
| 3 |
import random
|
| 4 |
-
from functools import partial
|
| 5 |
|
| 6 |
import fitz
|
| 7 |
import requests
|
|
@@ -15,6 +14,7 @@ from PIL import Image
|
|
| 15 |
import numpy as np
|
| 16 |
|
| 17 |
from api.db import ParserType
|
|
|
|
| 18 |
from rag.nlp import huqie
|
| 19 |
from collections import Counter
|
| 20 |
from copy import deepcopy
|
|
@@ -26,13 +26,32 @@ logging.getLogger("pdfminer").setLevel(logging.WARNING)
|
|
| 26 |
|
| 27 |
class HuParser:
|
| 28 |
def __init__(self):
|
| 29 |
-
|
| 30 |
-
logging.getLogger("ppocr").setLevel(logging.ERROR)
|
| 31 |
-
self.ocr = PaddleOCR(use_angle_cls=False, lang="ch")
|
| 32 |
if not hasattr(self, "model_speciess"):
|
| 33 |
self.model_speciess = ParserType.GENERAL.value
|
| 34 |
-
self.
|
| 35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
self.updown_cnt_mdl = xgb.Booster()
|
| 38 |
if torch.cuda.is_available():
|
|
@@ -56,7 +75,7 @@ class HuParser:
|
|
| 56 |
token = os.environ.get("INFINIFLOW_TOKEN")
|
| 57 |
if not url or not token:
|
| 58 |
logging.warning("INFINIFLOW_SERVER is not specified. To maximize the effectiveness, please visit https://github.com/infiniflow/ragflow, and sign in the our demo web site to get token. It's FREE! Using 'export' to set both environment variables: INFINIFLOW_SERVER and INFINIFLOW_TOKEN.")
|
| 59 |
-
return []
|
| 60 |
|
| 61 |
def convert_image_to_bytes(PILimage):
|
| 62 |
image = BytesIO()
|
|
@@ -382,7 +401,7 @@ class HuParser:
|
|
| 382 |
|
| 383 |
return layouts
|
| 384 |
|
| 385 |
-
def
|
| 386 |
tbls = self.tbl_det(images, thr=0.5)
|
| 387 |
res = []
|
| 388 |
# align left&right for rows, align top&bottom for columns
|
|
@@ -452,7 +471,7 @@ class HuParser:
|
|
| 452 |
assert len(self.page_images) == len(tbcnt) - 1
|
| 453 |
if not imgs:
|
| 454 |
return
|
| 455 |
-
recos = self.
|
| 456 |
tbcnt = np.cumsum(tbcnt)
|
| 457 |
for i in range(len(tbcnt) - 1): # for page
|
| 458 |
pg = []
|
|
@@ -517,8 +536,8 @@ class HuParser:
|
|
| 517 |
b["H_right"] = spans[ii]["x1"]
|
| 518 |
b["SP"] = ii
|
| 519 |
|
| 520 |
-
def
|
| 521 |
-
bxs = self.ocr
|
| 522 |
if not bxs:
|
| 523 |
self.boxes.append([])
|
| 524 |
return
|
|
@@ -557,11 +576,12 @@ class HuParser:
|
|
| 557 |
|
| 558 |
self.boxes.append(bxs)
|
| 559 |
|
| 560 |
-
def
|
| 561 |
assert len(self.page_images) == len(self.boxes)
|
| 562 |
# Tag layout type
|
| 563 |
boxes = []
|
| 564 |
layouts = self.layouter(self.page_images)
|
|
|
|
| 565 |
assert len(self.page_images) == len(layouts)
|
| 566 |
for pn, lts in enumerate(layouts):
|
| 567 |
bxs = self.boxes[pn]
|
|
@@ -1741,7 +1761,7 @@ class HuParser:
|
|
| 1741 |
# else:
|
| 1742 |
# self.page_cum_height.append(
|
| 1743 |
# np.max([c["bottom"] for c in chars]))
|
| 1744 |
-
self.
|
| 1745 |
|
| 1746 |
if not self.is_english and not any([c for c in self.page_chars]) and self.boxes:
|
| 1747 |
bxes = [b for bxs in self.boxes for b in bxs]
|
|
@@ -1754,7 +1774,7 @@ class HuParser:
|
|
| 1754 |
|
| 1755 |
def __call__(self, fnm, need_image=True, zoomin=3, return_html=False):
|
| 1756 |
self.__images__(fnm, zoomin)
|
| 1757 |
-
self.
|
| 1758 |
self._table_transformer_job(zoomin)
|
| 1759 |
self._text_merge()
|
| 1760 |
self._concat_downward()
|
|
|
|
| 1 |
# -*- coding: utf-8 -*-
|
| 2 |
import os
|
| 3 |
import random
|
|
|
|
| 4 |
|
| 5 |
import fitz
|
| 6 |
import requests
|
|
|
|
| 14 |
import numpy as np
|
| 15 |
|
| 16 |
from api.db import ParserType
|
| 17 |
+
from deepdoc.visual import OCR, Recognizer
|
| 18 |
from rag.nlp import huqie
|
| 19 |
from collections import Counter
|
| 20 |
from copy import deepcopy
|
|
|
|
| 26 |
|
| 27 |
class HuParser:
|
| 28 |
def __init__(self):
|
| 29 |
+
self.ocr = OCR()
|
|
|
|
|
|
|
| 30 |
if not hasattr(self, "model_speciess"):
|
| 31 |
self.model_speciess = ParserType.GENERAL.value
|
| 32 |
+
self.layout_labels = [
|
| 33 |
+
"_background_",
|
| 34 |
+
"Text",
|
| 35 |
+
"Title",
|
| 36 |
+
"Figure",
|
| 37 |
+
"Figure caption",
|
| 38 |
+
"Table",
|
| 39 |
+
"Table caption",
|
| 40 |
+
"Header",
|
| 41 |
+
"Footer",
|
| 42 |
+
"Reference",
|
| 43 |
+
"Equation",
|
| 44 |
+
]
|
| 45 |
+
self.tsr_labels = [
|
| 46 |
+
"table",
|
| 47 |
+
"table column",
|
| 48 |
+
"table row",
|
| 49 |
+
"table column header",
|
| 50 |
+
"table projected row header",
|
| 51 |
+
"table spanning cell",
|
| 52 |
+
]
|
| 53 |
+
self.layouter = Recognizer(self.layout_labels, "layout", "/data/newpeak/medical-gpt/res/ppdet/")
|
| 54 |
+
self.tbl_det = Recognizer(self.tsr_labels, "tsr", "/data/newpeak/medical-gpt/res/ppdet.tbl/")
|
| 55 |
|
| 56 |
self.updown_cnt_mdl = xgb.Booster()
|
| 57 |
if torch.cuda.is_available():
|
|
|
|
| 75 |
token = os.environ.get("INFINIFLOW_TOKEN")
|
| 76 |
if not url or not token:
|
| 77 |
logging.warning("INFINIFLOW_SERVER is not specified. To maximize the effectiveness, please visit https://github.com/infiniflow/ragflow, and sign in the our demo web site to get token. It's FREE! Using 'export' to set both environment variables: INFINIFLOW_SERVER and INFINIFLOW_TOKEN.")
|
| 78 |
+
return [[] for _ in range(len(images))]
|
| 79 |
|
| 80 |
def convert_image_to_bytes(PILimage):
|
| 81 |
image = BytesIO()
|
|
|
|
| 401 |
|
| 402 |
return layouts
|
| 403 |
|
| 404 |
+
def __table_tsr(self, images):
|
| 405 |
tbls = self.tbl_det(images, thr=0.5)
|
| 406 |
res = []
|
| 407 |
# align left&right for rows, align top&bottom for columns
|
|
|
|
| 471 |
assert len(self.page_images) == len(tbcnt) - 1
|
| 472 |
if not imgs:
|
| 473 |
return
|
| 474 |
+
recos = self.__table_tsr(imgs)
|
| 475 |
tbcnt = np.cumsum(tbcnt)
|
| 476 |
for i in range(len(tbcnt) - 1): # for page
|
| 477 |
pg = []
|
|
|
|
| 536 |
b["H_right"] = spans[ii]["x1"]
|
| 537 |
b["SP"] = ii
|
| 538 |
|
| 539 |
+
def __ocr(self, pagenum, img, chars, ZM=3):
|
| 540 |
+
bxs = self.ocr(np.array(img))
|
| 541 |
if not bxs:
|
| 542 |
self.boxes.append([])
|
| 543 |
return
|
|
|
|
| 576 |
|
| 577 |
self.boxes.append(bxs)
|
| 578 |
|
| 579 |
+
def _layouts_rec(self, ZM):
|
| 580 |
assert len(self.page_images) == len(self.boxes)
|
| 581 |
# Tag layout type
|
| 582 |
boxes = []
|
| 583 |
layouts = self.layouter(self.page_images)
|
| 584 |
+
#save_results(self.page_images, layouts, self.layout_labels, output_dir='output/', threshold=0.7)
|
| 585 |
assert len(self.page_images) == len(layouts)
|
| 586 |
for pn, lts in enumerate(layouts):
|
| 587 |
bxs = self.boxes[pn]
|
|
|
|
| 1761 |
# else:
|
| 1762 |
# self.page_cum_height.append(
|
| 1763 |
# np.max([c["bottom"] for c in chars]))
|
| 1764 |
+
self.__ocr(i + 1, img, chars, zoomin)
|
| 1765 |
|
| 1766 |
if not self.is_english and not any([c for c in self.page_chars]) and self.boxes:
|
| 1767 |
bxes = [b for bxs in self.boxes for b in bxs]
|
|
|
|
| 1774 |
|
| 1775 |
def __call__(self, fnm, need_image=True, zoomin=3, return_html=False):
|
| 1776 |
self.__images__(fnm, zoomin)
|
| 1777 |
+
self._layouts_rec(zoomin)
|
| 1778 |
self._table_transformer_job(zoomin)
|
| 1779 |
self._text_merge()
|
| 1780 |
self._concat_downward()
|
deepdoc/visual/__init__.py
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .ocr import OCR
|
| 2 |
+
from .recognizer import Recognizer
|
deepdoc/visual/ocr.py
ADDED
|
@@ -0,0 +1,561 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
+
|
| 14 |
+
import copy
|
| 15 |
+
import time
|
| 16 |
+
import os
|
| 17 |
+
|
| 18 |
+
from huggingface_hub import snapshot_download
|
| 19 |
+
|
| 20 |
+
from .operators import *
|
| 21 |
+
import numpy as np
|
| 22 |
+
import onnxruntime as ort
|
| 23 |
+
|
| 24 |
+
from api.utils.file_utils import get_project_base_directory
|
| 25 |
+
from .postprocess import build_post_process
|
| 26 |
+
from rag.settings import cron_logger
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def transform(data, ops=None):
|
| 30 |
+
""" transform """
|
| 31 |
+
if ops is None:
|
| 32 |
+
ops = []
|
| 33 |
+
for op in ops:
|
| 34 |
+
data = op(data)
|
| 35 |
+
if data is None:
|
| 36 |
+
return None
|
| 37 |
+
return data
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
def create_operators(op_param_list, global_config=None):
|
| 41 |
+
"""
|
| 42 |
+
create operators based on the config
|
| 43 |
+
|
| 44 |
+
Args:
|
| 45 |
+
params(list): a dict list, used to create some operators
|
| 46 |
+
"""
|
| 47 |
+
assert isinstance(
|
| 48 |
+
op_param_list, list), ('operator config should be a list')
|
| 49 |
+
ops = []
|
| 50 |
+
for operator in op_param_list:
|
| 51 |
+
assert isinstance(operator,
|
| 52 |
+
dict) and len(operator) == 1, "yaml format error"
|
| 53 |
+
op_name = list(operator)[0]
|
| 54 |
+
param = {} if operator[op_name] is None else operator[op_name]
|
| 55 |
+
if global_config is not None:
|
| 56 |
+
param.update(global_config)
|
| 57 |
+
op = eval(op_name)(**param)
|
| 58 |
+
ops.append(op)
|
| 59 |
+
return ops
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def load_model(model_dir, nm):
|
| 63 |
+
model_file_path = os.path.join(model_dir, nm + ".onnx")
|
| 64 |
+
if not os.path.exists(model_file_path):
|
| 65 |
+
raise ValueError("not find model file path {}".format(
|
| 66 |
+
model_file_path))
|
| 67 |
+
sess = ort.InferenceSession(model_file_path)
|
| 68 |
+
return sess, sess.get_inputs()[0]
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
class TextRecognizer(object):
|
| 72 |
+
def __init__(self, model_dir):
|
| 73 |
+
self.rec_image_shape = [int(v) for v in "3, 48, 320".split(",")]
|
| 74 |
+
self.rec_batch_num = 16
|
| 75 |
+
postprocess_params = {
|
| 76 |
+
'name': 'CTCLabelDecode',
|
| 77 |
+
"character_dict_path": os.path.join(get_project_base_directory(), "rag/res", "ocr.res"),
|
| 78 |
+
"use_space_char": True
|
| 79 |
+
}
|
| 80 |
+
self.postprocess_op = build_post_process(postprocess_params)
|
| 81 |
+
self.predictor, self.input_tensor = load_model(model_dir, 'rec')
|
| 82 |
+
|
| 83 |
+
def resize_norm_img(self, img, max_wh_ratio):
|
| 84 |
+
imgC, imgH, imgW = self.rec_image_shape
|
| 85 |
+
|
| 86 |
+
assert imgC == img.shape[2]
|
| 87 |
+
imgW = int((imgH * max_wh_ratio))
|
| 88 |
+
w = self.input_tensor.shape[3:][0]
|
| 89 |
+
if isinstance(w, str):
|
| 90 |
+
pass
|
| 91 |
+
elif w is not None and w > 0:
|
| 92 |
+
imgW = w
|
| 93 |
+
h, w = img.shape[:2]
|
| 94 |
+
ratio = w / float(h)
|
| 95 |
+
if math.ceil(imgH * ratio) > imgW:
|
| 96 |
+
resized_w = imgW
|
| 97 |
+
else:
|
| 98 |
+
resized_w = int(math.ceil(imgH * ratio))
|
| 99 |
+
|
| 100 |
+
resized_image = cv2.resize(img, (resized_w, imgH))
|
| 101 |
+
resized_image = resized_image.astype('float32')
|
| 102 |
+
resized_image = resized_image.transpose((2, 0, 1)) / 255
|
| 103 |
+
resized_image -= 0.5
|
| 104 |
+
resized_image /= 0.5
|
| 105 |
+
padding_im = np.zeros((imgC, imgH, imgW), dtype=np.float32)
|
| 106 |
+
padding_im[:, :, 0:resized_w] = resized_image
|
| 107 |
+
return padding_im
|
| 108 |
+
|
| 109 |
+
def resize_norm_img_vl(self, img, image_shape):
|
| 110 |
+
|
| 111 |
+
imgC, imgH, imgW = image_shape
|
| 112 |
+
img = img[:, :, ::-1] # bgr2rgb
|
| 113 |
+
resized_image = cv2.resize(
|
| 114 |
+
img, (imgW, imgH), interpolation=cv2.INTER_LINEAR)
|
| 115 |
+
resized_image = resized_image.astype('float32')
|
| 116 |
+
resized_image = resized_image.transpose((2, 0, 1)) / 255
|
| 117 |
+
return resized_image
|
| 118 |
+
|
| 119 |
+
def resize_norm_img_srn(self, img, image_shape):
|
| 120 |
+
imgC, imgH, imgW = image_shape
|
| 121 |
+
|
| 122 |
+
img_black = np.zeros((imgH, imgW))
|
| 123 |
+
im_hei = img.shape[0]
|
| 124 |
+
im_wid = img.shape[1]
|
| 125 |
+
|
| 126 |
+
if im_wid <= im_hei * 1:
|
| 127 |
+
img_new = cv2.resize(img, (imgH * 1, imgH))
|
| 128 |
+
elif im_wid <= im_hei * 2:
|
| 129 |
+
img_new = cv2.resize(img, (imgH * 2, imgH))
|
| 130 |
+
elif im_wid <= im_hei * 3:
|
| 131 |
+
img_new = cv2.resize(img, (imgH * 3, imgH))
|
| 132 |
+
else:
|
| 133 |
+
img_new = cv2.resize(img, (imgW, imgH))
|
| 134 |
+
|
| 135 |
+
img_np = np.asarray(img_new)
|
| 136 |
+
img_np = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)
|
| 137 |
+
img_black[:, 0:img_np.shape[1]] = img_np
|
| 138 |
+
img_black = img_black[:, :, np.newaxis]
|
| 139 |
+
|
| 140 |
+
row, col, c = img_black.shape
|
| 141 |
+
c = 1
|
| 142 |
+
|
| 143 |
+
return np.reshape(img_black, (c, row, col)).astype(np.float32)
|
| 144 |
+
|
| 145 |
+
def srn_other_inputs(self, image_shape, num_heads, max_text_length):
|
| 146 |
+
|
| 147 |
+
imgC, imgH, imgW = image_shape
|
| 148 |
+
feature_dim = int((imgH / 8) * (imgW / 8))
|
| 149 |
+
|
| 150 |
+
encoder_word_pos = np.array(range(0, feature_dim)).reshape(
|
| 151 |
+
(feature_dim, 1)).astype('int64')
|
| 152 |
+
gsrm_word_pos = np.array(range(0, max_text_length)).reshape(
|
| 153 |
+
(max_text_length, 1)).astype('int64')
|
| 154 |
+
|
| 155 |
+
gsrm_attn_bias_data = np.ones((1, max_text_length, max_text_length))
|
| 156 |
+
gsrm_slf_attn_bias1 = np.triu(gsrm_attn_bias_data, 1).reshape(
|
| 157 |
+
[-1, 1, max_text_length, max_text_length])
|
| 158 |
+
gsrm_slf_attn_bias1 = np.tile(
|
| 159 |
+
gsrm_slf_attn_bias1,
|
| 160 |
+
[1, num_heads, 1, 1]).astype('float32') * [-1e9]
|
| 161 |
+
|
| 162 |
+
gsrm_slf_attn_bias2 = np.tril(gsrm_attn_bias_data, -1).reshape(
|
| 163 |
+
[-1, 1, max_text_length, max_text_length])
|
| 164 |
+
gsrm_slf_attn_bias2 = np.tile(
|
| 165 |
+
gsrm_slf_attn_bias2,
|
| 166 |
+
[1, num_heads, 1, 1]).astype('float32') * [-1e9]
|
| 167 |
+
|
| 168 |
+
encoder_word_pos = encoder_word_pos[np.newaxis, :]
|
| 169 |
+
gsrm_word_pos = gsrm_word_pos[np.newaxis, :]
|
| 170 |
+
|
| 171 |
+
return [
|
| 172 |
+
encoder_word_pos, gsrm_word_pos, gsrm_slf_attn_bias1,
|
| 173 |
+
gsrm_slf_attn_bias2
|
| 174 |
+
]
|
| 175 |
+
|
| 176 |
+
def process_image_srn(self, img, image_shape, num_heads, max_text_length):
|
| 177 |
+
norm_img = self.resize_norm_img_srn(img, image_shape)
|
| 178 |
+
norm_img = norm_img[np.newaxis, :]
|
| 179 |
+
|
| 180 |
+
[encoder_word_pos, gsrm_word_pos, gsrm_slf_attn_bias1, gsrm_slf_attn_bias2] = \
|
| 181 |
+
self.srn_other_inputs(image_shape, num_heads, max_text_length)
|
| 182 |
+
|
| 183 |
+
gsrm_slf_attn_bias1 = gsrm_slf_attn_bias1.astype(np.float32)
|
| 184 |
+
gsrm_slf_attn_bias2 = gsrm_slf_attn_bias2.astype(np.float32)
|
| 185 |
+
encoder_word_pos = encoder_word_pos.astype(np.int64)
|
| 186 |
+
gsrm_word_pos = gsrm_word_pos.astype(np.int64)
|
| 187 |
+
|
| 188 |
+
return (norm_img, encoder_word_pos, gsrm_word_pos, gsrm_slf_attn_bias1,
|
| 189 |
+
gsrm_slf_attn_bias2)
|
| 190 |
+
|
| 191 |
+
def resize_norm_img_sar(self, img, image_shape,
|
| 192 |
+
width_downsample_ratio=0.25):
|
| 193 |
+
imgC, imgH, imgW_min, imgW_max = image_shape
|
| 194 |
+
h = img.shape[0]
|
| 195 |
+
w = img.shape[1]
|
| 196 |
+
valid_ratio = 1.0
|
| 197 |
+
# make sure new_width is an integral multiple of width_divisor.
|
| 198 |
+
width_divisor = int(1 / width_downsample_ratio)
|
| 199 |
+
# resize
|
| 200 |
+
ratio = w / float(h)
|
| 201 |
+
resize_w = math.ceil(imgH * ratio)
|
| 202 |
+
if resize_w % width_divisor != 0:
|
| 203 |
+
resize_w = round(resize_w / width_divisor) * width_divisor
|
| 204 |
+
if imgW_min is not None:
|
| 205 |
+
resize_w = max(imgW_min, resize_w)
|
| 206 |
+
if imgW_max is not None:
|
| 207 |
+
valid_ratio = min(1.0, 1.0 * resize_w / imgW_max)
|
| 208 |
+
resize_w = min(imgW_max, resize_w)
|
| 209 |
+
resized_image = cv2.resize(img, (resize_w, imgH))
|
| 210 |
+
resized_image = resized_image.astype('float32')
|
| 211 |
+
# norm
|
| 212 |
+
if image_shape[0] == 1:
|
| 213 |
+
resized_image = resized_image / 255
|
| 214 |
+
resized_image = resized_image[np.newaxis, :]
|
| 215 |
+
else:
|
| 216 |
+
resized_image = resized_image.transpose((2, 0, 1)) / 255
|
| 217 |
+
resized_image -= 0.5
|
| 218 |
+
resized_image /= 0.5
|
| 219 |
+
resize_shape = resized_image.shape
|
| 220 |
+
padding_im = -1.0 * np.ones((imgC, imgH, imgW_max), dtype=np.float32)
|
| 221 |
+
padding_im[:, :, 0:resize_w] = resized_image
|
| 222 |
+
pad_shape = padding_im.shape
|
| 223 |
+
|
| 224 |
+
return padding_im, resize_shape, pad_shape, valid_ratio
|
| 225 |
+
|
| 226 |
+
def resize_norm_img_spin(self, img):
|
| 227 |
+
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
| 228 |
+
# return padding_im
|
| 229 |
+
img = cv2.resize(img, tuple([100, 32]), cv2.INTER_CUBIC)
|
| 230 |
+
img = np.array(img, np.float32)
|
| 231 |
+
img = np.expand_dims(img, -1)
|
| 232 |
+
img = img.transpose((2, 0, 1))
|
| 233 |
+
mean = [127.5]
|
| 234 |
+
std = [127.5]
|
| 235 |
+
mean = np.array(mean, dtype=np.float32)
|
| 236 |
+
std = np.array(std, dtype=np.float32)
|
| 237 |
+
mean = np.float32(mean.reshape(1, -1))
|
| 238 |
+
stdinv = 1 / np.float32(std.reshape(1, -1))
|
| 239 |
+
img -= mean
|
| 240 |
+
img *= stdinv
|
| 241 |
+
return img
|
| 242 |
+
|
| 243 |
+
def resize_norm_img_svtr(self, img, image_shape):
|
| 244 |
+
|
| 245 |
+
imgC, imgH, imgW = image_shape
|
| 246 |
+
resized_image = cv2.resize(
|
| 247 |
+
img, (imgW, imgH), interpolation=cv2.INTER_LINEAR)
|
| 248 |
+
resized_image = resized_image.astype('float32')
|
| 249 |
+
resized_image = resized_image.transpose((2, 0, 1)) / 255
|
| 250 |
+
resized_image -= 0.5
|
| 251 |
+
resized_image /= 0.5
|
| 252 |
+
return resized_image
|
| 253 |
+
|
| 254 |
+
def resize_norm_img_abinet(self, img, image_shape):
|
| 255 |
+
|
| 256 |
+
imgC, imgH, imgW = image_shape
|
| 257 |
+
|
| 258 |
+
resized_image = cv2.resize(
|
| 259 |
+
img, (imgW, imgH), interpolation=cv2.INTER_LINEAR)
|
| 260 |
+
resized_image = resized_image.astype('float32')
|
| 261 |
+
resized_image = resized_image / 255.
|
| 262 |
+
|
| 263 |
+
mean = np.array([0.485, 0.456, 0.406])
|
| 264 |
+
std = np.array([0.229, 0.224, 0.225])
|
| 265 |
+
resized_image = (
|
| 266 |
+
resized_image - mean[None, None, ...]) / std[None, None, ...]
|
| 267 |
+
resized_image = resized_image.transpose((2, 0, 1))
|
| 268 |
+
resized_image = resized_image.astype('float32')
|
| 269 |
+
|
| 270 |
+
return resized_image
|
| 271 |
+
|
| 272 |
+
def norm_img_can(self, img, image_shape):
|
| 273 |
+
|
| 274 |
+
img = cv2.cvtColor(
|
| 275 |
+
img, cv2.COLOR_BGR2GRAY) # CAN only predict gray scale image
|
| 276 |
+
|
| 277 |
+
if self.rec_image_shape[0] == 1:
|
| 278 |
+
h, w = img.shape
|
| 279 |
+
_, imgH, imgW = self.rec_image_shape
|
| 280 |
+
if h < imgH or w < imgW:
|
| 281 |
+
padding_h = max(imgH - h, 0)
|
| 282 |
+
padding_w = max(imgW - w, 0)
|
| 283 |
+
img_padded = np.pad(img, ((0, padding_h), (0, padding_w)),
|
| 284 |
+
'constant',
|
| 285 |
+
constant_values=(255))
|
| 286 |
+
img = img_padded
|
| 287 |
+
|
| 288 |
+
img = np.expand_dims(img, 0) / 255.0 # h,w,c -> c,h,w
|
| 289 |
+
img = img.astype('float32')
|
| 290 |
+
|
| 291 |
+
return img
|
| 292 |
+
|
| 293 |
+
def __call__(self, img_list):
|
| 294 |
+
img_num = len(img_list)
|
| 295 |
+
# Calculate the aspect ratio of all text bars
|
| 296 |
+
width_list = []
|
| 297 |
+
for img in img_list:
|
| 298 |
+
width_list.append(img.shape[1] / float(img.shape[0]))
|
| 299 |
+
# Sorting can speed up the recognition process
|
| 300 |
+
indices = np.argsort(np.array(width_list))
|
| 301 |
+
rec_res = [['', 0.0]] * img_num
|
| 302 |
+
batch_num = self.rec_batch_num
|
| 303 |
+
st = time.time()
|
| 304 |
+
|
| 305 |
+
for beg_img_no in range(0, img_num, batch_num):
|
| 306 |
+
end_img_no = min(img_num, beg_img_no + batch_num)
|
| 307 |
+
norm_img_batch = []
|
| 308 |
+
imgC, imgH, imgW = self.rec_image_shape[:3]
|
| 309 |
+
max_wh_ratio = imgW / imgH
|
| 310 |
+
# max_wh_ratio = 0
|
| 311 |
+
for ino in range(beg_img_no, end_img_no):
|
| 312 |
+
h, w = img_list[indices[ino]].shape[0:2]
|
| 313 |
+
wh_ratio = w * 1.0 / h
|
| 314 |
+
max_wh_ratio = max(max_wh_ratio, wh_ratio)
|
| 315 |
+
for ino in range(beg_img_no, end_img_no):
|
| 316 |
+
norm_img = self.resize_norm_img(img_list[indices[ino]],
|
| 317 |
+
max_wh_ratio)
|
| 318 |
+
norm_img = norm_img[np.newaxis, :]
|
| 319 |
+
norm_img_batch.append(norm_img)
|
| 320 |
+
norm_img_batch = np.concatenate(norm_img_batch)
|
| 321 |
+
norm_img_batch = norm_img_batch.copy()
|
| 322 |
+
|
| 323 |
+
input_dict = {}
|
| 324 |
+
input_dict[self.input_tensor.name] = norm_img_batch
|
| 325 |
+
outputs = self.predictor.run(None, input_dict)
|
| 326 |
+
preds = outputs[0]
|
| 327 |
+
rec_result = self.postprocess_op(preds)
|
| 328 |
+
for rno in range(len(rec_result)):
|
| 329 |
+
rec_res[indices[beg_img_no + rno]] = rec_result[rno]
|
| 330 |
+
|
| 331 |
+
return rec_res, time.time() - st
|
| 332 |
+
|
| 333 |
+
|
| 334 |
+
class TextDetector(object):
|
| 335 |
+
def __init__(self, model_dir):
|
| 336 |
+
pre_process_list = [{
|
| 337 |
+
'DetResizeForTest': {
|
| 338 |
+
'limit_side_len': 960,
|
| 339 |
+
'limit_type': "max",
|
| 340 |
+
}
|
| 341 |
+
}, {
|
| 342 |
+
'NormalizeImage': {
|
| 343 |
+
'std': [0.229, 0.224, 0.225],
|
| 344 |
+
'mean': [0.485, 0.456, 0.406],
|
| 345 |
+
'scale': '1./255.',
|
| 346 |
+
'order': 'hwc'
|
| 347 |
+
}
|
| 348 |
+
}, {
|
| 349 |
+
'ToCHWImage': None
|
| 350 |
+
}, {
|
| 351 |
+
'KeepKeys': {
|
| 352 |
+
'keep_keys': ['image', 'shape']
|
| 353 |
+
}
|
| 354 |
+
}]
|
| 355 |
+
postprocess_params = {"name": "DBPostProcess", "thresh": 0.3, "box_thresh": 0.6, "max_candidates": 1000,
|
| 356 |
+
"unclip_ratio": 1.5, "use_dilation": False, "score_mode": "fast", "box_type": "quad"}
|
| 357 |
+
|
| 358 |
+
self.postprocess_op = build_post_process(postprocess_params)
|
| 359 |
+
self.predictor, self.input_tensor = load_model(model_dir, 'det')
|
| 360 |
+
|
| 361 |
+
img_h, img_w = self.input_tensor.shape[2:]
|
| 362 |
+
if isinstance(img_h, str) or isinstance(img_w, str):
|
| 363 |
+
pass
|
| 364 |
+
elif img_h is not None and img_w is not None and img_h > 0 and img_w > 0:
|
| 365 |
+
pre_process_list[0] = {
|
| 366 |
+
'DetResizeForTest': {
|
| 367 |
+
'image_shape': [img_h, img_w]
|
| 368 |
+
}
|
| 369 |
+
}
|
| 370 |
+
self.preprocess_op = create_operators(pre_process_list)
|
| 371 |
+
|
| 372 |
+
def order_points_clockwise(self, pts):
|
| 373 |
+
rect = np.zeros((4, 2), dtype="float32")
|
| 374 |
+
s = pts.sum(axis=1)
|
| 375 |
+
rect[0] = pts[np.argmin(s)]
|
| 376 |
+
rect[2] = pts[np.argmax(s)]
|
| 377 |
+
tmp = np.delete(pts, (np.argmin(s), np.argmax(s)), axis=0)
|
| 378 |
+
diff = np.diff(np.array(tmp), axis=1)
|
| 379 |
+
rect[1] = tmp[np.argmin(diff)]
|
| 380 |
+
rect[3] = tmp[np.argmax(diff)]
|
| 381 |
+
return rect
|
| 382 |
+
|
| 383 |
+
def clip_det_res(self, points, img_height, img_width):
|
| 384 |
+
for pno in range(points.shape[0]):
|
| 385 |
+
points[pno, 0] = int(min(max(points[pno, 0], 0), img_width - 1))
|
| 386 |
+
points[pno, 1] = int(min(max(points[pno, 1], 0), img_height - 1))
|
| 387 |
+
return points
|
| 388 |
+
|
| 389 |
+
def filter_tag_det_res(self, dt_boxes, image_shape):
|
| 390 |
+
img_height, img_width = image_shape[0:2]
|
| 391 |
+
dt_boxes_new = []
|
| 392 |
+
for box in dt_boxes:
|
| 393 |
+
if isinstance(box, list):
|
| 394 |
+
box = np.array(box)
|
| 395 |
+
box = self.order_points_clockwise(box)
|
| 396 |
+
box = self.clip_det_res(box, img_height, img_width)
|
| 397 |
+
rect_width = int(np.linalg.norm(box[0] - box[1]))
|
| 398 |
+
rect_height = int(np.linalg.norm(box[0] - box[3]))
|
| 399 |
+
if rect_width <= 3 or rect_height <= 3:
|
| 400 |
+
continue
|
| 401 |
+
dt_boxes_new.append(box)
|
| 402 |
+
dt_boxes = np.array(dt_boxes_new)
|
| 403 |
+
return dt_boxes
|
| 404 |
+
|
| 405 |
+
def filter_tag_det_res_only_clip(self, dt_boxes, image_shape):
|
| 406 |
+
img_height, img_width = image_shape[0:2]
|
| 407 |
+
dt_boxes_new = []
|
| 408 |
+
for box in dt_boxes:
|
| 409 |
+
if isinstance(box, list):
|
| 410 |
+
box = np.array(box)
|
| 411 |
+
box = self.clip_det_res(box, img_height, img_width)
|
| 412 |
+
dt_boxes_new.append(box)
|
| 413 |
+
dt_boxes = np.array(dt_boxes_new)
|
| 414 |
+
return dt_boxes
|
| 415 |
+
|
| 416 |
+
def __call__(self, img):
|
| 417 |
+
ori_im = img.copy()
|
| 418 |
+
data = {'image': img}
|
| 419 |
+
|
| 420 |
+
st = time.time()
|
| 421 |
+
data = transform(data, self.preprocess_op)
|
| 422 |
+
img, shape_list = data
|
| 423 |
+
if img is None:
|
| 424 |
+
return None, 0
|
| 425 |
+
img = np.expand_dims(img, axis=0)
|
| 426 |
+
shape_list = np.expand_dims(shape_list, axis=0)
|
| 427 |
+
img = img.copy()
|
| 428 |
+
input_dict = {}
|
| 429 |
+
input_dict[self.input_tensor.name] = img
|
| 430 |
+
outputs = self.predictor.run(None, input_dict)
|
| 431 |
+
|
| 432 |
+
post_result = self.postprocess_op({"maps": outputs[0]}, shape_list)
|
| 433 |
+
dt_boxes = post_result[0]['points']
|
| 434 |
+
dt_boxes = self.filter_tag_det_res(dt_boxes, ori_im.shape)
|
| 435 |
+
|
| 436 |
+
return dt_boxes, time.time() - st
|
| 437 |
+
|
| 438 |
+
|
| 439 |
+
class OCR(object):
|
| 440 |
+
def __init__(self, model_dir=None):
|
| 441 |
+
"""
|
| 442 |
+
If you have trouble downloading HuggingFace models, -_^ this might help!!
|
| 443 |
+
|
| 444 |
+
For Linux:
|
| 445 |
+
export HF_ENDPOINT=https://hf-mirror.com
|
| 446 |
+
|
| 447 |
+
For Windows:
|
| 448 |
+
Good luck
|
| 449 |
+
^_-
|
| 450 |
+
|
| 451 |
+
"""
|
| 452 |
+
if not model_dir:
|
| 453 |
+
model_dir = snapshot_download(repo_id="InfiniFlow/ocr")
|
| 454 |
+
|
| 455 |
+
self.text_detector = TextDetector(model_dir)
|
| 456 |
+
self.text_recognizer = TextRecognizer(model_dir)
|
| 457 |
+
self.drop_score = 0.5
|
| 458 |
+
self.crop_image_res_index = 0
|
| 459 |
+
|
| 460 |
+
def get_rotate_crop_image(self, img, points):
|
| 461 |
+
'''
|
| 462 |
+
img_height, img_width = img.shape[0:2]
|
| 463 |
+
left = int(np.min(points[:, 0]))
|
| 464 |
+
right = int(np.max(points[:, 0]))
|
| 465 |
+
top = int(np.min(points[:, 1]))
|
| 466 |
+
bottom = int(np.max(points[:, 1]))
|
| 467 |
+
img_crop = img[top:bottom, left:right, :].copy()
|
| 468 |
+
points[:, 0] = points[:, 0] - left
|
| 469 |
+
points[:, 1] = points[:, 1] - top
|
| 470 |
+
'''
|
| 471 |
+
assert len(points) == 4, "shape of points must be 4*2"
|
| 472 |
+
img_crop_width = int(
|
| 473 |
+
max(
|
| 474 |
+
np.linalg.norm(points[0] - points[1]),
|
| 475 |
+
np.linalg.norm(points[2] - points[3])))
|
| 476 |
+
img_crop_height = int(
|
| 477 |
+
max(
|
| 478 |
+
np.linalg.norm(points[0] - points[3]),
|
| 479 |
+
np.linalg.norm(points[1] - points[2])))
|
| 480 |
+
pts_std = np.float32([[0, 0], [img_crop_width, 0],
|
| 481 |
+
[img_crop_width, img_crop_height],
|
| 482 |
+
[0, img_crop_height]])
|
| 483 |
+
M = cv2.getPerspectiveTransform(points, pts_std)
|
| 484 |
+
dst_img = cv2.warpPerspective(
|
| 485 |
+
img,
|
| 486 |
+
M, (img_crop_width, img_crop_height),
|
| 487 |
+
borderMode=cv2.BORDER_REPLICATE,
|
| 488 |
+
flags=cv2.INTER_CUBIC)
|
| 489 |
+
dst_img_height, dst_img_width = dst_img.shape[0:2]
|
| 490 |
+
if dst_img_height * 1.0 / dst_img_width >= 1.5:
|
| 491 |
+
dst_img = np.rot90(dst_img)
|
| 492 |
+
return dst_img
|
| 493 |
+
|
| 494 |
+
def sorted_boxes(self, dt_boxes):
|
| 495 |
+
"""
|
| 496 |
+
Sort text boxes in order from top to bottom, left to right
|
| 497 |
+
args:
|
| 498 |
+
dt_boxes(array):detected text boxes with shape [4, 2]
|
| 499 |
+
return:
|
| 500 |
+
sorted boxes(array) with shape [4, 2]
|
| 501 |
+
"""
|
| 502 |
+
num_boxes = dt_boxes.shape[0]
|
| 503 |
+
sorted_boxes = sorted(dt_boxes, key=lambda x: (x[0][1], x[0][0]))
|
| 504 |
+
_boxes = list(sorted_boxes)
|
| 505 |
+
|
| 506 |
+
for i in range(num_boxes - 1):
|
| 507 |
+
for j in range(i, -1, -1):
|
| 508 |
+
if abs(_boxes[j + 1][0][1] - _boxes[j][0][1]) < 10 and \
|
| 509 |
+
(_boxes[j + 1][0][0] < _boxes[j][0][0]):
|
| 510 |
+
tmp = _boxes[j]
|
| 511 |
+
_boxes[j] = _boxes[j + 1]
|
| 512 |
+
_boxes[j + 1] = tmp
|
| 513 |
+
else:
|
| 514 |
+
break
|
| 515 |
+
return _boxes
|
| 516 |
+
|
| 517 |
+
def __call__(self, img, cls=True):
|
| 518 |
+
time_dict = {'det': 0, 'rec': 0, 'cls': 0, 'all': 0}
|
| 519 |
+
|
| 520 |
+
if img is None:
|
| 521 |
+
return None, None, time_dict
|
| 522 |
+
|
| 523 |
+
start = time.time()
|
| 524 |
+
ori_im = img.copy()
|
| 525 |
+
dt_boxes, elapse = self.text_detector(img)
|
| 526 |
+
time_dict['det'] = elapse
|
| 527 |
+
|
| 528 |
+
if dt_boxes is None:
|
| 529 |
+
end = time.time()
|
| 530 |
+
time_dict['all'] = end - start
|
| 531 |
+
return None, None, time_dict
|
| 532 |
+
else:
|
| 533 |
+
cron_logger.debug("dt_boxes num : {}, elapsed : {}".format(
|
| 534 |
+
len(dt_boxes), elapse))
|
| 535 |
+
img_crop_list = []
|
| 536 |
+
|
| 537 |
+
dt_boxes = self.sorted_boxes(dt_boxes)
|
| 538 |
+
|
| 539 |
+
for bno in range(len(dt_boxes)):
|
| 540 |
+
tmp_box = copy.deepcopy(dt_boxes[bno])
|
| 541 |
+
img_crop = self.get_rotate_crop_image(ori_im, tmp_box)
|
| 542 |
+
img_crop_list.append(img_crop)
|
| 543 |
+
|
| 544 |
+
rec_res, elapse = self.text_recognizer(img_crop_list)
|
| 545 |
+
time_dict['rec'] = elapse
|
| 546 |
+
cron_logger.debug("rec_res num : {}, elapsed : {}".format(
|
| 547 |
+
len(rec_res), elapse))
|
| 548 |
+
|
| 549 |
+
filter_boxes, filter_rec_res = [], []
|
| 550 |
+
for box, rec_result in zip(dt_boxes, rec_res):
|
| 551 |
+
text, score = rec_result
|
| 552 |
+
if score >= self.drop_score:
|
| 553 |
+
filter_boxes.append(box)
|
| 554 |
+
filter_rec_res.append(rec_result)
|
| 555 |
+
end = time.time()
|
| 556 |
+
time_dict['all'] = end - start
|
| 557 |
+
|
| 558 |
+
#for bno in range(len(img_crop_list)):
|
| 559 |
+
# print(f"{bno}, {rec_res[bno]}")
|
| 560 |
+
|
| 561 |
+
return list(zip([a.tolist() for a in filter_boxes], filter_rec_res))
|
deepdoc/visual/ocr.res
ADDED
|
@@ -0,0 +1,6623 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'
|
| 2 |
+
疗
|
| 3 |
+
绚
|
| 4 |
+
诚
|
| 5 |
+
娇
|
| 6 |
+
溜
|
| 7 |
+
题
|
| 8 |
+
贿
|
| 9 |
+
者
|
| 10 |
+
廖
|
| 11 |
+
更
|
| 12 |
+
纳
|
| 13 |
+
加
|
| 14 |
+
奉
|
| 15 |
+
公
|
| 16 |
+
一
|
| 17 |
+
就
|
| 18 |
+
汴
|
| 19 |
+
计
|
| 20 |
+
与
|
| 21 |
+
路
|
| 22 |
+
房
|
| 23 |
+
原
|
| 24 |
+
妇
|
| 25 |
+
2
|
| 26 |
+
0
|
| 27 |
+
8
|
| 28 |
+
-
|
| 29 |
+
7
|
| 30 |
+
其
|
| 31 |
+
>
|
| 32 |
+
:
|
| 33 |
+
]
|
| 34 |
+
,
|
| 35 |
+
,
|
| 36 |
+
骑
|
| 37 |
+
刈
|
| 38 |
+
全
|
| 39 |
+
消
|
| 40 |
+
昏
|
| 41 |
+
傈
|
| 42 |
+
安
|
| 43 |
+
久
|
| 44 |
+
钟
|
| 45 |
+
嗅
|
| 46 |
+
不
|
| 47 |
+
影
|
| 48 |
+
处
|
| 49 |
+
驽
|
| 50 |
+
蜿
|
| 51 |
+
资
|
| 52 |
+
关
|
| 53 |
+
椤
|
| 54 |
+
地
|
| 55 |
+
瘸
|
| 56 |
+
专
|
| 57 |
+
问
|
| 58 |
+
忖
|
| 59 |
+
票
|
| 60 |
+
嫉
|
| 61 |
+
炎
|
| 62 |
+
韵
|
| 63 |
+
要
|
| 64 |
+
月
|
| 65 |
+
田
|
| 66 |
+
节
|
| 67 |
+
陂
|
| 68 |
+
鄙
|
| 69 |
+
捌
|
| 70 |
+
备
|
| 71 |
+
拳
|
| 72 |
+
伺
|
| 73 |
+
眼
|
| 74 |
+
网
|
| 75 |
+
盎
|
| 76 |
+
大
|
| 77 |
+
傍
|
| 78 |
+
心
|
| 79 |
+
东
|
| 80 |
+
愉
|
| 81 |
+
汇
|
| 82 |
+
蹿
|
| 83 |
+
科
|
| 84 |
+
每
|
| 85 |
+
业
|
| 86 |
+
里
|
| 87 |
+
航
|
| 88 |
+
晏
|
| 89 |
+
字
|
| 90 |
+
平
|
| 91 |
+
录
|
| 92 |
+
先
|
| 93 |
+
1
|
| 94 |
+
3
|
| 95 |
+
彤
|
| 96 |
+
鲶
|
| 97 |
+
产
|
| 98 |
+
稍
|
| 99 |
+
督
|
| 100 |
+
腴
|
| 101 |
+
有
|
| 102 |
+
象
|
| 103 |
+
岳
|
| 104 |
+
注
|
| 105 |
+
绍
|
| 106 |
+
在
|
| 107 |
+
泺
|
| 108 |
+
文
|
| 109 |
+
定
|
| 110 |
+
核
|
| 111 |
+
名
|
| 112 |
+
水
|
| 113 |
+
过
|
| 114 |
+
理
|
| 115 |
+
让
|
| 116 |
+
偷
|
| 117 |
+
率
|
| 118 |
+
等
|
| 119 |
+
这
|
| 120 |
+
发
|
| 121 |
+
”
|
| 122 |
+
为
|
| 123 |
+
含
|
| 124 |
+
肥
|
| 125 |
+
酉
|
| 126 |
+
相
|
| 127 |
+
鄱
|
| 128 |
+
七
|
| 129 |
+
编
|
| 130 |
+
猥
|
| 131 |
+
锛
|
| 132 |
+
日
|
| 133 |
+
镀
|
| 134 |
+
蒂
|
| 135 |
+
掰
|
| 136 |
+
倒
|
| 137 |
+
辆
|
| 138 |
+
栾
|
| 139 |
+
栗
|
| 140 |
+
综
|
| 141 |
+
涩
|
| 142 |
+
州
|
| 143 |
+
雌
|
| 144 |
+
滑
|
| 145 |
+
馀
|
| 146 |
+
了
|
| 147 |
+
机
|
| 148 |
+
块
|
| 149 |
+
司
|
| 150 |
+
宰
|
| 151 |
+
甙
|
| 152 |
+
兴
|
| 153 |
+
矽
|
| 154 |
+
抚
|
| 155 |
+
保
|
| 156 |
+
用
|
| 157 |
+
沧
|
| 158 |
+
秩
|
| 159 |
+
如
|
| 160 |
+
收
|
| 161 |
+
息
|
| 162 |
+
滥
|
| 163 |
+
页
|
| 164 |
+
疑
|
| 165 |
+
埠
|
| 166 |
+
!
|
| 167 |
+
!
|
| 168 |
+
姥
|
| 169 |
+
异
|
| 170 |
+
橹
|
| 171 |
+
钇
|
| 172 |
+
向
|
| 173 |
+
下
|
| 174 |
+
跄
|
| 175 |
+
的
|
| 176 |
+
椴
|
| 177 |
+
沫
|
| 178 |
+
国
|
| 179 |
+
绥
|
| 180 |
+
獠
|
| 181 |
+
报
|
| 182 |
+
开
|
| 183 |
+
民
|
| 184 |
+
蜇
|
| 185 |
+
何
|
| 186 |
+
分
|
| 187 |
+
凇
|
| 188 |
+
长
|
| 189 |
+
讥
|
| 190 |
+
藏
|
| 191 |
+
掏
|
| 192 |
+
施
|
| 193 |
+
羽
|
| 194 |
+
中
|
| 195 |
+
讲
|
| 196 |
+
派
|
| 197 |
+
嘟
|
| 198 |
+
人
|
| 199 |
+
提
|
| 200 |
+
浼
|
| 201 |
+
间
|
| 202 |
+
世
|
| 203 |
+
而
|
| 204 |
+
古
|
| 205 |
+
多
|
| 206 |
+
倪
|
| 207 |
+
唇
|
| 208 |
+
饯
|
| 209 |
+
控
|
| 210 |
+
庚
|
| 211 |
+
首
|
| 212 |
+
赛
|
| 213 |
+
蜓
|
| 214 |
+
味
|
| 215 |
+
断
|
| 216 |
+
制
|
| 217 |
+
觉
|
| 218 |
+
技
|
| 219 |
+
替
|
| 220 |
+
艰
|
| 221 |
+
溢
|
| 222 |
+
潮
|
| 223 |
+
夕
|
| 224 |
+
钺
|
| 225 |
+
外
|
| 226 |
+
摘
|
| 227 |
+
枋
|
| 228 |
+
动
|
| 229 |
+
双
|
| 230 |
+
单
|
| 231 |
+
啮
|
| 232 |
+
户
|
| 233 |
+
枇
|
| 234 |
+
确
|
| 235 |
+
锦
|
| 236 |
+
曜
|
| 237 |
+
杜
|
| 238 |
+
或
|
| 239 |
+
能
|
| 240 |
+
效
|
| 241 |
+
霜
|
| 242 |
+
盒
|
| 243 |
+
然
|
| 244 |
+
侗
|
| 245 |
+
电
|
| 246 |
+
晁
|
| 247 |
+
放
|
| 248 |
+
步
|
| 249 |
+
鹃
|
| 250 |
+
新
|
| 251 |
+
杖
|
| 252 |
+
蜂
|
| 253 |
+
吒
|
| 254 |
+
濂
|
| 255 |
+
瞬
|
| 256 |
+
评
|
| 257 |
+
总
|
| 258 |
+
隍
|
| 259 |
+
对
|
| 260 |
+
独
|
| 261 |
+
合
|
| 262 |
+
也
|
| 263 |
+
是
|
| 264 |
+
府
|
| 265 |
+
青
|
| 266 |
+
天
|
| 267 |
+
诲
|
| 268 |
+
墙
|
| 269 |
+
组
|
| 270 |
+
滴
|
| 271 |
+
级
|
| 272 |
+
邀
|
| 273 |
+
帘
|
| 274 |
+
示
|
| 275 |
+
已
|
| 276 |
+
时
|
| 277 |
+
骸
|
| 278 |
+
仄
|
| 279 |
+
泅
|
| 280 |
+
和
|
| 281 |
+
遨
|
| 282 |
+
店
|
| 283 |
+
雇
|
| 284 |
+
疫
|
| 285 |
+
持
|
| 286 |
+
巍
|
| 287 |
+
踮
|
| 288 |
+
境
|
| 289 |
+
只
|
| 290 |
+
亨
|
| 291 |
+
目
|
| 292 |
+
鉴
|
| 293 |
+
崤
|
| 294 |
+
闲
|
| 295 |
+
体
|
| 296 |
+
泄
|
| 297 |
+
杂
|
| 298 |
+
作
|
| 299 |
+
般
|
| 300 |
+
轰
|
| 301 |
+
化
|
| 302 |
+
解
|
| 303 |
+
迂
|
| 304 |
+
诿
|
| 305 |
+
蛭
|
| 306 |
+
璀
|
| 307 |
+
腾
|
| 308 |
+
告
|
| 309 |
+
版
|
| 310 |
+
服
|
| 311 |
+
省
|
| 312 |
+
师
|
| 313 |
+
小
|
| 314 |
+
规
|
| 315 |
+
程
|
| 316 |
+
线
|
| 317 |
+
海
|
| 318 |
+
办
|
| 319 |
+
引
|
| 320 |
+
二
|
| 321 |
+
桧
|
| 322 |
+
牌
|
| 323 |
+
砺
|
| 324 |
+
洄
|
| 325 |
+
裴
|
| 326 |
+
修
|
| 327 |
+
图
|
| 328 |
+
痫
|
| 329 |
+
胡
|
| 330 |
+
许
|
| 331 |
+
犊
|
| 332 |
+
事
|
| 333 |
+
郛
|
| 334 |
+
基
|
| 335 |
+
柴
|
| 336 |
+
呼
|
| 337 |
+
食
|
| 338 |
+
研
|
| 339 |
+
奶
|
| 340 |
+
律
|
| 341 |
+
蛋
|
| 342 |
+
因
|
| 343 |
+
葆
|
| 344 |
+
察
|
| 345 |
+
戏
|
| 346 |
+
褒
|
| 347 |
+
戒
|
| 348 |
+
再
|
| 349 |
+
李
|
| 350 |
+
骁
|
| 351 |
+
工
|
| 352 |
+
貂
|
| 353 |
+
油
|
| 354 |
+
鹅
|
| 355 |
+
章
|
| 356 |
+
啄
|
| 357 |
+
休
|
| 358 |
+
场
|
| 359 |
+
给
|
| 360 |
+
睡
|
| 361 |
+
纷
|
| 362 |
+
豆
|
| 363 |
+
器
|
| 364 |
+
捎
|
| 365 |
+
说
|
| 366 |
+
敏
|
| 367 |
+
学
|
| 368 |
+
会
|
| 369 |
+
浒
|
| 370 |
+
设
|
| 371 |
+
诊
|
| 372 |
+
格
|
| 373 |
+
廓
|
| 374 |
+
查
|
| 375 |
+
来
|
| 376 |
+
霓
|
| 377 |
+
室
|
| 378 |
+
溆
|
| 379 |
+
¢
|
| 380 |
+
诡
|
| 381 |
+
寥
|
| 382 |
+
焕
|
| 383 |
+
舜
|
| 384 |
+
柒
|
| 385 |
+
狐
|
| 386 |
+
回
|
| 387 |
+
戟
|
| 388 |
+
砾
|
| 389 |
+
厄
|
| 390 |
+
实
|
| 391 |
+
翩
|
| 392 |
+
尿
|
| 393 |
+
五
|
| 394 |
+
入
|
| 395 |
+
径
|
| 396 |
+
惭
|
| 397 |
+
喹
|
| 398 |
+
股
|
| 399 |
+
宇
|
| 400 |
+
篝
|
| 401 |
+
|
|
| 402 |
+
;
|
| 403 |
+
美
|
| 404 |
+
期
|
| 405 |
+
云
|
| 406 |
+
九
|
| 407 |
+
祺
|
| 408 |
+
扮
|
| 409 |
+
靠
|
| 410 |
+
锝
|
| 411 |
+
槌
|
| 412 |
+
系
|
| 413 |
+
企
|
| 414 |
+
酰
|
| 415 |
+
阊
|
| 416 |
+
暂
|
| 417 |
+
蚕
|
| 418 |
+
忻
|
| 419 |
+
豁
|
| 420 |
+
本
|
| 421 |
+
羹
|
| 422 |
+
执
|
| 423 |
+
条
|
| 424 |
+
钦
|
| 425 |
+
H
|
| 426 |
+
獒
|
| 427 |
+
限
|
| 428 |
+
进
|
| 429 |
+
季
|
| 430 |
+
楦
|
| 431 |
+
于
|
| 432 |
+
芘
|
| 433 |
+
玖
|
| 434 |
+
铋
|
| 435 |
+
茯
|
| 436 |
+
未
|
| 437 |
+
答
|
| 438 |
+
粘
|
| 439 |
+
括
|
| 440 |
+
样
|
| 441 |
+
精
|
| 442 |
+
欠
|
| 443 |
+
矢
|
| 444 |
+
甥
|
| 445 |
+
帷
|
| 446 |
+
嵩
|
| 447 |
+
扣
|
| 448 |
+
令
|
| 449 |
+
仔
|
| 450 |
+
风
|
| 451 |
+
皈
|
| 452 |
+
行
|
| 453 |
+
支
|
| 454 |
+
部
|
| 455 |
+
蓉
|
| 456 |
+
刮
|
| 457 |
+
站
|
| 458 |
+
蜡
|
| 459 |
+
救
|
| 460 |
+
钊
|
| 461 |
+
汗
|
| 462 |
+
松
|
| 463 |
+
嫌
|
| 464 |
+
成
|
| 465 |
+
可
|
| 466 |
+
.
|
| 467 |
+
鹤
|
| 468 |
+
院
|
| 469 |
+
从
|
| 470 |
+
交
|
| 471 |
+
政
|
| 472 |
+
怕
|
| 473 |
+
活
|
| 474 |
+
调
|
| 475 |
+
球
|
| 476 |
+
局
|
| 477 |
+
验
|
| 478 |
+
髌
|
| 479 |
+
第
|
| 480 |
+
韫
|
| 481 |
+
谗
|
| 482 |
+
串
|
| 483 |
+
到
|
| 484 |
+
圆
|
| 485 |
+
年
|
| 486 |
+
米
|
| 487 |
+
/
|
| 488 |
+
*
|
| 489 |
+
友
|
| 490 |
+
忿
|
| 491 |
+
检
|
| 492 |
+
区
|
| 493 |
+
看
|
| 494 |
+
自
|
| 495 |
+
敢
|
| 496 |
+
刃
|
| 497 |
+
个
|
| 498 |
+
兹
|
| 499 |
+
弄
|
| 500 |
+
流
|
| 501 |
+
留
|
| 502 |
+
同
|
| 503 |
+
没
|
| 504 |
+
齿
|
| 505 |
+
星
|
| 506 |
+
聆
|
| 507 |
+
轼
|
| 508 |
+
湖
|
| 509 |
+
什
|
| 510 |
+
三
|
| 511 |
+
建
|
| 512 |
+
蛔
|
| 513 |
+
儿
|
| 514 |
+
椋
|
| 515 |
+
汕
|
| 516 |
+
震
|
| 517 |
+
颧
|
| 518 |
+
鲤
|
| 519 |
+
跟
|
| 520 |
+
力
|
| 521 |
+
情
|
| 522 |
+
璺
|
| 523 |
+
铨
|
| 524 |
+
陪
|
| 525 |
+
务
|
| 526 |
+
指
|
| 527 |
+
族
|
| 528 |
+
训
|
| 529 |
+
滦
|
| 530 |
+
鄣
|
| 531 |
+
濮
|
| 532 |
+
扒
|
| 533 |
+
商
|
| 534 |
+
箱
|
| 535 |
+
十
|
| 536 |
+
召
|
| 537 |
+
慷
|
| 538 |
+
辗
|
| 539 |
+
所
|
| 540 |
+
莞
|
| 541 |
+
管
|
| 542 |
+
护
|
| 543 |
+
臭
|
| 544 |
+
横
|
| 545 |
+
硒
|
| 546 |
+
嗓
|
| 547 |
+
接
|
| 548 |
+
侦
|
| 549 |
+
六
|
| 550 |
+
露
|
| 551 |
+
党
|
| 552 |
+
馋
|
| 553 |
+
驾
|
| 554 |
+
剖
|
| 555 |
+
高
|
| 556 |
+
侬
|
| 557 |
+
妪
|
| 558 |
+
幂
|
| 559 |
+
猗
|
| 560 |
+
绺
|
| 561 |
+
骐
|
| 562 |
+
央
|
| 563 |
+
酐
|
| 564 |
+
孝
|
| 565 |
+
筝
|
| 566 |
+
课
|
| 567 |
+
徇
|
| 568 |
+
缰
|
| 569 |
+
门
|
| 570 |
+
男
|
| 571 |
+
西
|
| 572 |
+
项
|
| 573 |
+
句
|
| 574 |
+
谙
|
| 575 |
+
瞒
|
| 576 |
+
秃
|
| 577 |
+
篇
|
| 578 |
+
教
|
| 579 |
+
碲
|
| 580 |
+
罚
|
| 581 |
+
声
|
| 582 |
+
呐
|
| 583 |
+
景
|
| 584 |
+
前
|
| 585 |
+
富
|
| 586 |
+
嘴
|
| 587 |
+
鳌
|
| 588 |
+
稀
|
| 589 |
+
免
|
| 590 |
+
朋
|
| 591 |
+
啬
|
| 592 |
+
睐
|
| 593 |
+
去
|
| 594 |
+
赈
|
| 595 |
+
鱼
|
| 596 |
+
住
|
| 597 |
+
肩
|
| 598 |
+
愕
|
| 599 |
+
速
|
| 600 |
+
旁
|
| 601 |
+
波
|
| 602 |
+
厅
|
| 603 |
+
健
|
| 604 |
+
茼
|
| 605 |
+
厥
|
| 606 |
+
鲟
|
| 607 |
+
谅
|
| 608 |
+
投
|
| 609 |
+
攸
|
| 610 |
+
炔
|
| 611 |
+
数
|
| 612 |
+
方
|
| 613 |
+
击
|
| 614 |
+
呋
|
| 615 |
+
谈
|
| 616 |
+
绩
|
| 617 |
+
别
|
| 618 |
+
愫
|
| 619 |
+
僚
|
| 620 |
+
躬
|
| 621 |
+
鹧
|
| 622 |
+
胪
|
| 623 |
+
炳
|
| 624 |
+
招
|
| 625 |
+
喇
|
| 626 |
+
膨
|
| 627 |
+
泵
|
| 628 |
+
蹦
|
| 629 |
+
毛
|
| 630 |
+
结
|
| 631 |
+
5
|
| 632 |
+
4
|
| 633 |
+
谱
|
| 634 |
+
识
|
| 635 |
+
陕
|
| 636 |
+
粽
|
| 637 |
+
婚
|
| 638 |
+
拟
|
| 639 |
+
构
|
| 640 |
+
且
|
| 641 |
+
搜
|
| 642 |
+
任
|
| 643 |
+
潘
|
| 644 |
+
比
|
| 645 |
+
郢
|
| 646 |
+
妨
|
| 647 |
+
醪
|
| 648 |
+
陀
|
| 649 |
+
桔
|
| 650 |
+
碘
|
| 651 |
+
扎
|
| 652 |
+
选
|
| 653 |
+
哈
|
| 654 |
+
骷
|
| 655 |
+
楷
|
| 656 |
+
亿
|
| 657 |
+
明
|
| 658 |
+
缆
|
| 659 |
+
脯
|
| 660 |
+
监
|
| 661 |
+
睫
|
| 662 |
+
逻
|
| 663 |
+
婵
|
| 664 |
+
共
|
| 665 |
+
赴
|
| 666 |
+
淝
|
| 667 |
+
凡
|
| 668 |
+
惦
|
| 669 |
+
及
|
| 670 |
+
达
|
| 671 |
+
揖
|
| 672 |
+
谩
|
| 673 |
+
澹
|
| 674 |
+
减
|
| 675 |
+
焰
|
| 676 |
+
蛹
|
| 677 |
+
番
|
| 678 |
+
祁
|
| 679 |
+
柏
|
| 680 |
+
员
|
| 681 |
+
禄
|
| 682 |
+
怡
|
| 683 |
+
峤
|
| 684 |
+
龙
|
| 685 |
+
白
|
| 686 |
+
叽
|
| 687 |
+
生
|
| 688 |
+
闯
|
| 689 |
+
起
|
| 690 |
+
细
|
| 691 |
+
装
|
| 692 |
+
谕
|
| 693 |
+
竟
|
| 694 |
+
聚
|
| 695 |
+
钙
|
| 696 |
+
上
|
| 697 |
+
导
|
| 698 |
+
渊
|
| 699 |
+
按
|
| 700 |
+
艾
|
| 701 |
+
辘
|
| 702 |
+
挡
|
| 703 |
+
耒
|
| 704 |
+
盹
|
| 705 |
+
饪
|
| 706 |
+
臀
|
| 707 |
+
记
|
| 708 |
+
邮
|
| 709 |
+
蕙
|
| 710 |
+
受
|
| 711 |
+
各
|
| 712 |
+
医
|
| 713 |
+
搂
|
| 714 |
+
普
|
| 715 |
+
滇
|
| 716 |
+
朗
|
| 717 |
+
茸
|
| 718 |
+
带
|
| 719 |
+
翻
|
| 720 |
+
酚
|
| 721 |
+
(
|
| 722 |
+
光
|
| 723 |
+
堤
|
| 724 |
+
墟
|
| 725 |
+
蔷
|
| 726 |
+
万
|
| 727 |
+
幻
|
| 728 |
+
〓
|
| 729 |
+
瑙
|
| 730 |
+
辈
|
| 731 |
+
昧
|
| 732 |
+
盏
|
| 733 |
+
亘
|
| 734 |
+
蛀
|
| 735 |
+
吉
|
| 736 |
+
铰
|
| 737 |
+
请
|
| 738 |
+
子
|
| 739 |
+
假
|
| 740 |
+
闻
|
| 741 |
+
税
|
| 742 |
+
井
|
| 743 |
+
诩
|
| 744 |
+
哨
|
| 745 |
+
嫂
|
| 746 |
+
好
|
| 747 |
+
面
|
| 748 |
+
琐
|
| 749 |
+
校
|
| 750 |
+
馊
|
| 751 |
+
鬣
|
| 752 |
+
缂
|
| 753 |
+
营
|
| 754 |
+
访
|
| 755 |
+
炖
|
| 756 |
+
占
|
| 757 |
+
农
|
| 758 |
+
缀
|
| 759 |
+
否
|
| 760 |
+
经
|
| 761 |
+
钚
|
| 762 |
+
棵
|
| 763 |
+
趟
|
| 764 |
+
张
|
| 765 |
+
亟
|
| 766 |
+
吏
|
| 767 |
+
茶
|
| 768 |
+
谨
|
| 769 |
+
捻
|
| 770 |
+
论
|
| 771 |
+
迸
|
| 772 |
+
堂
|
| 773 |
+
玉
|
| 774 |
+
信
|
| 775 |
+
吧
|
| 776 |
+
瞠
|
| 777 |
+
乡
|
| 778 |
+
姬
|
| 779 |
+
寺
|
| 780 |
+
咬
|
| 781 |
+
溏
|
| 782 |
+
苄
|
| 783 |
+
皿
|
| 784 |
+
意
|
| 785 |
+
赉
|
| 786 |
+
宝
|
| 787 |
+
尔
|
| 788 |
+
钰
|
| 789 |
+
艺
|
| 790 |
+
特
|
| 791 |
+
唳
|
| 792 |
+
踉
|
| 793 |
+
都
|
| 794 |
+
荣
|
| 795 |
+
倚
|
| 796 |
+
登
|
| 797 |
+
荐
|
| 798 |
+
丧
|
| 799 |
+
奇
|
| 800 |
+
涵
|
| 801 |
+
批
|
| 802 |
+
炭
|
| 803 |
+
近
|
| 804 |
+
符
|
| 805 |
+
傩
|
| 806 |
+
感
|
| 807 |
+
道
|
| 808 |
+
着
|
| 809 |
+
菊
|
| 810 |
+
虹
|
| 811 |
+
仲
|
| 812 |
+
众
|
| 813 |
+
懈
|
| 814 |
+
濯
|
| 815 |
+
颞
|
| 816 |
+
眺
|
| 817 |
+
南
|
| 818 |
+
释
|
| 819 |
+
北
|
| 820 |
+
缝
|
| 821 |
+
标
|
| 822 |
+
既
|
| 823 |
+
茗
|
| 824 |
+
整
|
| 825 |
+
撼
|
| 826 |
+
迤
|
| 827 |
+
贲
|
| 828 |
+
挎
|
| 829 |
+
耱
|
| 830 |
+
拒
|
| 831 |
+
某
|
| 832 |
+
妍
|
| 833 |
+
卫
|
| 834 |
+
哇
|
| 835 |
+
英
|
| 836 |
+
矶
|
| 837 |
+
藩
|
| 838 |
+
治
|
| 839 |
+
他
|
| 840 |
+
元
|
| 841 |
+
领
|
| 842 |
+
膜
|
| 843 |
+
遮
|
| 844 |
+
穗
|
| 845 |
+
蛾
|
| 846 |
+
飞
|
| 847 |
+
荒
|
| 848 |
+
棺
|
| 849 |
+
劫
|
| 850 |
+
么
|
| 851 |
+
市
|
| 852 |
+
火
|
| 853 |
+
温
|
| 854 |
+
拈
|
| 855 |
+
棚
|
| 856 |
+
洼
|
| 857 |
+
转
|
| 858 |
+
��
|
| 859 |
+
奕
|
| 860 |
+
卸
|
| 861 |
+
迪
|
| 862 |
+
伸
|
| 863 |
+
泳
|
| 864 |
+
斗
|
| 865 |
+
邡
|
| 866 |
+
侄
|
| 867 |
+
涨
|
| 868 |
+
屯
|
| 869 |
+
萋
|
| 870 |
+
胭
|
| 871 |
+
氡
|
| 872 |
+
崮
|
| 873 |
+
枞
|
| 874 |
+
惧
|
| 875 |
+
冒
|
| 876 |
+
彩
|
| 877 |
+
斜
|
| 878 |
+
手
|
| 879 |
+
豚
|
| 880 |
+
随
|
| 881 |
+
旭
|
| 882 |
+
淑
|
| 883 |
+
妞
|
| 884 |
+
形
|
| 885 |
+
菌
|
| 886 |
+
吲
|
| 887 |
+
沱
|
| 888 |
+
争
|
| 889 |
+
驯
|
| 890 |
+
歹
|
| 891 |
+
挟
|
| 892 |
+
兆
|
| 893 |
+
柱
|
| 894 |
+
传
|
| 895 |
+
至
|
| 896 |
+
包
|
| 897 |
+
内
|
| 898 |
+
响
|
| 899 |
+
临
|
| 900 |
+
红
|
| 901 |
+
功
|
| 902 |
+
弩
|
| 903 |
+
衡
|
| 904 |
+
寂
|
| 905 |
+
禁
|
| 906 |
+
老
|
| 907 |
+
棍
|
| 908 |
+
耆
|
| 909 |
+
渍
|
| 910 |
+
织
|
| 911 |
+
害
|
| 912 |
+
氵
|
| 913 |
+
渑
|
| 914 |
+
布
|
| 915 |
+
载
|
| 916 |
+
靥
|
| 917 |
+
嗬
|
| 918 |
+
虽
|
| 919 |
+
苹
|
| 920 |
+
咨
|
| 921 |
+
娄
|
| 922 |
+
库
|
| 923 |
+
雉
|
| 924 |
+
榜
|
| 925 |
+
帜
|
| 926 |
+
嘲
|
| 927 |
+
套
|
| 928 |
+
瑚
|
| 929 |
+
亲
|
| 930 |
+
簸
|
| 931 |
+
欧
|
| 932 |
+
边
|
| 933 |
+
6
|
| 934 |
+
腿
|
| 935 |
+
旮
|
| 936 |
+
抛
|
| 937 |
+
吹
|
| 938 |
+
瞳
|
| 939 |
+
得
|
| 940 |
+
镓
|
| 941 |
+
梗
|
| 942 |
+
厨
|
| 943 |
+
继
|
| 944 |
+
漾
|
| 945 |
+
愣
|
| 946 |
+
憨
|
| 947 |
+
士
|
| 948 |
+
策
|
| 949 |
+
窑
|
| 950 |
+
抑
|
| 951 |
+
躯
|
| 952 |
+
襟
|
| 953 |
+
脏
|
| 954 |
+
参
|
| 955 |
+
贸
|
| 956 |
+
言
|
| 957 |
+
干
|
| 958 |
+
绸
|
| 959 |
+
鳄
|
| 960 |
+
穷
|
| 961 |
+
藜
|
| 962 |
+
音
|
| 963 |
+
折
|
| 964 |
+
详
|
| 965 |
+
)
|
| 966 |
+
举
|
| 967 |
+
悍
|
| 968 |
+
甸
|
| 969 |
+
癌
|
| 970 |
+
黎
|
| 971 |
+
谴
|
| 972 |
+
死
|
| 973 |
+
罩
|
| 974 |
+
迁
|
| 975 |
+
寒
|
| 976 |
+
驷
|
| 977 |
+
袖
|
| 978 |
+
媒
|
| 979 |
+
蒋
|
| 980 |
+
掘
|
| 981 |
+
模
|
| 982 |
+
纠
|
| 983 |
+
恣
|
| 984 |
+
观
|
| 985 |
+
祖
|
| 986 |
+
蛆
|
| 987 |
+
碍
|
| 988 |
+
位
|
| 989 |
+
稿
|
| 990 |
+
主
|
| 991 |
+
澧
|
| 992 |
+
跌
|
| 993 |
+
筏
|
| 994 |
+
京
|
| 995 |
+
锏
|
| 996 |
+
帝
|
| 997 |
+
贴
|
| 998 |
+
证
|
| 999 |
+
糠
|
| 1000 |
+
才
|
| 1001 |
+
黄
|
| 1002 |
+
鲸
|
| 1003 |
+
略
|
| 1004 |
+
炯
|
| 1005 |
+
饱
|
| 1006 |
+
四
|
| 1007 |
+
出
|
| 1008 |
+
园
|
| 1009 |
+
犀
|
| 1010 |
+
牧
|
| 1011 |
+
容
|
| 1012 |
+
汉
|
| 1013 |
+
杆
|
| 1014 |
+
浈
|
| 1015 |
+
汰
|
| 1016 |
+
瑷
|
| 1017 |
+
造
|
| 1018 |
+
虫
|
| 1019 |
+
瘩
|
| 1020 |
+
怪
|
| 1021 |
+
驴
|
| 1022 |
+
济
|
| 1023 |
+
应
|
| 1024 |
+
花
|
| 1025 |
+
沣
|
| 1026 |
+
谔
|
| 1027 |
+
夙
|
| 1028 |
+
旅
|
| 1029 |
+
价
|
| 1030 |
+
矿
|
| 1031 |
+
以
|
| 1032 |
+
考
|
| 1033 |
+
s
|
| 1034 |
+
u
|
| 1035 |
+
呦
|
| 1036 |
+
晒
|
| 1037 |
+
巡
|
| 1038 |
+
茅
|
| 1039 |
+
准
|
| 1040 |
+
肟
|
| 1041 |
+
瓴
|
| 1042 |
+
詹
|
| 1043 |
+
仟
|
| 1044 |
+
褂
|
| 1045 |
+
译
|
| 1046 |
+
桌
|
| 1047 |
+
混
|
| 1048 |
+
宁
|
| 1049 |
+
怦
|
| 1050 |
+
郑
|
| 1051 |
+
抿
|
| 1052 |
+
些
|
| 1053 |
+
余
|
| 1054 |
+
鄂
|
| 1055 |
+
饴
|
| 1056 |
+
攒
|
| 1057 |
+
珑
|
| 1058 |
+
群
|
| 1059 |
+
阖
|
| 1060 |
+
岔
|
| 1061 |
+
琨
|
| 1062 |
+
藓
|
| 1063 |
+
预
|
| 1064 |
+
环
|
| 1065 |
+
洮
|
| 1066 |
+
岌
|
| 1067 |
+
宀
|
| 1068 |
+
杲
|
| 1069 |
+
瀵
|
| 1070 |
+
最
|
| 1071 |
+
常
|
| 1072 |
+
囡
|
| 1073 |
+
周
|
| 1074 |
+
踊
|
| 1075 |
+
女
|
| 1076 |
+
鼓
|
| 1077 |
+
袭
|
| 1078 |
+
喉
|
| 1079 |
+
简
|
| 1080 |
+
范
|
| 1081 |
+
薯
|
| 1082 |
+
遐
|
| 1083 |
+
疏
|
| 1084 |
+
粱
|
| 1085 |
+
黜
|
| 1086 |
+
禧
|
| 1087 |
+
法
|
| 1088 |
+
箔
|
| 1089 |
+
斤
|
| 1090 |
+
遥
|
| 1091 |
+
汝
|
| 1092 |
+
奥
|
| 1093 |
+
直
|
| 1094 |
+
贞
|
| 1095 |
+
撑
|
| 1096 |
+
置
|
| 1097 |
+
绱
|
| 1098 |
+
集
|
| 1099 |
+
她
|
| 1100 |
+
馅
|
| 1101 |
+
逗
|
| 1102 |
+
钧
|
| 1103 |
+
橱
|
| 1104 |
+
魉
|
| 1105 |
+
[
|
| 1106 |
+
恙
|
| 1107 |
+
躁
|
| 1108 |
+
唤
|
| 1109 |
+
9
|
| 1110 |
+
旺
|
| 1111 |
+
膘
|
| 1112 |
+
待
|
| 1113 |
+
脾
|
| 1114 |
+
惫
|
| 1115 |
+
购
|
| 1116 |
+
吗
|
| 1117 |
+
依
|
| 1118 |
+
盲
|
| 1119 |
+
度
|
| 1120 |
+
瘿
|
| 1121 |
+
蠖
|
| 1122 |
+
俾
|
| 1123 |
+
之
|
| 1124 |
+
镗
|
| 1125 |
+
拇
|
| 1126 |
+
鲵
|
| 1127 |
+
厝
|
| 1128 |
+
簧
|
| 1129 |
+
续
|
| 1130 |
+
款
|
| 1131 |
+
展
|
| 1132 |
+
啃
|
| 1133 |
+
表
|
| 1134 |
+
剔
|
| 1135 |
+
品
|
| 1136 |
+
钻
|
| 1137 |
+
腭
|
| 1138 |
+
损
|
| 1139 |
+
清
|
| 1140 |
+
锶
|
| 1141 |
+
统
|
| 1142 |
+
涌
|
| 1143 |
+
寸
|
| 1144 |
+
滨
|
| 1145 |
+
贪
|
| 1146 |
+
链
|
| 1147 |
+
吠
|
| 1148 |
+
冈
|
| 1149 |
+
伎
|
| 1150 |
+
迥
|
| 1151 |
+
咏
|
| 1152 |
+
吁
|
| 1153 |
+
览
|
| 1154 |
+
防
|
| 1155 |
+
迅
|
| 1156 |
+
失
|
| 1157 |
+
汾
|
| 1158 |
+
阔
|
| 1159 |
+
逵
|
| 1160 |
+
绀
|
| 1161 |
+
蔑
|
| 1162 |
+
列
|
| 1163 |
+
川
|
| 1164 |
+
凭
|
| 1165 |
+
努
|
| 1166 |
+
熨
|
| 1167 |
+
揪
|
| 1168 |
+
利
|
| 1169 |
+
俱
|
| 1170 |
+
绉
|
| 1171 |
+
抢
|
| 1172 |
+
鸨
|
| 1173 |
+
我
|
| 1174 |
+
即
|
| 1175 |
+
责
|
| 1176 |
+
膦
|
| 1177 |
+
易
|
| 1178 |
+
毓
|
| 1179 |
+
鹊
|
| 1180 |
+
刹
|
| 1181 |
+
玷
|
| 1182 |
+
岿
|
| 1183 |
+
空
|
| 1184 |
+
嘞
|
| 1185 |
+
绊
|
| 1186 |
+
排
|
| 1187 |
+
术
|
| 1188 |
+
估
|
| 1189 |
+
锷
|
| 1190 |
+
违
|
| 1191 |
+
们
|
| 1192 |
+
苟
|
| 1193 |
+
铜
|
| 1194 |
+
播
|
| 1195 |
+
肘
|
| 1196 |
+
件
|
| 1197 |
+
烫
|
| 1198 |
+
审
|
| 1199 |
+
鲂
|
| 1200 |
+
广
|
| 1201 |
+
像
|
| 1202 |
+
铌
|
| 1203 |
+
惰
|
| 1204 |
+
铟
|
| 1205 |
+
巳
|
| 1206 |
+
胍
|
| 1207 |
+
鲍
|
| 1208 |
+
康
|
| 1209 |
+
憧
|
| 1210 |
+
色
|
| 1211 |
+
恢
|
| 1212 |
+
想
|
| 1213 |
+
拷
|
| 1214 |
+
尤
|
| 1215 |
+
疳
|
| 1216 |
+
知
|
| 1217 |
+
S
|
| 1218 |
+
Y
|
| 1219 |
+
F
|
| 1220 |
+
D
|
| 1221 |
+
A
|
| 1222 |
+
峄
|
| 1223 |
+
裕
|
| 1224 |
+
帮
|
| 1225 |
+
握
|
| 1226 |
+
搔
|
| 1227 |
+
氐
|
| 1228 |
+
氘
|
| 1229 |
+
难
|
| 1230 |
+
墒
|
| 1231 |
+
沮
|
| 1232 |
+
雨
|
| 1233 |
+
叁
|
| 1234 |
+
缥
|
| 1235 |
+
悴
|
| 1236 |
+
藐
|
| 1237 |
+
湫
|
| 1238 |
+
娟
|
| 1239 |
+
苑
|
| 1240 |
+
稠
|
| 1241 |
+
颛
|
| 1242 |
+
簇
|
| 1243 |
+
后
|
| 1244 |
+
阕
|
| 1245 |
+
闭
|
| 1246 |
+
蕤
|
| 1247 |
+
缚
|
| 1248 |
+
怎
|
| 1249 |
+
佞
|
| 1250 |
+
码
|
| 1251 |
+
嘤
|
| 1252 |
+
蔡
|
| 1253 |
+
痊
|
| 1254 |
+
舱
|
| 1255 |
+
螯
|
| 1256 |
+
帕
|
| 1257 |
+
赫
|
| 1258 |
+
昵
|
| 1259 |
+
升
|
| 1260 |
+
烬
|
| 1261 |
+
岫
|
| 1262 |
+
、
|
| 1263 |
+
疵
|
| 1264 |
+
蜻
|
| 1265 |
+
髁
|
| 1266 |
+
蕨
|
| 1267 |
+
隶
|
| 1268 |
+
烛
|
| 1269 |
+
械
|
| 1270 |
+
丑
|
| 1271 |
+
盂
|
| 1272 |
+
梁
|
| 1273 |
+
强
|
| 1274 |
+
鲛
|
| 1275 |
+
由
|
| 1276 |
+
拘
|
| 1277 |
+
揉
|
| 1278 |
+
劭
|
| 1279 |
+
龟
|
| 1280 |
+
撤
|
| 1281 |
+
钩
|
| 1282 |
+
呕
|
| 1283 |
+
孛
|
| 1284 |
+
费
|
| 1285 |
+
妻
|
| 1286 |
+
漂
|
| 1287 |
+
求
|
| 1288 |
+
阑
|
| 1289 |
+
崖
|
| 1290 |
+
秤
|
| 1291 |
+
甘
|
| 1292 |
+
通
|
| 1293 |
+
深
|
| 1294 |
+
补
|
| 1295 |
+
赃
|
| 1296 |
+
坎
|
| 1297 |
+
床
|
| 1298 |
+
啪
|
| 1299 |
+
承
|
| 1300 |
+
吼
|
| 1301 |
+
量
|
| 1302 |
+
暇
|
| 1303 |
+
钼
|
| 1304 |
+
烨
|
| 1305 |
+
阂
|
| 1306 |
+
擎
|
| 1307 |
+
脱
|
| 1308 |
+
逮
|
| 1309 |
+
称
|
| 1310 |
+
P
|
| 1311 |
+
神
|
| 1312 |
+
属
|
| 1313 |
+
矗
|
| 1314 |
+
华
|
| 1315 |
+
届
|
| 1316 |
+
狍
|
| 1317 |
+
葑
|
| 1318 |
+
汹
|
| 1319 |
+
育
|
| 1320 |
+
患
|
| 1321 |
+
窒
|
| 1322 |
+
蛰
|
| 1323 |
+
佼
|
| 1324 |
+
静
|
| 1325 |
+
槎
|
| 1326 |
+
运
|
| 1327 |
+
鳗
|
| 1328 |
+
庆
|
| 1329 |
+
逝
|
| 1330 |
+
曼
|
| 1331 |
+
疱
|
| 1332 |
+
克
|
| 1333 |
+
代
|
| 1334 |
+
官
|
| 1335 |
+
此
|
| 1336 |
+
麸
|
| 1337 |
+
耧
|
| 1338 |
+
蚌
|
| 1339 |
+
晟
|
| 1340 |
+
例
|
| 1341 |
+
础
|
| 1342 |
+
榛
|
| 1343 |
+
副
|
| 1344 |
+
测
|
| 1345 |
+
唰
|
| 1346 |
+
缢
|
| 1347 |
+
迹
|
| 1348 |
+
灬
|
| 1349 |
+
霁
|
| 1350 |
+
身
|
| 1351 |
+
岁
|
| 1352 |
+
赭
|
| 1353 |
+
扛
|
| 1354 |
+
又
|
| 1355 |
+
菡
|
| 1356 |
+
乜
|
| 1357 |
+
雾
|
| 1358 |
+
板
|
| 1359 |
+
读
|
| 1360 |
+
陷
|
| 1361 |
+
徉
|
| 1362 |
+
贯
|
| 1363 |
+
郁
|
| 1364 |
+
虑
|
| 1365 |
+
变
|
| 1366 |
+
钓
|
| 1367 |
+
菜
|
| 1368 |
+
圾
|
| 1369 |
+
现
|
| 1370 |
+
琢
|
| 1371 |
+
式
|
| 1372 |
+
乐
|
| 1373 |
+
维
|
| 1374 |
+
渔
|
| 1375 |
+
浜
|
| 1376 |
+
左
|
| 1377 |
+
吾
|
| 1378 |
+
脑
|
| 1379 |
+
钡
|
| 1380 |
+
警
|
| 1381 |
+
T
|
| 1382 |
+
啵
|
| 1383 |
+
拴
|
| 1384 |
+
偌
|
| 1385 |
+
漱
|
| 1386 |
+
湿
|
| 1387 |
+
硕
|
| 1388 |
+
止
|
| 1389 |
+
骼
|
| 1390 |
+
魄
|
| 1391 |
+
积
|
| 1392 |
+
燥
|
| 1393 |
+
联
|
| 1394 |
+
踢
|
| 1395 |
+
玛
|
| 1396 |
+
则
|
| 1397 |
+
窿
|
| 1398 |
+
见
|
| 1399 |
+
振
|
| 1400 |
+
畿
|
| 1401 |
+
送
|
| 1402 |
+
班
|
| 1403 |
+
钽
|
| 1404 |
+
您
|
| 1405 |
+
赵
|
| 1406 |
+
刨
|
| 1407 |
+
印
|
| 1408 |
+
讨
|
| 1409 |
+
踝
|
| 1410 |
+
籍
|
| 1411 |
+
谡
|
| 1412 |
+
舌
|
| 1413 |
+
崧
|
| 1414 |
+
汽
|
| 1415 |
+
蔽
|
| 1416 |
+
沪
|
| 1417 |
+
酥
|
| 1418 |
+
绒
|
| 1419 |
+
怖
|
| 1420 |
+
财
|
| 1421 |
+
帖
|
| 1422 |
+
肱
|
| 1423 |
+
私
|
| 1424 |
+
莎
|
| 1425 |
+
勋
|
| 1426 |
+
羔
|
| 1427 |
+
霸
|
| 1428 |
+
励
|
| 1429 |
+
哼
|
| 1430 |
+
帐
|
| 1431 |
+
将
|
| 1432 |
+
帅
|
| 1433 |
+
渠
|
| 1434 |
+
纪
|
| 1435 |
+
婴
|
| 1436 |
+
娩
|
| 1437 |
+
岭
|
| 1438 |
+
厘
|
| 1439 |
+
滕
|
| 1440 |
+
吻
|
| 1441 |
+
伤
|
| 1442 |
+
坝
|
| 1443 |
+
冠
|
| 1444 |
+
戊
|
| 1445 |
+
隆
|
| 1446 |
+
瘁
|
| 1447 |
+
介
|
| 1448 |
+
涧
|
| 1449 |
+
物
|
| 1450 |
+
黍
|
| 1451 |
+
并
|
| 1452 |
+
姗
|
| 1453 |
+
奢
|
| 1454 |
+
蹑
|
| 1455 |
+
掣
|
| 1456 |
+
垸
|
| 1457 |
+
锴
|
| 1458 |
+
命
|
| 1459 |
+
箍
|
| 1460 |
+
捉
|
| 1461 |
+
病
|
| 1462 |
+
辖
|
| 1463 |
+
琰
|
| 1464 |
+
眭
|
| 1465 |
+
迩
|
| 1466 |
+
艘
|
| 1467 |
+
绌
|
| 1468 |
+
繁
|
| 1469 |
+
寅
|
| 1470 |
+
若
|
| 1471 |
+
毋
|
| 1472 |
+
思
|
| 1473 |
+
诉
|
| 1474 |
+
类
|
| 1475 |
+
诈
|
| 1476 |
+
燮
|
| 1477 |
+
轲
|
| 1478 |
+
酮
|
| 1479 |
+
狂
|
| 1480 |
+
重
|
| 1481 |
+
反
|
| 1482 |
+
职
|
| 1483 |
+
筱
|
| 1484 |
+
县
|
| 1485 |
+
委
|
| 1486 |
+
磕
|
| 1487 |
+
绣
|
| 1488 |
+
奖
|
| 1489 |
+
晋
|
| 1490 |
+
濉
|
| 1491 |
+
志
|
| 1492 |
+
徽
|
| 1493 |
+
肠
|
| 1494 |
+
呈
|
| 1495 |
+
獐
|
| 1496 |
+
坻
|
| 1497 |
+
口
|
| 1498 |
+
片
|
| 1499 |
+
碰
|
| 1500 |
+
几
|
| 1501 |
+
村
|
| 1502 |
+
柿
|
| 1503 |
+
劳
|
| 1504 |
+
料
|
| 1505 |
+
获
|
| 1506 |
+
亩
|
| 1507 |
+
惕
|
| 1508 |
+
晕
|
| 1509 |
+
厌
|
| 1510 |
+
号
|
| 1511 |
+
罢
|
| 1512 |
+
池
|
| 1513 |
+
正
|
| 1514 |
+
鏖
|
| 1515 |
+
煨
|
| 1516 |
+
家
|
| 1517 |
+
棕
|
| 1518 |
+
复
|
| 1519 |
+
尝
|
| 1520 |
+
懋
|
| 1521 |
+
蜥
|
| 1522 |
+
锅
|
| 1523 |
+
岛
|
| 1524 |
+
扰
|
| 1525 |
+
队
|
| 1526 |
+
坠
|
| 1527 |
+
瘾
|
| 1528 |
+
钬
|
| 1529 |
+
@
|
| 1530 |
+
卧
|
| 1531 |
+
疣
|
| 1532 |
+
镇
|
| 1533 |
+
譬
|
| 1534 |
+
冰
|
| 1535 |
+
彷
|
| 1536 |
+
频
|
| 1537 |
+
黯
|
| 1538 |
+
据
|
| 1539 |
+
垄
|
| 1540 |
+
采
|
| 1541 |
+
八
|
| 1542 |
+
缪
|
| 1543 |
+
瘫
|
| 1544 |
+
型
|
| 1545 |
+
熹
|
| 1546 |
+
砰
|
| 1547 |
+
楠
|
| 1548 |
+
襁
|
| 1549 |
+
箐
|
| 1550 |
+
但
|
| 1551 |
+
嘶
|
| 1552 |
+
绳
|
| 1553 |
+
啤
|
| 1554 |
+
拍
|
| 1555 |
+
盥
|
| 1556 |
+
穆
|
| 1557 |
+
傲
|
| 1558 |
+
洗
|
| 1559 |
+
盯
|
| 1560 |
+
塘
|
| 1561 |
+
怔
|
| 1562 |
+
筛
|
| 1563 |
+
丿
|
| 1564 |
+
台
|
| 1565 |
+
恒
|
| 1566 |
+
喂
|
| 1567 |
+
葛
|
| 1568 |
+
永
|
| 1569 |
+
¥
|
| 1570 |
+
烟
|
| 1571 |
+
酒
|
| 1572 |
+
桦
|
| 1573 |
+
书
|
| 1574 |
+
砂
|
| 1575 |
+
蚝
|
| 1576 |
+
缉
|
| 1577 |
+
态
|
| 1578 |
+
瀚
|
| 1579 |
+
袄
|
| 1580 |
+
圳
|
| 1581 |
+
轻
|
| 1582 |
+
蛛
|
| 1583 |
+
超
|
| 1584 |
+
榧
|
| 1585 |
+
遛
|
| 1586 |
+
姒
|
| 1587 |
+
奘
|
| 1588 |
+
铮
|
| 1589 |
+
右
|
| 1590 |
+
荽
|
| 1591 |
+
望
|
| 1592 |
+
偻
|
| 1593 |
+
卡
|
| 1594 |
+
丶
|
| 1595 |
+
氰
|
| 1596 |
+
附
|
| 1597 |
+
做
|
| 1598 |
+
革
|
| 1599 |
+
索
|
| 1600 |
+
戚
|
| 1601 |
+
坨
|
| 1602 |
+
桷
|
| 1603 |
+
唁
|
| 1604 |
+
垅
|
| 1605 |
+
榻
|
| 1606 |
+
岐
|
| 1607 |
+
偎
|
| 1608 |
+
坛
|
| 1609 |
+
莨
|
| 1610 |
+
山
|
| 1611 |
+
殊
|
| 1612 |
+
微
|
| 1613 |
+
骇
|
| 1614 |
+
陈
|
| 1615 |
+
爨
|
| 1616 |
+
推
|
| 1617 |
+
嗝
|
| 1618 |
+
驹
|
| 1619 |
+
澡
|
| 1620 |
+
藁
|
| 1621 |
+
呤
|
| 1622 |
+
卤
|
| 1623 |
+
嘻
|
| 1624 |
+
糅
|
| 1625 |
+
逛
|
| 1626 |
+
侵
|
| 1627 |
+
郓
|
| 1628 |
+
酌
|
| 1629 |
+
德
|
| 1630 |
+
摇
|
| 1631 |
+
※
|
| 1632 |
+
鬃
|
| 1633 |
+
被
|
| 1634 |
+
慨
|
| 1635 |
+
殡
|
| 1636 |
+
羸
|
| 1637 |
+
昌
|
| 1638 |
+
泡
|
| 1639 |
+
戛
|
| 1640 |
+
鞋
|
| 1641 |
+
河
|
| 1642 |
+
宪
|
| 1643 |
+
沿
|
| 1644 |
+
玲
|
| 1645 |
+
鲨
|
| 1646 |
+
翅
|
| 1647 |
+
哽
|
| 1648 |
+
源
|
| 1649 |
+
铅
|
| 1650 |
+
语
|
| 1651 |
+
照
|
| 1652 |
+
邯
|
| 1653 |
+
址
|
| 1654 |
+
荃
|
| 1655 |
+
佬
|
| 1656 |
+
顺
|
| 1657 |
+
鸳
|
| 1658 |
+
町
|
| 1659 |
+
霭
|
| 1660 |
+
睾
|
| 1661 |
+
瓢
|
| 1662 |
+
夸
|
| 1663 |
+
椁
|
| 1664 |
+
晓
|
| 1665 |
+
酿
|
| 1666 |
+
痈
|
| 1667 |
+
咔
|
| 1668 |
+
侏
|
| 1669 |
+
券
|
| 1670 |
+
噎
|
| 1671 |
+
湍
|
| 1672 |
+
签
|
| 1673 |
+
嚷
|
| 1674 |
+
离
|
| 1675 |
+
午
|
| 1676 |
+
尚
|
| 1677 |
+
社
|
| 1678 |
+
锤
|
| 1679 |
+
背
|
| 1680 |
+
孟
|
| 1681 |
+
使
|
| 1682 |
+
浪
|
| 1683 |
+
缦
|
| 1684 |
+
潍
|
| 1685 |
+
鞅
|
| 1686 |
+
军
|
| 1687 |
+
姹
|
| 1688 |
+
驶
|
| 1689 |
+
笑
|
| 1690 |
+
鳟
|
| 1691 |
+
鲁
|
| 1692 |
+
》
|
| 1693 |
+
孽
|
| 1694 |
+
钜
|
| 1695 |
+
绿
|
| 1696 |
+
洱
|
| 1697 |
+
礴
|
| 1698 |
+
焯
|
| 1699 |
+
椰
|
| 1700 |
+
颖
|
| 1701 |
+
囔
|
| 1702 |
+
乌
|
| 1703 |
+
孔
|
| 1704 |
+
巴
|
| 1705 |
+
互
|
| 1706 |
+
性
|
| 1707 |
+
椽
|
| 1708 |
+
哞
|
| 1709 |
+
聘
|
| 1710 |
+
昨
|
| 1711 |
+
早
|
| 1712 |
+
暮
|
| 1713 |
+
胶
|
| 1714 |
+
炀
|
| 1715 |
+
隧
|
| 1716 |
+
��
|
| 1717 |
+
彗
|
| 1718 |
+
昝
|
| 1719 |
+
铁
|
| 1720 |
+
呓
|
| 1721 |
+
氽
|
| 1722 |
+
藉
|
| 1723 |
+
喔
|
| 1724 |
+
癖
|
| 1725 |
+
瑗
|
| 1726 |
+
姨
|
| 1727 |
+
权
|
| 1728 |
+
胱
|
| 1729 |
+
韦
|
| 1730 |
+
堑
|
| 1731 |
+
蜜
|
| 1732 |
+
酋
|
| 1733 |
+
楝
|
| 1734 |
+
砝
|
| 1735 |
+
毁
|
| 1736 |
+
靓
|
| 1737 |
+
歙
|
| 1738 |
+
锲
|
| 1739 |
+
究
|
| 1740 |
+
屋
|
| 1741 |
+
喳
|
| 1742 |
+
骨
|
| 1743 |
+
辨
|
| 1744 |
+
碑
|
| 1745 |
+
武
|
| 1746 |
+
鸠
|
| 1747 |
+
宫
|
| 1748 |
+
辜
|
| 1749 |
+
烊
|
| 1750 |
+
适
|
| 1751 |
+
坡
|
| 1752 |
+
殃
|
| 1753 |
+
培
|
| 1754 |
+
佩
|
| 1755 |
+
供
|
| 1756 |
+
走
|
| 1757 |
+
蜈
|
| 1758 |
+
迟
|
| 1759 |
+
翼
|
| 1760 |
+
况
|
| 1761 |
+
姣
|
| 1762 |
+
凛
|
| 1763 |
+
浔
|
| 1764 |
+
吃
|
| 1765 |
+
飘
|
| 1766 |
+
债
|
| 1767 |
+
犟
|
| 1768 |
+
金
|
| 1769 |
+
促
|
| 1770 |
+
苛
|
| 1771 |
+
崇
|
| 1772 |
+
坂
|
| 1773 |
+
莳
|
| 1774 |
+
畔
|
| 1775 |
+
绂
|
| 1776 |
+
兵
|
| 1777 |
+
蠕
|
| 1778 |
+
斋
|
| 1779 |
+
根
|
| 1780 |
+
砍
|
| 1781 |
+
亢
|
| 1782 |
+
欢
|
| 1783 |
+
恬
|
| 1784 |
+
崔
|
| 1785 |
+
剁
|
| 1786 |
+
餐
|
| 1787 |
+
榫
|
| 1788 |
+
快
|
| 1789 |
+
扶
|
| 1790 |
+
‖
|
| 1791 |
+
濒
|
| 1792 |
+
缠
|
| 1793 |
+
鳜
|
| 1794 |
+
当
|
| 1795 |
+
彭
|
| 1796 |
+
驭
|
| 1797 |
+
浦
|
| 1798 |
+
篮
|
| 1799 |
+
昀
|
| 1800 |
+
锆
|
| 1801 |
+
秸
|
| 1802 |
+
钳
|
| 1803 |
+
弋
|
| 1804 |
+
娣
|
| 1805 |
+
瞑
|
| 1806 |
+
夷
|
| 1807 |
+
龛
|
| 1808 |
+
苫
|
| 1809 |
+
拱
|
| 1810 |
+
致
|
| 1811 |
+
%
|
| 1812 |
+
嵊
|
| 1813 |
+
障
|
| 1814 |
+
隐
|
| 1815 |
+
弑
|
| 1816 |
+
初
|
| 1817 |
+
娓
|
| 1818 |
+
抉
|
| 1819 |
+
汩
|
| 1820 |
+
累
|
| 1821 |
+
蓖
|
| 1822 |
+
"
|
| 1823 |
+
唬
|
| 1824 |
+
助
|
| 1825 |
+
苓
|
| 1826 |
+
昙
|
| 1827 |
+
押
|
| 1828 |
+
毙
|
| 1829 |
+
破
|
| 1830 |
+
城
|
| 1831 |
+
郧
|
| 1832 |
+
逢
|
| 1833 |
+
嚏
|
| 1834 |
+
獭
|
| 1835 |
+
瞻
|
| 1836 |
+
溱
|
| 1837 |
+
婿
|
| 1838 |
+
赊
|
| 1839 |
+
跨
|
| 1840 |
+
恼
|
| 1841 |
+
璧
|
| 1842 |
+
萃
|
| 1843 |
+
姻
|
| 1844 |
+
貉
|
| 1845 |
+
灵
|
| 1846 |
+
炉
|
| 1847 |
+
密
|
| 1848 |
+
氛
|
| 1849 |
+
陶
|
| 1850 |
+
砸
|
| 1851 |
+
谬
|
| 1852 |
+
衔
|
| 1853 |
+
点
|
| 1854 |
+
琛
|
| 1855 |
+
沛
|
| 1856 |
+
枳
|
| 1857 |
+
层
|
| 1858 |
+
岱
|
| 1859 |
+
诺
|
| 1860 |
+
脍
|
| 1861 |
+
榈
|
| 1862 |
+
埂
|
| 1863 |
+
征
|
| 1864 |
+
冷
|
| 1865 |
+
裁
|
| 1866 |
+
打
|
| 1867 |
+
蹴
|
| 1868 |
+
素
|
| 1869 |
+
瘘
|
| 1870 |
+
逞
|
| 1871 |
+
蛐
|
| 1872 |
+
聊
|
| 1873 |
+
激
|
| 1874 |
+
腱
|
| 1875 |
+
萘
|
| 1876 |
+
踵
|
| 1877 |
+
飒
|
| 1878 |
+
蓟
|
| 1879 |
+
吆
|
| 1880 |
+
取
|
| 1881 |
+
咙
|
| 1882 |
+
簋
|
| 1883 |
+
涓
|
| 1884 |
+
矩
|
| 1885 |
+
曝
|
| 1886 |
+
挺
|
| 1887 |
+
揣
|
| 1888 |
+
座
|
| 1889 |
+
你
|
| 1890 |
+
史
|
| 1891 |
+
舵
|
| 1892 |
+
焱
|
| 1893 |
+
尘
|
| 1894 |
+
苏
|
| 1895 |
+
笈
|
| 1896 |
+
脚
|
| 1897 |
+
溉
|
| 1898 |
+
榨
|
| 1899 |
+
诵
|
| 1900 |
+
樊
|
| 1901 |
+
邓
|
| 1902 |
+
焊
|
| 1903 |
+
义
|
| 1904 |
+
庶
|
| 1905 |
+
儋
|
| 1906 |
+
蟋
|
| 1907 |
+
蒲
|
| 1908 |
+
赦
|
| 1909 |
+
呷
|
| 1910 |
+
杞
|
| 1911 |
+
诠
|
| 1912 |
+
豪
|
| 1913 |
+
还
|
| 1914 |
+
试
|
| 1915 |
+
颓
|
| 1916 |
+
茉
|
| 1917 |
+
太
|
| 1918 |
+
除
|
| 1919 |
+
紫
|
| 1920 |
+
逃
|
| 1921 |
+
痴
|
| 1922 |
+
草
|
| 1923 |
+
充
|
| 1924 |
+
鳕
|
| 1925 |
+
珉
|
| 1926 |
+
祗
|
| 1927 |
+
墨
|
| 1928 |
+
渭
|
| 1929 |
+
烩
|
| 1930 |
+
蘸
|
| 1931 |
+
慕
|
| 1932 |
+
璇
|
| 1933 |
+
镶
|
| 1934 |
+
穴
|
| 1935 |
+
嵘
|
| 1936 |
+
恶
|
| 1937 |
+
骂
|
| 1938 |
+
险
|
| 1939 |
+
绋
|
| 1940 |
+
幕
|
| 1941 |
+
碉
|
| 1942 |
+
肺
|
| 1943 |
+
戳
|
| 1944 |
+
刘
|
| 1945 |
+
潞
|
| 1946 |
+
秣
|
| 1947 |
+
纾
|
| 1948 |
+
潜
|
| 1949 |
+
銮
|
| 1950 |
+
洛
|
| 1951 |
+
须
|
| 1952 |
+
罘
|
| 1953 |
+
销
|
| 1954 |
+
瘪
|
| 1955 |
+
汞
|
| 1956 |
+
兮
|
| 1957 |
+
屉
|
| 1958 |
+
r
|
| 1959 |
+
林
|
| 1960 |
+
厕
|
| 1961 |
+
质
|
| 1962 |
+
探
|
| 1963 |
+
划
|
| 1964 |
+
狸
|
| 1965 |
+
殚
|
| 1966 |
+
善
|
| 1967 |
+
煊
|
| 1968 |
+
烹
|
| 1969 |
+
〒
|
| 1970 |
+
锈
|
| 1971 |
+
逯
|
| 1972 |
+
宸
|
| 1973 |
+
辍
|
| 1974 |
+
泱
|
| 1975 |
+
柚
|
| 1976 |
+
袍
|
| 1977 |
+
远
|
| 1978 |
+
蹋
|
| 1979 |
+
嶙
|
| 1980 |
+
绝
|
| 1981 |
+
峥
|
| 1982 |
+
娥
|
| 1983 |
+
缍
|
| 1984 |
+
雀
|
| 1985 |
+
徵
|
| 1986 |
+
认
|
| 1987 |
+
镱
|
| 1988 |
+
谷
|
| 1989 |
+
=
|
| 1990 |
+
贩
|
| 1991 |
+
勉
|
| 1992 |
+
撩
|
| 1993 |
+
鄯
|
| 1994 |
+
斐
|
| 1995 |
+
洋
|
| 1996 |
+
非
|
| 1997 |
+
祚
|
| 1998 |
+
泾
|
| 1999 |
+
诒
|
| 2000 |
+
饿
|
| 2001 |
+
撬
|
| 2002 |
+
威
|
| 2003 |
+
晷
|
| 2004 |
+
搭
|
| 2005 |
+
芍
|
| 2006 |
+
锥
|
| 2007 |
+
笺
|
| 2008 |
+
蓦
|
| 2009 |
+
候
|
| 2010 |
+
琊
|
| 2011 |
+
档
|
| 2012 |
+
礁
|
| 2013 |
+
沼
|
| 2014 |
+
卵
|
| 2015 |
+
荠
|
| 2016 |
+
忑
|
| 2017 |
+
朝
|
| 2018 |
+
凹
|
| 2019 |
+
瑞
|
| 2020 |
+
头
|
| 2021 |
+
仪
|
| 2022 |
+
弧
|
| 2023 |
+
孵
|
| 2024 |
+
畏
|
| 2025 |
+
铆
|
| 2026 |
+
突
|
| 2027 |
+
衲
|
| 2028 |
+
车
|
| 2029 |
+
浩
|
| 2030 |
+
气
|
| 2031 |
+
茂
|
| 2032 |
+
悖
|
| 2033 |
+
厢
|
| 2034 |
+
枕
|
| 2035 |
+
酝
|
| 2036 |
+
戴
|
| 2037 |
+
湾
|
| 2038 |
+
邹
|
| 2039 |
+
飚
|
| 2040 |
+
攘
|
| 2041 |
+
锂
|
| 2042 |
+
写
|
| 2043 |
+
宵
|
| 2044 |
+
翁
|
| 2045 |
+
岷
|
| 2046 |
+
无
|
| 2047 |
+
喜
|
| 2048 |
+
丈
|
| 2049 |
+
挑
|
| 2050 |
+
嗟
|
| 2051 |
+
绛
|
| 2052 |
+
殉
|
| 2053 |
+
议
|
| 2054 |
+
槽
|
| 2055 |
+
具
|
| 2056 |
+
醇
|
| 2057 |
+
淞
|
| 2058 |
+
笃
|
| 2059 |
+
郴
|
| 2060 |
+
阅
|
| 2061 |
+
饼
|
| 2062 |
+
底
|
| 2063 |
+
壕
|
| 2064 |
+
砚
|
| 2065 |
+
弈
|
| 2066 |
+
询
|
| 2067 |
+
缕
|
| 2068 |
+
庹
|
| 2069 |
+
翟
|
| 2070 |
+
零
|
| 2071 |
+
筷
|
| 2072 |
+
暨
|
| 2073 |
+
舟
|
| 2074 |
+
闺
|
| 2075 |
+
甯
|
| 2076 |
+
撞
|
| 2077 |
+
麂
|
| 2078 |
+
茌
|
| 2079 |
+
蔼
|
| 2080 |
+
很
|
| 2081 |
+
珲
|
| 2082 |
+
捕
|
| 2083 |
+
棠
|
| 2084 |
+
角
|
| 2085 |
+
阉
|
| 2086 |
+
媛
|
| 2087 |
+
娲
|
| 2088 |
+
诽
|
| 2089 |
+
剿
|
| 2090 |
+
尉
|
| 2091 |
+
爵
|
| 2092 |
+
睬
|
| 2093 |
+
韩
|
| 2094 |
+
诰
|
| 2095 |
+
匣
|
| 2096 |
+
危
|
| 2097 |
+
糍
|
| 2098 |
+
镯
|
| 2099 |
+
立
|
| 2100 |
+
浏
|
| 2101 |
+
阳
|
| 2102 |
+
少
|
| 2103 |
+
盆
|
| 2104 |
+
舔
|
| 2105 |
+
擘
|
| 2106 |
+
匪
|
| 2107 |
+
申
|
| 2108 |
+
尬
|
| 2109 |
+
铣
|
| 2110 |
+
旯
|
| 2111 |
+
抖
|
| 2112 |
+
赘
|
| 2113 |
+
瓯
|
| 2114 |
+
居
|
| 2115 |
+
ˇ
|
| 2116 |
+
哮
|
| 2117 |
+
游
|
| 2118 |
+
锭
|
| 2119 |
+
茏
|
| 2120 |
+
歌
|
| 2121 |
+
坏
|
| 2122 |
+
甚
|
| 2123 |
+
秒
|
| 2124 |
+
舞
|
| 2125 |
+
沙
|
| 2126 |
+
仗
|
| 2127 |
+
劲
|
| 2128 |
+
潺
|
| 2129 |
+
阿
|
| 2130 |
+
燧
|
| 2131 |
+
郭
|
| 2132 |
+
嗖
|
| 2133 |
+
霏
|
| 2134 |
+
忠
|
| 2135 |
+
材
|
| 2136 |
+
奂
|
| 2137 |
+
耐
|
| 2138 |
+
跺
|
| 2139 |
+
砀
|
| 2140 |
+
输
|
| 2141 |
+
岖
|
| 2142 |
+
媳
|
| 2143 |
+
氟
|
| 2144 |
+
极
|
| 2145 |
+
摆
|
| 2146 |
+
灿
|
| 2147 |
+
今
|
| 2148 |
+
扔
|
| 2149 |
+
腻
|
| 2150 |
+
枝
|
| 2151 |
+
奎
|
| 2152 |
+
药
|
| 2153 |
+
熄
|
| 2154 |
+
吨
|
| 2155 |
+
话
|
| 2156 |
+
q
|
| 2157 |
+
额
|
| 2158 |
+
慑
|
| 2159 |
+
嘌
|
| 2160 |
+
协
|
| 2161 |
+
喀
|
| 2162 |
+
壳
|
| 2163 |
+
埭
|
| 2164 |
+
视
|
| 2165 |
+
著
|
| 2166 |
+
於
|
| 2167 |
+
愧
|
| 2168 |
+
陲
|
| 2169 |
+
翌
|
| 2170 |
+
峁
|
| 2171 |
+
颅
|
| 2172 |
+
佛
|
| 2173 |
+
腹
|
| 2174 |
+
聋
|
| 2175 |
+
侯
|
| 2176 |
+
咎
|
| 2177 |
+
叟
|
| 2178 |
+
秀
|
| 2179 |
+
颇
|
| 2180 |
+
存
|
| 2181 |
+
较
|
| 2182 |
+
罪
|
| 2183 |
+
哄
|
| 2184 |
+
岗
|
| 2185 |
+
扫
|
| 2186 |
+
栏
|
| 2187 |
+
钾
|
| 2188 |
+
羌
|
| 2189 |
+
己
|
| 2190 |
+
璨
|
| 2191 |
+
枭
|
| 2192 |
+
霉
|
| 2193 |
+
煌
|
| 2194 |
+
涸
|
| 2195 |
+
衿
|
| 2196 |
+
键
|
| 2197 |
+
镝
|
| 2198 |
+
益
|
| 2199 |
+
岢
|
| 2200 |
+
奏
|
| 2201 |
+
连
|
| 2202 |
+
夯
|
| 2203 |
+
睿
|
| 2204 |
+
冥
|
| 2205 |
+
均
|
| 2206 |
+
糖
|
| 2207 |
+
狞
|
| 2208 |
+
蹊
|
| 2209 |
+
稻
|
| 2210 |
+
爸
|
| 2211 |
+
刿
|
| 2212 |
+
胥
|
| 2213 |
+
煜
|
| 2214 |
+
丽
|
| 2215 |
+
肿
|
| 2216 |
+
璃
|
| 2217 |
+
掸
|
| 2218 |
+
跚
|
| 2219 |
+
灾
|
| 2220 |
+
垂
|
| 2221 |
+
樾
|
| 2222 |
+
濑
|
| 2223 |
+
乎
|
| 2224 |
+
莲
|
| 2225 |
+
窄
|
| 2226 |
+
犹
|
| 2227 |
+
撮
|
| 2228 |
+
战
|
| 2229 |
+
馄
|
| 2230 |
+
软
|
| 2231 |
+
络
|
| 2232 |
+
显
|
| 2233 |
+
鸢
|
| 2234 |
+
胸
|
| 2235 |
+
宾
|
| 2236 |
+
妲
|
| 2237 |
+
恕
|
| 2238 |
+
埔
|
| 2239 |
+
蝌
|
| 2240 |
+
份
|
| 2241 |
+
遇
|
| 2242 |
+
巧
|
| 2243 |
+
瞟
|
| 2244 |
+
粒
|
| 2245 |
+
恰
|
| 2246 |
+
剥
|
| 2247 |
+
桡
|
| 2248 |
+
博
|
| 2249 |
+
讯
|
| 2250 |
+
凯
|
| 2251 |
+
堇
|
| 2252 |
+
阶
|
| 2253 |
+
滤
|
| 2254 |
+
卖
|
| 2255 |
+
斌
|
| 2256 |
+
骚
|
| 2257 |
+
彬
|
| 2258 |
+
兑
|
| 2259 |
+
磺
|
| 2260 |
+
樱
|
| 2261 |
+
舷
|
| 2262 |
+
两
|
| 2263 |
+
娱
|
| 2264 |
+
福
|
| 2265 |
+
仃
|
| 2266 |
+
差
|
| 2267 |
+
找
|
| 2268 |
+
桁
|
| 2269 |
+
÷
|
| 2270 |
+
净
|
| 2271 |
+
把
|
| 2272 |
+
阴
|
| 2273 |
+
污
|
| 2274 |
+
戬
|
| 2275 |
+
雷
|
| 2276 |
+
碓
|
| 2277 |
+
蕲
|
| 2278 |
+
楚
|
| 2279 |
+
罡
|
| 2280 |
+
焖
|
| 2281 |
+
抽
|
| 2282 |
+
妫
|
| 2283 |
+
咒
|
| 2284 |
+
仑
|
| 2285 |
+
闱
|
| 2286 |
+
尽
|
| 2287 |
+
邑
|
| 2288 |
+
菁
|
| 2289 |
+
爱
|
| 2290 |
+
贷
|
| 2291 |
+
沥
|
| 2292 |
+
鞑
|
| 2293 |
+
牡
|
| 2294 |
+
嗉
|
| 2295 |
+
崴
|
| 2296 |
+
骤
|
| 2297 |
+
塌
|
| 2298 |
+
嗦
|
| 2299 |
+
订
|
| 2300 |
+
拮
|
| 2301 |
+
滓
|
| 2302 |
+
捡
|
| 2303 |
+
锻
|
| 2304 |
+
次
|
| 2305 |
+
坪
|
| 2306 |
+
杩
|
| 2307 |
+
臃
|
| 2308 |
+
箬
|
| 2309 |
+
融
|
| 2310 |
+
珂
|
| 2311 |
+
鹗
|
| 2312 |
+
宗
|
| 2313 |
+
枚
|
| 2314 |
+
降
|
| 2315 |
+
鸬
|
| 2316 |
+
妯
|
| 2317 |
+
阄
|
| 2318 |
+
堰
|
| 2319 |
+
盐
|
| 2320 |
+
毅
|
| 2321 |
+
必
|
| 2322 |
+
杨
|
| 2323 |
+
崃
|
| 2324 |
+
俺
|
| 2325 |
+
甬
|
| 2326 |
+
状
|
| 2327 |
+
莘
|
| 2328 |
+
货
|
| 2329 |
+
耸
|
| 2330 |
+
菱
|
| 2331 |
+
腼
|
| 2332 |
+
铸
|
| 2333 |
+
唏
|
| 2334 |
+
痤
|
| 2335 |
+
孚
|
| 2336 |
+
澳
|
| 2337 |
+
懒
|
| 2338 |
+
溅
|
| 2339 |
+
翘
|
| 2340 |
+
疙
|
| 2341 |
+
杷
|
| 2342 |
+
淼
|
| 2343 |
+
缙
|
| 2344 |
+
骰
|
| 2345 |
+
喊
|
| 2346 |
+
悉
|
| 2347 |
+
砻
|
| 2348 |
+
坷
|
| 2349 |
+
艇
|
| 2350 |
+
赁
|
| 2351 |
+
界
|
| 2352 |
+
谤
|
| 2353 |
+
纣
|
| 2354 |
+
宴
|
| 2355 |
+
晃
|
| 2356 |
+
茹
|
| 2357 |
+
归
|
| 2358 |
+
饭
|
| 2359 |
+
梢
|
| 2360 |
+
铡
|
| 2361 |
+
街
|
| 2362 |
+
抄
|
| 2363 |
+
肼
|
| 2364 |
+
鬟
|
| 2365 |
+
苯
|
| 2366 |
+
颂
|
| 2367 |
+
撷
|
| 2368 |
+
戈
|
| 2369 |
+
炒
|
| 2370 |
+
咆
|
| 2371 |
+
茭
|
| 2372 |
+
瘙
|
| 2373 |
+
负
|
| 2374 |
+
仰
|
| 2375 |
+
客
|
| 2376 |
+
琉
|
| 2377 |
+
铢
|
| 2378 |
+
封
|
| 2379 |
+
卑
|
| 2380 |
+
珥
|
| 2381 |
+
椿
|
| 2382 |
+
镧
|
| 2383 |
+
窨
|
| 2384 |
+
鬲
|
| 2385 |
+
寿
|
| 2386 |
+
御
|
| 2387 |
+
袤
|
| 2388 |
+
铃
|
| 2389 |
+
萎
|
| 2390 |
+
砖
|
| 2391 |
+
餮
|
| 2392 |
+
脒
|
| 2393 |
+
裳
|
| 2394 |
+
肪
|
| 2395 |
+
孕
|
| 2396 |
+
嫣
|
| 2397 |
+
馗
|
| 2398 |
+
嵇
|
| 2399 |
+
恳
|
| 2400 |
+
氯
|
| 2401 |
+
江
|
| 2402 |
+
石
|
| 2403 |
+
褶
|
| 2404 |
+
冢
|
| 2405 |
+
祸
|
| 2406 |
+
阻
|
| 2407 |
+
狈
|
| 2408 |
+
羞
|
| 2409 |
+
银
|
| 2410 |
+
靳
|
| 2411 |
+
透
|
| 2412 |
+
咳
|
| 2413 |
+
叼
|
| 2414 |
+
敷
|
| 2415 |
+
芷
|
| 2416 |
+
啥
|
| 2417 |
+
它
|
| 2418 |
+
瓤
|
| 2419 |
+
兰
|
| 2420 |
+
痘
|
| 2421 |
+
懊
|
| 2422 |
+
逑
|
| 2423 |
+
肌
|
| 2424 |
+
往
|
| 2425 |
+
捺
|
| 2426 |
+
坊
|
| 2427 |
+
甩
|
| 2428 |
+
呻
|
| 2429 |
+
〃
|
| 2430 |
+
沦
|
| 2431 |
+
忘
|
| 2432 |
+
膻
|
| 2433 |
+
祟
|
| 2434 |
+
菅
|
| 2435 |
+
剧
|
| 2436 |
+
崆
|
| 2437 |
+
智
|
| 2438 |
+
坯
|
| 2439 |
+
臧
|
| 2440 |
+
霍
|
| 2441 |
+
墅
|
| 2442 |
+
攻
|
| 2443 |
+
眯
|
| 2444 |
+
倘
|
| 2445 |
+
拢
|
| 2446 |
+
骠
|
| 2447 |
+
铐
|
| 2448 |
+
庭
|
| 2449 |
+
岙
|
| 2450 |
+
瓠
|
| 2451 |
+
′
|
| 2452 |
+
缺
|
| 2453 |
+
泥
|
| 2454 |
+
迢
|
| 2455 |
+
捶
|
| 2456 |
+
?
|
| 2457 |
+
?
|
| 2458 |
+
郏
|
| 2459 |
+
喙
|
| 2460 |
+
掷
|
| 2461 |
+
沌
|
| 2462 |
+
纯
|
| 2463 |
+
秘
|
| 2464 |
+
种
|
| 2465 |
+
听
|
| 2466 |
+
绘
|
| 2467 |
+
固
|
| 2468 |
+
螨
|
| 2469 |
+
团
|
| 2470 |
+
香
|
| 2471 |
+
盗
|
| 2472 |
+
妒
|
| 2473 |
+
埚
|
| 2474 |
+
蓝
|
| 2475 |
+
拖
|
| 2476 |
+
旱
|
| 2477 |
+
荞
|
| 2478 |
+
铀
|
| 2479 |
+
血
|
| 2480 |
+
遏
|
| 2481 |
+
汲
|
| 2482 |
+
辰
|
| 2483 |
+
叩
|
| 2484 |
+
拽
|
| 2485 |
+
幅
|
| 2486 |
+
硬
|
| 2487 |
+
惶
|
| 2488 |
+
桀
|
| 2489 |
+
漠
|
| 2490 |
+
措
|
| 2491 |
+
泼
|
| 2492 |
+
唑
|
| 2493 |
+
齐
|
| 2494 |
+
肾
|
| 2495 |
+
念
|
| 2496 |
+
酱
|
| 2497 |
+
虚
|
| 2498 |
+
屁
|
| 2499 |
+
耶
|
| 2500 |
+
旗
|
| 2501 |
+
砦
|
| 2502 |
+
闵
|
| 2503 |
+
婉
|
| 2504 |
+
馆
|
| 2505 |
+
拭
|
| 2506 |
+
绅
|
| 2507 |
+
韧
|
| 2508 |
+
忏
|
| 2509 |
+
窝
|
| 2510 |
+
醋
|
| 2511 |
+
葺
|
| 2512 |
+
顾
|
| 2513 |
+
辞
|
| 2514 |
+
倜
|
| 2515 |
+
堆
|
| 2516 |
+
辋
|
| 2517 |
+
逆
|
| 2518 |
+
玟
|
| 2519 |
+
贱
|
| 2520 |
+
疾
|
| 2521 |
+
董
|
| 2522 |
+
惘
|
| 2523 |
+
倌
|
| 2524 |
+
锕
|
| 2525 |
+
淘
|
| 2526 |
+
嘀
|
| 2527 |
+
莽
|
| 2528 |
+
俭
|
| 2529 |
+
笏
|
| 2530 |
+
绑
|
| 2531 |
+
鲷
|
| 2532 |
+
杈
|
| 2533 |
+
择
|
| 2534 |
+
蟀
|
| 2535 |
+
粥
|
| 2536 |
+
嗯
|
| 2537 |
+
驰
|
| 2538 |
+
逾
|
| 2539 |
+
案
|
| 2540 |
+
谪
|
| 2541 |
+
褓
|
| 2542 |
+
胫
|
| 2543 |
+
哩
|
| 2544 |
+
昕
|
| 2545 |
+
颚
|
| 2546 |
+
鲢
|
| 2547 |
+
绠
|
| 2548 |
+
躺
|
| 2549 |
+
鹄
|
| 2550 |
+
崂
|
| 2551 |
+
儒
|
| 2552 |
+
俨
|
| 2553 |
+
丝
|
| 2554 |
+
尕
|
| 2555 |
+
泌
|
| 2556 |
+
啊
|
| 2557 |
+
萸
|
| 2558 |
+
彰
|
| 2559 |
+
幺
|
| 2560 |
+
吟
|
| 2561 |
+
骄
|
| 2562 |
+
苣
|
| 2563 |
+
弦
|
| 2564 |
+
脊
|
| 2565 |
+
瑰
|
| 2566 |
+
〈
|
| 2567 |
+
诛
|
| 2568 |
+
镁
|
| 2569 |
+
析
|
| 2570 |
+
闪
|
| 2571 |
+
剪
|
| 2572 |
+
侧
|
| 2573 |
+
哟
|
| 2574 |
+
框
|
| 2575 |
+
螃
|
| 2576 |
+
守
|
| 2577 |
+
嬗
|
| 2578 |
+
燕
|
| 2579 |
+
狭
|
| 2580 |
+
铈
|
| 2581 |
+
缮
|
| 2582 |
+
概
|
| 2583 |
+
迳
|
| 2584 |
+
痧
|
| 2585 |
+
鲲
|
| 2586 |
+
俯
|
| 2587 |
+
售
|
| 2588 |
+
笼
|
| 2589 |
+
痣
|
| 2590 |
+
扉
|
| 2591 |
+
挖
|
| 2592 |
+
满
|
| 2593 |
+
咋
|
| 2594 |
+
援
|
| 2595 |
+
邱
|
| 2596 |
+
扇
|
| 2597 |
+
歪
|
| 2598 |
+
便
|
| 2599 |
+
玑
|
| 2600 |
+
绦
|
| 2601 |
+
峡
|
| 2602 |
+
蛇
|
| 2603 |
+
叨
|
| 2604 |
+
〖
|
| 2605 |
+
泽
|
| 2606 |
+
胃
|
| 2607 |
+
斓
|
| 2608 |
+
喋
|
| 2609 |
+
怂
|
| 2610 |
+
坟
|
| 2611 |
+
猪
|
| 2612 |
+
该
|
| 2613 |
+
蚬
|
| 2614 |
+
炕
|
| 2615 |
+
弥
|
| 2616 |
+
赞
|
| 2617 |
+
棣
|
| 2618 |
+
晔
|
| 2619 |
+
娠
|
| 2620 |
+
挲
|
| 2621 |
+
狡
|
| 2622 |
+
创
|
| 2623 |
+
疖
|
| 2624 |
+
铕
|
| 2625 |
+
镭
|
| 2626 |
+
稷
|
| 2627 |
+
挫
|
| 2628 |
+
弭
|
| 2629 |
+
啾
|
| 2630 |
+
翔
|
| 2631 |
+
粉
|
| 2632 |
+
履
|
| 2633 |
+
苘
|
| 2634 |
+
哦
|
| 2635 |
+
楼
|
| 2636 |
+
秕
|
| 2637 |
+
铂
|
| 2638 |
+
土
|
| 2639 |
+
锣
|
| 2640 |
+
瘟
|
| 2641 |
+
挣
|
| 2642 |
+
栉
|
| 2643 |
+
习
|
| 2644 |
+
享
|
| 2645 |
+
桢
|
| 2646 |
+
袅
|
| 2647 |
+
磨
|
| 2648 |
+
桂
|
| 2649 |
+
谦
|
| 2650 |
+
延
|
| 2651 |
+
坚
|
| 2652 |
+
蔚
|
| 2653 |
+
噗
|
| 2654 |
+
署
|
| 2655 |
+
谟
|
| 2656 |
+
猬
|
| 2657 |
+
钎
|
| 2658 |
+
恐
|
| 2659 |
+
嬉
|
| 2660 |
+
雒
|
| 2661 |
+
倦
|
| 2662 |
+
衅
|
| 2663 |
+
亏
|
| 2664 |
+
璩
|
| 2665 |
+
睹
|
| 2666 |
+
刻
|
| 2667 |
+
殿
|
| 2668 |
+
王
|
| 2669 |
+
算
|
| 2670 |
+
雕
|
| 2671 |
+
麻
|
| 2672 |
+
丘
|
| 2673 |
+
柯
|
| 2674 |
+
骆
|
| 2675 |
+
丸
|
| 2676 |
+
塍
|
| 2677 |
+
谚
|
| 2678 |
+
添
|
| 2679 |
+
鲈
|
| 2680 |
+
垓
|
| 2681 |
+
桎
|
| 2682 |
+
蚯
|
| 2683 |
+
芥
|
| 2684 |
+
予
|
| 2685 |
+
飕
|
| 2686 |
+
镦
|
| 2687 |
+
谌
|
| 2688 |
+
窗
|
| 2689 |
+
醚
|
| 2690 |
+
菀
|
| 2691 |
+
亮
|
| 2692 |
+
搪
|
| 2693 |
+
莺
|
| 2694 |
+
蒿
|
| 2695 |
+
羁
|
| 2696 |
+
足
|
| 2697 |
+
J
|
| 2698 |
+
真
|
| 2699 |
+
轶
|
| 2700 |
+
悬
|
| 2701 |
+
衷
|
| 2702 |
+
靛
|
| 2703 |
+
翊
|
| 2704 |
+
掩
|
| 2705 |
+
哒
|
| 2706 |
+
炅
|
| 2707 |
+
掐
|
| 2708 |
+
冼
|
| 2709 |
+
妮
|
| 2710 |
+
l
|
| 2711 |
+
谐
|
| 2712 |
+
稚
|
| 2713 |
+
荆
|
| 2714 |
+
擒
|
| 2715 |
+
犯
|
| 2716 |
+
陵
|
| 2717 |
+
虏
|
| 2718 |
+
浓
|
| 2719 |
+
崽
|
| 2720 |
+
刍
|
| 2721 |
+
陌
|
| 2722 |
+
傻
|
| 2723 |
+
孜
|
| 2724 |
+
千
|
| 2725 |
+
靖
|
| 2726 |
+
演
|
| 2727 |
+
矜
|
| 2728 |
+
钕
|
| 2729 |
+
煽
|
| 2730 |
+
杰
|
| 2731 |
+
酗
|
| 2732 |
+
渗
|
| 2733 |
+
伞
|
| 2734 |
+
栋
|
| 2735 |
+
俗
|
| 2736 |
+
泫
|
| 2737 |
+
戍
|
| 2738 |
+
罕
|
| 2739 |
+
沾
|
| 2740 |
+
疽
|
| 2741 |
+
灏
|
| 2742 |
+
煦
|
| 2743 |
+
芬
|
| 2744 |
+
磴
|
| 2745 |
+
叱
|
| 2746 |
+
阱
|
| 2747 |
+
榉
|
| 2748 |
+
湃
|
| 2749 |
+
蜀
|
| 2750 |
+
叉
|
| 2751 |
+
醒
|
| 2752 |
+
彪
|
| 2753 |
+
租
|
| 2754 |
+
郡
|
| 2755 |
+
篷
|
| 2756 |
+
屎
|
| 2757 |
+
良
|
| 2758 |
+
垢
|
| 2759 |
+
隗
|
| 2760 |
+
弱
|
| 2761 |
+
陨
|
| 2762 |
+
峪
|
| 2763 |
+
砷
|
| 2764 |
+
掴
|
| 2765 |
+
颁
|
| 2766 |
+
胎
|
| 2767 |
+
雯
|
| 2768 |
+
绵
|
| 2769 |
+
贬
|
| 2770 |
+
沐
|
| 2771 |
+
撵
|
| 2772 |
+
隘
|
| 2773 |
+
篙
|
| 2774 |
+
暖
|
| 2775 |
+
曹
|
| 2776 |
+
陡
|
| 2777 |
+
栓
|
| 2778 |
+
填
|
| 2779 |
+
臼
|
| 2780 |
+
彦
|
| 2781 |
+
瓶
|
| 2782 |
+
琪
|
| 2783 |
+
潼
|
| 2784 |
+
哪
|
| 2785 |
+
鸡
|
| 2786 |
+
摩
|
| 2787 |
+
啦
|
| 2788 |
+
俟
|
| 2789 |
+
锋
|
| 2790 |
+
域
|
| 2791 |
+
耻
|
| 2792 |
+
蔫
|
| 2793 |
+
疯
|
| 2794 |
+
纹
|
| 2795 |
+
撇
|
| 2796 |
+
毒
|
| 2797 |
+
绶
|
| 2798 |
+
痛
|
| 2799 |
+
酯
|
| 2800 |
+
忍
|
| 2801 |
+
爪
|
| 2802 |
+
赳
|
| 2803 |
+
歆
|
| 2804 |
+
嘹
|
| 2805 |
+
辕
|
| 2806 |
+
烈
|
| 2807 |
+
册
|
| 2808 |
+
朴
|
| 2809 |
+
钱
|
| 2810 |
+
吮
|
| 2811 |
+
毯
|
| 2812 |
+
癜
|
| 2813 |
+
娃
|
| 2814 |
+
谀
|
| 2815 |
+
邵
|
| 2816 |
+
厮
|
| 2817 |
+
炽
|
| 2818 |
+
璞
|
| 2819 |
+
邃
|
| 2820 |
+
丐
|
| 2821 |
+
追
|
| 2822 |
+
词
|
| 2823 |
+
瓒
|
| 2824 |
+
忆
|
| 2825 |
+
轧
|
| 2826 |
+
芫
|
| 2827 |
+
谯
|
| 2828 |
+
喷
|
| 2829 |
+
弟
|
| 2830 |
+
半
|
| 2831 |
+
冕
|
| 2832 |
+
裙
|
| 2833 |
+
掖
|
| 2834 |
+
墉
|
| 2835 |
+
绮
|
| 2836 |
+
寝
|
| 2837 |
+
苔
|
| 2838 |
+
势
|
| 2839 |
+
顷
|
| 2840 |
+
褥
|
| 2841 |
+
切
|
| 2842 |
+
衮
|
| 2843 |
+
君
|
| 2844 |
+
佳
|
| 2845 |
+
嫒
|
| 2846 |
+
蚩
|
| 2847 |
+
霞
|
| 2848 |
+
佚
|
| 2849 |
+
洙
|
| 2850 |
+
逊
|
| 2851 |
+
镖
|
| 2852 |
+
暹
|
| 2853 |
+
唛
|
| 2854 |
+
&
|
| 2855 |
+
殒
|
| 2856 |
+
顶
|
| 2857 |
+
碗
|
| 2858 |
+
獗
|
| 2859 |
+
轭
|
| 2860 |
+
铺
|
| 2861 |
+
蛊
|
| 2862 |
+
废
|
| 2863 |
+
恹
|
| 2864 |
+
汨
|
| 2865 |
+
崩
|
| 2866 |
+
珍
|
| 2867 |
+
那
|
| 2868 |
+
杵
|
| 2869 |
+
曲
|
| 2870 |
+
纺
|
| 2871 |
+
夏
|
| 2872 |
+
薰
|
| 2873 |
+
傀
|
| 2874 |
+
闳
|
| 2875 |
+
淬
|
| 2876 |
+
姘
|
| 2877 |
+
舀
|
| 2878 |
+
拧
|
| 2879 |
+
卷
|
| 2880 |
+
楂
|
| 2881 |
+
恍
|
| 2882 |
+
讪
|
| 2883 |
+
厩
|
| 2884 |
+
寮
|
| 2885 |
+
篪
|
| 2886 |
+
赓
|
| 2887 |
+
乘
|
| 2888 |
+
灭
|
| 2889 |
+
盅
|
| 2890 |
+
鞣
|
| 2891 |
+
沟
|
| 2892 |
+
慎
|
| 2893 |
+
挂
|
| 2894 |
+
饺
|
| 2895 |
+
鼾
|
| 2896 |
+
杳
|
| 2897 |
+
树
|
| 2898 |
+
缨
|
| 2899 |
+
丛
|
| 2900 |
+
絮
|
| 2901 |
+
娌
|
| 2902 |
+
臻
|
| 2903 |
+
嗳
|
| 2904 |
+
篡
|
| 2905 |
+
侩
|
| 2906 |
+
述
|
| 2907 |
+
衰
|
| 2908 |
+
矛
|
| 2909 |
+
圈
|
| 2910 |
+
蚜
|
| 2911 |
+
匕
|
| 2912 |
+
筹
|
| 2913 |
+
匿
|
| 2914 |
+
濞
|
| 2915 |
+
晨
|
| 2916 |
+
叶
|
| 2917 |
+
骋
|
| 2918 |
+
郝
|
| 2919 |
+
挚
|
| 2920 |
+
蚴
|
| 2921 |
+
滞
|
| 2922 |
+
增
|
| 2923 |
+
侍
|
| 2924 |
+
描
|
| 2925 |
+
瓣
|
| 2926 |
+
吖
|
| 2927 |
+
嫦
|
| 2928 |
+
蟒
|
| 2929 |
+
匾
|
| 2930 |
+
圣
|
| 2931 |
+
赌
|
| 2932 |
+
毡
|
| 2933 |
+
癞
|
| 2934 |
+
恺
|
| 2935 |
+
百
|
| 2936 |
+
曳
|
| 2937 |
+
需
|
| 2938 |
+
篓
|
| 2939 |
+
肮
|
| 2940 |
+
庖
|
| 2941 |
+
帏
|
| 2942 |
+
卿
|
| 2943 |
+
驿
|
| 2944 |
+
遗
|
| 2945 |
+
蹬
|
| 2946 |
+
鬓
|
| 2947 |
+
骡
|
| 2948 |
+
歉
|
| 2949 |
+
芎
|
| 2950 |
+
胳
|
| 2951 |
+
屐
|
| 2952 |
+
禽
|
| 2953 |
+
烦
|
| 2954 |
+
晌
|
| 2955 |
+
寄
|
| 2956 |
+
媾
|
| 2957 |
+
狄
|
| 2958 |
+
翡
|
| 2959 |
+
苒
|
| 2960 |
+
船
|
| 2961 |
+
廉
|
| 2962 |
+
终
|
| 2963 |
+
痞
|
| 2964 |
+
殇
|
| 2965 |
+
々
|
| 2966 |
+
畦
|
| 2967 |
+
饶
|
| 2968 |
+
改
|
| 2969 |
+
拆
|
| 2970 |
+
悻
|
| 2971 |
+
萄
|
| 2972 |
+
£
|
| 2973 |
+
瓿
|
| 2974 |
+
乃
|
| 2975 |
+
訾
|
| 2976 |
+
桅
|
| 2977 |
+
匮
|
| 2978 |
+
溧
|
| 2979 |
+
拥
|
| 2980 |
+
纱
|
| 2981 |
+
铍
|
| 2982 |
+
骗
|
| 2983 |
+
蕃
|
| 2984 |
+
龋
|
| 2985 |
+
缬
|
| 2986 |
+
父
|
| 2987 |
+
佐
|
| 2988 |
+
疚
|
| 2989 |
+
栎
|
| 2990 |
+
醍
|
| 2991 |
+
掳
|
| 2992 |
+
蓄
|
| 2993 |
+
x
|
| 2994 |
+
惆
|
| 2995 |
+
颜
|
| 2996 |
+
鲆
|
| 2997 |
+
榆
|
| 2998 |
+
〔
|
| 2999 |
+
猎
|
| 3000 |
+
敌
|
| 3001 |
+
暴
|
| 3002 |
+
谥
|
| 3003 |
+
鲫
|
| 3004 |
+
贾
|
| 3005 |
+
罗
|
| 3006 |
+
玻
|
| 3007 |
+
缄
|
| 3008 |
+
扦
|
| 3009 |
+
芪
|
| 3010 |
+
癣
|
| 3011 |
+
落
|
| 3012 |
+
徒
|
| 3013 |
+
臾
|
| 3014 |
+
恿
|
| 3015 |
+
猩
|
| 3016 |
+
托
|
| 3017 |
+
邴
|
| 3018 |
+
肄
|
| 3019 |
+
牵
|
| 3020 |
+
春
|
| 3021 |
+
陛
|
| 3022 |
+
耀
|
| 3023 |
+
刊
|
| 3024 |
+
拓
|
| 3025 |
+
蓓
|
| 3026 |
+
邳
|
| 3027 |
+
堕
|
| 3028 |
+
寇
|
| 3029 |
+
枉
|
| 3030 |
+
淌
|
| 3031 |
+
啡
|
| 3032 |
+
湄
|
| 3033 |
+
兽
|
| 3034 |
+
酷
|
| 3035 |
+
萼
|
| 3036 |
+
碚
|
| 3037 |
+
濠
|
| 3038 |
+
萤
|
| 3039 |
+
夹
|
| 3040 |
+
旬
|
| 3041 |
+
戮
|
| 3042 |
+
梭
|
| 3043 |
+
琥
|
| 3044 |
+
椭
|
| 3045 |
+
昔
|
| 3046 |
+
勺
|
| 3047 |
+
蜊
|
| 3048 |
+
绐
|
| 3049 |
+
晚
|
| 3050 |
+
孺
|
| 3051 |
+
僵
|
| 3052 |
+
宣
|
| 3053 |
+
摄
|
| 3054 |
+
冽
|
| 3055 |
+
旨
|
| 3056 |
+
萌
|
| 3057 |
+
忙
|
| 3058 |
+
蚤
|
| 3059 |
+
眉
|
| 3060 |
+
噼
|
| 3061 |
+
蟑
|
| 3062 |
+
付
|
| 3063 |
+
契
|
| 3064 |
+
瓜
|
| 3065 |
+
悼
|
| 3066 |
+
颡
|
| 3067 |
+
壁
|
| 3068 |
+
曾
|
| 3069 |
+
窕
|
| 3070 |
+
颢
|
| 3071 |
+
澎
|
| 3072 |
+
仿
|
| 3073 |
+
俑
|
| 3074 |
+
浑
|
| 3075 |
+
嵌
|
| 3076 |
+
浣
|
| 3077 |
+
乍
|
| 3078 |
+
碌
|
| 3079 |
+
褪
|
| 3080 |
+
乱
|
| 3081 |
+
蔟
|
| 3082 |
+
隙
|
| 3083 |
+
玩
|
| 3084 |
+
剐
|
| 3085 |
+
葫
|
| 3086 |
+
箫
|
| 3087 |
+
纲
|
| 3088 |
+
围
|
| 3089 |
+
伐
|
| 3090 |
+
决
|
| 3091 |
+
伙
|
| 3092 |
+
漩
|
| 3093 |
+
瑟
|
| 3094 |
+
刑
|
| 3095 |
+
肓
|
| 3096 |
+
镳
|
| 3097 |
+
缓
|
| 3098 |
+
蹭
|
| 3099 |
+
氨
|
| 3100 |
+
皓
|
| 3101 |
+
典
|
| 3102 |
+
畲
|
| 3103 |
+
坍
|
| 3104 |
+
铑
|
| 3105 |
+
檐
|
| 3106 |
+
塑
|
| 3107 |
+
洞
|
| 3108 |
+
倬
|
| 3109 |
+
储
|
| 3110 |
+
胴
|
| 3111 |
+
淳
|
| 3112 |
+
戾
|
| 3113 |
+
吐
|
| 3114 |
+
灼
|
| 3115 |
+
惺
|
| 3116 |
+
妙
|
| 3117 |
+
毕
|
| 3118 |
+
珐
|
| 3119 |
+
缈
|
| 3120 |
+
虱
|
| 3121 |
+
盖
|
| 3122 |
+
羰
|
| 3123 |
+
鸿
|
| 3124 |
+
磅
|
| 3125 |
+
谓
|
| 3126 |
+
髅
|
| 3127 |
+
娴
|
| 3128 |
+
苴
|
| 3129 |
+
唷
|
| 3130 |
+
蚣
|
| 3131 |
+
霹
|
| 3132 |
+
抨
|
| 3133 |
+
贤
|
| 3134 |
+
唠
|
| 3135 |
+
犬
|
| 3136 |
+
誓
|
| 3137 |
+
逍
|
| 3138 |
+
庠
|
| 3139 |
+
逼
|
| 3140 |
+
麓
|
| 3141 |
+
籼
|
| 3142 |
+
釉
|
| 3143 |
+
呜
|
| 3144 |
+
碧
|
| 3145 |
+
秧
|
| 3146 |
+
氩
|
| 3147 |
+
摔
|
| 3148 |
+
霄
|
| 3149 |
+
穸
|
| 3150 |
+
纨
|
| 3151 |
+
辟
|
| 3152 |
+
妈
|
| 3153 |
+
映
|
| 3154 |
+
完
|
| 3155 |
+
牛
|
| 3156 |
+
缴
|
| 3157 |
+
嗷
|
| 3158 |
+
炊
|
| 3159 |
+
恩
|
| 3160 |
+
荔
|
| 3161 |
+
茆
|
| 3162 |
+
掉
|
| 3163 |
+
紊
|
| 3164 |
+
慌
|
| 3165 |
+
莓
|
| 3166 |
+
羟
|
| 3167 |
+
阙
|
| 3168 |
+
萁
|
| 3169 |
+
磐
|
| 3170 |
+
另
|
| 3171 |
+
蕹
|
| 3172 |
+
辱
|
| 3173 |
+
鳐
|
| 3174 |
+
湮
|
| 3175 |
+
吡
|
| 3176 |
+
吩
|
| 3177 |
+
唐
|
| 3178 |
+
睦
|
| 3179 |
+
垠
|
| 3180 |
+
舒
|
| 3181 |
+
圜
|
| 3182 |
+
冗
|
| 3183 |
+
瞿
|
| 3184 |
+
溺
|
| 3185 |
+
芾
|
| 3186 |
+
囱
|
| 3187 |
+
匠
|
| 3188 |
+
僳
|
| 3189 |
+
汐
|
| 3190 |
+
菩
|
| 3191 |
+
饬
|
| 3192 |
+
漓
|
| 3193 |
+
黑
|
| 3194 |
+
霰
|
| 3195 |
+
浸
|
| 3196 |
+
濡
|
| 3197 |
+
窥
|
| 3198 |
+
毂
|
| 3199 |
+
蒡
|
| 3200 |
+
兢
|
| 3201 |
+
驻
|
| 3202 |
+
鹉
|
| 3203 |
+
芮
|
| 3204 |
+
诙
|
| 3205 |
+
迫
|
| 3206 |
+
雳
|
| 3207 |
+
厂
|
| 3208 |
+
忐
|
| 3209 |
+
臆
|
| 3210 |
+
猴
|
| 3211 |
+
鸣
|
| 3212 |
+
蚪
|
| 3213 |
+
栈
|
| 3214 |
+
箕
|
| 3215 |
+
羡
|
| 3216 |
+
渐
|
| 3217 |
+
莆
|
| 3218 |
+
捍
|
| 3219 |
+
眈
|
| 3220 |
+
哓
|
| 3221 |
+
趴
|
| 3222 |
+
蹼
|
| 3223 |
+
埕
|
| 3224 |
+
嚣
|
| 3225 |
+
骛
|
| 3226 |
+
宏
|
| 3227 |
+
淄
|
| 3228 |
+
斑
|
| 3229 |
+
噜
|
| 3230 |
+
严
|
| 3231 |
+
瑛
|
| 3232 |
+
垃
|
| 3233 |
+
椎
|
| 3234 |
+
诱
|
| 3235 |
+
压
|
| 3236 |
+
庾
|
| 3237 |
+
绞
|
| 3238 |
+
焘
|
| 3239 |
+
廿
|
| 3240 |
+
抡
|
| 3241 |
+
迄
|
| 3242 |
+
棘
|
| 3243 |
+
夫
|
| 3244 |
+
纬
|
| 3245 |
+
锹
|
| 3246 |
+
眨
|
| 3247 |
+
瞌
|
| 3248 |
+
侠
|
| 3249 |
+
脐
|
| 3250 |
+
竞
|
| 3251 |
+
瀑
|
| 3252 |
+
孳
|
| 3253 |
+
骧
|
| 3254 |
+
遁
|
| 3255 |
+
姜
|
| 3256 |
+
颦
|
| 3257 |
+
荪
|
| 3258 |
+
滚
|
| 3259 |
+
萦
|
| 3260 |
+
伪
|
| 3261 |
+
逸
|
| 3262 |
+
粳
|
| 3263 |
+
爬
|
| 3264 |
+
锁
|
| 3265 |
+
矣
|
| 3266 |
+
役
|
| 3267 |
+
趣
|
| 3268 |
+
洒
|
| 3269 |
+
颔
|
| 3270 |
+
诏
|
| 3271 |
+
逐
|
| 3272 |
+
奸
|
| 3273 |
+
甭
|
| 3274 |
+
惠
|
| 3275 |
+
攀
|
| 3276 |
+
蹄
|
| 3277 |
+
泛
|
| 3278 |
+
尼
|
| 3279 |
+
拼
|
| 3280 |
+
阮
|
| 3281 |
+
鹰
|
| 3282 |
+
亚
|
| 3283 |
+
颈
|
| 3284 |
+
惑
|
| 3285 |
+
勒
|
| 3286 |
+
〉
|
| 3287 |
+
际
|
| 3288 |
+
肛
|
| 3289 |
+
爷
|
| 3290 |
+
刚
|
| 3291 |
+
钨
|
| 3292 |
+
丰
|
| 3293 |
+
养
|
| 3294 |
+
冶
|
| 3295 |
+
鲽
|
| 3296 |
+
辉
|
| 3297 |
+
蔻
|
| 3298 |
+
画
|
| 3299 |
+
覆
|
| 3300 |
+
皴
|
| 3301 |
+
妊
|
| 3302 |
+
麦
|
| 3303 |
+
返
|
| 3304 |
+
醉
|
| 3305 |
+
皂
|
| 3306 |
+
擀
|
| 3307 |
+
〗
|
| 3308 |
+
酶
|
| 3309 |
+
凑
|
| 3310 |
+
粹
|
| 3311 |
+
悟
|
| 3312 |
+
诀
|
| 3313 |
+
硖
|
| 3314 |
+
港
|
| 3315 |
+
卜
|
| 3316 |
+
z
|
| 3317 |
+
杀
|
| 3318 |
+
涕
|
| 3319 |
+
±
|
| 3320 |
+
舍
|
| 3321 |
+
铠
|
| 3322 |
+
抵
|
| 3323 |
+
弛
|
| 3324 |
+
段
|
| 3325 |
+
敝
|
| 3326 |
+
镐
|
| 3327 |
+
奠
|
| 3328 |
+
拂
|
| 3329 |
+
轴
|
| 3330 |
+
跛
|
| 3331 |
+
袱
|
| 3332 |
+
e
|
| 3333 |
+
t
|
| 3334 |
+
沉
|
| 3335 |
+
菇
|
| 3336 |
+
俎
|
| 3337 |
+
薪
|
| 3338 |
+
峦
|
| 3339 |
+
秭
|
| 3340 |
+
蟹
|
| 3341 |
+
历
|
| 3342 |
+
盟
|
| 3343 |
+
菠
|
| 3344 |
+
寡
|
| 3345 |
+
液
|
| 3346 |
+
肢
|
| 3347 |
+
喻
|
| 3348 |
+
染
|
| 3349 |
+
裱
|
| 3350 |
+
悱
|
| 3351 |
+
抱
|
| 3352 |
+
氙
|
| 3353 |
+
赤
|
| 3354 |
+
捅
|
| 3355 |
+
猛
|
| 3356 |
+
跑
|
| 3357 |
+
氮
|
| 3358 |
+
谣
|
| 3359 |
+
仁
|
| 3360 |
+
尺
|
| 3361 |
+
辊
|
| 3362 |
+
窍
|
| 3363 |
+
烙
|
| 3364 |
+
衍
|
| 3365 |
+
架
|
| 3366 |
+
擦
|
| 3367 |
+
倏
|
| 3368 |
+
璐
|
| 3369 |
+
瑁
|
| 3370 |
+
币
|
| 3371 |
+
楞
|
| 3372 |
+
胖
|
| 3373 |
+
夔
|
| 3374 |
+
趸
|
| 3375 |
+
邛
|
| 3376 |
+
惴
|
| 3377 |
+
饕
|
| 3378 |
+
虔
|
| 3379 |
+
蝎
|
| 3380 |
+
§
|
| 3381 |
+
哉
|
| 3382 |
+
贝
|
| 3383 |
+
宽
|
| 3384 |
+
辫
|
| 3385 |
+
炮
|
| 3386 |
+
扩
|
| 3387 |
+
饲
|
| 3388 |
+
籽
|
| 3389 |
+
魏
|
| 3390 |
+
菟
|
| 3391 |
+
锰
|
| 3392 |
+
伍
|
| 3393 |
+
猝
|
| 3394 |
+
末
|
| 3395 |
+
琳
|
| 3396 |
+
哚
|
| 3397 |
+
蛎
|
| 3398 |
+
邂
|
| 3399 |
+
呀
|
| 3400 |
+
姿
|
| 3401 |
+
鄞
|
| 3402 |
+
却
|
| 3403 |
+
歧
|
| 3404 |
+
仙
|
| 3405 |
+
恸
|
| 3406 |
+
椐
|
| 3407 |
+
森
|
| 3408 |
+
牒
|
| 3409 |
+
寤
|
| 3410 |
+
袒
|
| 3411 |
+
婆
|
| 3412 |
+
虢
|
| 3413 |
+
雅
|
| 3414 |
+
钉
|
| 3415 |
+
朵
|
| 3416 |
+
贼
|
| 3417 |
+
欲
|
| 3418 |
+
苞
|
| 3419 |
+
寰
|
| 3420 |
+
故
|
| 3421 |
+
龚
|
| 3422 |
+
坭
|
| 3423 |
+
嘘
|
| 3424 |
+
咫
|
| 3425 |
+
礼
|
| 3426 |
+
硷
|
| 3427 |
+
兀
|
| 3428 |
+
睢
|
| 3429 |
+
汶
|
| 3430 |
+
’
|
| 3431 |
+
铲
|
| 3432 |
+
烧
|
| 3433 |
+
绕
|
| 3434 |
+
诃
|
| 3435 |
+
浃
|
| 3436 |
+
钿
|
| 3437 |
+
哺
|
| 3438 |
+
柜
|
| 3439 |
+
讼
|
| 3440 |
+
颊
|
| 3441 |
+
璁
|
| 3442 |
+
腔
|
| 3443 |
+
洽
|
| 3444 |
+
咐
|
| 3445 |
+
脲
|
| 3446 |
+
簌
|
| 3447 |
+
筠
|
| 3448 |
+
镣
|
| 3449 |
+
玮
|
| 3450 |
+
鞠
|
| 3451 |
+
谁
|
| 3452 |
+
兼
|
| 3453 |
+
姆
|
| 3454 |
+
挥
|
| 3455 |
+
梯
|
| 3456 |
+
蝴
|
| 3457 |
+
谘
|
| 3458 |
+
漕
|
| 3459 |
+
刷
|
| 3460 |
+
躏
|
| 3461 |
+
宦
|
| 3462 |
+
弼
|
| 3463 |
+
b
|
| 3464 |
+
垌
|
| 3465 |
+
劈
|
| 3466 |
+
麟
|
| 3467 |
+
莉
|
| 3468 |
+
揭
|
| 3469 |
+
笙
|
| 3470 |
+
渎
|
| 3471 |
+
仕
|
| 3472 |
+
嗤
|
| 3473 |
+
仓
|
| 3474 |
+
配
|
| 3475 |
+
怏
|
| 3476 |
+
抬
|
| 3477 |
+
错
|
| 3478 |
+
泯
|
| 3479 |
+
镊
|
| 3480 |
+
孰
|
| 3481 |
+
猿
|
| 3482 |
+
邪
|
| 3483 |
+
仍
|
| 3484 |
+
秋
|
| 3485 |
+
鼬
|
| 3486 |
+
壹
|
| 3487 |
+
歇
|
| 3488 |
+
吵
|
| 3489 |
+
炼
|
| 3490 |
+
<
|
| 3491 |
+
尧
|
| 3492 |
+
射
|
| 3493 |
+
柬
|
| 3494 |
+
廷
|
| 3495 |
+
胧
|
| 3496 |
+
霾
|
| 3497 |
+
凳
|
| 3498 |
+
隋
|
| 3499 |
+
肚
|
| 3500 |
+
浮
|
| 3501 |
+
梦
|
| 3502 |
+
祥
|
| 3503 |
+
株
|
| 3504 |
+
堵
|
| 3505 |
+
退
|
| 3506 |
+
L
|
| 3507 |
+
鹫
|
| 3508 |
+
跎
|
| 3509 |
+
凶
|
| 3510 |
+
毽
|
| 3511 |
+
荟
|
| 3512 |
+
炫
|
| 3513 |
+
栩
|
| 3514 |
+
玳
|
| 3515 |
+
甜
|
| 3516 |
+
沂
|
| 3517 |
+
鹿
|
| 3518 |
+
顽
|
| 3519 |
+
伯
|
| 3520 |
+
爹
|
| 3521 |
+
赔
|
| 3522 |
+
蛴
|
| 3523 |
+
徐
|
| 3524 |
+
匡
|
| 3525 |
+
欣
|
| 3526 |
+
狰
|
| 3527 |
+
缸
|
| 3528 |
+
雹
|
| 3529 |
+
蟆
|
| 3530 |
+
疤
|
| 3531 |
+
默
|
| 3532 |
+
沤
|
| 3533 |
+
啜
|
| 3534 |
+
痂
|
| 3535 |
+
衣
|
| 3536 |
+
禅
|
| 3537 |
+
w
|
| 3538 |
+
i
|
| 3539 |
+
h
|
| 3540 |
+
辽
|
| 3541 |
+
葳
|
| 3542 |
+
黝
|
| 3543 |
+
钗
|
| 3544 |
+
停
|
| 3545 |
+
沽
|
| 3546 |
+
棒
|
| 3547 |
+
馨
|
| 3548 |
+
颌
|
| 3549 |
+
肉
|
| 3550 |
+
吴
|
| 3551 |
+
硫
|
| 3552 |
+
悯
|
| 3553 |
+
劾
|
| 3554 |
+
娈
|
| 3555 |
+
马
|
| 3556 |
+
啧
|
| 3557 |
+
吊
|
| 3558 |
+
悌
|
| 3559 |
+
镑
|
| 3560 |
+
峭
|
| 3561 |
+
帆
|
| 3562 |
+
瀣
|
| 3563 |
+
涉
|
| 3564 |
+
咸
|
| 3565 |
+
疸
|
| 3566 |
+
滋
|
| 3567 |
+
泣
|
| 3568 |
+
翦
|
| 3569 |
+
拙
|
| 3570 |
+
癸
|
| 3571 |
+
钥
|
| 3572 |
+
蜒
|
| 3573 |
+
+
|
| 3574 |
+
尾
|
| 3575 |
+
庄
|
| 3576 |
+
凝
|
| 3577 |
+
泉
|
| 3578 |
+
婢
|
| 3579 |
+
渴
|
| 3580 |
+
谊
|
| 3581 |
+
乞
|
| 3582 |
+
陆
|
| 3583 |
+
锉
|
| 3584 |
+
糊
|
| 3585 |
+
鸦
|
| 3586 |
+
淮
|
| 3587 |
+
I
|
| 3588 |
+
B
|
| 3589 |
+
N
|
| 3590 |
+
晦
|
| 3591 |
+
弗
|
| 3592 |
+
乔
|
| 3593 |
+
庥
|
| 3594 |
+
葡
|
| 3595 |
+
尻
|
| 3596 |
+
席
|
| 3597 |
+
橡
|
| 3598 |
+
傣
|
| 3599 |
+
渣
|
| 3600 |
+
拿
|
| 3601 |
+
惩
|
| 3602 |
+
麋
|
| 3603 |
+
斛
|
| 3604 |
+
缃
|
| 3605 |
+
矮
|
| 3606 |
+
蛏
|
| 3607 |
+
岘
|
| 3608 |
+
鸽
|
| 3609 |
+
姐
|
| 3610 |
+
膏
|
| 3611 |
+
催
|
| 3612 |
+
奔
|
| 3613 |
+
镒
|
| 3614 |
+
喱
|
| 3615 |
+
蠡
|
| 3616 |
+
摧
|
| 3617 |
+
钯
|
| 3618 |
+
胤
|
| 3619 |
+
柠
|
| 3620 |
+
拐
|
| 3621 |
+
璋
|
| 3622 |
+
鸥
|
| 3623 |
+
卢
|
| 3624 |
+
荡
|
| 3625 |
+
倾
|
| 3626 |
+
^
|
| 3627 |
+
_
|
| 3628 |
+
珀
|
| 3629 |
+
逄
|
| 3630 |
+
萧
|
| 3631 |
+
塾
|
| 3632 |
+
掇
|
| 3633 |
+
贮
|
| 3634 |
+
笆
|
| 3635 |
+
聂
|
| 3636 |
+
圃
|
| 3637 |
+
冲
|
| 3638 |
+
嵬
|
| 3639 |
+
M
|
| 3640 |
+
滔
|
| 3641 |
+
笕
|
| 3642 |
+
值
|
| 3643 |
+
炙
|
| 3644 |
+
偶
|
| 3645 |
+
蜱
|
| 3646 |
+
搐
|
| 3647 |
+
梆
|
| 3648 |
+
汪
|
| 3649 |
+
蔬
|
| 3650 |
+
腑
|
| 3651 |
+
鸯
|
| 3652 |
+
蹇
|
| 3653 |
+
敞
|
| 3654 |
+
绯
|
| 3655 |
+
仨
|
| 3656 |
+
祯
|
| 3657 |
+
谆
|
| 3658 |
+
梧
|
| 3659 |
+
糗
|
| 3660 |
+
鑫
|
| 3661 |
+
啸
|
| 3662 |
+
豺
|
| 3663 |
+
囹
|
| 3664 |
+
猾
|
| 3665 |
+
巢
|
| 3666 |
+
柄
|
| 3667 |
+
瀛
|
| 3668 |
+
筑
|
| 3669 |
+
踌
|
| 3670 |
+
沭
|
| 3671 |
+
暗
|
| 3672 |
+
苁
|
| 3673 |
+
鱿
|
| 3674 |
+
蹉
|
| 3675 |
+
脂
|
| 3676 |
+
蘖
|
| 3677 |
+
牢
|
| 3678 |
+
热
|
| 3679 |
+
木
|
| 3680 |
+
吸
|
| 3681 |
+
溃
|
| 3682 |
+
宠
|
| 3683 |
+
序
|
| 3684 |
+
泞
|
| 3685 |
+
偿
|
| 3686 |
+
拜
|
| 3687 |
+
檩
|
| 3688 |
+
厚
|
| 3689 |
+
朐
|
| 3690 |
+
毗
|
| 3691 |
+
螳
|
| 3692 |
+
吞
|
| 3693 |
+
媚
|
| 3694 |
+
朽
|
| 3695 |
+
担
|
| 3696 |
+
蝗
|
| 3697 |
+
橘
|
| 3698 |
+
畴
|
| 3699 |
+
祈
|
| 3700 |
+
糟
|
| 3701 |
+
盱
|
| 3702 |
+
隼
|
| 3703 |
+
郜
|
| 3704 |
+
惜
|
| 3705 |
+
珠
|
| 3706 |
+
裨
|
| 3707 |
+
铵
|
| 3708 |
+
焙
|
| 3709 |
+
琚
|
| 3710 |
+
唯
|
| 3711 |
+
咚
|
| 3712 |
+
噪
|
| 3713 |
+
骊
|
| 3714 |
+
丫
|
| 3715 |
+
滢
|
| 3716 |
+
勤
|
| 3717 |
+
棉
|
| 3718 |
+
呸
|
| 3719 |
+
咣
|
| 3720 |
+
淀
|
| 3721 |
+
隔
|
| 3722 |
+
蕾
|
| 3723 |
+
窈
|
| 3724 |
+
饨
|
| 3725 |
+
挨
|
| 3726 |
+
煅
|
| 3727 |
+
短
|
| 3728 |
+
匙
|
| 3729 |
+
粕
|
| 3730 |
+
镜
|
| 3731 |
+
赣
|
| 3732 |
+
撕
|
| 3733 |
+
墩
|
| 3734 |
+
酬
|
| 3735 |
+
馁
|
| 3736 |
+
豌
|
| 3737 |
+
颐
|
| 3738 |
+
抗
|
| 3739 |
+
酣
|
| 3740 |
+
氓
|
| 3741 |
+
佑
|
| 3742 |
+
搁
|
| 3743 |
+
哭
|
| 3744 |
+
递
|
| 3745 |
+
耷
|
| 3746 |
+
涡
|
| 3747 |
+
桃
|
| 3748 |
+
贻
|
| 3749 |
+
碣
|
| 3750 |
+
截
|
| 3751 |
+
瘦
|
| 3752 |
+
昭
|
| 3753 |
+
镌
|
| 3754 |
+
蔓
|
| 3755 |
+
氚
|
| 3756 |
+
甲
|
| 3757 |
+
猕
|
| 3758 |
+
蕴
|
| 3759 |
+
蓬
|
| 3760 |
+
散
|
| 3761 |
+
拾
|
| 3762 |
+
纛
|
| 3763 |
+
狼
|
| 3764 |
+
猷
|
| 3765 |
+
铎
|
| 3766 |
+
埋
|
| 3767 |
+
旖
|
| 3768 |
+
矾
|
| 3769 |
+
讳
|
| 3770 |
+
囊
|
| 3771 |
+
糜
|
| 3772 |
+
迈
|
| 3773 |
+
粟
|
| 3774 |
+
蚂
|
| 3775 |
+
紧
|
| 3776 |
+
鲳
|
| 3777 |
+
瘢
|
| 3778 |
+
栽
|
| 3779 |
+
稼
|
| 3780 |
+
羊
|
| 3781 |
+
锄
|
| 3782 |
+
斟
|
| 3783 |
+
睁
|
| 3784 |
+
桥
|
| 3785 |
+
瓮
|
| 3786 |
+
蹙
|
| 3787 |
+
祉
|
| 3788 |
+
醺
|
| 3789 |
+
鼻
|
| 3790 |
+
昱
|
| 3791 |
+
剃
|
| 3792 |
+
跳
|
| 3793 |
+
篱
|
| 3794 |
+
跷
|
| 3795 |
+
蒜
|
| 3796 |
+
翎
|
| 3797 |
+
宅
|
| 3798 |
+
晖
|
| 3799 |
+
嗑
|
| 3800 |
+
壑
|
| 3801 |
+
峻
|
| 3802 |
+
癫
|
| 3803 |
+
屏
|
| 3804 |
+
狠
|
| 3805 |
+
陋
|
| 3806 |
+
袜
|
| 3807 |
+
途
|
| 3808 |
+
憎
|
| 3809 |
+
祀
|
| 3810 |
+
莹
|
| 3811 |
+
滟
|
| 3812 |
+
佶
|
| 3813 |
+
溥
|
| 3814 |
+
臣
|
| 3815 |
+
约
|
| 3816 |
+
盛
|
| 3817 |
+
峰
|
| 3818 |
+
磁
|
| 3819 |
+
慵
|
| 3820 |
+
婪
|
| 3821 |
+
拦
|
| 3822 |
+
莅
|
| 3823 |
+
朕
|
| 3824 |
+
鹦
|
| 3825 |
+
粲
|
| 3826 |
+
裤
|
| 3827 |
+
哎
|
| 3828 |
+
疡
|
| 3829 |
+
嫖
|
| 3830 |
+
琵
|
| 3831 |
+
窟
|
| 3832 |
+
堪
|
| 3833 |
+
谛
|
| 3834 |
+
嘉
|
| 3835 |
+
儡
|
| 3836 |
+
鳝
|
| 3837 |
+
斩
|
| 3838 |
+
郾
|
| 3839 |
+
驸
|
| 3840 |
+
酊
|
| 3841 |
+
妄
|
| 3842 |
+
胜
|
| 3843 |
+
贺
|
| 3844 |
+
徙
|
| 3845 |
+
傅
|
| 3846 |
+
噌
|
| 3847 |
+
钢
|
| 3848 |
+
栅
|
| 3849 |
+
庇
|
| 3850 |
+
恋
|
| 3851 |
+
匝
|
| 3852 |
+
巯
|
| 3853 |
+
邈
|
| 3854 |
+
尸
|
| 3855 |
+
锚
|
| 3856 |
+
粗
|
| 3857 |
+
佟
|
| 3858 |
+
蛟
|
| 3859 |
+
薹
|
| 3860 |
+
纵
|
| 3861 |
+
蚊
|
| 3862 |
+
郅
|
| 3863 |
+
绢
|
| 3864 |
+
锐
|
| 3865 |
+
苗
|
| 3866 |
+
俞
|
| 3867 |
+
篆
|
| 3868 |
+
淆
|
| 3869 |
+
膀
|
| 3870 |
+
鲜
|
| 3871 |
+
煎
|
| 3872 |
+
诶
|
| 3873 |
+
秽
|
| 3874 |
+
寻
|
| 3875 |
+
涮
|
| 3876 |
+
刺
|
| 3877 |
+
怀
|
| 3878 |
+
噶
|
| 3879 |
+
巨
|
| 3880 |
+
褰
|
| 3881 |
+
魅
|
| 3882 |
+
灶
|
| 3883 |
+
灌
|
| 3884 |
+
桉
|
| 3885 |
+
藕
|
| 3886 |
+
谜
|
| 3887 |
+
舸
|
| 3888 |
+
薄
|
| 3889 |
+
搀
|
| 3890 |
+
恽
|
| 3891 |
+
借
|
| 3892 |
+
牯
|
| 3893 |
+
痉
|
| 3894 |
+
渥
|
| 3895 |
+
愿
|
| 3896 |
+
亓
|
| 3897 |
+
耘
|
| 3898 |
+
杠
|
| 3899 |
+
柩
|
| 3900 |
+
锔
|
| 3901 |
+
蚶
|
| 3902 |
+
钣
|
| 3903 |
+
珈
|
| 3904 |
+
喘
|
| 3905 |
+
蹒
|
| 3906 |
+
幽
|
| 3907 |
+
赐
|
| 3908 |
+
稗
|
| 3909 |
+
晤
|
| 3910 |
+
莱
|
| 3911 |
+
泔
|
| 3912 |
+
扯
|
| 3913 |
+
肯
|
| 3914 |
+
菪
|
| 3915 |
+
裆
|
| 3916 |
+
腩
|
| 3917 |
+
豉
|
| 3918 |
+
疆
|
| 3919 |
+
骜
|
| 3920 |
+
腐
|
| 3921 |
+
倭
|
| 3922 |
+
珏
|
| 3923 |
+
唔
|
| 3924 |
+
粮
|
| 3925 |
+
亡
|
| 3926 |
+
润
|
| 3927 |
+
慰
|
| 3928 |
+
伽
|
| 3929 |
+
橄
|
| 3930 |
+
玄
|
| 3931 |
+
誉
|
| 3932 |
+
醐
|
| 3933 |
+
胆
|
| 3934 |
+
龊
|
| 3935 |
+
粼
|
| 3936 |
+
塬
|
| 3937 |
+
陇
|
| 3938 |
+
彼
|
| 3939 |
+
削
|
| 3940 |
+
嗣
|
| 3941 |
+
绾
|
| 3942 |
+
芽
|
| 3943 |
+
妗
|
| 3944 |
+
垭
|
| 3945 |
+
瘴
|
| 3946 |
+
爽
|
| 3947 |
+
薏
|
| 3948 |
+
寨
|
| 3949 |
+
龈
|
| 3950 |
+
泠
|
| 3951 |
+
弹
|
| 3952 |
+
赢
|
| 3953 |
+
漪
|
| 3954 |
+
猫
|
| 3955 |
+
嘧
|
| 3956 |
+
涂
|
| 3957 |
+
恤
|
| 3958 |
+
圭
|
| 3959 |
+
茧
|
| 3960 |
+
烽
|
| 3961 |
+
屑
|
| 3962 |
+
痕
|
| 3963 |
+
巾
|
| 3964 |
+
赖
|
| 3965 |
+
荸
|
| 3966 |
+
凰
|
| 3967 |
+
腮
|
| 3968 |
+
畈
|
| 3969 |
+
亵
|
| 3970 |
+
蹲
|
| 3971 |
+
偃
|
| 3972 |
+
苇
|
| 3973 |
+
澜
|
| 3974 |
+
艮
|
| 3975 |
+
换
|
| 3976 |
+
骺
|
| 3977 |
+
烘
|
| 3978 |
+
苕
|
| 3979 |
+
梓
|
| 3980 |
+
颉
|
| 3981 |
+
肇
|
| 3982 |
+
哗
|
| 3983 |
+
悄
|
| 3984 |
+
氤
|
| 3985 |
+
涠
|
| 3986 |
+
葬
|
| 3987 |
+
屠
|
| 3988 |
+
鹭
|
| 3989 |
+
植
|
| 3990 |
+
竺
|
| 3991 |
+
佯
|
| 3992 |
+
诣
|
| 3993 |
+
鲇
|
| 3994 |
+
瘀
|
| 3995 |
+
鲅
|
| 3996 |
+
邦
|
| 3997 |
+
移
|
| 3998 |
+
滁
|
| 3999 |
+
冯
|
| 4000 |
+
耕
|
| 4001 |
+
癔
|
| 4002 |
+
戌
|
| 4003 |
+
茬
|
| 4004 |
+
沁
|
| 4005 |
+
巩
|
| 4006 |
+
悠
|
| 4007 |
+
湘
|
| 4008 |
+
洪
|
| 4009 |
+
痹
|
| 4010 |
+
锟
|
| 4011 |
+
循
|
| 4012 |
+
谋
|
| 4013 |
+
腕
|
| 4014 |
+
鳃
|
| 4015 |
+
钠
|
| 4016 |
+
捞
|
| 4017 |
+
焉
|
| 4018 |
+
迎
|
| 4019 |
+
碱
|
| 4020 |
+
伫
|
| 4021 |
+
急
|
| 4022 |
+
榷
|
| 4023 |
+
奈
|
| 4024 |
+
邝
|
| 4025 |
+
卯
|
| 4026 |
+
辄
|
| 4027 |
+
皲
|
| 4028 |
+
卟
|
| 4029 |
+
醛
|
| 4030 |
+
畹
|
| 4031 |
+
忧
|
| 4032 |
+
稳
|
| 4033 |
+
雄
|
| 4034 |
+
昼
|
| 4035 |
+
缩
|
| 4036 |
+
阈
|
| 4037 |
+
睑
|
| 4038 |
+
扌
|
| 4039 |
+
耗
|
| 4040 |
+
曦
|
| 4041 |
+
涅
|
| 4042 |
+
捏
|
| 4043 |
+
瞧
|
| 4044 |
+
邕
|
| 4045 |
+
淖
|
| 4046 |
+
漉
|
| 4047 |
+
铝
|
| 4048 |
+
耦
|
| 4049 |
+
禹
|
| 4050 |
+
湛
|
| 4051 |
+
喽
|
| 4052 |
+
莼
|
| 4053 |
+
琅
|
| 4054 |
+
诸
|
| 4055 |
+
苎
|
| 4056 |
+
纂
|
| 4057 |
+
硅
|
| 4058 |
+
始
|
| 4059 |
+
嗨
|
| 4060 |
+
傥
|
| 4061 |
+
燃
|
| 4062 |
+
臂
|
| 4063 |
+
赅
|
| 4064 |
+
嘈
|
| 4065 |
+
呆
|
| 4066 |
+
贵
|
| 4067 |
+
屹
|
| 4068 |
+
壮
|
| 4069 |
+
肋
|
| 4070 |
+
亍
|
| 4071 |
+
蚀
|
| 4072 |
+
卅
|
| 4073 |
+
豹
|
| 4074 |
+
腆
|
| 4075 |
+
邬
|
| 4076 |
+
迭
|
| 4077 |
+
浊
|
| 4078 |
+
}
|
| 4079 |
+
童
|
| 4080 |
+
螂
|
| 4081 |
+
捐
|
| 4082 |
+
圩
|
| 4083 |
+
勐
|
| 4084 |
+
触
|
| 4085 |
+
寞
|
| 4086 |
+
汊
|
| 4087 |
+
壤
|
| 4088 |
+
荫
|
| 4089 |
+
膺
|
| 4090 |
+
渌
|
| 4091 |
+
芳
|
| 4092 |
+
懿
|
| 4093 |
+
遴
|
| 4094 |
+
螈
|
| 4095 |
+
泰
|
| 4096 |
+
蓼
|
| 4097 |
+
蛤
|
| 4098 |
+
茜
|
| 4099 |
+
舅
|
| 4100 |
+
枫
|
| 4101 |
+
朔
|
| 4102 |
+
膝
|
| 4103 |
+
眙
|
| 4104 |
+
避
|
| 4105 |
+
梅
|
| 4106 |
+
判
|
| 4107 |
+
鹜
|
| 4108 |
+
璜
|
| 4109 |
+
牍
|
| 4110 |
+
缅
|
| 4111 |
+
垫
|
| 4112 |
+
藻
|
| 4113 |
+
黔
|
| 4114 |
+
侥
|
| 4115 |
+
惚
|
| 4116 |
+
懂
|
| 4117 |
+
踩
|
| 4118 |
+
腰
|
| 4119 |
+
腈
|
| 4120 |
+
札
|
| 4121 |
+
丞
|
| 4122 |
+
唾
|
| 4123 |
+
慈
|
| 4124 |
+
顿
|
| 4125 |
+
摹
|
| 4126 |
+
荻
|
| 4127 |
+
琬
|
| 4128 |
+
~
|
| 4129 |
+
斧
|
| 4130 |
+
沈
|
| 4131 |
+
滂
|
| 4132 |
+
胁
|
| 4133 |
+
胀
|
| 4134 |
+
幄
|
| 4135 |
+
莜
|
| 4136 |
+
Z
|
| 4137 |
+
匀
|
| 4138 |
+
鄄
|
| 4139 |
+
掌
|
| 4140 |
+
绰
|
| 4141 |
+
茎
|
| 4142 |
+
焚
|
| 4143 |
+
赋
|
| 4144 |
+
萱
|
| 4145 |
+
谑
|
| 4146 |
+
汁
|
| 4147 |
+
铒
|
| 4148 |
+
瞎
|
| 4149 |
+
夺
|
| 4150 |
+
蜗
|
| 4151 |
+
野
|
| 4152 |
+
娆
|
| 4153 |
+
冀
|
| 4154 |
+
弯
|
| 4155 |
+
篁
|
| 4156 |
+
懵
|
| 4157 |
+
灞
|
| 4158 |
+
隽
|
| 4159 |
+
芡
|
| 4160 |
+
脘
|
| 4161 |
+
俐
|
| 4162 |
+
辩
|
| 4163 |
+
芯
|
| 4164 |
+
掺
|
| 4165 |
+
喏
|
| 4166 |
+
膈
|
| 4167 |
+
蝈
|
| 4168 |
+
觐
|
| 4169 |
+
悚
|
| 4170 |
+
踹
|
| 4171 |
+
蔗
|
| 4172 |
+
熠
|
| 4173 |
+
鼠
|
| 4174 |
+
呵
|
| 4175 |
+
抓
|
| 4176 |
+
橼
|
| 4177 |
+
峨
|
| 4178 |
+
畜
|
| 4179 |
+
缔
|
| 4180 |
+
禾
|
| 4181 |
+
崭
|
| 4182 |
+
弃
|
| 4183 |
+
熊
|
| 4184 |
+
摒
|
| 4185 |
+
凸
|
| 4186 |
+
拗
|
| 4187 |
+
穹
|
| 4188 |
+
蒙
|
| 4189 |
+
抒
|
| 4190 |
+
祛
|
| 4191 |
+
劝
|
| 4192 |
+
闫
|
| 4193 |
+
扳
|
| 4194 |
+
阵
|
| 4195 |
+
醌
|
| 4196 |
+
踪
|
| 4197 |
+
喵
|
| 4198 |
+
侣
|
| 4199 |
+
搬
|
| 4200 |
+
仅
|
| 4201 |
+
荧
|
| 4202 |
+
赎
|
| 4203 |
+
蝾
|
| 4204 |
+
琦
|
| 4205 |
+
买
|
| 4206 |
+
婧
|
| 4207 |
+
瞄
|
| 4208 |
+
寓
|
| 4209 |
+
皎
|
| 4210 |
+
冻
|
| 4211 |
+
赝
|
| 4212 |
+
箩
|
| 4213 |
+
莫
|
| 4214 |
+
瞰
|
| 4215 |
+
郊
|
| 4216 |
+
笫
|
| 4217 |
+
姝
|
| 4218 |
+
筒
|
| 4219 |
+
枪
|
| 4220 |
+
遣
|
| 4221 |
+
煸
|
| 4222 |
+
袋
|
| 4223 |
+
舆
|
| 4224 |
+
痱
|
| 4225 |
+
涛
|
| 4226 |
+
母
|
| 4227 |
+
〇
|
| 4228 |
+
启
|
| 4229 |
+
践
|
| 4230 |
+
耙
|
| 4231 |
+
绲
|
| 4232 |
+
盘
|
| 4233 |
+
遂
|
| 4234 |
+
昊
|
| 4235 |
+
搞
|
| 4236 |
+
槿
|
| 4237 |
+
诬
|
| 4238 |
+
纰
|
| 4239 |
+
泓
|
| 4240 |
+
惨
|
| 4241 |
+
檬
|
| 4242 |
+
亻
|
| 4243 |
+
越
|
| 4244 |
+
C
|
| 4245 |
+
o
|
| 4246 |
+
憩
|
| 4247 |
+
熵
|
| 4248 |
+
祷
|
| 4249 |
+
钒
|
| 4250 |
+
暧
|
| 4251 |
+
塔
|
| 4252 |
+
阗
|
| 4253 |
+
胰
|
| 4254 |
+
咄
|
| 4255 |
+
娶
|
| 4256 |
+
魔
|
| 4257 |
+
琶
|
| 4258 |
+
钞
|
| 4259 |
+
邻
|
| 4260 |
+
扬
|
| 4261 |
+
杉
|
| 4262 |
+
殴
|
| 4263 |
+
咽
|
| 4264 |
+
弓
|
| 4265 |
+
〆
|
| 4266 |
+
髻
|
| 4267 |
+
】
|
| 4268 |
+
吭
|
| 4269 |
+
揽
|
| 4270 |
+
霆
|
| 4271 |
+
拄
|
| 4272 |
+
殖
|
| 4273 |
+
脆
|
| 4274 |
+
彻
|
| 4275 |
+
岩
|
| 4276 |
+
芝
|
| 4277 |
+
勃
|
| 4278 |
+
辣
|
| 4279 |
+
剌
|
| 4280 |
+
钝
|
| 4281 |
+
嘎
|
| 4282 |
+
甄
|
| 4283 |
+
佘
|
| 4284 |
+
皖
|
| 4285 |
+
伦
|
| 4286 |
+
授
|
| 4287 |
+
��
|
| 4288 |
+
憔
|
| 4289 |
+
挪
|
| 4290 |
+
皇
|
| 4291 |
+
庞
|
| 4292 |
+
稔
|
| 4293 |
+
芜
|
| 4294 |
+
踏
|
| 4295 |
+
溴
|
| 4296 |
+
兖
|
| 4297 |
+
卒
|
| 4298 |
+
擢
|
| 4299 |
+
饥
|
| 4300 |
+
鳞
|
| 4301 |
+
煲
|
| 4302 |
+
‰
|
| 4303 |
+
账
|
| 4304 |
+
颗
|
| 4305 |
+
叻
|
| 4306 |
+
斯
|
| 4307 |
+
捧
|
| 4308 |
+
鳍
|
| 4309 |
+
琮
|
| 4310 |
+
讹
|
| 4311 |
+
蛙
|
| 4312 |
+
纽
|
| 4313 |
+
谭
|
| 4314 |
+
酸
|
| 4315 |
+
兔
|
| 4316 |
+
莒
|
| 4317 |
+
睇
|
| 4318 |
+
伟
|
| 4319 |
+
觑
|
| 4320 |
+
羲
|
| 4321 |
+
嗜
|
| 4322 |
+
宜
|
| 4323 |
+
褐
|
| 4324 |
+
旎
|
| 4325 |
+
辛
|
| 4326 |
+
卦
|
| 4327 |
+
诘
|
| 4328 |
+
筋
|
| 4329 |
+
鎏
|
| 4330 |
+
溪
|
| 4331 |
+
挛
|
| 4332 |
+
熔
|
| 4333 |
+
阜
|
| 4334 |
+
晰
|
| 4335 |
+
鳅
|
| 4336 |
+
丢
|
| 4337 |
+
奚
|
| 4338 |
+
灸
|
| 4339 |
+
呱
|
| 4340 |
+
献
|
| 4341 |
+
陉
|
| 4342 |
+
黛
|
| 4343 |
+
鸪
|
| 4344 |
+
甾
|
| 4345 |
+
萨
|
| 4346 |
+
疮
|
| 4347 |
+
拯
|
| 4348 |
+
洲
|
| 4349 |
+
疹
|
| 4350 |
+
辑
|
| 4351 |
+
叙
|
| 4352 |
+
恻
|
| 4353 |
+
谒
|
| 4354 |
+
允
|
| 4355 |
+
柔
|
| 4356 |
+
烂
|
| 4357 |
+
氏
|
| 4358 |
+
逅
|
| 4359 |
+
漆
|
| 4360 |
+
拎
|
| 4361 |
+
惋
|
| 4362 |
+
扈
|
| 4363 |
+
湟
|
| 4364 |
+
纭
|
| 4365 |
+
啕
|
| 4366 |
+
掬
|
| 4367 |
+
擞
|
| 4368 |
+
哥
|
| 4369 |
+
忽
|
| 4370 |
+
涤
|
| 4371 |
+
鸵
|
| 4372 |
+
靡
|
| 4373 |
+
郗
|
| 4374 |
+
瓷
|
| 4375 |
+
扁
|
| 4376 |
+
廊
|
| 4377 |
+
怨
|
| 4378 |
+
雏
|
| 4379 |
+
钮
|
| 4380 |
+
敦
|
| 4381 |
+
E
|
| 4382 |
+
懦
|
| 4383 |
+
憋
|
| 4384 |
+
汀
|
| 4385 |
+
拚
|
| 4386 |
+
啉
|
| 4387 |
+
腌
|
| 4388 |
+
岸
|
| 4389 |
+
f
|
| 4390 |
+
痼
|
| 4391 |
+
瞅
|
| 4392 |
+
尊
|
| 4393 |
+
咀
|
| 4394 |
+
眩
|
| 4395 |
+
飙
|
| 4396 |
+
忌
|
| 4397 |
+
仝
|
| 4398 |
+
迦
|
| 4399 |
+
熬
|
| 4400 |
+
毫
|
| 4401 |
+
胯
|
| 4402 |
+
篑
|
| 4403 |
+
茄
|
| 4404 |
+
腺
|
| 4405 |
+
凄
|
| 4406 |
+
舛
|
| 4407 |
+
碴
|
| 4408 |
+
锵
|
| 4409 |
+
诧
|
| 4410 |
+
羯
|
| 4411 |
+
後
|
| 4412 |
+
漏
|
| 4413 |
+
汤
|
| 4414 |
+
宓
|
| 4415 |
+
仞
|
| 4416 |
+
蚁
|
| 4417 |
+
壶
|
| 4418 |
+
谰
|
| 4419 |
+
皑
|
| 4420 |
+
铄
|
| 4421 |
+
棰
|
| 4422 |
+
罔
|
| 4423 |
+
辅
|
| 4424 |
+
晶
|
| 4425 |
+
苦
|
| 4426 |
+
牟
|
| 4427 |
+
闽
|
| 4428 |
+
\
|
| 4429 |
+
烃
|
| 4430 |
+
饮
|
| 4431 |
+
聿
|
| 4432 |
+
丙
|
| 4433 |
+
蛳
|
| 4434 |
+
朱
|
| 4435 |
+
煤
|
| 4436 |
+
涔
|
| 4437 |
+
鳖
|
| 4438 |
+
犁
|
| 4439 |
+
罐
|
| 4440 |
+
荼
|
| 4441 |
+
砒
|
| 4442 |
+
淦
|
| 4443 |
+
妤
|
| 4444 |
+
黏
|
| 4445 |
+
戎
|
| 4446 |
+
孑
|
| 4447 |
+
婕
|
| 4448 |
+
瑾
|
| 4449 |
+
戢
|
| 4450 |
+
钵
|
| 4451 |
+
枣
|
| 4452 |
+
捋
|
| 4453 |
+
砥
|
| 4454 |
+
衩
|
| 4455 |
+
狙
|
| 4456 |
+
桠
|
| 4457 |
+
稣
|
| 4458 |
+
阎
|
| 4459 |
+
肃
|
| 4460 |
+
梏
|
| 4461 |
+
诫
|
| 4462 |
+
孪
|
| 4463 |
+
昶
|
| 4464 |
+
婊
|
| 4465 |
+
衫
|
| 4466 |
+
嗔
|
| 4467 |
+
侃
|
| 4468 |
+
塞
|
| 4469 |
+
蜃
|
| 4470 |
+
樵
|
| 4471 |
+
峒
|
| 4472 |
+
貌
|
| 4473 |
+
屿
|
| 4474 |
+
欺
|
| 4475 |
+
缫
|
| 4476 |
+
阐
|
| 4477 |
+
栖
|
| 4478 |
+
诟
|
| 4479 |
+
珞
|
| 4480 |
+
荭
|
| 4481 |
+
吝
|
| 4482 |
+
萍
|
| 4483 |
+
嗽
|
| 4484 |
+
恂
|
| 4485 |
+
啻
|
| 4486 |
+
蜴
|
| 4487 |
+
磬
|
| 4488 |
+
峋
|
| 4489 |
+
俸
|
| 4490 |
+
豫
|
| 4491 |
+
谎
|
| 4492 |
+
徊
|
| 4493 |
+
镍
|
| 4494 |
+
韬
|
| 4495 |
+
魇
|
| 4496 |
+
晴
|
| 4497 |
+
U
|
| 4498 |
+
囟
|
| 4499 |
+
猜
|
| 4500 |
+
蛮
|
| 4501 |
+
坐
|
| 4502 |
+
囿
|
| 4503 |
+
伴
|
| 4504 |
+
亭
|
| 4505 |
+
肝
|
| 4506 |
+
佗
|
| 4507 |
+
蝠
|
| 4508 |
+
妃
|
| 4509 |
+
胞
|
| 4510 |
+
滩
|
| 4511 |
+
榴
|
| 4512 |
+
氖
|
| 4513 |
+
垩
|
| 4514 |
+
苋
|
| 4515 |
+
砣
|
| 4516 |
+
扪
|
| 4517 |
+
馏
|
| 4518 |
+
姓
|
| 4519 |
+
轩
|
| 4520 |
+
厉
|
| 4521 |
+
夥
|
| 4522 |
+
侈
|
| 4523 |
+
禀
|
| 4524 |
+
垒
|
| 4525 |
+
岑
|
| 4526 |
+
赏
|
| 4527 |
+
钛
|
| 4528 |
+
辐
|
| 4529 |
+
痔
|
| 4530 |
+
披
|
| 4531 |
+
纸
|
| 4532 |
+
碳
|
| 4533 |
+
“
|
| 4534 |
+
坞
|
| 4535 |
+
蠓
|
| 4536 |
+
挤
|
| 4537 |
+
荥
|
| 4538 |
+
沅
|
| 4539 |
+
悔
|
| 4540 |
+
铧
|
| 4541 |
+
帼
|
| 4542 |
+
蒌
|
| 4543 |
+
蝇
|
| 4544 |
+
a
|
| 4545 |
+
p
|
| 4546 |
+
y
|
| 4547 |
+
n
|
| 4548 |
+
g
|
| 4549 |
+
哀
|
| 4550 |
+
浆
|
| 4551 |
+
瑶
|
| 4552 |
+
凿
|
| 4553 |
+
桶
|
| 4554 |
+
馈
|
| 4555 |
+
皮
|
| 4556 |
+
奴
|
| 4557 |
+
苜
|
| 4558 |
+
佤
|
| 4559 |
+
伶
|
| 4560 |
+
晗
|
| 4561 |
+
铱
|
| 4562 |
+
炬
|
| 4563 |
+
优
|
| 4564 |
+
弊
|
| 4565 |
+
氢
|
| 4566 |
+
恃
|
| 4567 |
+
甫
|
| 4568 |
+
攥
|
| 4569 |
+
端
|
| 4570 |
+
锌
|
| 4571 |
+
灰
|
| 4572 |
+
稹
|
| 4573 |
+
炝
|
| 4574 |
+
曙
|
| 4575 |
+
邋
|
| 4576 |
+
亥
|
| 4577 |
+
眶
|
| 4578 |
+
碾
|
| 4579 |
+
拉
|
| 4580 |
+
萝
|
| 4581 |
+
绔
|
| 4582 |
+
捷
|
| 4583 |
+
浍
|
| 4584 |
+
腋
|
| 4585 |
+
姑
|
| 4586 |
+
菖
|
| 4587 |
+
凌
|
| 4588 |
+
涞
|
| 4589 |
+
麽
|
| 4590 |
+
锢
|
| 4591 |
+
桨
|
| 4592 |
+
潢
|
| 4593 |
+
绎
|
| 4594 |
+
镰
|
| 4595 |
+
殆
|
| 4596 |
+
锑
|
| 4597 |
+
渝
|
| 4598 |
+
铬
|
| 4599 |
+
困
|
| 4600 |
+
绽
|
| 4601 |
+
觎
|
| 4602 |
+
匈
|
| 4603 |
+
糙
|
| 4604 |
+
暑
|
| 4605 |
+
裹
|
| 4606 |
+
鸟
|
| 4607 |
+
盔
|
| 4608 |
+
肽
|
| 4609 |
+
迷
|
| 4610 |
+
綦
|
| 4611 |
+
『
|
| 4612 |
+
亳
|
| 4613 |
+
佝
|
| 4614 |
+
俘
|
| 4615 |
+
钴
|
| 4616 |
+
觇
|
| 4617 |
+
骥
|
| 4618 |
+
仆
|
| 4619 |
+
疝
|
| 4620 |
+
跪
|
| 4621 |
+
婶
|
| 4622 |
+
郯
|
| 4623 |
+
瀹
|
| 4624 |
+
唉
|
| 4625 |
+
脖
|
| 4626 |
+
踞
|
| 4627 |
+
针
|
| 4628 |
+
晾
|
| 4629 |
+
忒
|
| 4630 |
+
扼
|
| 4631 |
+
瞩
|
| 4632 |
+
叛
|
| 4633 |
+
椒
|
| 4634 |
+
疟
|
| 4635 |
+
嗡
|
| 4636 |
+
邗
|
| 4637 |
+
肆
|
| 4638 |
+
跆
|
| 4639 |
+
玫
|
| 4640 |
+
忡
|
| 4641 |
+
捣
|
| 4642 |
+
咧
|
| 4643 |
+
唆
|
| 4644 |
+
艄
|
| 4645 |
+
蘑
|
| 4646 |
+
潦
|
| 4647 |
+
笛
|
| 4648 |
+
阚
|
| 4649 |
+
沸
|
| 4650 |
+
泻
|
| 4651 |
+
掊
|
| 4652 |
+
菽
|
| 4653 |
+
贫
|
| 4654 |
+
斥
|
| 4655 |
+
髂
|
| 4656 |
+
孢
|
| 4657 |
+
镂
|
| 4658 |
+
赂
|
| 4659 |
+
麝
|
| 4660 |
+
鸾
|
| 4661 |
+
屡
|
| 4662 |
+
衬
|
| 4663 |
+
苷
|
| 4664 |
+
恪
|
| 4665 |
+
叠
|
| 4666 |
+
希
|
| 4667 |
+
粤
|
| 4668 |
+
爻
|
| 4669 |
+
喝
|
| 4670 |
+
茫
|
| 4671 |
+
惬
|
| 4672 |
+
郸
|
| 4673 |
+
绻
|
| 4674 |
+
庸
|
| 4675 |
+
撅
|
| 4676 |
+
碟
|
| 4677 |
+
宄
|
| 4678 |
+
妹
|
| 4679 |
+
膛
|
| 4680 |
+
叮
|
| 4681 |
+
饵
|
| 4682 |
+
崛
|
| 4683 |
+
嗲
|
| 4684 |
+
椅
|
| 4685 |
+
冤
|
| 4686 |
+
搅
|
| 4687 |
+
咕
|
| 4688 |
+
敛
|
| 4689 |
+
尹
|
| 4690 |
+
垦
|
| 4691 |
+
闷
|
| 4692 |
+
蝉
|
| 4693 |
+
霎
|
| 4694 |
+
勰
|
| 4695 |
+
败
|
| 4696 |
+
蓑
|
| 4697 |
+
泸
|
| 4698 |
+
肤
|
| 4699 |
+
鹌
|
| 4700 |
+
幌
|
| 4701 |
+
焦
|
| 4702 |
+
浠
|
| 4703 |
+
鞍
|
| 4704 |
+
刁
|
| 4705 |
+
舰
|
| 4706 |
+
乙
|
| 4707 |
+
竿
|
| 4708 |
+
裔
|
| 4709 |
+
。
|
| 4710 |
+
茵
|
| 4711 |
+
函
|
| 4712 |
+
伊
|
| 4713 |
+
兄
|
| 4714 |
+
丨
|
| 4715 |
+
娜
|
| 4716 |
+
匍
|
| 4717 |
+
謇
|
| 4718 |
+
莪
|
| 4719 |
+
宥
|
| 4720 |
+
似
|
| 4721 |
+
蝽
|
| 4722 |
+
翳
|
| 4723 |
+
酪
|
| 4724 |
+
翠
|
| 4725 |
+
粑
|
| 4726 |
+
薇
|
| 4727 |
+
祢
|
| 4728 |
+
骏
|
| 4729 |
+
赠
|
| 4730 |
+
叫
|
| 4731 |
+
Q
|
| 4732 |
+
噤
|
| 4733 |
+
噻
|
| 4734 |
+
竖
|
| 4735 |
+
芗
|
| 4736 |
+
莠
|
| 4737 |
+
潭
|
| 4738 |
+
俊
|
| 4739 |
+
羿
|
| 4740 |
+
耜
|
| 4741 |
+
O
|
| 4742 |
+
郫
|
| 4743 |
+
趁
|
| 4744 |
+
嗪
|
| 4745 |
+
囚
|
| 4746 |
+
蹶
|
| 4747 |
+
芒
|
| 4748 |
+
洁
|
| 4749 |
+
笋
|
| 4750 |
+
鹑
|
| 4751 |
+
敲
|
| 4752 |
+
硝
|
| 4753 |
+
啶
|
| 4754 |
+
堡
|
| 4755 |
+
渲
|
| 4756 |
+
揩
|
| 4757 |
+
』
|
| 4758 |
+
携
|
| 4759 |
+
宿
|
| 4760 |
+
遒
|
| 4761 |
+
颍
|
| 4762 |
+
扭
|
| 4763 |
+
棱
|
| 4764 |
+
割
|
| 4765 |
+
萜
|
| 4766 |
+
蔸
|
| 4767 |
+
葵
|
| 4768 |
+
琴
|
| 4769 |
+
捂
|
| 4770 |
+
饰
|
| 4771 |
+
衙
|
| 4772 |
+
耿
|
| 4773 |
+
掠
|
| 4774 |
+
募
|
| 4775 |
+
岂
|
| 4776 |
+
窖
|
| 4777 |
+
涟
|
| 4778 |
+
蔺
|
| 4779 |
+
瘤
|
| 4780 |
+
柞
|
| 4781 |
+
瞪
|
| 4782 |
+
怜
|
| 4783 |
+
匹
|
| 4784 |
+
距
|
| 4785 |
+
楔
|
| 4786 |
+
炜
|
| 4787 |
+
哆
|
| 4788 |
+
秦
|
| 4789 |
+
缎
|
| 4790 |
+
幼
|
| 4791 |
+
茁
|
| 4792 |
+
绪
|
| 4793 |
+
痨
|
| 4794 |
+
恨
|
| 4795 |
+
楸
|
| 4796 |
+
娅
|
| 4797 |
+
瓦
|
| 4798 |
+
桩
|
| 4799 |
+
雪
|
| 4800 |
+
嬴
|
| 4801 |
+
伏
|
| 4802 |
+
榔
|
| 4803 |
+
妥
|
| 4804 |
+
铿
|
| 4805 |
+
拌
|
| 4806 |
+
眠
|
| 4807 |
+
雍
|
| 4808 |
+
缇
|
| 4809 |
+
‘
|
| 4810 |
+
卓
|
| 4811 |
+
搓
|
| 4812 |
+
哌
|
| 4813 |
+
觞
|
| 4814 |
+
噩
|
| 4815 |
+
屈
|
| 4816 |
+
哧
|
| 4817 |
+
髓
|
| 4818 |
+
咦
|
| 4819 |
+
巅
|
| 4820 |
+
娑
|
| 4821 |
+
侑
|
| 4822 |
+
淫
|
| 4823 |
+
膳
|
| 4824 |
+
祝
|
| 4825 |
+
勾
|
| 4826 |
+
姊
|
| 4827 |
+
莴
|
| 4828 |
+
胄
|
| 4829 |
+
疃
|
| 4830 |
+
薛
|
| 4831 |
+
蜷
|
| 4832 |
+
胛
|
| 4833 |
+
巷
|
| 4834 |
+
芙
|
| 4835 |
+
芋
|
| 4836 |
+
熙
|
| 4837 |
+
闰
|
| 4838 |
+
勿
|
| 4839 |
+
窃
|
| 4840 |
+
狱
|
| 4841 |
+
剩
|
| 4842 |
+
钏
|
| 4843 |
+
幢
|
| 4844 |
+
陟
|
| 4845 |
+
铛
|
| 4846 |
+
慧
|
| 4847 |
+
靴
|
| 4848 |
+
耍
|
| 4849 |
+
k
|
| 4850 |
+
浙
|
| 4851 |
+
浇
|
| 4852 |
+
飨
|
| 4853 |
+
惟
|
| 4854 |
+
绗
|
| 4855 |
+
祜
|
| 4856 |
+
澈
|
| 4857 |
+
啼
|
| 4858 |
+
咪
|
| 4859 |
+
磷
|
| 4860 |
+
摞
|
| 4861 |
+
诅
|
| 4862 |
+
郦
|
| 4863 |
+
抹
|
| 4864 |
+
跃
|
| 4865 |
+
壬
|
| 4866 |
+
吕
|
| 4867 |
+
肖
|
| 4868 |
+
琏
|
| 4869 |
+
颤
|
| 4870 |
+
尴
|
| 4871 |
+
剡
|
| 4872 |
+
抠
|
| 4873 |
+
凋
|
| 4874 |
+
赚
|
| 4875 |
+
泊
|
| 4876 |
+
津
|
| 4877 |
+
宕
|
| 4878 |
+
殷
|
| 4879 |
+
倔
|
| 4880 |
+
氲
|
| 4881 |
+
漫
|
| 4882 |
+
邺
|
| 4883 |
+
涎
|
| 4884 |
+
怠
|
| 4885 |
+
$
|
| 4886 |
+
垮
|
| 4887 |
+
荬
|
| 4888 |
+
遵
|
| 4889 |
+
俏
|
| 4890 |
+
叹
|
| 4891 |
+
噢
|
| 4892 |
+
饽
|
| 4893 |
+
蜘
|
| 4894 |
+
孙
|
| 4895 |
+
筵
|
| 4896 |
+
疼
|
| 4897 |
+
鞭
|
| 4898 |
+
羧
|
| 4899 |
+
牦
|
| 4900 |
+
箭
|
| 4901 |
+
潴
|
| 4902 |
+
c
|
| 4903 |
+
眸
|
| 4904 |
+
祭
|
| 4905 |
+
髯
|
| 4906 |
+
啖
|
| 4907 |
+
坳
|
| 4908 |
+
愁
|
| 4909 |
+
芩
|
| 4910 |
+
驮
|
| 4911 |
+
倡
|
| 4912 |
+
巽
|
| 4913 |
+
穰
|
| 4914 |
+
沃
|
| 4915 |
+
胚
|
| 4916 |
+
怒
|
| 4917 |
+
凤
|
| 4918 |
+
槛
|
| 4919 |
+
剂
|
| 4920 |
+
趵
|
| 4921 |
+
嫁
|
| 4922 |
+
v
|
| 4923 |
+
邢
|
| 4924 |
+
灯
|
| 4925 |
+
鄢
|
| 4926 |
+
桐
|
| 4927 |
+
睽
|
| 4928 |
+
檗
|
| 4929 |
+
锯
|
| 4930 |
+
槟
|
| 4931 |
+
婷
|
| 4932 |
+
嵋
|
| 4933 |
+
圻
|
| 4934 |
+
诗
|
| 4935 |
+
蕈
|
| 4936 |
+
颠
|
| 4937 |
+
遭
|
| 4938 |
+
痢
|
| 4939 |
+
芸
|
| 4940 |
+
怯
|
| 4941 |
+
馥
|
| 4942 |
+
竭
|
| 4943 |
+
锗
|
| 4944 |
+
徜
|
| 4945 |
+
恭
|
| 4946 |
+
遍
|
| 4947 |
+
籁
|
| 4948 |
+
剑
|
| 4949 |
+
嘱
|
| 4950 |
+
苡
|
| 4951 |
+
龄
|
| 4952 |
+
僧
|
| 4953 |
+
桑
|
| 4954 |
+
潸
|
| 4955 |
+
弘
|
| 4956 |
+
澶
|
| 4957 |
+
楹
|
| 4958 |
+
悲
|
| 4959 |
+
讫
|
| 4960 |
+
愤
|
| 4961 |
+
腥
|
| 4962 |
+
悸
|
| 4963 |
+
谍
|
| 4964 |
+
椹
|
| 4965 |
+
呢
|
| 4966 |
+
桓
|
| 4967 |
+
葭
|
| 4968 |
+
攫
|
| 4969 |
+
阀
|
| 4970 |
+
翰
|
| 4971 |
+
躲
|
| 4972 |
+
敖
|
| 4973 |
+
柑
|
| 4974 |
+
郎
|
| 4975 |
+
笨
|
| 4976 |
+
橇
|
| 4977 |
+
呃
|
| 4978 |
+
魁
|
| 4979 |
+
燎
|
| 4980 |
+
脓
|
| 4981 |
+
葩
|
| 4982 |
+
磋
|
| 4983 |
+
垛
|
| 4984 |
+
玺
|
| 4985 |
+
狮
|
| 4986 |
+
沓
|
| 4987 |
+
砜
|
| 4988 |
+
蕊
|
| 4989 |
+
锺
|
| 4990 |
+
罹
|
| 4991 |
+
蕉
|
| 4992 |
+
翱
|
| 4993 |
+
虐
|
| 4994 |
+
闾
|
| 4995 |
+
巫
|
| 4996 |
+
旦
|
| 4997 |
+
茱
|
| 4998 |
+
嬷
|
| 4999 |
+
枯
|
| 5000 |
+
鹏
|
| 5001 |
+
贡
|
| 5002 |
+
芹
|
| 5003 |
+
汛
|
| 5004 |
+
矫
|
| 5005 |
+
绁
|
| 5006 |
+
拣
|
| 5007 |
+
禺
|
| 5008 |
+
佃
|
| 5009 |
+
讣
|
| 5010 |
+
舫
|
| 5011 |
+
惯
|
| 5012 |
+
乳
|
| 5013 |
+
趋
|
| 5014 |
+
疲
|
| 5015 |
+
挽
|
| 5016 |
+
岚
|
| 5017 |
+
虾
|
| 5018 |
+
衾
|
| 5019 |
+
蠹
|
| 5020 |
+
蹂
|
| 5021 |
+
飓
|
| 5022 |
+
氦
|
| 5023 |
+
铖
|
| 5024 |
+
孩
|
| 5025 |
+
稞
|
| 5026 |
+
瑜
|
| 5027 |
+
壅
|
| 5028 |
+
掀
|
| 5029 |
+
勘
|
| 5030 |
+
妓
|
| 5031 |
+
畅
|
| 5032 |
+
髋
|
| 5033 |
+
W
|
| 5034 |
+
庐
|
| 5035 |
+
牲
|
| 5036 |
+
蓿
|
| 5037 |
+
榕
|
| 5038 |
+
练
|
| 5039 |
+
垣
|
| 5040 |
+
唱
|
| 5041 |
+
邸
|
| 5042 |
+
菲
|
| 5043 |
+
昆
|
| 5044 |
+
婺
|
| 5045 |
+
穿
|
| 5046 |
+
绡
|
| 5047 |
+
麒
|
| 5048 |
+
蚱
|
| 5049 |
+
掂
|
| 5050 |
+
愚
|
| 5051 |
+
泷
|
| 5052 |
+
涪
|
| 5053 |
+
漳
|
| 5054 |
+
妩
|
| 5055 |
+
娉
|
| 5056 |
+
榄
|
| 5057 |
+
讷
|
| 5058 |
+
觅
|
| 5059 |
+
旧
|
| 5060 |
+
藤
|
| 5061 |
+
煮
|
| 5062 |
+
呛
|
| 5063 |
+
柳
|
| 5064 |
+
腓
|
| 5065 |
+
叭
|
| 5066 |
+
庵
|
| 5067 |
+
烷
|
| 5068 |
+
阡
|
| 5069 |
+
罂
|
| 5070 |
+
蜕
|
| 5071 |
+
擂
|
| 5072 |
+
猖
|
| 5073 |
+
咿
|
| 5074 |
+
媲
|
| 5075 |
+
脉
|
| 5076 |
+
【
|
| 5077 |
+
沏
|
| 5078 |
+
貅
|
| 5079 |
+
黠
|
| 5080 |
+
熏
|
| 5081 |
+
哲
|
| 5082 |
+
烁
|
| 5083 |
+
坦
|
| 5084 |
+
酵
|
| 5085 |
+
兜
|
| 5086 |
+
×
|
| 5087 |
+
潇
|
| 5088 |
+
撒
|
| 5089 |
+
剽
|
| 5090 |
+
珩
|
| 5091 |
+
圹
|
| 5092 |
+
乾
|
| 5093 |
+
摸
|
| 5094 |
+
樟
|
| 5095 |
+
帽
|
| 5096 |
+
嗒
|
| 5097 |
+
襄
|
| 5098 |
+
魂
|
| 5099 |
+
轿
|
| 5100 |
+
憬
|
| 5101 |
+
锡
|
| 5102 |
+
〕
|
| 5103 |
+
喃
|
| 5104 |
+
皆
|
| 5105 |
+
咖
|
| 5106 |
+
隅
|
| 5107 |
+
脸
|
| 5108 |
+
残
|
| 5109 |
+
泮
|
| 5110 |
+
袂
|
| 5111 |
+
鹂
|
| 5112 |
+
珊
|
| 5113 |
+
囤
|
| 5114 |
+
捆
|
| 5115 |
+
咤
|
| 5116 |
+
误
|
| 5117 |
+
徨
|
| 5118 |
+
闹
|
| 5119 |
+
淙
|
| 5120 |
+
芊
|
| 5121 |
+
淋
|
| 5122 |
+
怆
|
| 5123 |
+
囗
|
| 5124 |
+
拨
|
| 5125 |
+
梳
|
| 5126 |
+
渤
|
| 5127 |
+
R
|
| 5128 |
+
G
|
| 5129 |
+
绨
|
| 5130 |
+
蚓
|
| 5131 |
+
婀
|
| 5132 |
+
幡
|
| 5133 |
+
狩
|
| 5134 |
+
麾
|
| 5135 |
+
谢
|
| 5136 |
+
唢
|
| 5137 |
+
裸
|
| 5138 |
+
旌
|
| 5139 |
+
伉
|
| 5140 |
+
纶
|
| 5141 |
+
裂
|
| 5142 |
+
驳
|
| 5143 |
+
砼
|
| 5144 |
+
咛
|
| 5145 |
+
澄
|
| 5146 |
+
樨
|
| 5147 |
+
蹈
|
| 5148 |
+
宙
|
| 5149 |
+
澍
|
| 5150 |
+
倍
|
| 5151 |
+
貔
|
| 5152 |
+
操
|
| 5153 |
+
勇
|
| 5154 |
+
蟠
|
| 5155 |
+
摈
|
| 5156 |
+
砧
|
| 5157 |
+
虬
|
| 5158 |
+
够
|
| 5159 |
+
缁
|
| 5160 |
+
悦
|
| 5161 |
+
藿
|
| 5162 |
+
撸
|
| 5163 |
+
艹
|
| 5164 |
+
摁
|
| 5165 |
+
淹
|
| 5166 |
+
豇
|
| 5167 |
+
虎
|
| 5168 |
+
榭
|
| 5169 |
+
ˉ
|
| 5170 |
+
吱
|
| 5171 |
+
d
|
| 5172 |
+
°
|
| 5173 |
+
喧
|
| 5174 |
+
荀
|
| 5175 |
+
踱
|
| 5176 |
+
侮
|
| 5177 |
+
奋
|
| 5178 |
+
偕
|
| 5179 |
+
饷
|
| 5180 |
+
犍
|
| 5181 |
+
惮
|
| 5182 |
+
坑
|
| 5183 |
+
璎
|
| 5184 |
+
徘
|
| 5185 |
+
宛
|
| 5186 |
+
妆
|
| 5187 |
+
袈
|
| 5188 |
+
倩
|
| 5189 |
+
窦
|
| 5190 |
+
昂
|
| 5191 |
+
荏
|
| 5192 |
+
乖
|
| 5193 |
+
K
|
| 5194 |
+
怅
|
| 5195 |
+
撰
|
| 5196 |
+
鳙
|
| 5197 |
+
牙
|
| 5198 |
+
袁
|
| 5199 |
+
酞
|
| 5200 |
+
X
|
| 5201 |
+
痿
|
| 5202 |
+
琼
|
| 5203 |
+
闸
|
| 5204 |
+
雁
|
| 5205 |
+
趾
|
| 5206 |
+
荚
|
| 5207 |
+
虻
|
| 5208 |
+
涝
|
| 5209 |
+
《
|
| 5210 |
+
杏
|
| 5211 |
+
韭
|
| 5212 |
+
偈
|
| 5213 |
+
烤
|
| 5214 |
+
绫
|
| 5215 |
+
鞘
|
| 5216 |
+
卉
|
| 5217 |
+
症
|
| 5218 |
+
遢
|
| 5219 |
+
蓥
|
| 5220 |
+
诋
|
| 5221 |
+
杭
|
| 5222 |
+
荨
|
| 5223 |
+
匆
|
| 5224 |
+
竣
|
| 5225 |
+
簪
|
| 5226 |
+
辙
|
| 5227 |
+
敕
|
| 5228 |
+
虞
|
| 5229 |
+
丹
|
| 5230 |
+
缭
|
| 5231 |
+
咩
|
| 5232 |
+
黟
|
| 5233 |
+
m
|
| 5234 |
+
淤
|
| 5235 |
+
瑕
|
| 5236 |
+
咂
|
| 5237 |
+
铉
|
| 5238 |
+
硼
|
| 5239 |
+
茨
|
| 5240 |
+
嶂
|
| 5241 |
+
痒
|
| 5242 |
+
畸
|
| 5243 |
+
敬
|
| 5244 |
+
涿
|
| 5245 |
+
粪
|
| 5246 |
+
窘
|
| 5247 |
+
熟
|
| 5248 |
+
叔
|
| 5249 |
+
嫔
|
| 5250 |
+
盾
|
| 5251 |
+
忱
|
| 5252 |
+
裘
|
| 5253 |
+
憾
|
| 5254 |
+
梵
|
| 5255 |
+
赡
|
| 5256 |
+
珙
|
| 5257 |
+
咯
|
| 5258 |
+
娘
|
| 5259 |
+
庙
|
| 5260 |
+
溯
|
| 5261 |
+
胺
|
| 5262 |
+
葱
|
| 5263 |
+
痪
|
| 5264 |
+
摊
|
| 5265 |
+
荷
|
| 5266 |
+
卞
|
| 5267 |
+
乒
|
| 5268 |
+
髦
|
| 5269 |
+
寐
|
| 5270 |
+
铭
|
| 5271 |
+
坩
|
| 5272 |
+
胗
|
| 5273 |
+
枷
|
| 5274 |
+
爆
|
| 5275 |
+
溟
|
| 5276 |
+
嚼
|
| 5277 |
+
羚
|
| 5278 |
+
砬
|
| 5279 |
+
轨
|
| 5280 |
+
惊
|
| 5281 |
+
挠
|
| 5282 |
+
罄
|
| 5283 |
+
竽
|
| 5284 |
+
菏
|
| 5285 |
+
氧
|
| 5286 |
+
浅
|
| 5287 |
+
楣
|
| 5288 |
+
盼
|
| 5289 |
+
枢
|
| 5290 |
+
炸
|
| 5291 |
+
阆
|
| 5292 |
+
杯
|
| 5293 |
+
谏
|
| 5294 |
+
噬
|
| 5295 |
+
淇
|
| 5296 |
+
渺
|
| 5297 |
+
俪
|
| 5298 |
+
秆
|
| 5299 |
+
墓
|
| 5300 |
+
泪
|
| 5301 |
+
跻
|
| 5302 |
+
砌
|
| 5303 |
+
痰
|
| 5304 |
+
垡
|
| 5305 |
+
渡
|
| 5306 |
+
耽
|
| 5307 |
+
釜
|
| 5308 |
+
讶
|
| 5309 |
+
鳎
|
| 5310 |
+
煞
|
| 5311 |
+
呗
|
| 5312 |
+
韶
|
| 5313 |
+
舶
|
| 5314 |
+
绷
|
| 5315 |
+
鹳
|
| 5316 |
+
缜
|
| 5317 |
+
旷
|
| 5318 |
+
铊
|
| 5319 |
+
皱
|
| 5320 |
+
龌
|
| 5321 |
+
檀
|
| 5322 |
+
霖
|
| 5323 |
+
奄
|
| 5324 |
+
槐
|
| 5325 |
+
艳
|
| 5326 |
+
蝶
|
| 5327 |
+
旋
|
| 5328 |
+
哝
|
| 5329 |
+
赶
|
| 5330 |
+
骞
|
| 5331 |
+
蚧
|
| 5332 |
+
腊
|
| 5333 |
+
盈
|
| 5334 |
+
丁
|
| 5335 |
+
`
|
| 5336 |
+
蜚
|
| 5337 |
+
矸
|
| 5338 |
+
蝙
|
| 5339 |
+
睨
|
| 5340 |
+
嚓
|
| 5341 |
+
僻
|
| 5342 |
+
鬼
|
| 5343 |
+
醴
|
| 5344 |
+
夜
|
| 5345 |
+
彝
|
| 5346 |
+
磊
|
| 5347 |
+
笔
|
| 5348 |
+
拔
|
| 5349 |
+
栀
|
| 5350 |
+
糕
|
| 5351 |
+
厦
|
| 5352 |
+
邰
|
| 5353 |
+
纫
|
| 5354 |
+
逭
|
| 5355 |
+
纤
|
| 5356 |
+
眦
|
| 5357 |
+
膊
|
| 5358 |
+
馍
|
| 5359 |
+
躇
|
| 5360 |
+
烯
|
| 5361 |
+
蘼
|
| 5362 |
+
冬
|
| 5363 |
+
诤
|
| 5364 |
+
暄
|
| 5365 |
+
骶
|
| 5366 |
+
哑
|
| 5367 |
+
瘠
|
| 5368 |
+
」
|
| 5369 |
+
臊
|
| 5370 |
+
丕
|
| 5371 |
+
愈
|
| 5372 |
+
咱
|
| 5373 |
+
螺
|
| 5374 |
+
擅
|
| 5375 |
+
跋
|
| 5376 |
+
搏
|
| 5377 |
+
硪
|
| 5378 |
+
谄
|
| 5379 |
+
笠
|
| 5380 |
+
淡
|
| 5381 |
+
嘿
|
| 5382 |
+
骅
|
| 5383 |
+
谧
|
| 5384 |
+
鼎
|
| 5385 |
+
皋
|
| 5386 |
+
姚
|
| 5387 |
+
歼
|
| 5388 |
+
蠢
|
| 5389 |
+
驼
|
| 5390 |
+
耳
|
| 5391 |
+
胬
|
| 5392 |
+
挝
|
| 5393 |
+
涯
|
| 5394 |
+
狗
|
| 5395 |
+
蒽
|
| 5396 |
+
孓
|
| 5397 |
+
犷
|
| 5398 |
+
凉
|
| 5399 |
+
芦
|
| 5400 |
+
箴
|
| 5401 |
+
铤
|
| 5402 |
+
孤
|
| 5403 |
+
嘛
|
| 5404 |
+
坤
|
| 5405 |
+
V
|
| 5406 |
+
茴
|
| 5407 |
+
朦
|
| 5408 |
+
挞
|
| 5409 |
+
尖
|
| 5410 |
+
橙
|
| 5411 |
+
诞
|
| 5412 |
+
搴
|
| 5413 |
+
碇
|
| 5414 |
+
洵
|
| 5415 |
+
浚
|
| 5416 |
+
帚
|
| 5417 |
+
蜍
|
| 5418 |
+
漯
|
| 5419 |
+
柘
|
| 5420 |
+
嚎
|
| 5421 |
+
讽
|
| 5422 |
+
芭
|
| 5423 |
+
荤
|
| 5424 |
+
咻
|
| 5425 |
+
祠
|
| 5426 |
+
秉
|
| 5427 |
+
跖
|
| 5428 |
+
埃
|
| 5429 |
+
吓
|
| 5430 |
+
糯
|
| 5431 |
+
眷
|
| 5432 |
+
馒
|
| 5433 |
+
惹
|
| 5434 |
+
娼
|
| 5435 |
+
鲑
|
| 5436 |
+
嫩
|
| 5437 |
+
讴
|
| 5438 |
+
轮
|
| 5439 |
+
瞥
|
| 5440 |
+
靶
|
| 5441 |
+
褚
|
| 5442 |
+
乏
|
| 5443 |
+
缤
|
| 5444 |
+
宋
|
| 5445 |
+
帧
|
| 5446 |
+
删
|
| 5447 |
+
驱
|
| 5448 |
+
碎
|
| 5449 |
+
扑
|
| 5450 |
+
俩
|
| 5451 |
+
俄
|
| 5452 |
+
偏
|
| 5453 |
+
涣
|
| 5454 |
+
竹
|
| 5455 |
+
噱
|
| 5456 |
+
皙
|
| 5457 |
+
佰
|
| 5458 |
+
渚
|
| 5459 |
+
唧
|
| 5460 |
+
斡
|
| 5461 |
+
#
|
| 5462 |
+
镉
|
| 5463 |
+
刀
|
| 5464 |
+
崎
|
| 5465 |
+
筐
|
| 5466 |
+
佣
|
| 5467 |
+
夭
|
| 5468 |
+
贰
|
| 5469 |
+
肴
|
| 5470 |
+
峙
|
| 5471 |
+
哔
|
| 5472 |
+
艿
|
| 5473 |
+
匐
|
| 5474 |
+
牺
|
| 5475 |
+
镛
|
| 5476 |
+
缘
|
| 5477 |
+
仡
|
| 5478 |
+
嫡
|
| 5479 |
+
劣
|
| 5480 |
+
枸
|
| 5481 |
+
堀
|
| 5482 |
+
梨
|
| 5483 |
+
簿
|
| 5484 |
+
鸭
|
| 5485 |
+
蒸
|
| 5486 |
+
亦
|
| 5487 |
+
稽
|
| 5488 |
+
浴
|
| 5489 |
+
{
|
| 5490 |
+
衢
|
| 5491 |
+
束
|
| 5492 |
+
槲
|
| 5493 |
+
j
|
| 5494 |
+
阁
|
| 5495 |
+
揍
|
| 5496 |
+
疥
|
| 5497 |
+
棋
|
| 5498 |
+
潋
|
| 5499 |
+
聪
|
| 5500 |
+
窜
|
| 5501 |
+
乓
|
| 5502 |
+
睛
|
| 5503 |
+
插
|
| 5504 |
+
冉
|
| 5505 |
+
阪
|
| 5506 |
+
苍
|
| 5507 |
+
搽
|
| 5508 |
+
「
|
| 5509 |
+
蟾
|
| 5510 |
+
螟
|
| 5511 |
+
幸
|
| 5512 |
+
仇
|
| 5513 |
+
樽
|
| 5514 |
+
撂
|
| 5515 |
+
慢
|
| 5516 |
+
跤
|
| 5517 |
+
幔
|
| 5518 |
+
俚
|
| 5519 |
+
淅
|
| 5520 |
+
覃
|
| 5521 |
+
觊
|
| 5522 |
+
溶
|
| 5523 |
+
妖
|
| 5524 |
+
帛
|
| 5525 |
+
侨
|
| 5526 |
+
曰
|
| 5527 |
+
妾
|
| 5528 |
+
泗
|
| 5529 |
+
·
|
| 5530 |
+
:
|
| 5531 |
+
瀘
|
| 5532 |
+
風
|
| 5533 |
+
Ë
|
| 5534 |
+
(
|
| 5535 |
+
)
|
| 5536 |
+
∶
|
| 5537 |
+
紅
|
| 5538 |
+
紗
|
| 5539 |
+
瑭
|
| 5540 |
+
雲
|
| 5541 |
+
頭
|
| 5542 |
+
鶏
|
| 5543 |
+
財
|
| 5544 |
+
許
|
| 5545 |
+
•
|
| 5546 |
+
¥
|
| 5547 |
+
樂
|
| 5548 |
+
焗
|
| 5549 |
+
麗
|
| 5550 |
+
—
|
| 5551 |
+
;
|
| 5552 |
+
滙
|
| 5553 |
+
東
|
| 5554 |
+
榮
|
| 5555 |
+
繪
|
| 5556 |
+
興
|
| 5557 |
+
…
|
| 5558 |
+
門
|
| 5559 |
+
業
|
| 5560 |
+
π
|
| 5561 |
+
楊
|
| 5562 |
+
國
|
| 5563 |
+
顧
|
| 5564 |
+
é
|
| 5565 |
+
盤
|
| 5566 |
+
寳
|
| 5567 |
+
Λ
|
| 5568 |
+
龍
|
| 5569 |
+
鳳
|
| 5570 |
+
島
|
| 5571 |
+
誌
|
| 5572 |
+
緣
|
| 5573 |
+
結
|
| 5574 |
+
銭
|
| 5575 |
+
萬
|
| 5576 |
+
勝
|
| 5577 |
+
祎
|
| 5578 |
+
璟
|
| 5579 |
+
優
|
| 5580 |
+
歡
|
| 5581 |
+
臨
|
| 5582 |
+
時
|
| 5583 |
+
購
|
| 5584 |
+
=
|
| 5585 |
+
★
|
| 5586 |
+
藍
|
| 5587 |
+
昇
|
| 5588 |
+
鐵
|
| 5589 |
+
觀
|
| 5590 |
+
勅
|
| 5591 |
+
農
|
| 5592 |
+
聲
|
| 5593 |
+
畫
|
| 5594 |
+
兿
|
| 5595 |
+
術
|
| 5596 |
+
發
|
| 5597 |
+
劉
|
| 5598 |
+
記
|
| 5599 |
+
專
|
| 5600 |
+
耑
|
| 5601 |
+
園
|
| 5602 |
+
書
|
| 5603 |
+
壴
|
| 5604 |
+
種
|
| 5605 |
+
Ο
|
| 5606 |
+
●
|
| 5607 |
+
褀
|
| 5608 |
+
號
|
| 5609 |
+
銀
|
| 5610 |
+
匯
|
| 5611 |
+
敟
|
| 5612 |
+
锘
|
| 5613 |
+
葉
|
| 5614 |
+
橪
|
| 5615 |
+
廣
|
| 5616 |
+
進
|
| 5617 |
+
蒄
|
| 5618 |
+
鑽
|
| 5619 |
+
阝
|
| 5620 |
+
祙
|
| 5621 |
+
貢
|
| 5622 |
+
鍋
|
| 5623 |
+
豊
|
| 5624 |
+
夬
|
| 5625 |
+
喆
|
| 5626 |
+
團
|
| 5627 |
+
閣
|
| 5628 |
+
開
|
| 5629 |
+
燁
|
| 5630 |
+
賓
|
| 5631 |
+
館
|
| 5632 |
+
酡
|
| 5633 |
+
沔
|
| 5634 |
+
順
|
| 5635 |
+
+
|
| 5636 |
+
硚
|
| 5637 |
+
劵
|
| 5638 |
+
饸
|
| 5639 |
+
陽
|
| 5640 |
+
車
|
| 5641 |
+
湓
|
| 5642 |
+
復
|
| 5643 |
+
萊
|
| 5644 |
+
氣
|
| 5645 |
+
軒
|
| 5646 |
+
華
|
| 5647 |
+
堃
|
| 5648 |
+
迮
|
| 5649 |
+
纟
|
| 5650 |
+
戶
|
| 5651 |
+
馬
|
| 5652 |
+
學
|
| 5653 |
+
裡
|
| 5654 |
+
電
|
| 5655 |
+
嶽
|
| 5656 |
+
獨
|
| 5657 |
+
マ
|
| 5658 |
+
シ
|
| 5659 |
+
サ
|
| 5660 |
+
ジ
|
| 5661 |
+
燘
|
| 5662 |
+
袪
|
| 5663 |
+
環
|
| 5664 |
+
❤
|
| 5665 |
+
臺
|
| 5666 |
+
灣
|
| 5667 |
+
専
|
| 5668 |
+
賣
|
| 5669 |
+
孖
|
| 5670 |
+
聖
|
| 5671 |
+
攝
|
| 5672 |
+
線
|
| 5673 |
+
▪
|
| 5674 |
+
α
|
| 5675 |
+
傢
|
| 5676 |
+
俬
|
| 5677 |
+
夢
|
| 5678 |
+
達
|
| 5679 |
+
莊
|
| 5680 |
+
喬
|
| 5681 |
+
貝
|
| 5682 |
+
薩
|
| 5683 |
+
劍
|
| 5684 |
+
羅
|
| 5685 |
+
壓
|
| 5686 |
+
棛
|
| 5687 |
+
饦
|
| 5688 |
+
尃
|
| 5689 |
+
璈
|
| 5690 |
+
囍
|
| 5691 |
+
醫
|
| 5692 |
+
G
|
| 5693 |
+
I
|
| 5694 |
+
A
|
| 5695 |
+
#
|
| 5696 |
+
N
|
| 5697 |
+
鷄
|
| 5698 |
+
髙
|
| 5699 |
+
嬰
|
| 5700 |
+
啓
|
| 5701 |
+
約
|
| 5702 |
+
隹
|
| 5703 |
+
潔
|
| 5704 |
+
賴
|
| 5705 |
+
藝
|
| 5706 |
+
~
|
| 5707 |
+
寶
|
| 5708 |
+
籣
|
| 5709 |
+
麺
|
| 5710 |
+
|
| 5711 |
+
嶺
|
| 5712 |
+
√
|
| 5713 |
+
義
|
| 5714 |
+
網
|
| 5715 |
+
峩
|
| 5716 |
+
長
|
| 5717 |
+
∧
|
| 5718 |
+
魚
|
| 5719 |
+
機
|
| 5720 |
+
構
|
| 5721 |
+
②
|
| 5722 |
+
鳯
|
| 5723 |
+
偉
|
| 5724 |
+
L
|
| 5725 |
+
B
|
| 5726 |
+
㙟
|
| 5727 |
+
畵
|
| 5728 |
+
鴿
|
| 5729 |
+
'
|
| 5730 |
+
詩
|
| 5731 |
+
溝
|
| 5732 |
+
嚞
|
| 5733 |
+
屌
|
| 5734 |
+
藔
|
| 5735 |
+
佧
|
| 5736 |
+
玥
|
| 5737 |
+
蘭
|
| 5738 |
+
織
|
| 5739 |
+
1
|
| 5740 |
+
3
|
| 5741 |
+
9
|
| 5742 |
+
0
|
| 5743 |
+
7
|
| 5744 |
+
點
|
| 5745 |
+
砭
|
| 5746 |
+
鴨
|
| 5747 |
+
鋪
|
| 5748 |
+
銘
|
| 5749 |
+
廳
|
| 5750 |
+
弍
|
| 5751 |
+
‧
|
| 5752 |
+
創
|
| 5753 |
+
湯
|
| 5754 |
+
坶
|
| 5755 |
+
℃
|
| 5756 |
+
卩
|
| 5757 |
+
骝
|
| 5758 |
+
&
|
| 5759 |
+
烜
|
| 5760 |
+
荘
|
| 5761 |
+
當
|
| 5762 |
+
潤
|
| 5763 |
+
扞
|
| 5764 |
+
係
|
| 5765 |
+
懷
|
| 5766 |
+
碶
|
| 5767 |
+
钅
|
| 5768 |
+
蚨
|
| 5769 |
+
讠
|
| 5770 |
+
☆
|
| 5771 |
+
叢
|
| 5772 |
+
爲
|
| 5773 |
+
埗
|
| 5774 |
+
涫
|
| 5775 |
+
塗
|
| 5776 |
+
→
|
| 5777 |
+
楽
|
| 5778 |
+
現
|
| 5779 |
+
鯨
|
| 5780 |
+
愛
|
| 5781 |
+
瑪
|
| 5782 |
+
鈺
|
| 5783 |
+
忄
|
| 5784 |
+
悶
|
| 5785 |
+
藥
|
| 5786 |
+
飾
|
| 5787 |
+
樓
|
| 5788 |
+
視
|
| 5789 |
+
孬
|
| 5790 |
+
ㆍ
|
| 5791 |
+
燚
|
| 5792 |
+
苪
|
| 5793 |
+
師
|
| 5794 |
+
①
|
| 5795 |
+
丼
|
| 5796 |
+
锽
|
| 5797 |
+
│
|
| 5798 |
+
韓
|
| 5799 |
+
標
|
| 5800 |
+
è
|
| 5801 |
+
兒
|
| 5802 |
+
閏
|
| 5803 |
+
匋
|
| 5804 |
+
張
|
| 5805 |
+
漢
|
| 5806 |
+
Ü
|
| 5807 |
+
髪
|
| 5808 |
+
會
|
| 5809 |
+
閑
|
| 5810 |
+
檔
|
| 5811 |
+
習
|
| 5812 |
+
裝
|
| 5813 |
+
の
|
| 5814 |
+
峯
|
| 5815 |
+
菘
|
| 5816 |
+
輝
|
| 5817 |
+
И
|
| 5818 |
+
雞
|
| 5819 |
+
釣
|
| 5820 |
+
億
|
| 5821 |
+
浐
|
| 5822 |
+
K
|
| 5823 |
+
O
|
| 5824 |
+
R
|
| 5825 |
+
8
|
| 5826 |
+
H
|
| 5827 |
+
E
|
| 5828 |
+
P
|
| 5829 |
+
T
|
| 5830 |
+
W
|
| 5831 |
+
D
|
| 5832 |
+
S
|
| 5833 |
+
C
|
| 5834 |
+
M
|
| 5835 |
+
F
|
| 5836 |
+
姌
|
| 5837 |
+
饹
|
| 5838 |
+
»
|
| 5839 |
+
晞
|
| 5840 |
+
廰
|
| 5841 |
+
ä
|
| 5842 |
+
嵯
|
| 5843 |
+
鷹
|
| 5844 |
+
負
|
| 5845 |
+
飲
|
| 5846 |
+
絲
|
| 5847 |
+
冚
|
| 5848 |
+
楗
|
| 5849 |
+
澤
|
| 5850 |
+
綫
|
| 5851 |
+
區
|
| 5852 |
+
❋
|
| 5853 |
+
←
|
| 5854 |
+
質
|
| 5855 |
+
靑
|
| 5856 |
+
揚
|
| 5857 |
+
③
|
| 5858 |
+
滬
|
| 5859 |
+
統
|
| 5860 |
+
産
|
| 5861 |
+
協
|
| 5862 |
+
﹑
|
| 5863 |
+
乸
|
| 5864 |
+
畐
|
| 5865 |
+
經
|
| 5866 |
+
運
|
| 5867 |
+
際
|
| 5868 |
+
洺
|
| 5869 |
+
岽
|
| 5870 |
+
為
|
| 5871 |
+
粵
|
| 5872 |
+
諾
|
| 5873 |
+
崋
|
| 5874 |
+
豐
|
| 5875 |
+
碁
|
| 5876 |
+
ɔ
|
| 5877 |
+
V
|
| 5878 |
+
2
|
| 5879 |
+
6
|
| 5880 |
+
齋
|
| 5881 |
+
誠
|
| 5882 |
+
訂
|
| 5883 |
+
´
|
| 5884 |
+
勑
|
| 5885 |
+
雙
|
| 5886 |
+
陳
|
| 5887 |
+
無
|
| 5888 |
+
í
|
| 5889 |
+
泩
|
| 5890 |
+
媄
|
| 5891 |
+
夌
|
| 5892 |
+
刂
|
| 5893 |
+
i
|
| 5894 |
+
c
|
| 5895 |
+
t
|
| 5896 |
+
o
|
| 5897 |
+
r
|
| 5898 |
+
a
|
| 5899 |
+
嘢
|
| 5900 |
+
耄
|
| 5901 |
+
燴
|
| 5902 |
+
暃
|
| 5903 |
+
壽
|
| 5904 |
+
媽
|
| 5905 |
+
靈
|
| 5906 |
+
抻
|
| 5907 |
+
體
|
| 5908 |
+
唻
|
| 5909 |
+
É
|
| 5910 |
+
冮
|
| 5911 |
+
甹
|
| 5912 |
+
鎮
|
| 5913 |
+
錦
|
| 5914 |
+
ʌ
|
| 5915 |
+
蜛
|
| 5916 |
+
蠄
|
| 5917 |
+
尓
|
| 5918 |
+
駕
|
| 5919 |
+
戀
|
| 5920 |
+
飬
|
| 5921 |
+
逹
|
| 5922 |
+
倫
|
| 5923 |
+
貴
|
| 5924 |
+
極
|
| 5925 |
+
Я
|
| 5926 |
+
Й
|
| 5927 |
+
寬
|
| 5928 |
+
磚
|
| 5929 |
+
嶪
|
| 5930 |
+
郎
|
| 5931 |
+
職
|
| 5932 |
+
|
|
| 5933 |
+
間
|
| 5934 |
+
n
|
| 5935 |
+
d
|
| 5936 |
+
剎
|
| 5937 |
+
伈
|
| 5938 |
+
課
|
| 5939 |
+
飛
|
| 5940 |
+
橋
|
| 5941 |
+
瘊
|
| 5942 |
+
№
|
| 5943 |
+
譜
|
| 5944 |
+
骓
|
| 5945 |
+
圗
|
| 5946 |
+
滘
|
| 5947 |
+
縣
|
| 5948 |
+
粿
|
| 5949 |
+
咅
|
| 5950 |
+
養
|
| 5951 |
+
濤
|
| 5952 |
+
彳
|
| 5953 |
+
®
|
| 5954 |
+
%
|
| 5955 |
+
Ⅱ
|
| 5956 |
+
啰
|
| 5957 |
+
㴪
|
| 5958 |
+
見
|
| 5959 |
+
矞
|
| 5960 |
+
薬
|
| 5961 |
+
糁
|
| 5962 |
+
邨
|
| 5963 |
+
鲮
|
| 5964 |
+
顔
|
| 5965 |
+
罱
|
| 5966 |
+
З
|
| 5967 |
+
選
|
| 5968 |
+
話
|
| 5969 |
+
贏
|
| 5970 |
+
氪
|
| 5971 |
+
俵
|
| 5972 |
+
競
|
| 5973 |
+
瑩
|
| 5974 |
+
繡
|
| 5975 |
+
枱
|
| 5976 |
+
β
|
| 5977 |
+
綉
|
| 5978 |
+
á
|
| 5979 |
+
獅
|
| 5980 |
+
爾
|
| 5981 |
+
™
|
| 5982 |
+
麵
|
| 5983 |
+
戋
|
| 5984 |
+
淩
|
| 5985 |
+
徳
|
| 5986 |
+
個
|
| 5987 |
+
劇
|
| 5988 |
+
場
|
| 5989 |
+
務
|
| 5990 |
+
簡
|
| 5991 |
+
寵
|
| 5992 |
+
h
|
| 5993 |
+
實
|
| 5994 |
+
膠
|
| 5995 |
+
轱
|
| 5996 |
+
圖
|
| 5997 |
+
築
|
| 5998 |
+
嘣
|
| 5999 |
+
樹
|
| 6000 |
+
㸃
|
| 6001 |
+
營
|
| 6002 |
+
耵
|
| 6003 |
+
孫
|
| 6004 |
+
饃
|
| 6005 |
+
鄺
|
| 6006 |
+
飯
|
| 6007 |
+
麯
|
| 6008 |
+
遠
|
| 6009 |
+
輸
|
| 6010 |
+
坫
|
| 6011 |
+
孃
|
| 6012 |
+
乚
|
| 6013 |
+
閃
|
| 6014 |
+
鏢
|
| 6015 |
+
㎡
|
| 6016 |
+
題
|
| 6017 |
+
廠
|
| 6018 |
+
關
|
| 6019 |
+
↑
|
| 6020 |
+
爺
|
| 6021 |
+
將
|
| 6022 |
+
軍
|
| 6023 |
+
連
|
| 6024 |
+
篦
|
| 6025 |
+
覌
|
| 6026 |
+
參
|
| 6027 |
+
箸
|
| 6028 |
+
-
|
| 6029 |
+
窠
|
| 6030 |
+
棽
|
| 6031 |
+
寕
|
| 6032 |
+
夀
|
| 6033 |
+
爰
|
| 6034 |
+
歐
|
| 6035 |
+
呙
|
| 6036 |
+
閥
|
| 6037 |
+
頡
|
| 6038 |
+
熱
|
| 6039 |
+
雎
|
| 6040 |
+
垟
|
| 6041 |
+
裟
|
| 6042 |
+
凬
|
| 6043 |
+
勁
|
| 6044 |
+
帑
|
| 6045 |
+
馕
|
| 6046 |
+
夆
|
| 6047 |
+
疌
|
| 6048 |
+
枼
|
| 6049 |
+
馮
|
| 6050 |
+
貨
|
| 6051 |
+
蒤
|
| 6052 |
+
樸
|
| 6053 |
+
彧
|
| 6054 |
+
旸
|
| 6055 |
+
靜
|
| 6056 |
+
龢
|
| 6057 |
+
暢
|
| 6058 |
+
㐱
|
| 6059 |
+
鳥
|
| 6060 |
+
珺
|
| 6061 |
+
鏡
|
| 6062 |
+
灡
|
| 6063 |
+
爭
|
| 6064 |
+
堷
|
| 6065 |
+
廚
|
| 6066 |
+
Ó
|
| 6067 |
+
騰
|
| 6068 |
+
診
|
| 6069 |
+
┅
|
| 6070 |
+
蘇
|
| 6071 |
+
褔
|
| 6072 |
+
凱
|
| 6073 |
+
頂
|
| 6074 |
+
豕
|
| 6075 |
+
亞
|
| 6076 |
+
帥
|
| 6077 |
+
嘬
|
| 6078 |
+
⊥
|
| 6079 |
+
仺
|
| 6080 |
+
桖
|
| 6081 |
+
複
|
| 6082 |
+
饣
|
| 6083 |
+
絡
|
| 6084 |
+
穂
|
| 6085 |
+
顏
|
| 6086 |
+
棟
|
| 6087 |
+
納
|
| 6088 |
+
▏
|
| 6089 |
+
濟
|
| 6090 |
+
親
|
| 6091 |
+
設
|
| 6092 |
+
計
|
| 6093 |
+
攵
|
| 6094 |
+
埌
|
| 6095 |
+
烺
|
| 6096 |
+
ò
|
| 6097 |
+
頤
|
| 6098 |
+
燦
|
| 6099 |
+
蓮
|
| 6100 |
+
撻
|
| 6101 |
+
節
|
| 6102 |
+
講
|
| 6103 |
+
濱
|
| 6104 |
+
濃
|
| 6105 |
+
娽
|
| 6106 |
+
洳
|
| 6107 |
+
朿
|
| 6108 |
+
燈
|
| 6109 |
+
鈴
|
| 6110 |
+
護
|
| 6111 |
+
膚
|
| 6112 |
+
铔
|
| 6113 |
+
過
|
| 6114 |
+
補
|
| 6115 |
+
Z
|
| 6116 |
+
U
|
| 6117 |
+
5
|
| 6118 |
+
4
|
| 6119 |
+
坋
|
| 6120 |
+
闿
|
| 6121 |
+
䖝
|
| 6122 |
+
餘
|
| 6123 |
+
缐
|
| 6124 |
+
铞
|
| 6125 |
+
貿
|
| 6126 |
+
铪
|
| 6127 |
+
桼
|
| 6128 |
+
趙
|
| 6129 |
+
鍊
|
| 6130 |
+
[
|
| 6131 |
+
㐂
|
| 6132 |
+
垚
|
| 6133 |
+
菓
|
| 6134 |
+
揸
|
| 6135 |
+
捲
|
| 6136 |
+
鐘
|
| 6137 |
+
滏
|
| 6138 |
+
𣇉
|
| 6139 |
+
爍
|
| 6140 |
+
輪
|
| 6141 |
+
燜
|
| 6142 |
+
鴻
|
| 6143 |
+
鮮
|
| 6144 |
+
動
|
| 6145 |
+
鹞
|
| 6146 |
+
鷗
|
| 6147 |
+
丄
|
| 6148 |
+
慶
|
| 6149 |
+
鉌
|
| 6150 |
+
翥
|
| 6151 |
+
飮
|
| 6152 |
+
腸
|
| 6153 |
+
⇋
|
| 6154 |
+
漁
|
| 6155 |
+
覺
|
| 6156 |
+
來
|
| 6157 |
+
熘
|
| 6158 |
+
昴
|
| 6159 |
+
翏
|
| 6160 |
+
鲱
|
| 6161 |
+
圧
|
| 6162 |
+
鄉
|
| 6163 |
+
萭
|
| 6164 |
+
頔
|
| 6165 |
+
爐
|
| 6166 |
+
嫚
|
| 6167 |
+
г
|
| 6168 |
+
貭
|
| 6169 |
+
類
|
| 6170 |
+
聯
|
| 6171 |
+
幛
|
| 6172 |
+
輕
|
| 6173 |
+
訓
|
| 6174 |
+
鑒
|
| 6175 |
+
夋
|
| 6176 |
+
锨
|
| 6177 |
+
芃
|
| 6178 |
+
珣
|
| 6179 |
+
䝉
|
| 6180 |
+
扙
|
| 6181 |
+
嵐
|
| 6182 |
+
銷
|
| 6183 |
+
處
|
| 6184 |
+
ㄱ
|
| 6185 |
+
語
|
| 6186 |
+
誘
|
| 6187 |
+
苝
|
| 6188 |
+
歸
|
| 6189 |
+
儀
|
| 6190 |
+
燒
|
| 6191 |
+
楿
|
| 6192 |
+
內
|
| 6193 |
+
粢
|
| 6194 |
+
葒
|
| 6195 |
+
奧
|
| 6196 |
+
麥
|
| 6197 |
+
礻
|
| 6198 |
+
滿
|
| 6199 |
+
蠔
|
| 6200 |
+
穵
|
| 6201 |
+
瞭
|
| 6202 |
+
態
|
| 6203 |
+
鱬
|
| 6204 |
+
榞
|
| 6205 |
+
硂
|
| 6206 |
+
鄭
|
| 6207 |
+
黃
|
| 6208 |
+
煙
|
| 6209 |
+
祐
|
| 6210 |
+
奓
|
| 6211 |
+
逺
|
| 6212 |
+
*
|
| 6213 |
+
瑄
|
| 6214 |
+
獲
|
| 6215 |
+
聞
|
| 6216 |
+
薦
|
| 6217 |
+
讀
|
| 6218 |
+
這
|
| 6219 |
+
樣
|
| 6220 |
+
決
|
| 6221 |
+
問
|
| 6222 |
+
啟
|
| 6223 |
+
們
|
| 6224 |
+
執
|
| 6225 |
+
説
|
| 6226 |
+
轉
|
| 6227 |
+
單
|
| 6228 |
+
隨
|
| 6229 |
+
唘
|
| 6230 |
+
帶
|
| 6231 |
+
倉
|
| 6232 |
+
庫
|
| 6233 |
+
還
|
| 6234 |
+
贈
|
| 6235 |
+
尙
|
| 6236 |
+
皺
|
| 6237 |
+
■
|
| 6238 |
+
餅
|
| 6239 |
+
產
|
| 6240 |
+
○
|
| 6241 |
+
∈
|
| 6242 |
+
報
|
| 6243 |
+
狀
|
| 6244 |
+
楓
|
| 6245 |
+
賠
|
| 6246 |
+
琯
|
| 6247 |
+
嗮
|
| 6248 |
+
禮
|
| 6249 |
+
`
|
| 6250 |
+
傳
|
| 6251 |
+
>
|
| 6252 |
+
≤
|
| 6253 |
+
嗞
|
| 6254 |
+
Φ
|
| 6255 |
+
≥
|
| 6256 |
+
換
|
| 6257 |
+
咭
|
| 6258 |
+
∣
|
| 6259 |
+
↓
|
| 6260 |
+
曬
|
| 6261 |
+
ε
|
| 6262 |
+
応
|
| 6263 |
+
寫
|
| 6264 |
+
″
|
| 6265 |
+
終
|
| 6266 |
+
様
|
| 6267 |
+
純
|
| 6268 |
+
費
|
| 6269 |
+
療
|
| 6270 |
+
聨
|
| 6271 |
+
凍
|
| 6272 |
+
壐
|
| 6273 |
+
郵
|
| 6274 |
+
ü
|
| 6275 |
+
黒
|
| 6276 |
+
∫
|
| 6277 |
+
製
|
| 6278 |
+
塊
|
| 6279 |
+
調
|
| 6280 |
+
軽
|
| 6281 |
+
確
|
| 6282 |
+
撃
|
| 6283 |
+
級
|
| 6284 |
+
馴
|
| 6285 |
+
Ⅲ
|
| 6286 |
+
涇
|
| 6287 |
+
繹
|
| 6288 |
+
數
|
| 6289 |
+
碼
|
| 6290 |
+
證
|
| 6291 |
+
狒
|
| 6292 |
+
処
|
| 6293 |
+
劑
|
| 6294 |
+
<
|
| 6295 |
+
晧
|
| 6296 |
+
賀
|
| 6297 |
+
衆
|
| 6298 |
+
]
|
| 6299 |
+
櫥
|
| 6300 |
+
兩
|
| 6301 |
+
陰
|
| 6302 |
+
絶
|
| 6303 |
+
對
|
| 6304 |
+
鯉
|
| 6305 |
+
憶
|
| 6306 |
+
◎
|
| 6307 |
+
p
|
| 6308 |
+
e
|
| 6309 |
+
Y
|
| 6310 |
+
蕒
|
| 6311 |
+
煖
|
| 6312 |
+
頓
|
| 6313 |
+
測
|
| 6314 |
+
試
|
| 6315 |
+
鼽
|
| 6316 |
+
僑
|
| 6317 |
+
碩
|
| 6318 |
+
妝
|
| 6319 |
+
帯
|
| 6320 |
+
≈
|
| 6321 |
+
鐡
|
| 6322 |
+
舖
|
| 6323 |
+
權
|
| 6324 |
+
喫
|
| 6325 |
+
倆
|
| 6326 |
+
ˋ
|
| 6327 |
+
該
|
| 6328 |
+
悅
|
| 6329 |
+
ā
|
| 6330 |
+
俫
|
| 6331 |
+
.
|
| 6332 |
+
f
|
| 6333 |
+
s
|
| 6334 |
+
b
|
| 6335 |
+
m
|
| 6336 |
+
k
|
| 6337 |
+
g
|
| 6338 |
+
u
|
| 6339 |
+
j
|
| 6340 |
+
貼
|
| 6341 |
+
淨
|
| 6342 |
+
濕
|
| 6343 |
+
針
|
| 6344 |
+
適
|
| 6345 |
+
備
|
| 6346 |
+
l
|
| 6347 |
+
/
|
| 6348 |
+
給
|
| 6349 |
+
謢
|
| 6350 |
+
強
|
| 6351 |
+
觸
|
| 6352 |
+
衛
|
| 6353 |
+
與
|
| 6354 |
+
⊙
|
| 6355 |
+
$
|
| 6356 |
+
緯
|
| 6357 |
+
變
|
| 6358 |
+
⑴
|
| 6359 |
+
⑵
|
| 6360 |
+
⑶
|
| 6361 |
+
㎏
|
| 6362 |
+
殺
|
| 6363 |
+
∩
|
| 6364 |
+
幚
|
| 6365 |
+
─
|
| 6366 |
+
價
|
| 6367 |
+
▲
|
| 6368 |
+
離
|
| 6369 |
+
ú
|
| 6370 |
+
ó
|
| 6371 |
+
飄
|
| 6372 |
+
烏
|
| 6373 |
+
関
|
| 6374 |
+
閟
|
| 6375 |
+
﹝
|
| 6376 |
+
﹞
|
| 6377 |
+
邏
|
| 6378 |
+
輯
|
| 6379 |
+
鍵
|
| 6380 |
+
驗
|
| 6381 |
+
訣
|
| 6382 |
+
導
|
| 6383 |
+
歷
|
| 6384 |
+
屆
|
| 6385 |
+
層
|
| 6386 |
+
▼
|
| 6387 |
+
儱
|
| 6388 |
+
錄
|
| 6389 |
+
熳
|
| 6390 |
+
ē
|
| 6391 |
+
艦
|
| 6392 |
+
吋
|
| 6393 |
+
錶
|
| 6394 |
+
辧
|
| 6395 |
+
飼
|
| 6396 |
+
顯
|
| 6397 |
+
④
|
| 6398 |
+
禦
|
| 6399 |
+
販
|
| 6400 |
+
気
|
| 6401 |
+
対
|
| 6402 |
+
枰
|
| 6403 |
+
閩
|
| 6404 |
+
紀
|
| 6405 |
+
幹
|
| 6406 |
+
瞓
|
| 6407 |
+
貊
|
| 6408 |
+
淚
|
| 6409 |
+
△
|
| 6410 |
+
眞
|
| 6411 |
+
墊
|
| 6412 |
+
Ω
|
| 6413 |
+
獻
|
| 6414 |
+
褲
|
| 6415 |
+
縫
|
| 6416 |
+
緑
|
| 6417 |
+
亜
|
| 6418 |
+
鉅
|
| 6419 |
+
餠
|
| 6420 |
+
{
|
| 6421 |
+
}
|
| 6422 |
+
◆
|
| 6423 |
+
蘆
|
| 6424 |
+
薈
|
| 6425 |
+
█
|
| 6426 |
+
◇
|
| 6427 |
+
溫
|
| 6428 |
+
彈
|
| 6429 |
+
晳
|
| 6430 |
+
粧
|
| 6431 |
+
犸
|
| 6432 |
+
穩
|
| 6433 |
+
訊
|
| 6434 |
+
崬
|
| 6435 |
+
凖
|
| 6436 |
+
熥
|
| 6437 |
+
П
|
| 6438 |
+
舊
|
| 6439 |
+
條
|
| 6440 |
+
紋
|
| 6441 |
+
圍
|
| 6442 |
+
Ⅳ
|
| 6443 |
+
筆
|
| 6444 |
+
尷
|
| 6445 |
+
難
|
| 6446 |
+
雜
|
| 6447 |
+
錯
|
| 6448 |
+
綁
|
| 6449 |
+
識
|
| 6450 |
+
頰
|
| 6451 |
+
鎖
|
| 6452 |
+
艶
|
| 6453 |
+
□
|
| 6454 |
+
殁
|
| 6455 |
+
殼
|
| 6456 |
+
⑧
|
| 6457 |
+
├
|
| 6458 |
+
▕
|
| 6459 |
+
鵬
|
| 6460 |
+
ǐ
|
| 6461 |
+
ō
|
| 6462 |
+
ǒ
|
| 6463 |
+
糝
|
| 6464 |
+
綱
|
| 6465 |
+
▎
|
| 6466 |
+
μ
|
| 6467 |
+
盜
|
| 6468 |
+
饅
|
| 6469 |
+
醬
|
| 6470 |
+
籤
|
| 6471 |
+
蓋
|
| 6472 |
+
釀
|
| 6473 |
+
鹽
|
| 6474 |
+
據
|
| 6475 |
+
à
|
| 6476 |
+
ɡ
|
| 6477 |
+
辦
|
| 6478 |
+
◥
|
| 6479 |
+
彐
|
| 6480 |
+
┌
|
| 6481 |
+
婦
|
| 6482 |
+
獸
|
| 6483 |
+
鲩
|
| 6484 |
+
伱
|
| 6485 |
+
ī
|
| 6486 |
+
蒟
|
| 6487 |
+
蒻
|
| 6488 |
+
齊
|
| 6489 |
+
袆
|
| 6490 |
+
腦
|
| 6491 |
+
寧
|
| 6492 |
+
凈
|
| 6493 |
+
妳
|
| 6494 |
+
煥
|
| 6495 |
+
詢
|
| 6496 |
+
偽
|
| 6497 |
+
謹
|
| 6498 |
+
啫
|
| 6499 |
+
鯽
|
| 6500 |
+
騷
|
| 6501 |
+
鱸
|
| 6502 |
+
損
|
| 6503 |
+
傷
|
| 6504 |
+
鎻
|
| 6505 |
+
髮
|
| 6506 |
+
買
|
| 6507 |
+
冏
|
| 6508 |
+
儥
|
| 6509 |
+
両
|
| 6510 |
+
﹢
|
| 6511 |
+
∞
|
| 6512 |
+
載
|
| 6513 |
+
喰
|
| 6514 |
+
z
|
| 6515 |
+
羙
|
| 6516 |
+
悵
|
| 6517 |
+
燙
|
| 6518 |
+
曉
|
| 6519 |
+
員
|
| 6520 |
+
組
|
| 6521 |
+
徹
|
| 6522 |
+
艷
|
| 6523 |
+
痠
|
| 6524 |
+
鋼
|
| 6525 |
+
鼙
|
| 6526 |
+
縮
|
| 6527 |
+
細
|
| 6528 |
+
嚒
|
| 6529 |
+
爯
|
| 6530 |
+
≠
|
| 6531 |
+
維
|
| 6532 |
+
"
|
| 6533 |
+
鱻
|
| 6534 |
+
壇
|
| 6535 |
+
厍
|
| 6536 |
+
帰
|
| 6537 |
+
浥
|
| 6538 |
+
犇
|
| 6539 |
+
薡
|
| 6540 |
+
軎
|
| 6541 |
+
²
|
| 6542 |
+
應
|
| 6543 |
+
醜
|
| 6544 |
+
刪
|
| 6545 |
+
緻
|
| 6546 |
+
鶴
|
| 6547 |
+
賜
|
| 6548 |
+
噁
|
| 6549 |
+
軌
|
| 6550 |
+
尨
|
| 6551 |
+
镔
|
| 6552 |
+
鷺
|
| 6553 |
+
槗
|
| 6554 |
+
彌
|
| 6555 |
+
葚
|
| 6556 |
+
濛
|
| 6557 |
+
請
|
| 6558 |
+
溇
|
| 6559 |
+
緹
|
| 6560 |
+
賢
|
| 6561 |
+
訪
|
| 6562 |
+
獴
|
| 6563 |
+
瑅
|
| 6564 |
+
資
|
| 6565 |
+
縤
|
| 6566 |
+
陣
|
| 6567 |
+
蕟
|
| 6568 |
+
栢
|
| 6569 |
+
韻
|
| 6570 |
+
祼
|
| 6571 |
+
恁
|
| 6572 |
+
伢
|
| 6573 |
+
謝
|
| 6574 |
+
劃
|
| 6575 |
+
涑
|
| 6576 |
+
總
|
| 6577 |
+
衖
|
| 6578 |
+
踺
|
| 6579 |
+
砋
|
| 6580 |
+
凉
|
| 6581 |
+
籃
|
| 6582 |
+
駿
|
| 6583 |
+
苼
|
| 6584 |
+
瘋
|
| 6585 |
+
昽
|
| 6586 |
+
紡
|
| 6587 |
+
驊
|
| 6588 |
+
腎
|
| 6589 |
+
﹗
|
| 6590 |
+
響
|
| 6591 |
+
杋
|
| 6592 |
+
剛
|
| 6593 |
+
嚴
|
| 6594 |
+
禪
|
| 6595 |
+
歓
|
| 6596 |
+
槍
|
| 6597 |
+
傘
|
| 6598 |
+
檸
|
| 6599 |
+
檫
|
| 6600 |
+
炣
|
| 6601 |
+
勢
|
| 6602 |
+
鏜
|
| 6603 |
+
鎢
|
| 6604 |
+
銑
|
| 6605 |
+
尐
|
| 6606 |
+
減
|
| 6607 |
+
奪
|
| 6608 |
+
惡
|
| 6609 |
+
θ
|
| 6610 |
+
僮
|
| 6611 |
+
婭
|
| 6612 |
+
臘
|
| 6613 |
+
ū
|
| 6614 |
+
ì
|
| 6615 |
+
殻
|
| 6616 |
+
鉄
|
| 6617 |
+
∑
|
| 6618 |
+
蛲
|
| 6619 |
+
焼
|
| 6620 |
+
緖
|
| 6621 |
+
續
|
| 6622 |
+
紹
|
| 6623 |
+
懮
|
deepdoc/visual/operators.py
ADDED
|
@@ -0,0 +1,710 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#
|
| 2 |
+
# Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
|
| 3 |
+
#
|
| 4 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 5 |
+
# you may not use this file except in compliance with the License.
|
| 6 |
+
# You may obtain a copy of the License at
|
| 7 |
+
#
|
| 8 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 9 |
+
#
|
| 10 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 11 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 12 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 13 |
+
# See the License for the specific language governing permissions and
|
| 14 |
+
# limitations under the License.
|
| 15 |
+
#
|
| 16 |
+
|
| 17 |
+
import sys
|
| 18 |
+
import six
|
| 19 |
+
import cv2
|
| 20 |
+
import numpy as np
|
| 21 |
+
import math
|
| 22 |
+
from PIL import Image
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
class DecodeImage(object):
|
| 26 |
+
""" decode image """
|
| 27 |
+
|
| 28 |
+
def __init__(self,
|
| 29 |
+
img_mode='RGB',
|
| 30 |
+
channel_first=False,
|
| 31 |
+
ignore_orientation=False,
|
| 32 |
+
**kwargs):
|
| 33 |
+
self.img_mode = img_mode
|
| 34 |
+
self.channel_first = channel_first
|
| 35 |
+
self.ignore_orientation = ignore_orientation
|
| 36 |
+
|
| 37 |
+
def __call__(self, data):
|
| 38 |
+
img = data['image']
|
| 39 |
+
if six.PY2:
|
| 40 |
+
assert isinstance(img, str) and len(
|
| 41 |
+
img) > 0, "invalid input 'img' in DecodeImage"
|
| 42 |
+
else:
|
| 43 |
+
assert isinstance(img, bytes) and len(
|
| 44 |
+
img) > 0, "invalid input 'img' in DecodeImage"
|
| 45 |
+
img = np.frombuffer(img, dtype='uint8')
|
| 46 |
+
if self.ignore_orientation:
|
| 47 |
+
img = cv2.imdecode(img, cv2.IMREAD_IGNORE_ORIENTATION |
|
| 48 |
+
cv2.IMREAD_COLOR)
|
| 49 |
+
else:
|
| 50 |
+
img = cv2.imdecode(img, 1)
|
| 51 |
+
if img is None:
|
| 52 |
+
return None
|
| 53 |
+
if self.img_mode == 'GRAY':
|
| 54 |
+
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
|
| 55 |
+
elif self.img_mode == 'RGB':
|
| 56 |
+
assert img.shape[2] == 3, 'invalid shape of image[%s]' % (
|
| 57 |
+
img.shape)
|
| 58 |
+
img = img[:, :, ::-1]
|
| 59 |
+
|
| 60 |
+
if self.channel_first:
|
| 61 |
+
img = img.transpose((2, 0, 1))
|
| 62 |
+
|
| 63 |
+
data['image'] = img
|
| 64 |
+
return data
|
| 65 |
+
|
| 66 |
+
class StandardizeImage(object):
|
| 67 |
+
"""normalize image
|
| 68 |
+
Args:
|
| 69 |
+
mean (list): im - mean
|
| 70 |
+
std (list): im / std
|
| 71 |
+
is_scale (bool): whether need im / 255
|
| 72 |
+
norm_type (str): type in ['mean_std', 'none']
|
| 73 |
+
"""
|
| 74 |
+
|
| 75 |
+
def __init__(self, mean, std, is_scale=True, norm_type='mean_std'):
|
| 76 |
+
self.mean = mean
|
| 77 |
+
self.std = std
|
| 78 |
+
self.is_scale = is_scale
|
| 79 |
+
self.norm_type = norm_type
|
| 80 |
+
|
| 81 |
+
def __call__(self, im, im_info):
|
| 82 |
+
"""
|
| 83 |
+
Args:
|
| 84 |
+
im (np.ndarray): image (np.ndarray)
|
| 85 |
+
im_info (dict): info of image
|
| 86 |
+
Returns:
|
| 87 |
+
im (np.ndarray): processed image (np.ndarray)
|
| 88 |
+
im_info (dict): info of processed image
|
| 89 |
+
"""
|
| 90 |
+
im = im.astype(np.float32, copy=False)
|
| 91 |
+
if self.is_scale:
|
| 92 |
+
scale = 1.0 / 255.0
|
| 93 |
+
im *= scale
|
| 94 |
+
|
| 95 |
+
if self.norm_type == 'mean_std':
|
| 96 |
+
mean = np.array(self.mean)[np.newaxis, np.newaxis, :]
|
| 97 |
+
std = np.array(self.std)[np.newaxis, np.newaxis, :]
|
| 98 |
+
im -= mean
|
| 99 |
+
im /= std
|
| 100 |
+
return im, im_info
|
| 101 |
+
|
| 102 |
+
|
| 103 |
+
class NormalizeImage(object):
|
| 104 |
+
""" normalize image such as substract mean, divide std
|
| 105 |
+
"""
|
| 106 |
+
|
| 107 |
+
def __init__(self, scale=None, mean=None, std=None, order='chw', **kwargs):
|
| 108 |
+
if isinstance(scale, str):
|
| 109 |
+
scale = eval(scale)
|
| 110 |
+
self.scale = np.float32(scale if scale is not None else 1.0 / 255.0)
|
| 111 |
+
mean = mean if mean is not None else [0.485, 0.456, 0.406]
|
| 112 |
+
std = std if std is not None else [0.229, 0.224, 0.225]
|
| 113 |
+
|
| 114 |
+
shape = (3, 1, 1) if order == 'chw' else (1, 1, 3)
|
| 115 |
+
self.mean = np.array(mean).reshape(shape).astype('float32')
|
| 116 |
+
self.std = np.array(std).reshape(shape).astype('float32')
|
| 117 |
+
|
| 118 |
+
def __call__(self, data):
|
| 119 |
+
img = data['image']
|
| 120 |
+
from PIL import Image
|
| 121 |
+
if isinstance(img, Image.Image):
|
| 122 |
+
img = np.array(img)
|
| 123 |
+
assert isinstance(img,
|
| 124 |
+
np.ndarray), "invalid input 'img' in NormalizeImage"
|
| 125 |
+
data['image'] = (
|
| 126 |
+
img.astype('float32') * self.scale - self.mean) / self.std
|
| 127 |
+
return data
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
class ToCHWImage(object):
|
| 131 |
+
""" convert hwc image to chw image
|
| 132 |
+
"""
|
| 133 |
+
|
| 134 |
+
def __init__(self, **kwargs):
|
| 135 |
+
pass
|
| 136 |
+
|
| 137 |
+
def __call__(self, data):
|
| 138 |
+
img = data['image']
|
| 139 |
+
from PIL import Image
|
| 140 |
+
if isinstance(img, Image.Image):
|
| 141 |
+
img = np.array(img)
|
| 142 |
+
data['image'] = img.transpose((2, 0, 1))
|
| 143 |
+
return data
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
class Fasttext(object):
|
| 147 |
+
def __init__(self, path="None", **kwargs):
|
| 148 |
+
import fasttext
|
| 149 |
+
self.fast_model = fasttext.load_model(path)
|
| 150 |
+
|
| 151 |
+
def __call__(self, data):
|
| 152 |
+
label = data['label']
|
| 153 |
+
fast_label = self.fast_model[label]
|
| 154 |
+
data['fast_label'] = fast_label
|
| 155 |
+
return data
|
| 156 |
+
|
| 157 |
+
|
| 158 |
+
class KeepKeys(object):
|
| 159 |
+
def __init__(self, keep_keys, **kwargs):
|
| 160 |
+
self.keep_keys = keep_keys
|
| 161 |
+
|
| 162 |
+
def __call__(self, data):
|
| 163 |
+
data_list = []
|
| 164 |
+
for key in self.keep_keys:
|
| 165 |
+
data_list.append(data[key])
|
| 166 |
+
return data_list
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
class Pad(object):
|
| 170 |
+
def __init__(self, size=None, size_div=32, **kwargs):
|
| 171 |
+
if size is not None and not isinstance(size, (int, list, tuple)):
|
| 172 |
+
raise TypeError("Type of target_size is invalid. Now is {}".format(
|
| 173 |
+
type(size)))
|
| 174 |
+
if isinstance(size, int):
|
| 175 |
+
size = [size, size]
|
| 176 |
+
self.size = size
|
| 177 |
+
self.size_div = size_div
|
| 178 |
+
|
| 179 |
+
def __call__(self, data):
|
| 180 |
+
|
| 181 |
+
img = data['image']
|
| 182 |
+
img_h, img_w = img.shape[0], img.shape[1]
|
| 183 |
+
if self.size:
|
| 184 |
+
resize_h2, resize_w2 = self.size
|
| 185 |
+
assert (
|
| 186 |
+
img_h < resize_h2 and img_w < resize_w2
|
| 187 |
+
), '(h, w) of target size should be greater than (img_h, img_w)'
|
| 188 |
+
else:
|
| 189 |
+
resize_h2 = max(
|
| 190 |
+
int(math.ceil(img.shape[0] / self.size_div) * self.size_div),
|
| 191 |
+
self.size_div)
|
| 192 |
+
resize_w2 = max(
|
| 193 |
+
int(math.ceil(img.shape[1] / self.size_div) * self.size_div),
|
| 194 |
+
self.size_div)
|
| 195 |
+
img = cv2.copyMakeBorder(
|
| 196 |
+
img,
|
| 197 |
+
0,
|
| 198 |
+
resize_h2 - img_h,
|
| 199 |
+
0,
|
| 200 |
+
resize_w2 - img_w,
|
| 201 |
+
cv2.BORDER_CONSTANT,
|
| 202 |
+
value=0)
|
| 203 |
+
data['image'] = img
|
| 204 |
+
return data
|
| 205 |
+
|
| 206 |
+
|
| 207 |
+
class LinearResize(object):
|
| 208 |
+
"""resize image by target_size and max_size
|
| 209 |
+
Args:
|
| 210 |
+
target_size (int): the target size of image
|
| 211 |
+
keep_ratio (bool): whether keep_ratio or not, default true
|
| 212 |
+
interp (int): method of resize
|
| 213 |
+
"""
|
| 214 |
+
|
| 215 |
+
def __init__(self, target_size, keep_ratio=True, interp=cv2.INTER_LINEAR):
|
| 216 |
+
if isinstance(target_size, int):
|
| 217 |
+
target_size = [target_size, target_size]
|
| 218 |
+
self.target_size = target_size
|
| 219 |
+
self.keep_ratio = keep_ratio
|
| 220 |
+
self.interp = interp
|
| 221 |
+
|
| 222 |
+
def __call__(self, im, im_info):
|
| 223 |
+
"""
|
| 224 |
+
Args:
|
| 225 |
+
im (np.ndarray): image (np.ndarray)
|
| 226 |
+
im_info (dict): info of image
|
| 227 |
+
Returns:
|
| 228 |
+
im (np.ndarray): processed image (np.ndarray)
|
| 229 |
+
im_info (dict): info of processed image
|
| 230 |
+
"""
|
| 231 |
+
assert len(self.target_size) == 2
|
| 232 |
+
assert self.target_size[0] > 0 and self.target_size[1] > 0
|
| 233 |
+
im_channel = im.shape[2]
|
| 234 |
+
im_scale_y, im_scale_x = self.generate_scale(im)
|
| 235 |
+
im = cv2.resize(
|
| 236 |
+
im,
|
| 237 |
+
None,
|
| 238 |
+
None,
|
| 239 |
+
fx=im_scale_x,
|
| 240 |
+
fy=im_scale_y,
|
| 241 |
+
interpolation=self.interp)
|
| 242 |
+
im_info['im_shape'] = np.array(im.shape[:2]).astype('float32')
|
| 243 |
+
im_info['scale_factor'] = np.array(
|
| 244 |
+
[im_scale_y, im_scale_x]).astype('float32')
|
| 245 |
+
return im, im_info
|
| 246 |
+
|
| 247 |
+
def generate_scale(self, im):
|
| 248 |
+
"""
|
| 249 |
+
Args:
|
| 250 |
+
im (np.ndarray): image (np.ndarray)
|
| 251 |
+
Returns:
|
| 252 |
+
im_scale_x: the resize ratio of X
|
| 253 |
+
im_scale_y: the resize ratio of Y
|
| 254 |
+
"""
|
| 255 |
+
origin_shape = im.shape[:2]
|
| 256 |
+
im_c = im.shape[2]
|
| 257 |
+
if self.keep_ratio:
|
| 258 |
+
im_size_min = np.min(origin_shape)
|
| 259 |
+
im_size_max = np.max(origin_shape)
|
| 260 |
+
target_size_min = np.min(self.target_size)
|
| 261 |
+
target_size_max = np.max(self.target_size)
|
| 262 |
+
im_scale = float(target_size_min) / float(im_size_min)
|
| 263 |
+
if np.round(im_scale * im_size_max) > target_size_max:
|
| 264 |
+
im_scale = float(target_size_max) / float(im_size_max)
|
| 265 |
+
im_scale_x = im_scale
|
| 266 |
+
im_scale_y = im_scale
|
| 267 |
+
else:
|
| 268 |
+
resize_h, resize_w = self.target_size
|
| 269 |
+
im_scale_y = resize_h / float(origin_shape[0])
|
| 270 |
+
im_scale_x = resize_w / float(origin_shape[1])
|
| 271 |
+
return im_scale_y, im_scale_x
|
| 272 |
+
|
| 273 |
+
|
| 274 |
+
class Resize(object):
|
| 275 |
+
def __init__(self, size=(640, 640), **kwargs):
|
| 276 |
+
self.size = size
|
| 277 |
+
|
| 278 |
+
def resize_image(self, img):
|
| 279 |
+
resize_h, resize_w = self.size
|
| 280 |
+
ori_h, ori_w = img.shape[:2] # (h, w, c)
|
| 281 |
+
ratio_h = float(resize_h) / ori_h
|
| 282 |
+
ratio_w = float(resize_w) / ori_w
|
| 283 |
+
img = cv2.resize(img, (int(resize_w), int(resize_h)))
|
| 284 |
+
return img, [ratio_h, ratio_w]
|
| 285 |
+
|
| 286 |
+
def __call__(self, data):
|
| 287 |
+
img = data['image']
|
| 288 |
+
if 'polys' in data:
|
| 289 |
+
text_polys = data['polys']
|
| 290 |
+
|
| 291 |
+
img_resize, [ratio_h, ratio_w] = self.resize_image(img)
|
| 292 |
+
if 'polys' in data:
|
| 293 |
+
new_boxes = []
|
| 294 |
+
for box in text_polys:
|
| 295 |
+
new_box = []
|
| 296 |
+
for cord in box:
|
| 297 |
+
new_box.append([cord[0] * ratio_w, cord[1] * ratio_h])
|
| 298 |
+
new_boxes.append(new_box)
|
| 299 |
+
data['polys'] = np.array(new_boxes, dtype=np.float32)
|
| 300 |
+
data['image'] = img_resize
|
| 301 |
+
return data
|
| 302 |
+
|
| 303 |
+
|
| 304 |
+
class DetResizeForTest(object):
|
| 305 |
+
def __init__(self, **kwargs):
|
| 306 |
+
super(DetResizeForTest, self).__init__()
|
| 307 |
+
self.resize_type = 0
|
| 308 |
+
self.keep_ratio = False
|
| 309 |
+
if 'image_shape' in kwargs:
|
| 310 |
+
self.image_shape = kwargs['image_shape']
|
| 311 |
+
self.resize_type = 1
|
| 312 |
+
if 'keep_ratio' in kwargs:
|
| 313 |
+
self.keep_ratio = kwargs['keep_ratio']
|
| 314 |
+
elif 'limit_side_len' in kwargs:
|
| 315 |
+
self.limit_side_len = kwargs['limit_side_len']
|
| 316 |
+
self.limit_type = kwargs.get('limit_type', 'min')
|
| 317 |
+
elif 'resize_long' in kwargs:
|
| 318 |
+
self.resize_type = 2
|
| 319 |
+
self.resize_long = kwargs.get('resize_long', 960)
|
| 320 |
+
else:
|
| 321 |
+
self.limit_side_len = 736
|
| 322 |
+
self.limit_type = 'min'
|
| 323 |
+
|
| 324 |
+
def __call__(self, data):
|
| 325 |
+
img = data['image']
|
| 326 |
+
src_h, src_w, _ = img.shape
|
| 327 |
+
if sum([src_h, src_w]) < 64:
|
| 328 |
+
img = self.image_padding(img)
|
| 329 |
+
|
| 330 |
+
if self.resize_type == 0:
|
| 331 |
+
# img, shape = self.resize_image_type0(img)
|
| 332 |
+
img, [ratio_h, ratio_w] = self.resize_image_type0(img)
|
| 333 |
+
elif self.resize_type == 2:
|
| 334 |
+
img, [ratio_h, ratio_w] = self.resize_image_type2(img)
|
| 335 |
+
else:
|
| 336 |
+
# img, shape = self.resize_image_type1(img)
|
| 337 |
+
img, [ratio_h, ratio_w] = self.resize_image_type1(img)
|
| 338 |
+
data['image'] = img
|
| 339 |
+
data['shape'] = np.array([src_h, src_w, ratio_h, ratio_w])
|
| 340 |
+
return data
|
| 341 |
+
|
| 342 |
+
def image_padding(self, im, value=0):
|
| 343 |
+
h, w, c = im.shape
|
| 344 |
+
im_pad = np.zeros((max(32, h), max(32, w), c), np.uint8) + value
|
| 345 |
+
im_pad[:h, :w, :] = im
|
| 346 |
+
return im_pad
|
| 347 |
+
|
| 348 |
+
def resize_image_type1(self, img):
|
| 349 |
+
resize_h, resize_w = self.image_shape
|
| 350 |
+
ori_h, ori_w = img.shape[:2] # (h, w, c)
|
| 351 |
+
if self.keep_ratio is True:
|
| 352 |
+
resize_w = ori_w * resize_h / ori_h
|
| 353 |
+
N = math.ceil(resize_w / 32)
|
| 354 |
+
resize_w = N * 32
|
| 355 |
+
ratio_h = float(resize_h) / ori_h
|
| 356 |
+
ratio_w = float(resize_w) / ori_w
|
| 357 |
+
img = cv2.resize(img, (int(resize_w), int(resize_h)))
|
| 358 |
+
# return img, np.array([ori_h, ori_w])
|
| 359 |
+
return img, [ratio_h, ratio_w]
|
| 360 |
+
|
| 361 |
+
def resize_image_type0(self, img):
|
| 362 |
+
"""
|
| 363 |
+
resize image to a size multiple of 32 which is required by the network
|
| 364 |
+
args:
|
| 365 |
+
img(array): array with shape [h, w, c]
|
| 366 |
+
return(tuple):
|
| 367 |
+
img, (ratio_h, ratio_w)
|
| 368 |
+
"""
|
| 369 |
+
limit_side_len = self.limit_side_len
|
| 370 |
+
h, w, c = img.shape
|
| 371 |
+
|
| 372 |
+
# limit the max side
|
| 373 |
+
if self.limit_type == 'max':
|
| 374 |
+
if max(h, w) > limit_side_len:
|
| 375 |
+
if h > w:
|
| 376 |
+
ratio = float(limit_side_len) / h
|
| 377 |
+
else:
|
| 378 |
+
ratio = float(limit_side_len) / w
|
| 379 |
+
else:
|
| 380 |
+
ratio = 1.
|
| 381 |
+
elif self.limit_type == 'min':
|
| 382 |
+
if min(h, w) < limit_side_len:
|
| 383 |
+
if h < w:
|
| 384 |
+
ratio = float(limit_side_len) / h
|
| 385 |
+
else:
|
| 386 |
+
ratio = float(limit_side_len) / w
|
| 387 |
+
else:
|
| 388 |
+
ratio = 1.
|
| 389 |
+
elif self.limit_type == 'resize_long':
|
| 390 |
+
ratio = float(limit_side_len) / max(h, w)
|
| 391 |
+
else:
|
| 392 |
+
raise Exception('not support limit type, image ')
|
| 393 |
+
resize_h = int(h * ratio)
|
| 394 |
+
resize_w = int(w * ratio)
|
| 395 |
+
|
| 396 |
+
resize_h = max(int(round(resize_h / 32) * 32), 32)
|
| 397 |
+
resize_w = max(int(round(resize_w / 32) * 32), 32)
|
| 398 |
+
|
| 399 |
+
try:
|
| 400 |
+
if int(resize_w) <= 0 or int(resize_h) <= 0:
|
| 401 |
+
return None, (None, None)
|
| 402 |
+
img = cv2.resize(img, (int(resize_w), int(resize_h)))
|
| 403 |
+
except BaseException:
|
| 404 |
+
print(img.shape, resize_w, resize_h)
|
| 405 |
+
sys.exit(0)
|
| 406 |
+
ratio_h = resize_h / float(h)
|
| 407 |
+
ratio_w = resize_w / float(w)
|
| 408 |
+
return img, [ratio_h, ratio_w]
|
| 409 |
+
|
| 410 |
+
def resize_image_type2(self, img):
|
| 411 |
+
h, w, _ = img.shape
|
| 412 |
+
|
| 413 |
+
resize_w = w
|
| 414 |
+
resize_h = h
|
| 415 |
+
|
| 416 |
+
if resize_h > resize_w:
|
| 417 |
+
ratio = float(self.resize_long) / resize_h
|
| 418 |
+
else:
|
| 419 |
+
ratio = float(self.resize_long) / resize_w
|
| 420 |
+
|
| 421 |
+
resize_h = int(resize_h * ratio)
|
| 422 |
+
resize_w = int(resize_w * ratio)
|
| 423 |
+
|
| 424 |
+
max_stride = 128
|
| 425 |
+
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
| 426 |
+
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
| 427 |
+
img = cv2.resize(img, (int(resize_w), int(resize_h)))
|
| 428 |
+
ratio_h = resize_h / float(h)
|
| 429 |
+
ratio_w = resize_w / float(w)
|
| 430 |
+
|
| 431 |
+
return img, [ratio_h, ratio_w]
|
| 432 |
+
|
| 433 |
+
|
| 434 |
+
class E2EResizeForTest(object):
|
| 435 |
+
def __init__(self, **kwargs):
|
| 436 |
+
super(E2EResizeForTest, self).__init__()
|
| 437 |
+
self.max_side_len = kwargs['max_side_len']
|
| 438 |
+
self.valid_set = kwargs['valid_set']
|
| 439 |
+
|
| 440 |
+
def __call__(self, data):
|
| 441 |
+
img = data['image']
|
| 442 |
+
src_h, src_w, _ = img.shape
|
| 443 |
+
if self.valid_set == 'totaltext':
|
| 444 |
+
im_resized, [ratio_h, ratio_w] = self.resize_image_for_totaltext(
|
| 445 |
+
img, max_side_len=self.max_side_len)
|
| 446 |
+
else:
|
| 447 |
+
im_resized, (ratio_h, ratio_w) = self.resize_image(
|
| 448 |
+
img, max_side_len=self.max_side_len)
|
| 449 |
+
data['image'] = im_resized
|
| 450 |
+
data['shape'] = np.array([src_h, src_w, ratio_h, ratio_w])
|
| 451 |
+
return data
|
| 452 |
+
|
| 453 |
+
def resize_image_for_totaltext(self, im, max_side_len=512):
|
| 454 |
+
|
| 455 |
+
h, w, _ = im.shape
|
| 456 |
+
resize_w = w
|
| 457 |
+
resize_h = h
|
| 458 |
+
ratio = 1.25
|
| 459 |
+
if h * ratio > max_side_len:
|
| 460 |
+
ratio = float(max_side_len) / resize_h
|
| 461 |
+
resize_h = int(resize_h * ratio)
|
| 462 |
+
resize_w = int(resize_w * ratio)
|
| 463 |
+
|
| 464 |
+
max_stride = 128
|
| 465 |
+
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
| 466 |
+
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
| 467 |
+
im = cv2.resize(im, (int(resize_w), int(resize_h)))
|
| 468 |
+
ratio_h = resize_h / float(h)
|
| 469 |
+
ratio_w = resize_w / float(w)
|
| 470 |
+
return im, (ratio_h, ratio_w)
|
| 471 |
+
|
| 472 |
+
def resize_image(self, im, max_side_len=512):
|
| 473 |
+
"""
|
| 474 |
+
resize image to a size multiple of max_stride which is required by the network
|
| 475 |
+
:param im: the resized image
|
| 476 |
+
:param max_side_len: limit of max image size to avoid out of memory in gpu
|
| 477 |
+
:return: the resized image and the resize ratio
|
| 478 |
+
"""
|
| 479 |
+
h, w, _ = im.shape
|
| 480 |
+
|
| 481 |
+
resize_w = w
|
| 482 |
+
resize_h = h
|
| 483 |
+
|
| 484 |
+
# Fix the longer side
|
| 485 |
+
if resize_h > resize_w:
|
| 486 |
+
ratio = float(max_side_len) / resize_h
|
| 487 |
+
else:
|
| 488 |
+
ratio = float(max_side_len) / resize_w
|
| 489 |
+
|
| 490 |
+
resize_h = int(resize_h * ratio)
|
| 491 |
+
resize_w = int(resize_w * ratio)
|
| 492 |
+
|
| 493 |
+
max_stride = 128
|
| 494 |
+
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
| 495 |
+
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
| 496 |
+
im = cv2.resize(im, (int(resize_w), int(resize_h)))
|
| 497 |
+
ratio_h = resize_h / float(h)
|
| 498 |
+
ratio_w = resize_w / float(w)
|
| 499 |
+
|
| 500 |
+
return im, (ratio_h, ratio_w)
|
| 501 |
+
|
| 502 |
+
|
| 503 |
+
class KieResize(object):
|
| 504 |
+
def __init__(self, **kwargs):
|
| 505 |
+
super(KieResize, self).__init__()
|
| 506 |
+
self.max_side, self.min_side = kwargs['img_scale'][0], kwargs[
|
| 507 |
+
'img_scale'][1]
|
| 508 |
+
|
| 509 |
+
def __call__(self, data):
|
| 510 |
+
img = data['image']
|
| 511 |
+
points = data['points']
|
| 512 |
+
src_h, src_w, _ = img.shape
|
| 513 |
+
im_resized, scale_factor, [ratio_h, ratio_w
|
| 514 |
+
], [new_h, new_w] = self.resize_image(img)
|
| 515 |
+
resize_points = self.resize_boxes(img, points, scale_factor)
|
| 516 |
+
data['ori_image'] = img
|
| 517 |
+
data['ori_boxes'] = points
|
| 518 |
+
data['points'] = resize_points
|
| 519 |
+
data['image'] = im_resized
|
| 520 |
+
data['shape'] = np.array([new_h, new_w])
|
| 521 |
+
return data
|
| 522 |
+
|
| 523 |
+
def resize_image(self, img):
|
| 524 |
+
norm_img = np.zeros([1024, 1024, 3], dtype='float32')
|
| 525 |
+
scale = [512, 1024]
|
| 526 |
+
h, w = img.shape[:2]
|
| 527 |
+
max_long_edge = max(scale)
|
| 528 |
+
max_short_edge = min(scale)
|
| 529 |
+
scale_factor = min(max_long_edge / max(h, w),
|
| 530 |
+
max_short_edge / min(h, w))
|
| 531 |
+
resize_w, resize_h = int(w * float(scale_factor) + 0.5), int(h * float(
|
| 532 |
+
scale_factor) + 0.5)
|
| 533 |
+
max_stride = 32
|
| 534 |
+
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
| 535 |
+
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
| 536 |
+
im = cv2.resize(img, (resize_w, resize_h))
|
| 537 |
+
new_h, new_w = im.shape[:2]
|
| 538 |
+
w_scale = new_w / w
|
| 539 |
+
h_scale = new_h / h
|
| 540 |
+
scale_factor = np.array(
|
| 541 |
+
[w_scale, h_scale, w_scale, h_scale], dtype=np.float32)
|
| 542 |
+
norm_img[:new_h, :new_w, :] = im
|
| 543 |
+
return norm_img, scale_factor, [h_scale, w_scale], [new_h, new_w]
|
| 544 |
+
|
| 545 |
+
def resize_boxes(self, im, points, scale_factor):
|
| 546 |
+
points = points * scale_factor
|
| 547 |
+
img_shape = im.shape[:2]
|
| 548 |
+
points[:, 0::2] = np.clip(points[:, 0::2], 0, img_shape[1])
|
| 549 |
+
points[:, 1::2] = np.clip(points[:, 1::2], 0, img_shape[0])
|
| 550 |
+
return points
|
| 551 |
+
|
| 552 |
+
|
| 553 |
+
class SRResize(object):
|
| 554 |
+
def __init__(self,
|
| 555 |
+
imgH=32,
|
| 556 |
+
imgW=128,
|
| 557 |
+
down_sample_scale=4,
|
| 558 |
+
keep_ratio=False,
|
| 559 |
+
min_ratio=1,
|
| 560 |
+
mask=False,
|
| 561 |
+
infer_mode=False,
|
| 562 |
+
**kwargs):
|
| 563 |
+
self.imgH = imgH
|
| 564 |
+
self.imgW = imgW
|
| 565 |
+
self.keep_ratio = keep_ratio
|
| 566 |
+
self.min_ratio = min_ratio
|
| 567 |
+
self.down_sample_scale = down_sample_scale
|
| 568 |
+
self.mask = mask
|
| 569 |
+
self.infer_mode = infer_mode
|
| 570 |
+
|
| 571 |
+
def __call__(self, data):
|
| 572 |
+
imgH = self.imgH
|
| 573 |
+
imgW = self.imgW
|
| 574 |
+
images_lr = data["image_lr"]
|
| 575 |
+
transform2 = ResizeNormalize(
|
| 576 |
+
(imgW // self.down_sample_scale, imgH // self.down_sample_scale))
|
| 577 |
+
images_lr = transform2(images_lr)
|
| 578 |
+
data["img_lr"] = images_lr
|
| 579 |
+
if self.infer_mode:
|
| 580 |
+
return data
|
| 581 |
+
|
| 582 |
+
images_HR = data["image_hr"]
|
| 583 |
+
label_strs = data["label"]
|
| 584 |
+
transform = ResizeNormalize((imgW, imgH))
|
| 585 |
+
images_HR = transform(images_HR)
|
| 586 |
+
data["img_hr"] = images_HR
|
| 587 |
+
return data
|
| 588 |
+
|
| 589 |
+
|
| 590 |
+
class ResizeNormalize(object):
|
| 591 |
+
def __init__(self, size, interpolation=Image.BICUBIC):
|
| 592 |
+
self.size = size
|
| 593 |
+
self.interpolation = interpolation
|
| 594 |
+
|
| 595 |
+
def __call__(self, img):
|
| 596 |
+
img = img.resize(self.size, self.interpolation)
|
| 597 |
+
img_numpy = np.array(img).astype("float32")
|
| 598 |
+
img_numpy = img_numpy.transpose((2, 0, 1)) / 255
|
| 599 |
+
return img_numpy
|
| 600 |
+
|
| 601 |
+
|
| 602 |
+
class GrayImageChannelFormat(object):
|
| 603 |
+
"""
|
| 604 |
+
format gray scale image's channel: (3,h,w) -> (1,h,w)
|
| 605 |
+
Args:
|
| 606 |
+
inverse: inverse gray image
|
| 607 |
+
"""
|
| 608 |
+
|
| 609 |
+
def __init__(self, inverse=False, **kwargs):
|
| 610 |
+
self.inverse = inverse
|
| 611 |
+
|
| 612 |
+
def __call__(self, data):
|
| 613 |
+
img = data['image']
|
| 614 |
+
img_single_channel = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
| 615 |
+
img_expanded = np.expand_dims(img_single_channel, 0)
|
| 616 |
+
|
| 617 |
+
if self.inverse:
|
| 618 |
+
data['image'] = np.abs(img_expanded - 1)
|
| 619 |
+
else:
|
| 620 |
+
data['image'] = img_expanded
|
| 621 |
+
|
| 622 |
+
data['src_image'] = img
|
| 623 |
+
return data
|
| 624 |
+
|
| 625 |
+
|
| 626 |
+
class Permute(object):
|
| 627 |
+
"""permute image
|
| 628 |
+
Args:
|
| 629 |
+
to_bgr (bool): whether convert RGB to BGR
|
| 630 |
+
channel_first (bool): whether convert HWC to CHW
|
| 631 |
+
"""
|
| 632 |
+
|
| 633 |
+
def __init__(self, ):
|
| 634 |
+
super(Permute, self).__init__()
|
| 635 |
+
|
| 636 |
+
def __call__(self, im, im_info):
|
| 637 |
+
"""
|
| 638 |
+
Args:
|
| 639 |
+
im (np.ndarray): image (np.ndarray)
|
| 640 |
+
im_info (dict): info of image
|
| 641 |
+
Returns:
|
| 642 |
+
im (np.ndarray): processed image (np.ndarray)
|
| 643 |
+
im_info (dict): info of processed image
|
| 644 |
+
"""
|
| 645 |
+
im = im.transpose((2, 0, 1)).copy()
|
| 646 |
+
return im, im_info
|
| 647 |
+
|
| 648 |
+
|
| 649 |
+
class PadStride(object):
|
| 650 |
+
""" padding image for model with FPN, instead PadBatch(pad_to_stride) in original config
|
| 651 |
+
Args:
|
| 652 |
+
stride (bool): model with FPN need image shape % stride == 0
|
| 653 |
+
"""
|
| 654 |
+
|
| 655 |
+
def __init__(self, stride=0):
|
| 656 |
+
self.coarsest_stride = stride
|
| 657 |
+
|
| 658 |
+
def __call__(self, im, im_info):
|
| 659 |
+
"""
|
| 660 |
+
Args:
|
| 661 |
+
im (np.ndarray): image (np.ndarray)
|
| 662 |
+
im_info (dict): info of image
|
| 663 |
+
Returns:
|
| 664 |
+
im (np.ndarray): processed image (np.ndarray)
|
| 665 |
+
im_info (dict): info of processed image
|
| 666 |
+
"""
|
| 667 |
+
coarsest_stride = self.coarsest_stride
|
| 668 |
+
if coarsest_stride <= 0:
|
| 669 |
+
return im, im_info
|
| 670 |
+
im_c, im_h, im_w = im.shape
|
| 671 |
+
pad_h = int(np.ceil(float(im_h) / coarsest_stride) * coarsest_stride)
|
| 672 |
+
pad_w = int(np.ceil(float(im_w) / coarsest_stride) * coarsest_stride)
|
| 673 |
+
padding_im = np.zeros((im_c, pad_h, pad_w), dtype=np.float32)
|
| 674 |
+
padding_im[:, :im_h, :im_w] = im
|
| 675 |
+
return padding_im, im_info
|
| 676 |
+
|
| 677 |
+
|
| 678 |
+
def decode_image(im_file, im_info):
|
| 679 |
+
"""read rgb image
|
| 680 |
+
Args:
|
| 681 |
+
im_file (str|np.ndarray): input can be image path or np.ndarray
|
| 682 |
+
im_info (dict): info of image
|
| 683 |
+
Returns:
|
| 684 |
+
im (np.ndarray): processed image (np.ndarray)
|
| 685 |
+
im_info (dict): info of processed image
|
| 686 |
+
"""
|
| 687 |
+
if isinstance(im_file, str):
|
| 688 |
+
with open(im_file, 'rb') as f:
|
| 689 |
+
im_read = f.read()
|
| 690 |
+
data = np.frombuffer(im_read, dtype='uint8')
|
| 691 |
+
im = cv2.imdecode(data, 1) # BGR mode, but need RGB mode
|
| 692 |
+
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
|
| 693 |
+
else:
|
| 694 |
+
im = im_file
|
| 695 |
+
im_info['im_shape'] = np.array(im.shape[:2], dtype=np.float32)
|
| 696 |
+
im_info['scale_factor'] = np.array([1., 1.], dtype=np.float32)
|
| 697 |
+
return im, im_info
|
| 698 |
+
|
| 699 |
+
|
| 700 |
+
def preprocess(im, preprocess_ops):
|
| 701 |
+
# process image by preprocess_ops
|
| 702 |
+
im_info = {
|
| 703 |
+
'scale_factor': np.array(
|
| 704 |
+
[1., 1.], dtype=np.float32),
|
| 705 |
+
'im_shape': None,
|
| 706 |
+
}
|
| 707 |
+
im, im_info = decode_image(im, im_info)
|
| 708 |
+
for operator in preprocess_ops:
|
| 709 |
+
im, im_info = operator(im, im_info)
|
| 710 |
+
return im, im_info
|
deepdoc/visual/postprocess.py
ADDED
|
@@ -0,0 +1,354 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import copy
|
| 2 |
+
|
| 3 |
+
import numpy as np
|
| 4 |
+
import cv2
|
| 5 |
+
import paddle
|
| 6 |
+
from shapely.geometry import Polygon
|
| 7 |
+
import pyclipper
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
def build_post_process(config, global_config=None):
|
| 11 |
+
support_dict = ['DBPostProcess', 'CTCLabelDecode']
|
| 12 |
+
|
| 13 |
+
config = copy.deepcopy(config)
|
| 14 |
+
module_name = config.pop('name')
|
| 15 |
+
if module_name == "None":
|
| 16 |
+
return
|
| 17 |
+
if global_config is not None:
|
| 18 |
+
config.update(global_config)
|
| 19 |
+
assert module_name in support_dict, Exception(
|
| 20 |
+
'post process only support {}'.format(support_dict))
|
| 21 |
+
module_class = eval(module_name)(**config)
|
| 22 |
+
return module_class
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
class DBPostProcess(object):
|
| 26 |
+
"""
|
| 27 |
+
The post process for Differentiable Binarization (DB).
|
| 28 |
+
"""
|
| 29 |
+
|
| 30 |
+
def __init__(self,
|
| 31 |
+
thresh=0.3,
|
| 32 |
+
box_thresh=0.7,
|
| 33 |
+
max_candidates=1000,
|
| 34 |
+
unclip_ratio=2.0,
|
| 35 |
+
use_dilation=False,
|
| 36 |
+
score_mode="fast",
|
| 37 |
+
box_type='quad',
|
| 38 |
+
**kwargs):
|
| 39 |
+
self.thresh = thresh
|
| 40 |
+
self.box_thresh = box_thresh
|
| 41 |
+
self.max_candidates = max_candidates
|
| 42 |
+
self.unclip_ratio = unclip_ratio
|
| 43 |
+
self.min_size = 3
|
| 44 |
+
self.score_mode = score_mode
|
| 45 |
+
self.box_type = box_type
|
| 46 |
+
assert score_mode in [
|
| 47 |
+
"slow", "fast"
|
| 48 |
+
], "Score mode must be in [slow, fast] but got: {}".format(score_mode)
|
| 49 |
+
|
| 50 |
+
self.dilation_kernel = None if not use_dilation else np.array(
|
| 51 |
+
[[1, 1], [1, 1]])
|
| 52 |
+
|
| 53 |
+
def polygons_from_bitmap(self, pred, _bitmap, dest_width, dest_height):
|
| 54 |
+
'''
|
| 55 |
+
_bitmap: single map with shape (1, H, W),
|
| 56 |
+
whose values are binarized as {0, 1}
|
| 57 |
+
'''
|
| 58 |
+
|
| 59 |
+
bitmap = _bitmap
|
| 60 |
+
height, width = bitmap.shape
|
| 61 |
+
|
| 62 |
+
boxes = []
|
| 63 |
+
scores = []
|
| 64 |
+
|
| 65 |
+
contours, _ = cv2.findContours((bitmap * 255).astype(np.uint8),
|
| 66 |
+
cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
|
| 67 |
+
|
| 68 |
+
for contour in contours[:self.max_candidates]:
|
| 69 |
+
epsilon = 0.002 * cv2.arcLength(contour, True)
|
| 70 |
+
approx = cv2.approxPolyDP(contour, epsilon, True)
|
| 71 |
+
points = approx.reshape((-1, 2))
|
| 72 |
+
if points.shape[0] < 4:
|
| 73 |
+
continue
|
| 74 |
+
|
| 75 |
+
score = self.box_score_fast(pred, points.reshape(-1, 2))
|
| 76 |
+
if self.box_thresh > score:
|
| 77 |
+
continue
|
| 78 |
+
|
| 79 |
+
if points.shape[0] > 2:
|
| 80 |
+
box = self.unclip(points, self.unclip_ratio)
|
| 81 |
+
if len(box) > 1:
|
| 82 |
+
continue
|
| 83 |
+
else:
|
| 84 |
+
continue
|
| 85 |
+
box = box.reshape(-1, 2)
|
| 86 |
+
|
| 87 |
+
_, sside = self.get_mini_boxes(box.reshape((-1, 1, 2)))
|
| 88 |
+
if sside < self.min_size + 2:
|
| 89 |
+
continue
|
| 90 |
+
|
| 91 |
+
box = np.array(box)
|
| 92 |
+
box[:, 0] = np.clip(
|
| 93 |
+
np.round(box[:, 0] / width * dest_width), 0, dest_width)
|
| 94 |
+
box[:, 1] = np.clip(
|
| 95 |
+
np.round(box[:, 1] / height * dest_height), 0, dest_height)
|
| 96 |
+
boxes.append(box.tolist())
|
| 97 |
+
scores.append(score)
|
| 98 |
+
return boxes, scores
|
| 99 |
+
|
| 100 |
+
def boxes_from_bitmap(self, pred, _bitmap, dest_width, dest_height):
|
| 101 |
+
'''
|
| 102 |
+
_bitmap: single map with shape (1, H, W),
|
| 103 |
+
whose values are binarized as {0, 1}
|
| 104 |
+
'''
|
| 105 |
+
|
| 106 |
+
bitmap = _bitmap
|
| 107 |
+
height, width = bitmap.shape
|
| 108 |
+
|
| 109 |
+
outs = cv2.findContours((bitmap * 255).astype(np.uint8), cv2.RETR_LIST,
|
| 110 |
+
cv2.CHAIN_APPROX_SIMPLE)
|
| 111 |
+
if len(outs) == 3:
|
| 112 |
+
img, contours, _ = outs[0], outs[1], outs[2]
|
| 113 |
+
elif len(outs) == 2:
|
| 114 |
+
contours, _ = outs[0], outs[1]
|
| 115 |
+
|
| 116 |
+
num_contours = min(len(contours), self.max_candidates)
|
| 117 |
+
|
| 118 |
+
boxes = []
|
| 119 |
+
scores = []
|
| 120 |
+
for index in range(num_contours):
|
| 121 |
+
contour = contours[index]
|
| 122 |
+
points, sside = self.get_mini_boxes(contour)
|
| 123 |
+
if sside < self.min_size:
|
| 124 |
+
continue
|
| 125 |
+
points = np.array(points)
|
| 126 |
+
if self.score_mode == "fast":
|
| 127 |
+
score = self.box_score_fast(pred, points.reshape(-1, 2))
|
| 128 |
+
else:
|
| 129 |
+
score = self.box_score_slow(pred, contour)
|
| 130 |
+
if self.box_thresh > score:
|
| 131 |
+
continue
|
| 132 |
+
|
| 133 |
+
box = self.unclip(points, self.unclip_ratio).reshape(-1, 1, 2)
|
| 134 |
+
box, sside = self.get_mini_boxes(box)
|
| 135 |
+
if sside < self.min_size + 2:
|
| 136 |
+
continue
|
| 137 |
+
box = np.array(box)
|
| 138 |
+
|
| 139 |
+
box[:, 0] = np.clip(
|
| 140 |
+
np.round(box[:, 0] / width * dest_width), 0, dest_width)
|
| 141 |
+
box[:, 1] = np.clip(
|
| 142 |
+
np.round(box[:, 1] / height * dest_height), 0, dest_height)
|
| 143 |
+
boxes.append(box.astype("int32"))
|
| 144 |
+
scores.append(score)
|
| 145 |
+
return np.array(boxes, dtype="int32"), scores
|
| 146 |
+
|
| 147 |
+
def unclip(self, box, unclip_ratio):
|
| 148 |
+
poly = Polygon(box)
|
| 149 |
+
distance = poly.area * unclip_ratio / poly.length
|
| 150 |
+
offset = pyclipper.PyclipperOffset()
|
| 151 |
+
offset.AddPath(box, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)
|
| 152 |
+
expanded = np.array(offset.Execute(distance))
|
| 153 |
+
return expanded
|
| 154 |
+
|
| 155 |
+
def get_mini_boxes(self, contour):
|
| 156 |
+
bounding_box = cv2.minAreaRect(contour)
|
| 157 |
+
points = sorted(list(cv2.boxPoints(bounding_box)), key=lambda x: x[0])
|
| 158 |
+
|
| 159 |
+
index_1, index_2, index_3, index_4 = 0, 1, 2, 3
|
| 160 |
+
if points[1][1] > points[0][1]:
|
| 161 |
+
index_1 = 0
|
| 162 |
+
index_4 = 1
|
| 163 |
+
else:
|
| 164 |
+
index_1 = 1
|
| 165 |
+
index_4 = 0
|
| 166 |
+
if points[3][1] > points[2][1]:
|
| 167 |
+
index_2 = 2
|
| 168 |
+
index_3 = 3
|
| 169 |
+
else:
|
| 170 |
+
index_2 = 3
|
| 171 |
+
index_3 = 2
|
| 172 |
+
|
| 173 |
+
box = [
|
| 174 |
+
points[index_1], points[index_2], points[index_3], points[index_4]
|
| 175 |
+
]
|
| 176 |
+
return box, min(bounding_box[1])
|
| 177 |
+
|
| 178 |
+
def box_score_fast(self, bitmap, _box):
|
| 179 |
+
'''
|
| 180 |
+
box_score_fast: use bbox mean score as the mean score
|
| 181 |
+
'''
|
| 182 |
+
h, w = bitmap.shape[:2]
|
| 183 |
+
box = _box.copy()
|
| 184 |
+
xmin = np.clip(np.floor(box[:, 0].min()).astype("int32"), 0, w - 1)
|
| 185 |
+
xmax = np.clip(np.ceil(box[:, 0].max()).astype("int32"), 0, w - 1)
|
| 186 |
+
ymin = np.clip(np.floor(box[:, 1].min()).astype("int32"), 0, h - 1)
|
| 187 |
+
ymax = np.clip(np.ceil(box[:, 1].max()).astype("int32"), 0, h - 1)
|
| 188 |
+
|
| 189 |
+
mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8)
|
| 190 |
+
box[:, 0] = box[:, 0] - xmin
|
| 191 |
+
box[:, 1] = box[:, 1] - ymin
|
| 192 |
+
cv2.fillPoly(mask, box.reshape(1, -1, 2).astype("int32"), 1)
|
| 193 |
+
return cv2.mean(bitmap[ymin:ymax + 1, xmin:xmax + 1], mask)[0]
|
| 194 |
+
|
| 195 |
+
def box_score_slow(self, bitmap, contour):
|
| 196 |
+
'''
|
| 197 |
+
box_score_slow: use polyon mean score as the mean score
|
| 198 |
+
'''
|
| 199 |
+
h, w = bitmap.shape[:2]
|
| 200 |
+
contour = contour.copy()
|
| 201 |
+
contour = np.reshape(contour, (-1, 2))
|
| 202 |
+
|
| 203 |
+
xmin = np.clip(np.min(contour[:, 0]), 0, w - 1)
|
| 204 |
+
xmax = np.clip(np.max(contour[:, 0]), 0, w - 1)
|
| 205 |
+
ymin = np.clip(np.min(contour[:, 1]), 0, h - 1)
|
| 206 |
+
ymax = np.clip(np.max(contour[:, 1]), 0, h - 1)
|
| 207 |
+
|
| 208 |
+
mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8)
|
| 209 |
+
|
| 210 |
+
contour[:, 0] = contour[:, 0] - xmin
|
| 211 |
+
contour[:, 1] = contour[:, 1] - ymin
|
| 212 |
+
|
| 213 |
+
cv2.fillPoly(mask, contour.reshape(1, -1, 2).astype("int32"), 1)
|
| 214 |
+
return cv2.mean(bitmap[ymin:ymax + 1, xmin:xmax + 1], mask)[0]
|
| 215 |
+
|
| 216 |
+
def __call__(self, outs_dict, shape_list):
|
| 217 |
+
pred = outs_dict['maps']
|
| 218 |
+
if isinstance(pred, paddle.Tensor):
|
| 219 |
+
pred = pred.numpy()
|
| 220 |
+
pred = pred[:, 0, :, :]
|
| 221 |
+
segmentation = pred > self.thresh
|
| 222 |
+
|
| 223 |
+
boxes_batch = []
|
| 224 |
+
for batch_index in range(pred.shape[0]):
|
| 225 |
+
src_h, src_w, ratio_h, ratio_w = shape_list[batch_index]
|
| 226 |
+
if self.dilation_kernel is not None:
|
| 227 |
+
mask = cv2.dilate(
|
| 228 |
+
np.array(segmentation[batch_index]).astype(np.uint8),
|
| 229 |
+
self.dilation_kernel)
|
| 230 |
+
else:
|
| 231 |
+
mask = segmentation[batch_index]
|
| 232 |
+
if self.box_type == 'poly':
|
| 233 |
+
boxes, scores = self.polygons_from_bitmap(pred[batch_index],
|
| 234 |
+
mask, src_w, src_h)
|
| 235 |
+
elif self.box_type == 'quad':
|
| 236 |
+
boxes, scores = self.boxes_from_bitmap(pred[batch_index], mask,
|
| 237 |
+
src_w, src_h)
|
| 238 |
+
else:
|
| 239 |
+
raise ValueError(
|
| 240 |
+
"box_type can only be one of ['quad', 'poly']")
|
| 241 |
+
|
| 242 |
+
boxes_batch.append({'points': boxes})
|
| 243 |
+
return boxes_batch
|
| 244 |
+
|
| 245 |
+
|
| 246 |
+
class BaseRecLabelDecode(object):
|
| 247 |
+
""" Convert between text-label and text-index """
|
| 248 |
+
|
| 249 |
+
def __init__(self, character_dict_path=None, use_space_char=False):
|
| 250 |
+
self.beg_str = "sos"
|
| 251 |
+
self.end_str = "eos"
|
| 252 |
+
self.reverse = False
|
| 253 |
+
self.character_str = []
|
| 254 |
+
|
| 255 |
+
if character_dict_path is None:
|
| 256 |
+
self.character_str = "0123456789abcdefghijklmnopqrstuvwxyz"
|
| 257 |
+
dict_character = list(self.character_str)
|
| 258 |
+
else:
|
| 259 |
+
with open(character_dict_path, "rb") as fin:
|
| 260 |
+
lines = fin.readlines()
|
| 261 |
+
for line in lines:
|
| 262 |
+
line = line.decode('utf-8').strip("\n").strip("\r\n")
|
| 263 |
+
self.character_str.append(line)
|
| 264 |
+
if use_space_char:
|
| 265 |
+
self.character_str.append(" ")
|
| 266 |
+
dict_character = list(self.character_str)
|
| 267 |
+
if 'arabic' in character_dict_path:
|
| 268 |
+
self.reverse = True
|
| 269 |
+
|
| 270 |
+
dict_character = self.add_special_char(dict_character)
|
| 271 |
+
self.dict = {}
|
| 272 |
+
for i, char in enumerate(dict_character):
|
| 273 |
+
self.dict[char] = i
|
| 274 |
+
self.character = dict_character
|
| 275 |
+
|
| 276 |
+
def pred_reverse(self, pred):
|
| 277 |
+
pred_re = []
|
| 278 |
+
c_current = ''
|
| 279 |
+
for c in pred:
|
| 280 |
+
if not bool(re.search('[a-zA-Z0-9 :*./%+-]', c)):
|
| 281 |
+
if c_current != '':
|
| 282 |
+
pred_re.append(c_current)
|
| 283 |
+
pred_re.append(c)
|
| 284 |
+
c_current = ''
|
| 285 |
+
else:
|
| 286 |
+
c_current += c
|
| 287 |
+
if c_current != '':
|
| 288 |
+
pred_re.append(c_current)
|
| 289 |
+
|
| 290 |
+
return ''.join(pred_re[::-1])
|
| 291 |
+
|
| 292 |
+
def add_special_char(self, dict_character):
|
| 293 |
+
return dict_character
|
| 294 |
+
|
| 295 |
+
def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
|
| 296 |
+
""" convert text-index into text-label. """
|
| 297 |
+
result_list = []
|
| 298 |
+
ignored_tokens = self.get_ignored_tokens()
|
| 299 |
+
batch_size = len(text_index)
|
| 300 |
+
for batch_idx in range(batch_size):
|
| 301 |
+
selection = np.ones(len(text_index[batch_idx]), dtype=bool)
|
| 302 |
+
if is_remove_duplicate:
|
| 303 |
+
selection[1:] = text_index[batch_idx][1:] != text_index[
|
| 304 |
+
batch_idx][:-1]
|
| 305 |
+
for ignored_token in ignored_tokens:
|
| 306 |
+
selection &= text_index[batch_idx] != ignored_token
|
| 307 |
+
|
| 308 |
+
char_list = [
|
| 309 |
+
self.character[text_id]
|
| 310 |
+
for text_id in text_index[batch_idx][selection]
|
| 311 |
+
]
|
| 312 |
+
if text_prob is not None:
|
| 313 |
+
conf_list = text_prob[batch_idx][selection]
|
| 314 |
+
else:
|
| 315 |
+
conf_list = [1] * len(selection)
|
| 316 |
+
if len(conf_list) == 0:
|
| 317 |
+
conf_list = [0]
|
| 318 |
+
|
| 319 |
+
text = ''.join(char_list)
|
| 320 |
+
|
| 321 |
+
if self.reverse: # for arabic rec
|
| 322 |
+
text = self.pred_reverse(text)
|
| 323 |
+
|
| 324 |
+
result_list.append((text, np.mean(conf_list).tolist()))
|
| 325 |
+
return result_list
|
| 326 |
+
|
| 327 |
+
def get_ignored_tokens(self):
|
| 328 |
+
return [0] # for ctc blank
|
| 329 |
+
|
| 330 |
+
|
| 331 |
+
class CTCLabelDecode(BaseRecLabelDecode):
|
| 332 |
+
""" Convert between text-label and text-index """
|
| 333 |
+
|
| 334 |
+
def __init__(self, character_dict_path=None, use_space_char=False,
|
| 335 |
+
**kwargs):
|
| 336 |
+
super(CTCLabelDecode, self).__init__(character_dict_path,
|
| 337 |
+
use_space_char)
|
| 338 |
+
|
| 339 |
+
def __call__(self, preds, label=None, *args, **kwargs):
|
| 340 |
+
if isinstance(preds, tuple) or isinstance(preds, list):
|
| 341 |
+
preds = preds[-1]
|
| 342 |
+
if isinstance(preds, paddle.Tensor):
|
| 343 |
+
preds = preds.numpy()
|
| 344 |
+
preds_idx = preds.argmax(axis=2)
|
| 345 |
+
preds_prob = preds.max(axis=2)
|
| 346 |
+
text = self.decode(preds_idx, preds_prob, is_remove_duplicate=True)
|
| 347 |
+
if label is None:
|
| 348 |
+
return text
|
| 349 |
+
label = self.decode(label)
|
| 350 |
+
return text, label
|
| 351 |
+
|
| 352 |
+
def add_special_char(self, dict_character):
|
| 353 |
+
dict_character = ['blank'] + dict_character
|
| 354 |
+
return dict_character
|
deepdoc/visual/recognizer.py
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
+
|
| 14 |
+
import os
|
| 15 |
+
import onnxruntime as ort
|
| 16 |
+
from huggingface_hub import snapshot_download
|
| 17 |
+
|
| 18 |
+
from .operators import *
|
| 19 |
+
from rag.settings import cron_logger
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
class Recognizer(object):
|
| 23 |
+
def __init__(self, label_list, task_name, model_dir=None):
|
| 24 |
+
"""
|
| 25 |
+
If you have trouble downloading HuggingFace models, -_^ this might help!!
|
| 26 |
+
|
| 27 |
+
For Linux:
|
| 28 |
+
export HF_ENDPOINT=https://hf-mirror.com
|
| 29 |
+
|
| 30 |
+
For Windows:
|
| 31 |
+
Good luck
|
| 32 |
+
^_-
|
| 33 |
+
|
| 34 |
+
"""
|
| 35 |
+
if not model_dir:
|
| 36 |
+
model_dir = snapshot_download(repo_id="InfiniFlow/ocr")
|
| 37 |
+
|
| 38 |
+
model_file_path = os.path.join(model_dir, task_name + ".onnx")
|
| 39 |
+
if not os.path.exists(model_file_path):
|
| 40 |
+
raise ValueError("not find model file path {}".format(
|
| 41 |
+
model_file_path))
|
| 42 |
+
if ort.get_device() == "GPU":
|
| 43 |
+
self.ort_sess = ort.InferenceSession(model_file_path, providers=['CUDAExecutionProvider'])
|
| 44 |
+
else:
|
| 45 |
+
self.ort_sess = ort.InferenceSession(model_file_path, providers=['CPUExecutionProvider'])
|
| 46 |
+
self.label_list = label_list
|
| 47 |
+
|
| 48 |
+
def create_inputs(self, imgs, im_info):
|
| 49 |
+
"""generate input for different model type
|
| 50 |
+
Args:
|
| 51 |
+
imgs (list(numpy)): list of images (np.ndarray)
|
| 52 |
+
im_info (list(dict)): list of image info
|
| 53 |
+
Returns:
|
| 54 |
+
inputs (dict): input of model
|
| 55 |
+
"""
|
| 56 |
+
inputs = {}
|
| 57 |
+
|
| 58 |
+
im_shape = []
|
| 59 |
+
scale_factor = []
|
| 60 |
+
if len(imgs) == 1:
|
| 61 |
+
inputs['image'] = np.array((imgs[0],)).astype('float32')
|
| 62 |
+
inputs['im_shape'] = np.array(
|
| 63 |
+
(im_info[0]['im_shape'],)).astype('float32')
|
| 64 |
+
inputs['scale_factor'] = np.array(
|
| 65 |
+
(im_info[0]['scale_factor'],)).astype('float32')
|
| 66 |
+
return inputs
|
| 67 |
+
|
| 68 |
+
for e in im_info:
|
| 69 |
+
im_shape.append(np.array((e['im_shape'],)).astype('float32'))
|
| 70 |
+
scale_factor.append(np.array((e['scale_factor'],)).astype('float32'))
|
| 71 |
+
|
| 72 |
+
inputs['im_shape'] = np.concatenate(im_shape, axis=0)
|
| 73 |
+
inputs['scale_factor'] = np.concatenate(scale_factor, axis=0)
|
| 74 |
+
|
| 75 |
+
imgs_shape = [[e.shape[1], e.shape[2]] for e in imgs]
|
| 76 |
+
max_shape_h = max([e[0] for e in imgs_shape])
|
| 77 |
+
max_shape_w = max([e[1] for e in imgs_shape])
|
| 78 |
+
padding_imgs = []
|
| 79 |
+
for img in imgs:
|
| 80 |
+
im_c, im_h, im_w = img.shape[:]
|
| 81 |
+
padding_im = np.zeros(
|
| 82 |
+
(im_c, max_shape_h, max_shape_w), dtype=np.float32)
|
| 83 |
+
padding_im[:, :im_h, :im_w] = img
|
| 84 |
+
padding_imgs.append(padding_im)
|
| 85 |
+
inputs['image'] = np.stack(padding_imgs, axis=0)
|
| 86 |
+
return inputs
|
| 87 |
+
|
| 88 |
+
def preprocess(self, image_list):
|
| 89 |
+
preprocess_ops = []
|
| 90 |
+
for op_info in [
|
| 91 |
+
{'interp': 2, 'keep_ratio': False, 'target_size': [800, 608], 'type': 'LinearResize'},
|
| 92 |
+
{'is_scale': True, 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'type': 'StandardizeImage'},
|
| 93 |
+
{'type': 'Permute'},
|
| 94 |
+
{'stride': 32, 'type': 'PadStride'}
|
| 95 |
+
]:
|
| 96 |
+
new_op_info = op_info.copy()
|
| 97 |
+
op_type = new_op_info.pop('type')
|
| 98 |
+
preprocess_ops.append(eval(op_type)(**new_op_info))
|
| 99 |
+
|
| 100 |
+
inputs = []
|
| 101 |
+
for im_path in image_list:
|
| 102 |
+
im, im_info = preprocess(im_path, preprocess_ops)
|
| 103 |
+
inputs.append({"image": np.array((im,)).astype('float32'), "scale_factor": np.array((im_info["scale_factor"],)).astype('float32')})
|
| 104 |
+
return inputs
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
def __call__(self, image_list, thr=0.7, batch_size=16):
|
| 108 |
+
res = []
|
| 109 |
+
imgs = []
|
| 110 |
+
for i in range(len(image_list)):
|
| 111 |
+
if not isinstance(image_list[i], np.ndarray):
|
| 112 |
+
imgs.append(np.array(image_list[i]))
|
| 113 |
+
else: imgs.append(image_list[i])
|
| 114 |
+
|
| 115 |
+
batch_loop_cnt = math.ceil(float(len(imgs)) / batch_size)
|
| 116 |
+
for i in range(batch_loop_cnt):
|
| 117 |
+
start_index = i * batch_size
|
| 118 |
+
end_index = min((i + 1) * batch_size, len(imgs))
|
| 119 |
+
batch_image_list = imgs[start_index:end_index]
|
| 120 |
+
inputs = self.preprocess(batch_image_list)
|
| 121 |
+
for ins in inputs:
|
| 122 |
+
bb = []
|
| 123 |
+
for b in self.ort_sess.run(None, ins)[0]:
|
| 124 |
+
clsid, bbox, score = int(b[0]), b[2:], b[1]
|
| 125 |
+
if score < thr:
|
| 126 |
+
continue
|
| 127 |
+
if clsid >= len(self.label_list):
|
| 128 |
+
cron_logger.warning(f"bad category id")
|
| 129 |
+
continue
|
| 130 |
+
bb.append({
|
| 131 |
+
"type": self.label_list[clsid].lower(),
|
| 132 |
+
"bbox": [float(t) for t in bbox.tolist()],
|
| 133 |
+
"score": float(score)
|
| 134 |
+
})
|
| 135 |
+
res.append(bb)
|
| 136 |
+
|
| 137 |
+
#seeit.save_results(image_list, res, self.label_list, threshold=thr)
|
| 138 |
+
|
| 139 |
+
return res
|
deepdoc/visual/seeit.py
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
+
|
| 14 |
+
import os
|
| 15 |
+
import PIL
|
| 16 |
+
from PIL import ImageDraw
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
def save_results(image_list, results, labels, output_dir='output/', threshold=0.5):
|
| 20 |
+
if not os.path.exists(output_dir):
|
| 21 |
+
os.makedirs(output_dir)
|
| 22 |
+
for idx, im in enumerate(image_list):
|
| 23 |
+
im = draw_box(im, results[idx], labels, threshold=threshold)
|
| 24 |
+
|
| 25 |
+
out_path = os.path.join(output_dir, f"{idx}.jpg")
|
| 26 |
+
im.save(out_path, quality=95)
|
| 27 |
+
print("save result to: " + out_path)
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
def draw_box(im, result, lables, threshold=0.5):
|
| 31 |
+
draw_thickness = min(im.size) // 320
|
| 32 |
+
draw = ImageDraw.Draw(im)
|
| 33 |
+
color_list = get_color_map_list(len(lables))
|
| 34 |
+
clsid2color = {n.lower():color_list[i] for i,n in enumerate(lables)}
|
| 35 |
+
result = [r for r in result if r["score"] >= threshold]
|
| 36 |
+
|
| 37 |
+
for dt in result:
|
| 38 |
+
color = tuple(clsid2color[dt["type"]])
|
| 39 |
+
xmin, ymin, xmax, ymax = dt["bbox"]
|
| 40 |
+
draw.line(
|
| 41 |
+
[(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin),
|
| 42 |
+
(xmin, ymin)],
|
| 43 |
+
width=draw_thickness,
|
| 44 |
+
fill=color)
|
| 45 |
+
|
| 46 |
+
# draw label
|
| 47 |
+
text = "{} {:.4f}".format(dt["type"], dt["score"])
|
| 48 |
+
tw, th = imagedraw_textsize_c(draw, text)
|
| 49 |
+
draw.rectangle(
|
| 50 |
+
[(xmin + 1, ymin - th), (xmin + tw + 1, ymin)], fill=color)
|
| 51 |
+
draw.text((xmin + 1, ymin - th), text, fill=(255, 255, 255))
|
| 52 |
+
return im
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
def get_color_map_list(num_classes):
|
| 56 |
+
"""
|
| 57 |
+
Args:
|
| 58 |
+
num_classes (int): number of class
|
| 59 |
+
Returns:
|
| 60 |
+
color_map (list): RGB color list
|
| 61 |
+
"""
|
| 62 |
+
color_map = num_classes * [0, 0, 0]
|
| 63 |
+
for i in range(0, num_classes):
|
| 64 |
+
j = 0
|
| 65 |
+
lab = i
|
| 66 |
+
while lab:
|
| 67 |
+
color_map[i * 3] |= (((lab >> 0) & 1) << (7 - j))
|
| 68 |
+
color_map[i * 3 + 1] |= (((lab >> 1) & 1) << (7 - j))
|
| 69 |
+
color_map[i * 3 + 2] |= (((lab >> 2) & 1) << (7 - j))
|
| 70 |
+
j += 1
|
| 71 |
+
lab >>= 3
|
| 72 |
+
color_map = [color_map[i:i + 3] for i in range(0, len(color_map), 3)]
|
| 73 |
+
return color_map
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
def imagedraw_textsize_c(draw, text):
|
| 77 |
+
if int(PIL.__version__.split('.')[0]) < 10:
|
| 78 |
+
tw, th = draw.textsize(text)
|
| 79 |
+
else:
|
| 80 |
+
left, top, right, bottom = draw.textbbox((0, 0), text)
|
| 81 |
+
tw, th = right - left, bottom - top
|
| 82 |
+
|
| 83 |
+
return tw, th
|
rag/app/book.py
CHANGED
|
@@ -1,15 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import copy
|
| 2 |
-
import random
|
| 3 |
import re
|
| 4 |
-
import
|
| 5 |
-
from rag.parser import bullets_category, BULLET_PATTERN, is_english, tokenize, remove_contents_table, \
|
| 6 |
hierarchical_merge, make_colon_as_title, naive_merge, random_choices
|
| 7 |
from rag.nlp import huqie
|
| 8 |
-
from
|
| 9 |
-
from rag.parser.pdf_parser import HuParser
|
| 10 |
|
| 11 |
|
| 12 |
-
class Pdf(
|
| 13 |
def __call__(self, filename, binary=None, from_page=0,
|
| 14 |
to_page=100000, zoomin=3, callback=None):
|
| 15 |
self.__images__(
|
|
@@ -21,7 +30,7 @@ class Pdf(HuParser):
|
|
| 21 |
|
| 22 |
from timeit import default_timer as timer
|
| 23 |
start = timer()
|
| 24 |
-
self.
|
| 25 |
callback(0.47, "Layout analysis finished")
|
| 26 |
print("paddle layouts:", timer() - start)
|
| 27 |
self._table_transformer_job(zoomin)
|
|
@@ -53,7 +62,7 @@ def chunk(filename, binary=None, from_page=0, to_page=100000, callback=None, **k
|
|
| 53 |
sections,tbls = [], []
|
| 54 |
if re.search(r"\.docx?$", filename, re.IGNORECASE):
|
| 55 |
callback(0.1, "Start to parse.")
|
| 56 |
-
doc_parser =
|
| 57 |
# TODO: table of contents need to be removed
|
| 58 |
sections, tbls = doc_parser(binary if binary else filename, from_page=from_page, to_page=to_page)
|
| 59 |
remove_contents_table(sections, eng=is_english(random_choices([t for t,_ in sections], k=200)))
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
import copy
|
|
|
|
| 14 |
import re
|
| 15 |
+
from deepdoc.parser import bullets_category, is_english, tokenize, remove_contents_table, \
|
|
|
|
| 16 |
hierarchical_merge, make_colon_as_title, naive_merge, random_choices
|
| 17 |
from rag.nlp import huqie
|
| 18 |
+
from deepdoc.parser import PdfParser, DocxParser
|
|
|
|
| 19 |
|
| 20 |
|
| 21 |
+
class Pdf(PdfParser):
|
| 22 |
def __call__(self, filename, binary=None, from_page=0,
|
| 23 |
to_page=100000, zoomin=3, callback=None):
|
| 24 |
self.__images__(
|
|
|
|
| 30 |
|
| 31 |
from timeit import default_timer as timer
|
| 32 |
start = timer()
|
| 33 |
+
self._layouts_rec(zoomin)
|
| 34 |
callback(0.47, "Layout analysis finished")
|
| 35 |
print("paddle layouts:", timer() - start)
|
| 36 |
self._table_transformer_job(zoomin)
|
|
|
|
| 62 |
sections,tbls = [], []
|
| 63 |
if re.search(r"\.docx?$", filename, re.IGNORECASE):
|
| 64 |
callback(0.1, "Start to parse.")
|
| 65 |
+
doc_parser = DocxParser()
|
| 66 |
# TODO: table of contents need to be removed
|
| 67 |
sections, tbls = doc_parser(binary if binary else filename, from_page=from_page, to_page=to_page)
|
| 68 |
remove_contents_table(sections, eng=is_english(random_choices([t for t,_ in sections], k=200)))
|
rag/app/laws.py
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import copy
|
| 2 |
import re
|
| 3 |
from io import BytesIO
|
| 4 |
from docx import Document
|
| 5 |
-
from
|
| 6 |
make_colon_as_title
|
| 7 |
from rag.nlp import huqie
|
| 8 |
-
from
|
| 9 |
-
from rag.parser.pdf_parser import HuParser
|
| 10 |
from rag.settings import cron_logger
|
| 11 |
|
| 12 |
|
| 13 |
-
class Docx(
|
| 14 |
def __init__(self):
|
| 15 |
pass
|
| 16 |
|
|
@@ -35,7 +46,7 @@ class Docx(HuDocxParser):
|
|
| 35 |
return [l for l in lines if l]
|
| 36 |
|
| 37 |
|
| 38 |
-
class Pdf(
|
| 39 |
def __call__(self, filename, binary=None, from_page=0,
|
| 40 |
to_page=100000, zoomin=3, callback=None):
|
| 41 |
self.__images__(
|
|
@@ -47,7 +58,7 @@ class Pdf(HuParser):
|
|
| 47 |
|
| 48 |
from timeit import default_timer as timer
|
| 49 |
start = timer()
|
| 50 |
-
self.
|
| 51 |
callback(0.77, "Layout analysis finished")
|
| 52 |
cron_logger.info("paddle layouts:".format((timer()-start)/(self.total_page+0.1)))
|
| 53 |
self._naive_vertical_merge()
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
import copy
|
| 14 |
import re
|
| 15 |
from io import BytesIO
|
| 16 |
from docx import Document
|
| 17 |
+
from deepdoc.parser import bullets_category, is_english, tokenize, remove_contents_table, hierarchical_merge, \
|
| 18 |
make_colon_as_title
|
| 19 |
from rag.nlp import huqie
|
| 20 |
+
from deepdoc.parser import PdfParser, DocxParser
|
|
|
|
| 21 |
from rag.settings import cron_logger
|
| 22 |
|
| 23 |
|
| 24 |
+
class Docx(DocxParser):
|
| 25 |
def __init__(self):
|
| 26 |
pass
|
| 27 |
|
|
|
|
| 46 |
return [l for l in lines if l]
|
| 47 |
|
| 48 |
|
| 49 |
+
class Pdf(PdfParser):
|
| 50 |
def __call__(self, filename, binary=None, from_page=0,
|
| 51 |
to_page=100000, zoomin=3, callback=None):
|
| 52 |
self.__images__(
|
|
|
|
| 58 |
|
| 59 |
from timeit import default_timer as timer
|
| 60 |
start = timer()
|
| 61 |
+
self._layouts_rec(zoomin)
|
| 62 |
callback(0.77, "Layout analysis finished")
|
| 63 |
cron_logger.info("paddle layouts:".format((timer()-start)/(self.total_page+0.1)))
|
| 64 |
self._naive_vertical_merge()
|
rag/app/manual.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
| 1 |
import copy
|
| 2 |
import re
|
| 3 |
-
from
|
| 4 |
from rag.nlp import huqie
|
| 5 |
-
from
|
| 6 |
from rag.utils import num_tokens_from_string
|
| 7 |
|
| 8 |
|
| 9 |
-
class Pdf(
|
| 10 |
def __call__(self, filename, binary=None, from_page=0,
|
| 11 |
to_page=100000, zoomin=3, callback=None):
|
| 12 |
self.__images__(
|
|
@@ -18,7 +18,7 @@ class Pdf(HuParser):
|
|
| 18 |
|
| 19 |
from timeit import default_timer as timer
|
| 20 |
start = timer()
|
| 21 |
-
self.
|
| 22 |
callback(0.5, "Layout analysis finished.")
|
| 23 |
print("paddle layouts:", timer() - start)
|
| 24 |
self._table_transformer_job(zoomin)
|
|
|
|
| 1 |
import copy
|
| 2 |
import re
|
| 3 |
+
from deepdoc.parser import tokenize
|
| 4 |
from rag.nlp import huqie
|
| 5 |
+
from deepdoc.parser import PdfParser
|
| 6 |
from rag.utils import num_tokens_from_string
|
| 7 |
|
| 8 |
|
| 9 |
+
class Pdf(PdfParser):
|
| 10 |
def __call__(self, filename, binary=None, from_page=0,
|
| 11 |
to_page=100000, zoomin=3, callback=None):
|
| 12 |
self.__images__(
|
|
|
|
| 18 |
|
| 19 |
from timeit import default_timer as timer
|
| 20 |
start = timer()
|
| 21 |
+
self._layouts_rec(zoomin)
|
| 22 |
callback(0.5, "Layout analysis finished.")
|
| 23 |
print("paddle layouts:", timer() - start)
|
| 24 |
self._table_transformer_job(zoomin)
|
rag/app/naive.py
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import copy
|
| 2 |
import re
|
| 3 |
from rag.app import laws
|
| 4 |
-
from
|
| 5 |
from rag.nlp import huqie
|
| 6 |
-
from
|
| 7 |
from rag.settings import cron_logger
|
| 8 |
|
| 9 |
|
| 10 |
-
class Pdf(
|
| 11 |
def __call__(self, filename, binary=None, from_page=0,
|
| 12 |
to_page=100000, zoomin=3, callback=None):
|
| 13 |
self.__images__(
|
|
@@ -19,7 +31,7 @@ class Pdf(HuParser):
|
|
| 19 |
|
| 20 |
from timeit import default_timer as timer
|
| 21 |
start = timer()
|
| 22 |
-
self.
|
| 23 |
callback(0.77, "Layout analysis finished")
|
| 24 |
cron_logger.info("paddle layouts:".format((timer() - start) / (self.total_page + 0.1)))
|
| 25 |
self._naive_vertical_merge()
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
import copy
|
| 14 |
import re
|
| 15 |
from rag.app import laws
|
| 16 |
+
from deepdoc.parser import is_english, tokenize, naive_merge
|
| 17 |
from rag.nlp import huqie
|
| 18 |
+
from deepdoc.parser import PdfParser
|
| 19 |
from rag.settings import cron_logger
|
| 20 |
|
| 21 |
|
| 22 |
+
class Pdf(PdfParser):
|
| 23 |
def __call__(self, filename, binary=None, from_page=0,
|
| 24 |
to_page=100000, zoomin=3, callback=None):
|
| 25 |
self.__images__(
|
|
|
|
| 31 |
|
| 32 |
from timeit import default_timer as timer
|
| 33 |
start = timer()
|
| 34 |
+
self._layouts_rec(zoomin)
|
| 35 |
callback(0.77, "Layout analysis finished")
|
| 36 |
cron_logger.info("paddle layouts:".format((timer() - start) / (self.total_page + 0.1)))
|
| 37 |
self._naive_vertical_merge()
|
rag/app/paper.py
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import copy
|
| 2 |
import re
|
| 3 |
from collections import Counter
|
| 4 |
|
| 5 |
from api.db import ParserType
|
| 6 |
-
from
|
| 7 |
from rag.nlp import huqie
|
| 8 |
-
from
|
| 9 |
import numpy as np
|
| 10 |
from rag.utils import num_tokens_from_string
|
| 11 |
|
| 12 |
|
| 13 |
-
class Pdf(
|
| 14 |
def __init__(self):
|
| 15 |
self.model_speciess = ParserType.PAPER.value
|
| 16 |
super().__init__()
|
|
@@ -26,7 +38,7 @@ class Pdf(HuParser):
|
|
| 26 |
|
| 27 |
from timeit import default_timer as timer
|
| 28 |
start = timer()
|
| 29 |
-
self.
|
| 30 |
callback(0.47, "Layout analysis finished")
|
| 31 |
print("paddle layouts:", timer() - start)
|
| 32 |
self._table_transformer_job(zoomin)
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
import copy
|
| 14 |
import re
|
| 15 |
from collections import Counter
|
| 16 |
|
| 17 |
from api.db import ParserType
|
| 18 |
+
from deepdoc.parser import tokenize
|
| 19 |
from rag.nlp import huqie
|
| 20 |
+
from deepdoc.parser import PdfParser
|
| 21 |
import numpy as np
|
| 22 |
from rag.utils import num_tokens_from_string
|
| 23 |
|
| 24 |
|
| 25 |
+
class Pdf(PdfParser):
|
| 26 |
def __init__(self):
|
| 27 |
self.model_speciess = ParserType.PAPER.value
|
| 28 |
super().__init__()
|
|
|
|
| 38 |
|
| 39 |
from timeit import default_timer as timer
|
| 40 |
start = timer()
|
| 41 |
+
self._layouts_rec(zoomin)
|
| 42 |
callback(0.47, "Layout analysis finished")
|
| 43 |
print("paddle layouts:", timer() - start)
|
| 44 |
self._table_transformer_job(zoomin)
|
rag/app/presentation.py
CHANGED
|
@@ -1,11 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import copy
|
| 2 |
import re
|
| 3 |
from io import BytesIO
|
| 4 |
from pptx import Presentation
|
| 5 |
-
|
| 6 |
-
from rag.parser import tokenize, is_english
|
| 7 |
from rag.nlp import huqie
|
| 8 |
-
from
|
| 9 |
|
| 10 |
|
| 11 |
class Ppt(object):
|
|
@@ -58,7 +69,7 @@ class Ppt(object):
|
|
| 58 |
return [(txts[i], imgs[i]) for i in range(len(txts))]
|
| 59 |
|
| 60 |
|
| 61 |
-
class Pdf(
|
| 62 |
def __init__(self):
|
| 63 |
super().__init__()
|
| 64 |
|
|
@@ -74,7 +85,7 @@ class Pdf(HuParser):
|
|
| 74 |
assert len(self.boxes) == len(self.page_images), "{} vs. {}".format(len(self.boxes), len(self.page_images))
|
| 75 |
res = []
|
| 76 |
#################### More precisely ###################
|
| 77 |
-
# self.
|
| 78 |
# self._text_merge()
|
| 79 |
# pages = {}
|
| 80 |
# for b in self.boxes:
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
import copy
|
| 14 |
import re
|
| 15 |
from io import BytesIO
|
| 16 |
from pptx import Presentation
|
| 17 |
+
from deepdoc.parser import tokenize, is_english
|
|
|
|
| 18 |
from rag.nlp import huqie
|
| 19 |
+
from deepdoc.parser import PdfParser
|
| 20 |
|
| 21 |
|
| 22 |
class Ppt(object):
|
|
|
|
| 69 |
return [(txts[i], imgs[i]) for i in range(len(txts))]
|
| 70 |
|
| 71 |
|
| 72 |
+
class Pdf(PdfParser):
|
| 73 |
def __init__(self):
|
| 74 |
super().__init__()
|
| 75 |
|
|
|
|
| 85 |
assert len(self.boxes) == len(self.page_images), "{} vs. {}".format(len(self.boxes), len(self.page_images))
|
| 86 |
res = []
|
| 87 |
#################### More precisely ###################
|
| 88 |
+
# self._layouts_rec(zoomin)
|
| 89 |
# self._text_merge()
|
| 90 |
# pages = {}
|
| 91 |
# for b in self.boxes:
|
rag/app/qa.py
CHANGED
|
@@ -1,13 +1,25 @@
|
|
| 1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
import re
|
| 3 |
from io import BytesIO
|
| 4 |
from nltk import word_tokenize
|
| 5 |
from openpyxl import load_workbook
|
| 6 |
-
from
|
| 7 |
from rag.nlp import huqie, stemmer
|
|
|
|
| 8 |
|
| 9 |
|
| 10 |
-
class Excel(
|
| 11 |
def __call__(self, fnm, binary=None, callback=None):
|
| 12 |
if not binary:
|
| 13 |
wb = load_workbook(fnm)
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
import re
|
| 14 |
from io import BytesIO
|
| 15 |
from nltk import word_tokenize
|
| 16 |
from openpyxl import load_workbook
|
| 17 |
+
from deepdoc.parser import is_english, random_choices
|
| 18 |
from rag.nlp import huqie, stemmer
|
| 19 |
+
from deepdoc.parser import ExcelParser
|
| 20 |
|
| 21 |
|
| 22 |
+
class Excel(ExcelParser):
|
| 23 |
def __call__(self, fnm, binary=None, callback=None):
|
| 24 |
if not binary:
|
| 25 |
wb = load_workbook(fnm)
|
rag/app/resume.py
CHANGED
|
@@ -1,59 +1,82 @@
|
|
| 1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
import json
|
| 3 |
-
import os
|
| 4 |
import re
|
|
|
|
|
|
|
| 5 |
import requests
|
| 6 |
from api.db.services.knowledgebase_service import KnowledgebaseService
|
| 7 |
-
from api.settings import stat_logger
|
| 8 |
from rag.nlp import huqie
|
| 9 |
-
|
|
|
|
| 10 |
from rag.settings import cron_logger
|
| 11 |
from rag.utils import rmSpace
|
| 12 |
|
| 13 |
forbidden_select_fields4resume = [
|
| 14 |
"name_pinyin_kwd", "edu_first_fea_kwd", "degree_kwd", "sch_rank_kwd", "edu_fea_kwd"
|
| 15 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
def chunk(filename, binary=None, callback=None, **kwargs):
|
| 18 |
"""
|
| 19 |
The supported file formats are pdf, docx and txt.
|
| 20 |
-
To maximize the effectiveness, parse the resume correctly,
|
| 21 |
-
please visit https://github.com/infiniflow/ragflow, and sign in the our demo web-site
|
| 22 |
-
to get token. It's FREE!
|
| 23 |
-
Set INFINIFLOW_SERVER and INFINIFLOW_TOKEN in '.env' file or
|
| 24 |
-
using 'export' to set both environment variables: INFINIFLOW_SERVER and INFINIFLOW_TOKEN in docker container.
|
| 25 |
"""
|
| 26 |
if not re.search(r"\.(pdf|doc|docx|txt)$", filename, flags=re.IGNORECASE):
|
| 27 |
raise NotImplementedError("file type not supported yet(pdf supported)")
|
| 28 |
|
| 29 |
-
url = os.environ.get("INFINIFLOW_SERVER")
|
| 30 |
-
token = os.environ.get("INFINIFLOW_TOKEN")
|
| 31 |
-
if not url or not token:
|
| 32 |
-
stat_logger.warning(
|
| 33 |
-
"INFINIFLOW_SERVER is not specified. To maximize the effectiveness, please visit https://github.com/infiniflow/ragflow, and sign in the our demo web site to get token. It's FREE! Using 'export' to set both environment variables: INFINIFLOW_SERVER and INFINIFLOW_TOKEN.")
|
| 34 |
-
return []
|
| 35 |
-
|
| 36 |
if not binary:
|
| 37 |
with open(filename, "rb") as f:
|
| 38 |
binary = f.read()
|
| 39 |
|
| 40 |
-
def remote_call():
|
| 41 |
-
nonlocal filename, binary
|
| 42 |
-
for _ in range(3):
|
| 43 |
-
try:
|
| 44 |
-
res = requests.post(url + "/v1/layout/resume/", files=[(filename, binary)],
|
| 45 |
-
headers={"Authorization": token}, timeout=180)
|
| 46 |
-
res = res.json()
|
| 47 |
-
if res["retcode"] != 0:
|
| 48 |
-
raise RuntimeError(res["retmsg"])
|
| 49 |
-
return res["data"]
|
| 50 |
-
except RuntimeError as e:
|
| 51 |
-
raise e
|
| 52 |
-
except Exception as e:
|
| 53 |
-
cron_logger.error("resume parsing:" + str(e))
|
| 54 |
-
|
| 55 |
callback(0.2, "Resume parsing is going on...")
|
| 56 |
-
resume = remote_call()
|
| 57 |
if len(resume.keys()) < 7:
|
| 58 |
callback(-1, "Resume is not successfully parsed.")
|
| 59 |
return []
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
+
import base64
|
| 14 |
+
import datetime
|
| 15 |
import json
|
|
|
|
| 16 |
import re
|
| 17 |
+
|
| 18 |
+
import pandas as pd
|
| 19 |
import requests
|
| 20 |
from api.db.services.knowledgebase_service import KnowledgebaseService
|
|
|
|
| 21 |
from rag.nlp import huqie
|
| 22 |
+
from deepdoc.parser.resume import refactor
|
| 23 |
+
from deepdoc.parser.resume import step_one, step_two
|
| 24 |
from rag.settings import cron_logger
|
| 25 |
from rag.utils import rmSpace
|
| 26 |
|
| 27 |
forbidden_select_fields4resume = [
|
| 28 |
"name_pinyin_kwd", "edu_first_fea_kwd", "degree_kwd", "sch_rank_kwd", "edu_fea_kwd"
|
| 29 |
]
|
| 30 |
+
def remote_call(filename, binary):
|
| 31 |
+
q = {
|
| 32 |
+
"header": {
|
| 33 |
+
"uid": 1,
|
| 34 |
+
"user": "kevinhu",
|
| 35 |
+
"log_id": filename
|
| 36 |
+
},
|
| 37 |
+
"request": {
|
| 38 |
+
"p": {
|
| 39 |
+
"request_id": "1",
|
| 40 |
+
"encrypt_type": "base64",
|
| 41 |
+
"filename": filename,
|
| 42 |
+
"langtype": '',
|
| 43 |
+
"fileori": base64.b64encode(binary.stream.read()).decode('utf-8')
|
| 44 |
+
},
|
| 45 |
+
"c": "resume_parse_module",
|
| 46 |
+
"m": "resume_parse"
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
for _ in range(3):
|
| 50 |
+
try:
|
| 51 |
+
resume = requests.post("http://127.0.0.1:61670/tog", data=json.dumps(q))
|
| 52 |
+
resume = resume.json()["response"]["results"]
|
| 53 |
+
resume = refactor(resume)
|
| 54 |
+
for k in ["education", "work", "project", "training", "skill", "certificate", "language"]:
|
| 55 |
+
if not resume.get(k) and k in resume: del resume[k]
|
| 56 |
+
|
| 57 |
+
resume = step_one.refactor(pd.DataFrame([{"resume_content": json.dumps(resume), "tob_resume_id": "x",
|
| 58 |
+
"updated_at": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]))
|
| 59 |
+
resume = step_two.parse(resume)
|
| 60 |
+
return resume
|
| 61 |
+
except Exception as e:
|
| 62 |
+
cron_logger.error("Resume parser error: "+str(e))
|
| 63 |
+
return {}
|
| 64 |
+
|
| 65 |
|
| 66 |
def chunk(filename, binary=None, callback=None, **kwargs):
|
| 67 |
"""
|
| 68 |
The supported file formats are pdf, docx and txt.
|
| 69 |
+
To maximize the effectiveness, parse the resume correctly, please concat us: https://github.com/infiniflow/ragflow
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
"""
|
| 71 |
if not re.search(r"\.(pdf|doc|docx|txt)$", filename, flags=re.IGNORECASE):
|
| 72 |
raise NotImplementedError("file type not supported yet(pdf supported)")
|
| 73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
if not binary:
|
| 75 |
with open(filename, "rb") as f:
|
| 76 |
binary = f.read()
|
| 77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
callback(0.2, "Resume parsing is going on...")
|
| 79 |
+
resume = remote_call(filename, binary)
|
| 80 |
if len(resume.keys()) < 7:
|
| 81 |
callback(-1, "Resume is not successfully parsed.")
|
| 82 |
return []
|
rag/app/table.py
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import copy
|
| 2 |
import re
|
| 3 |
from io import BytesIO
|
|
@@ -8,11 +20,12 @@ from openpyxl import load_workbook
|
|
| 8 |
from dateutil.parser import parse as datetime_parse
|
| 9 |
|
| 10 |
from api.db.services.knowledgebase_service import KnowledgebaseService
|
| 11 |
-
from
|
| 12 |
-
from rag.nlp import huqie
|
|
|
|
| 13 |
|
| 14 |
|
| 15 |
-
class Excel(
|
| 16 |
def __call__(self, fnm, binary=None, callback=None):
|
| 17 |
if not binary:
|
| 18 |
wb = load_workbook(fnm)
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
import copy
|
| 14 |
import re
|
| 15 |
from io import BytesIO
|
|
|
|
| 20 |
from dateutil.parser import parse as datetime_parse
|
| 21 |
|
| 22 |
from api.db.services.knowledgebase_service import KnowledgebaseService
|
| 23 |
+
from deepdoc.parser import is_english, tokenize
|
| 24 |
+
from rag.nlp import huqie
|
| 25 |
+
from deepdoc.parser import ExcelParser
|
| 26 |
|
| 27 |
|
| 28 |
+
class Excel(ExcelParser):
|
| 29 |
def __call__(self, fnm, binary=None, callback=None):
|
| 30 |
if not binary:
|
| 31 |
wb = load_workbook(fnm)
|
rag/nlp/huchunk.py
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import re
|
| 2 |
import os
|
| 3 |
import copy
|
|
@@ -443,13 +455,13 @@ if __name__ == "__main__":
|
|
| 443 |
import sys
|
| 444 |
sys.path.append(os.path.dirname(__file__) + "/../")
|
| 445 |
if sys.argv[1].split(".")[-1].lower() == "pdf":
|
| 446 |
-
from parser import PdfParser
|
| 447 |
ckr = PdfChunker(PdfParser())
|
| 448 |
if sys.argv[1].split(".")[-1].lower().find("doc") >= 0:
|
| 449 |
-
from parser import DocxParser
|
| 450 |
ckr = DocxChunker(DocxParser())
|
| 451 |
if sys.argv[1].split(".")[-1].lower().find("xlsx") >= 0:
|
| 452 |
-
from parser import ExcelParser
|
| 453 |
ckr = ExcelChunker(ExcelParser())
|
| 454 |
|
| 455 |
# ckr.html(sys.argv[1])
|
|
|
|
| 1 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 2 |
+
# you may not use this file except in compliance with the License.
|
| 3 |
+
# You may obtain a copy of the License at
|
| 4 |
+
#
|
| 5 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 6 |
+
#
|
| 7 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 8 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 9 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 10 |
+
# See the License for the specific language governing permissions and
|
| 11 |
+
# limitations under the License.
|
| 12 |
+
#
|
| 13 |
import re
|
| 14 |
import os
|
| 15 |
import copy
|
|
|
|
| 455 |
import sys
|
| 456 |
sys.path.append(os.path.dirname(__file__) + "/../")
|
| 457 |
if sys.argv[1].split(".")[-1].lower() == "pdf":
|
| 458 |
+
from deepdoc.parser import PdfParser
|
| 459 |
ckr = PdfChunker(PdfParser())
|
| 460 |
if sys.argv[1].split(".")[-1].lower().find("doc") >= 0:
|
| 461 |
+
from deepdoc.parser import DocxParser
|
| 462 |
ckr = DocxChunker(DocxParser())
|
| 463 |
if sys.argv[1].split(".")[-1].lower().find("xlsx") >= 0:
|
| 464 |
+
from deepdoc.parser import ExcelParser
|
| 465 |
ckr = ExcelChunker(ExcelParser())
|
| 466 |
|
| 467 |
# ckr.html(sys.argv[1])
|
rag/svr/task_broker.py
CHANGED
|
@@ -21,7 +21,7 @@ from datetime import datetime
|
|
| 21 |
from api.db.db_models import Task
|
| 22 |
from api.db.db_utils import bulk_insert_into_db
|
| 23 |
from api.db.services.task_service import TaskService
|
| 24 |
-
from
|
| 25 |
from rag.settings import cron_logger
|
| 26 |
from rag.utils import MINIO
|
| 27 |
from rag.utils import findMaxTm
|
|
|
|
| 21 |
from api.db.db_models import Task
|
| 22 |
from api.db.db_utils import bulk_insert_into_db
|
| 23 |
from api.db.services.task_service import TaskService
|
| 24 |
+
from deepdoc.parser import HuParser
|
| 25 |
from rag.settings import cron_logger
|
| 26 |
from rag.utils import MINIO
|
| 27 |
from rag.utils import findMaxTm
|